如何按xslt中的值分组

How to group by a value in xslt

我有一个 xml 项目值

<value1>
        <OrderLine OrderedQty="1.00" Type="cancel" >
            <Item ItemID="1234">                
            </Item>
        </OrderLine>
        <OrderLine OrderedQty="1.00" Type="cancel" >
            <Item ItemID="1234">
            </Item>
        </OrderLine>
        <OrderLine OrderedQty="1.00" Type="blabla" >
            <Item ItemID="1234">
            </Item>
        </OrderLine>
        <OrderLine OrderedQty="1.00" Type="asdsd" >
            <Item ItemID="4567">
            </Item>
        </OrderLine>
</value1>

我想获取未取消的项目 ID,但其中一些是 canceled.The 项目 4567 未对其进行任何处理,因此我们不会对其进行更新。

<item>
<id>1234</id>
<quantity>1</quantity>
</item>

XSLT:

    <xsl:stylesheet version="2.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20">
    <tns:Root-Element>    
      <xsl:for-each-group select="/value1/OrderLine" group-by="Item/@ItemID">

      </xsl:for-each-group>
</tns:Root-Element>

我没有太多 xsl code.I 需要更新不是的订单 canceled.If 你拿 itemid 4567 没有变化所以我们不想要任何东西。

这应该让你开始......

XML 输入(为测试添加了额外的 OrderLine

<value1>
    <OrderLine OrderedQty="1.00" Type="cancel" >
        <Item ItemID="1234">                
        </Item>
    </OrderLine>
    <OrderLine OrderedQty="1.00" Type="cancel" >
        <Item ItemID="1234">
        </Item>
    </OrderLine>
    <OrderLine OrderedQty="1.00" Type="blabla" >
        <Item ItemID="1234">
        </Item>
    </OrderLine>
    <OrderLine OrderedQty="1.00" Type="asdsd" >
        <Item ItemID="4567">
        </Item>
    </OrderLine>
    <OrderLine OrderedQty="2.00" Type="qwerty" >
        <!--ADDED ITEM FOR TESTING-->
        <Item ItemID="1234"/>
    </OrderLine>
</value1>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <root>
      <xsl:for-each-group select="OrderLine[not(@Type='cancel')]/Item" group-by="@ItemID">
        <xsl:if test="count(current-group()) > 1">
          <item>
            <id><xsl:value-of select="current-grouping-key()"/></id>
            <quantity>
              <xsl:value-of select="sum(current-group()/../@OrderedQty)"/>
            </quantity>
          </item>          
        </xsl:if>
      </xsl:for-each-group>
    </root>
  </xsl:template>

</xsl:stylesheet>

XML输出

<root>
   <item>
      <id>1234</id>
      <quantity>3</quantity>
   </item>
</root>

备注:

  • 您没有将前缀 tns 绑定到命名空间,所以我只是为根元素使用了一个通用元素 (root)。
  • 我假设当你说 The item 4567 nothing is done to it so we wont update it. 你的意思是因为它没有添加到另一个项目,我们删除元素(因为它不在你的输出示例中)。
  • OrderLine/@Type 被忽略,除了检查 "cancel".
  • 的值