如何按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". 的值
我有一个 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". 的值