我如何使用xslt和XPath 2.0计算不同的值

时间:2015-01-27 10:22:32

标签: xml xslt 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>

从包含4篇文章的3个订单我想用xslt翻译一个列表,只有所有订单中所有金额总和的文章。在这个列表中,文章应该是不同的。您可以通过Article&#34; Vase&#34;来看到这一点。这是2个订单,金额从2到4.在我的目标列表中,文章&#34;花瓶&#34;只有一次,金额从6开始。所有订单的总和。

我阅读了很多内容,并且可以获得一个明确的文章名称或文章编号列表,但每次我都无法合并所有需要的值。 你有想法可以帮助我吗? 谢谢

1 个答案:

答案 0 :(得分:0)

使用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