2016-08-12 5 views
0

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.

+0

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 –

+0

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. –

+0

Danke an @Tim C. Meine Augen sind müde und ich sehe den Unterschied zwischen 'ren: RrewardAttr' und' ren: RewardAttr' nicht. – gooamoko

Antwort

0

Das war Fehler in verschiedenem Kind-Element-Namen:

ren:RrewardAttr 
ren:RewardAttr 

Nach Elementnamen und XSD-Schema zu korrigieren, Vorlage mit Parametern funktioniert gut.

Danke allen, vor allem @Tim C

Verwandte Themen