2016-12-07 64 views
1

我通過Main/MainLines/MainLine必須循環並獲得總和(數量)for-each - Item/ItemNo .The輸出應該只有一個MainLine每個ItemNo .The方式我做我收到重複的元素。XSLT:循環並獲得獨特的屬性值

輸入

<Main Company="ABC" MainNo="213211" > 
    <MainLines> 
    <MainLine Quantity="2" Node="9999"> 
     <Item ItemNo="123123" Class="NEW"/> 
    </MainLine> 
    <MainLine Quantity="1" Node="9999"> 
     <Item ItemNo="123123" Class="NEW"/> 
    </MainLine> 
    <MainLine Quantity="3" Node="9999"> 
     <Item ItemNo="123123" Class="NEW"/> 
    </MainLine> 
    <MainLine Quantity="2" Node="9999"> 
     <Item ItemNo="22222" Class="NEW"/> 
    </MainLine> 
    </MainLines> 
</Main> 

輸出

<Main Company="ABC" MainNo="213211" Reason="NewFile"> 
    <MainLines> 
    <MainLine ExtnQuantity="6"> 
     <MainLine Quantity="2" Node="9999"> 
     <Item ItemNo="123123" Class="NEW" /> 
     </MainLine> 
    </MainLine> 
    <MainLine ExtnQuantity="6"> 
     <MainLine Quantity="1" Node="9999"> 
     <Item ItemNo="123123" Class="NEW" /> 
     </MainLine> 
    </MainLine> 
    <MainLine ExtnQuantity="6"> 
     <MainLine Quantity="3" Node="9999"> 
     <Item ItemNo="123123" Class="NEW" /> 
     </MainLine> 
    </MainLine> 
    <MainLine ExtnQuantity="2"> 
     <MainLine Quantity="2" Node="9999"> 
     <Item ItemNo="22222" Class="NEW" /> 
     </MainLine> 
    </MainLine> 
    </MainLines> 
</Main> 

XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
    <Main> 
    <xsl:copy-of select="Main/@*"/> 
    <xsl:attribute name="Reason"> 
     <xsl:value-of select="'NewFile'"/> 
    </xsl:attribute> 
    <MainLines> 

     <xsl:for-each select="Main/MainLines/MainLine"> 
     <MainLine> 
      <xsl:variable name="ITEM_ID"> 
      <xsl:value-of select="Item/@ItemNo"/> 
      </xsl:variable> 

      <xsl:attribute name="ExtnQuantity"> 
      <xsl:value-of select="sum(../MainLine[Item/@ItemNo = $ITEM_ID]/@Quantity)"/> 
      </xsl:attribute> 
      <xsl:copy-of select="."/> 
     </MainLine> 
     </xsl:for-each> 

    </MainLines> 
    </Main> 
    </xsl:template> 
</xsl:stylesheet> 

期望輸出

<Main Company="ABC" MainNo="213211" Reason="NewFile"> 
    <MainLines> 
    <MainLine ExtnQuantity="6"> 
     <MainLine Quantity="2" Node="9999"> 
     <Item ItemNo="123123" Class="NEW" /> 
     </MainLine> 
    </MainLine> 
    <MainLine ExtnQuantity="2"> 
     <MainLine Quantity="2" Node="9999"> 
     <Item ItemNo="22222" Class="NEW" /> 
     </MainLine> 
    </MainLine> 
    </MainLines> 
</Main> 

回答

1

這是一個Muenchian grouping問題。 您可以通過遍歷唯一值ItemNo來解決它。 這是您的樣式表的修改版本:

請注意,我已將<MainLines>元素移至其自己的模板中以減少嵌套。此外,您可以直接將屬性添加到元素,您不需要<xsl:attribute>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <!-- Define key --> 
    <xsl:key name="ItemNoKey" match="MainLine/Item" use="@ItemNo" /> 

    <xsl:template match="/Main"> 
    <Main Reason="NewFile"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="MainLines"/> 
    </Main> 
    </xsl:template> 

    <xsl:template match="MainLines"> 
    <MainLines> 

     <!-- For each first MainLine with a given ItemNo --> 
     <xsl:for-each select="MainLine[count(Item | key('ItemNoKey', Item/@ItemNo)[1]) = 1]"> 
     <xsl:variable name="CurrentItemNo" select="Item/@ItemNo"/> 

     <!-- Print MainLine with quantity sum --> 
     <MainLine ExtnQuantity="{sum(../MainLine[Item/@ItemNo = $CurrentItemNo]/@Quantity)}"> 

      <!-- Copy the selected MainLine element --> 
      <xsl:copy-of select="."/> 
     </MainLine> 
     </xsl:for-each> 

    </MainLines> 
    </xsl:template> 
</xsl:stylesheet>