Ich habe folgende XML-DokumentWie verwende ich eine XSLT-Vorlage für verschiedene Level-Elemente?
<ren:RewardAct>
<ren:RewardAttrList>
<ren:RrewardAttr>
<ren:AttrName>11111111111111</ren:AttrName>
<ren:AttrValue>11111111111111</ren:AttrValue>
</ren:RrewardAttr>
</ren:RewardAttrList>
<ren:RewardList>
<ren:Reward>
<ren:Credit>
<ren:Division>11111111111111</ren:Division>
<ren:Region>11111111111111</ren:Region>
</ren:Credit>
<ren:RewardAttrList>
<ren:RewardAttr>
<ren:AttrName>11111111111111</ren:AttrName>
<ren:AttrValue>11111111111111</ren:AttrValue>
</ren:RewardAttr>
</ren:RewardAttrList>
. . .
Und ich möchte so etwas wie dieses
<RewDocSum>
<RewDocSum_ITEM>
<Value>1000.00</Value>
<Name>string</Name>
</RewDocSum_ITEM>
</RewDocSum>
<RewCategorOutlets>
<RewCategorOutlets_ITEM>
<GroupSum>
<GroupSum_ITEM>
<Value>1000.00</Value>
<Name>string</Name>
</GroupSum_ITEM>
</GroupSum>
. . .
Für Element <ren:RewardAttrList>
und es ist Kind-Elemente I mit Parametern zu verwenden Vorlage versuche, so sieht Übersetzungen wie
<xsl:template match="//ren:RewardAct">
<xsl:apply-templates select="ren:RewardAttrList">
<xslt:with-param name="listName" select="'RewDocSum'"/>
<xslt:with-param name="itemName" select="'RewDocSum_ITEM'"/>
</xsl:apply-templates>
<xsl:apply-templates select="ren:RewardList"/>
</xsl:template>
<xsl:template match="ren:RewardList">
<RewCategorOutlets>
<xsl:apply-templates select="ren:Reward"/>
</RewCategorOutlets>
</xsl:template>
<xsl:template match="ren:Reward">
<RewCategorOutlets_ITEM>
<xsl:apply-templates select="ren:RewardAttrList">
<xslt:with-param name="listName" select="'GroupSum'"/>
<xslt:with-param name="itemName" select="'GroupSum_ITEM'"/>
</xsl:apply-templates>
<Credits>
<xsl:apply-templates select="ren:Credit"/>
</Credits>
</RewCategorOutlets_ITEM>
</xsl:template>
<xsl:template match="ren:Credit">
<Credits_ITEM>
. . .
</Credits_ITEM>
</xsl:template>
<xsl:template match="//ren:RewardAttrList">
<xsl:param name="listName"/>
<xsl:param name="itemName"/>
<xsl:element name="{$listName}">
<xsl:apply-templates select="ren:RrewardAttr">
<xslt:with-param name="listItemName" select="$itemName"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="//ren:RrewardAttr">
<xsl:param name="listItemName"/>
<xsl:element name="{$listItemName}">
<Value>
<xsl:apply-templates select="ren:AttrValue/node()"/>
</Value>
<Name>
<xsl:apply-templates select="ren:AttrName/node()"/>
</Name>
</xsl:element>
</xsl:template>
Also, Vorlage für <ren:RewardAttrList>
funktioniert für äußere Element, funktioniert aber nicht für innere.
Was mache ich falsch?
Vielen Dank für Ihre Zeit und mit freundlichen Grüßen.
Bitte posten Sie ein kurzes, aber vollständiges Beispiel - siehe [mcve]. - ** Hinweis: ** Eine Vorlage, die mit 'ren: RewardAttrList' übereinstimmt, entspricht ** allen ** Elementen namens' ren: RewardAttrList' im gesamten Dokument. Sie müssen jedoch * während der Umwandlung * auf alle relevanten Knoten Vorlagen anwenden *. Normalerweise geschieht dies rekursiv - siehe: https://www.w3.org/TR/xslt/#section-Processing-Model –
Beachten Sie auch, dass für die erste ren: RewardAttrList-Liste die untergeordneten Elemente 'ren sind: RrewardAttr', das Sie in Ihrem XSLT korrekt behandeln, aber das zweite hat untergeordnete Elemente mit dem Namen 'ren: RewardAttr', denen das XSLT nicht entspricht. –
Danke an @Tim C. Meine Augen sind müde und ich sehe den Unterschied zwischen 'ren: RrewardAttr' und' ren: RewardAttr' nicht. – gooamoko