我如何使用 xslt 和 XPath 2.0 计算不同值
How I can count distinct-values with xslt and XPath 2.0
我想获取不同值的列表并计算金额的总和。
我的 xml 是:
<root>
<orders>
<fileid>123456789</fileid>
<order>
<name>Max Mustermann</name>
<street>Musterstr. 5</street>
<zip>12345</zip>
<city>Munster</city>
<articles>
<article>
<name>Vase</name>
<articlenumber>1234-001</articlenumber>
<amount>2</amount>
</article>
</articles>
</order>
<order>
<name>Karin Müller</name>
<street>Hofstr. 25</street>
<zip>54321</zip>
<city>Hamburg</city>
<articles>
<article>
<name>Blumen</name>
<articlenumber>4321-003</articlenumber>
<amount>10</amount>
</article>
</articles>
</order>
<order>
<name>Jenni Schulz</name>
<street>Achenerstr. 7</street>
<zip>34567</zip>
<city>Achen</city>
<articles>
<article>
<name>Tischdecke</name>
<articlenumber>4711-001</articlenumber>
<amount>1</amount>
</article>
<article>
<name>Vase</name>
<articlenumber>1234-001</articlenumber>
<amount>4</amount>
</article>
</articles>
</order>
</orders>
</root>
我想要这个列表:
<articles>
<article>
<name>Vase</name>
<articlenumber>1234-001</articlenumber>
<amount>6</amount>
</article>
<article>
<name>Blumen</name>
<articlenumber>4321-003</articlenumber>
<amount>10</amount>
</article>
<article>
<name>Tischdecke</name>
<articlenumber>4711-001</articlenumber>
<amount>1</amount>
</article>
</articles>
来自 3 个订单和 4 篇文章我想用 xslt 翻译一个列表,只有所有订单中所有金额总和的文章。在此列表中,文章应该不同。您可以在文章 "Vase" 中看到这一点。这是 2 个订单,金额为 2 和 4。在我的目标列表中,文章 "Vase" 只有一次,金额为 6。所有订单的总和。
我读了很多书,可以得到一个不同的文章名称或文章编号列表,但每次我都无法组合所有需要的值。
你有什么想法可以帮助我吗?
谢谢
对于 XSLT 2.0,这是一个分组问题,需要通过 for-each-group
:
来解决
<xsl:template match="/">
<articles>
<xsl:for-each-group select="//articles/article" group-by="articlenumber">
<xsl:copy>
<xsl:copy-of select="* except amount"/>
<amount><xsl:value-of select="sum(current-group()/amount)"/></amount>
</xsl:copy>
</xsl:for-each-group>
</articles>
</xsl:template>
有关完整示例,请参阅 http://xsltransform.net/3NzcBt8。
我想获取不同值的列表并计算金额的总和。
我的 xml 是:
<root>
<orders>
<fileid>123456789</fileid>
<order>
<name>Max Mustermann</name>
<street>Musterstr. 5</street>
<zip>12345</zip>
<city>Munster</city>
<articles>
<article>
<name>Vase</name>
<articlenumber>1234-001</articlenumber>
<amount>2</amount>
</article>
</articles>
</order>
<order>
<name>Karin Müller</name>
<street>Hofstr. 25</street>
<zip>54321</zip>
<city>Hamburg</city>
<articles>
<article>
<name>Blumen</name>
<articlenumber>4321-003</articlenumber>
<amount>10</amount>
</article>
</articles>
</order>
<order>
<name>Jenni Schulz</name>
<street>Achenerstr. 7</street>
<zip>34567</zip>
<city>Achen</city>
<articles>
<article>
<name>Tischdecke</name>
<articlenumber>4711-001</articlenumber>
<amount>1</amount>
</article>
<article>
<name>Vase</name>
<articlenumber>1234-001</articlenumber>
<amount>4</amount>
</article>
</articles>
</order>
</orders>
</root>
我想要这个列表:
<articles>
<article>
<name>Vase</name>
<articlenumber>1234-001</articlenumber>
<amount>6</amount>
</article>
<article>
<name>Blumen</name>
<articlenumber>4321-003</articlenumber>
<amount>10</amount>
</article>
<article>
<name>Tischdecke</name>
<articlenumber>4711-001</articlenumber>
<amount>1</amount>
</article>
</articles>
来自 3 个订单和 4 篇文章我想用 xslt 翻译一个列表,只有所有订单中所有金额总和的文章。在此列表中,文章应该不同。您可以在文章 "Vase" 中看到这一点。这是 2 个订单,金额为 2 和 4。在我的目标列表中,文章 "Vase" 只有一次,金额为 6。所有订单的总和。
我读了很多书,可以得到一个不同的文章名称或文章编号列表,但每次我都无法组合所有需要的值。 你有什么想法可以帮助我吗? 谢谢
对于 XSLT 2.0,这是一个分组问题,需要通过 for-each-group
:
<xsl:template match="/">
<articles>
<xsl:for-each-group select="//articles/article" group-by="articlenumber">
<xsl:copy>
<xsl:copy-of select="* except amount"/>
<amount><xsl:value-of select="sum(current-group()/amount)"/></amount>
</xsl:copy>
</xsl:for-each-group>
</articles>
</xsl:template>
有关完整示例,请参阅 http://xsltransform.net/3NzcBt8。