xml – 在XSL中按2个字段分组

我有一个xml:
<page>
   <document>
      <id>1001</id>
      <cur>USD</cur>
      <date>01.01.2009</date>
      <amount>10</amount>
   </document>
   <document>
      <id>1001</id>
      <cur>USD</cur>
      <date>02.01.2009</date>
      <amount>15</amount>
   </document>
   <document>
      <id>1001</id>
      <cur>JPY</cur>
      <date>01.01.2009</date>
      <amount>5</amount>
   </document>
   <document>
      <id>1002</id>
      <cur>USD</cur>
      <date>01.01.2009</date>
      <amount>5</amount>
   </document>
   ...
</page>

我需要将其转换为html.记录应按id和cur分组.并且应在每组之后显示总量.所以我们想要这样的东西:

Bill: id=1001,cur=USD
      date=01.01.2009   amount=10
      date=02.01.2009   amount=15
      total amount=25
Bill: id=1001,cur=JPY
      date=01.01.2009   amount=5
      total amount=5
Bill: id=1002,cur=USD
      date=01.01.2009   amount=5
      total amount=5
...

如何使用XSL实现这一目标?

当我试图在谷歌找到答案时,我发现了Muenchian方法,但是当我们想要将结果分组为2个字段时,它太复杂了.我是xsl的初学者,这对我来说有点困难.
我还为每个组找到了xslt 2.0运算符.主流浏览器是否支持?通常是使用它还是我们应该只依赖xslt 1.0?

您可以使用XSLT 1.0执行此操作

在这里使用的方法是创建一个具有两个字段id和cur的复合键.我稍后将模板应用于每个组中的第一个文档.在模板中,我然后遍历各个文档,最后我总结了文档数量字段.

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="idcur" match="document" use="concat(id,cur)"/>

<xsl:template match="/page">
    <xsl:apply-templates select="document[generate-id() = generate-id(key('idcur',concat(id,cur))[1])]"/>
</xsl:template>

<xsl:template match="document">
<xsl:variable name="document" select="key('idcur',cur))"/>
Bill: id=<xsl:value-of select="id"/>,cur=<xsl:value-of select="cur"/>
    <xsl:for-each select="$document">
      date=<xsl:value-of select="date"/>   amount=<xsl:value-of select="amount"/>
    </xsl:for-each>
      total amount=<xsl:value-of select="sum($document/amount)"/>
</xsl:template>
</xsl:stylesheet>

输出

Bill: id=1001,cur=USD
      date=01.01.2009   amount=5
      total amount=5

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念