2016-08-12 84 views
0

我有以下XML文檔如何將一個XSLT模板用於不同級別的元素?

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

我想是這樣的

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

對於元素<ren:RewardAttrList>,它是我嘗試使用帶有參數模板的子元素,所以翻譯的樣子

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

因此,模板<ren:RewardAttrList>適用於外部元素,但不適用於內部。

我做錯了什麼?

感謝您浪費您的時間和最好的問候。

+0

請發佈一個簡短但完整的示例 - 請參見[mcve]。 - **提示:**匹配「ren:RewardAttrList」的模板匹配整個文檔中名爲「ren:RewardAttrList」的所有**元素。但是,您必須在轉換過程中將*應用模板*應用於所有相關節點。通常,這是遞歸地完成 - 請參閱:https://www.w3.org/TR/xslt/#section-Processing-Model –

+0

另請注意,對於您的第一個「ren:RewardAttrList」列表,子元素爲「ren: RrewardAttr',它在XSLT中正確處理,但第二個具有名爲'ren:RewardAttr'的子元素,它與XSLT不匹配。 –

+0

感謝@Tim C.我的眼睛很累,我只是沒有看到'ren:RrewardAttr'和'ren:RewardAttr'之間的區別。 – gooamoko

回答

0

這個錯誤是在不同的子元素名稱:

ren:RrewardAttr 
ren:RewardAttr 

修正元素的名稱和XSD方案後,隨着參數模板工作正常。

感謝所有人,特別是@Tim C

相關問題