2014-01-08 101 views
2

如何根據另一個值添加值?XSLT根據另一個值添加屬性值

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <item id="A1" quantity="5"> 
     <info type="ram x1" import="CA" /> 
    </item> 
    <item id="A2" quantity="3"> 
     <info type="ram x1" import="SA" /> 
    </item> 
    <item id="A3" quantity="10"> 
     <info type="ram x2" import="AU" /> 
    </item> 
</items> 

我需要添加基於所述type例如我需要的輸出,因爲所有的數量時,

衝壓X1量= 8 RAM X2量= 10

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
     <details type="ram x1" quantity="8"/> 
     <details type="ram x2" quantity="10"/> 
</items> 

換試圖每個組首先得到數量,看它是否有效,

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:template match="items"> 
     <xsl:for-each-group select="item" group-by="info/@type"> 
     <xsl:value-of select="sum(@quantity)" /> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

回答

3

使用current-group()功能,即:

<xsl:value-of select="sum(current-group()/@quantity)" /> 
0

@Kirill Polishchuck給了一個很好的答案了,我想補充一個完整的樣式表來說明這一點。

它以您應該顯示的方式輸出格式化的XML。除了使用current-group()之外,還有一個有趣的應用current-grouping-key(),它檢索導致當前項目被分組在一起的值。

您已指定xsl:output method爲HTML,但您的預期輸出看起來像XML。因此,我已經改變它來輸出XML。

樣式表

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output method="xml" indent="yes" /> 

<xsl:template match="items"> 
    <xsl:copy> 
    <xsl:for-each-group select="item" group-by="info/@type"> 
     <details> 
      <xsl:attribute name="type"> 
       <xsl:value-of select="current-grouping-key()"/> 
      </xsl:attribute> 
      <xsl:attribute name="quantity"> 
       <xsl:value-of select="sum(current-group()/@quantity)" /> 
      </xsl:attribute> 
     </details> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <details type="ram x1" quantity="8"/> 
    <details type="ram x2" quantity="10"/> 
</items> 

甚至更​​簡潔(但更復雜的)版本使用所謂的屬性值模板:

<xsl:for-each-group select="item" group-by="info/@type"> 
    <details type="{current-grouping-key()}" quantity="{sum(current-group()/@quantity)}"/> 
</xsl:for-each-group> 
相關問題