|
next
|
 Subject: Grouping With Expression Author: Kenny Cudworth Date: 19 Aug 2005 08:32 PM
|
I can't get the desired output here. Can anyone help?
Start:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<ItemType description="MEDIA, DVD" objectKey="ItemType05"/>
<ItemType description="MEDIA, MAGAZINE" objectKey="ItemType0C"/>
<ItemType description="APPLIANCE, BLENDER" objectKey="ItemType12"/>
<ItemType description="MEDIA, CD" objectKey="ItemType1B"/>
<ItemType description="APPLIANCE, TOASTER" objectKey="ItemType4D"/>
<RolledUpItems objectKey="RolledUpItems0B" quantity="2">
<type>ItemType12</type>
</RolledUpItems>
<RolledUpItems objectKey="RolledUpItems0C" quantity="7">
<type>ItemType1B</type>
</RolledUpItems>
<RolledUpItems objectKey="RolledUpItems0D" quantity="17">
<type>ItemType0C</type>
</RolledUpItems>
<RolledUpItems objectKey="RolledUpItems0E" quantity="4">
<type>ItemType4D</type>
</RolledUpItems>
<RolledUpItems objectKey="RolledUpItems0F" quantity="2">
<type>ItemType05</type>
</RolledUpItems>
</root>
Transformation:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="items" match="RolledUpItems" use="contains(type/@description, 'MEDIA')"/>
<xsl:key name="types" match="ItemType" use="contains(@description, 'MEDIA')"/>
<xsl:template match="/">
<root>
<xsl:for-each select="//RolledUpItems[generate-id() = generate-id(key('items', contains(type/@description, 'MEDIA'))[1])]">
<xsl:variable name="item" select="."/>
<xsl:for-each select="//ItemType">
<xsl:if test="($item/type = ./@objectKey) and contains(./@description, 'MEDIA')">
<LineItemByEntityType>
<xsl:attribute name="objectKey">
<xsl:value-of select="$item/@objectKey"/>
</xsl:attribute>
<xsl:attribute name="quantity">
<xsl:value-of select="sum(key('items', contains(type/@description, 'MEDIA'))/@quantity)"/>
</xsl:attribute>
<xsl:variable name="compare" select="./@objectKey = $item/type"/>
<xsl:if test="string($compare)='true'">
<type>
<xsl:value-of select="string('DESIRED-Type-Media')"/>
</type>
</xsl:if>
</LineItemByEntityType>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="//ItemType[generate-id() = generate-id(key('types', contains(@description, 'MEDIA'))[1])]">
<xsl:if test="contains(./@description, 'MEDIA')">
<EntityType>
<xsl:attribute name="objectKey">
<xsl:value-of select="string('DESIRED-Type-Media')"/>
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="string('Media')"/>
</xsl:attribute>
</EntityType>
</xsl:if>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
Undesired Result:
<?xml version='1.0' encoding='UTF-8' ?>
<root>
<EntityType objectKey="DESIRED-Type-Media" name="Media"/>
</root>
Desired Result:
<?xml version='1.0' encoding='UTF-8' ?>
<root>
<LineItemByEntityType objectKey="RolledUpItems0C" quantity="26"/>
<EntityType objectKey="DESIRED-Type-Media" name="Media"/>
</root>
I'd appreciate any kind of help.
|
|
|