2015-01-21 55 views
0

添加重複值I具有以下XML去除/從名稱值對在XSLT

<pair> 
      <name>ABC</name> 
      <value>10</value> 
    </pair> 
    <pair> 
      <name>ABC</name> 
      <value>50</value> 
    </pair> 
    <pair> 
      <name>XYZ</name> 
      <value>30</value> 
    </pair> 

應coverted成

<pair> 
     <name>ABC</name> 
     <value>60</value> 
</pair> 
<pair> 
     <name>XYZ</name> 
     <value>30</value> 
</pair> 

即如果名字是在名稱值對相同。應該在輸出xml中添加相同名稱的值。任何人都可以幫忙嗎?

+1

這是一個*分組*問題 - 做一個搜索,這是這裏最常見的問題之一。請注意,對於XSLT 1.0或2.0,答案是不同的。 – 2015-01-21 12:10:05

回答

1

XML:

<parent> 
    <pair> 
     <name>ABC</name> 
     <value>10</value> 
    </pair> 
    <pair> 
     <name>ABC</name> 
     <value>50</value> 
    </pair> 
    <pair> 
     <name>XYZ</name> 
     <value>30</value> 
    </pair> 
</parent> 

XSLT:

<xsl:template match="/"> 
     <parent> 
      <xsl:for-each select="//parent/pair[not(name=preceding::pair/name)]"> 
       <xsl:variable name="curName" select="name" /> 
       <pair> 
       <name> 
       <xsl:value-of select="name"/> 
       </name> 
       <value> 
       <xsl:value-of select="sum(/parent/pair[name = $curName]/value)"/> 
       </value> 
       </pair> 
      </xsl:for-each> 
     </parent> 
</xsl:template> 

OR:

<xsl:key name="pair-by-name" match="parent/pair" use="name" /> 
<xsl:template match="/"> 
    <parent> 
     <xsl:for-each select="parent/pair[count(. | key('pair-by-name', name)[1]) = 1]"> 
      <xsl:sort select="name" /> 
      <pair> 
      <name> 
      <xsl:value-of select="name"/> 
      </name> 
      <value> 
      <xsl:value-of select="sum(key('pair-by-name', name)/value)"/> 
      </value> 
      </pair> 
     </xsl:for-each> 
    </parent> 
</xsl:template> 

上面的代碼應該可以工作。

+0

感謝@Magnilex糾正帖子格式。 – Hikmat 2015-01-21 17:49:28

+0

這不是一個好方法 - 請看這裏爲什麼:http://www.jenitennison.com/xslt/grouping/muenchian.html – 2015-01-21 17:58:38

1

假設XSLT 2.0和XSLT 2.0處理器等撒克遜9可以使用

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:for-each-group select="//pair" group-by="name"> 
     <xsl:copy> 
     <xsl:copy-of select="name"/> 
     <value><xsl:value-of select="sum(current-group()/value)"/></value> 
     </xsl:copy> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template>