Xslt 使用子节点值进行分组,并将分组的值求和一次
我有一个类似下面的场景,我想用子元素值对元素进行分组,并将数量相加。使用XSLT1.0Xslt 使用子节点值进行分组,并将分组的值求和一次,xslt,xslt-2.0,Xslt,Xslt 2.0,我有一个类似下面的场景,我想用子元素值对元素进行分组,并将数量相加。使用XSLT1.0 Input: <body> <Root1> <Root2> <E1>abc</merchantcode> <C1> <order> <catalog>
Input:
<body>
<Root1>
<Root2>
<E1>abc</merchantcode>
<C1>
<order>
<catalog>
<catalogitem>100</catalogitem>
<sku>100</sku>
<quantity>1</quantity>
</catalog>
</order>
</C1>
<C1>
<order>
<catalog>
<catalogitem>100</catalogitem>
<sku>100</sku>
<quantity>2</quantity>
</catalog>
</order>
</C1>
<C1>
<order>
<catalog>
<catalogitem>111</catalogitem>
<sku>111</sku>
<quantity>1</quantity>
</catalog>
</order>
</C1>
</Root2>
</Root1>
</body>
输入:
abc
100
100
1.
100
100
2.
111
111
1.
我想根据sku值对上述XML文档进行分组。然后我想把数量加起来。
以下是我想要的结果:
<body>
<Root1>
<Root2>
<E1>abc</merchantcode>
<C1>
<order>
<catalog>
<catalogitem>100</catalogitem>
<sku>100</sku>
<quantity>3</quantity>
</catalog>
</order>
</C1>
<C1>
<order>
<catalog>
<catalogitem>111</catalogitem>
<sku>111</sku>
<quantity>1</quantity>
</catalog>
</order>
</C1>
</Root2>
</Root1>
</body>
abc
100
100
3.
111
111
1.
有人能帮我吗?这样试试:
XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Root2">
<xsl:copy>
<xsl:apply-templates select="* except C1"/>
<xsl:for-each-group select="C1" group-by="order/catalog/sku">
<C1>
<order>
<catalog>
<xsl:copy-of select="order/catalog/(catalogitem | sku)" />
<quantity>
<xsl:value-of select="sum(current-group()/order/catalog/quantity)" />
</quantity>
</catalog>
</order>
</C1>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XSLT1.0解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kCatalogsByItemaAndSKU" match="C1"
use="concat(order/catalog/catalogitem, '+', order/catalog//sku)"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="C1"/>
<xsl:template match="C1[generate-id()
= generate-id(key('kCatalogsByItemaAndSKU',
concat(order/catalog/catalogitem,
'+', order/catalog/sku)
)[1]
)
]">
<C1><xsl:apply-templates/></C1>
</xsl:template>
<xsl:template match="C1/order/catalog/quantity/text()">
<xsl:value-of select=
"sum(key('kCatalogsByItemaAndSKU',
concat(../../catalogitem, '+', ../../sku)
)/order/catalog/quantity)"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时(固定为格式正确):
abc
100
100
1.
100
100
2.
111
111
1.
生成所需的正确结果:
<body>
<Root1>
<Root2>
<E1>abc</E1>
<C1>
<order>
<catalog>
<catalogitem>100</catalogitem>
<sku>100</sku>
<quantity>3</quantity>
</catalog>
</order>
</C1>
<C1>
<order>
<catalog>
<catalogitem>111</catalogitem>
<sku>111</sku>
<quantity>1</quantity>
</catalog>
</order>
</C1>
</Root2>
</Root1>
</body>
abc
100
100
3.
111
111
1.
您到底在哪里遇到了这个问题?我已经尝试过这样做,但没有成功,标签上写着“使用xslt 1.0”。注释中的代码对每个组使用xsl:。那么您使用或可以使用哪个版本?
<body>
<Root1>
<Root2>
<E1>abc</E1>
<C1>
<order>
<catalog>
<catalogitem>100</catalogitem>
<sku>100</sku>
<quantity>3</quantity>
</catalog>
</order>
</C1>
<C1>
<order>
<catalog>
<catalogitem>111</catalogitem>
<sku>111</sku>
<quantity>1</quantity>
</catalog>
</order>
</C1>
</Root2>
</Root1>
</body>