我有下一个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?
答案 0 :(得分:3)
您可以使用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',concat(id,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=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
答案 1 :(得分:0)
将两个字段连接起来创建复合键并不安全,除非您绝对确定所有这些创建的键都是唯一的。 我认为这种方法更安全:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="ids" match="document" use="id"/>
<xsl:key name="currencies" match="document" use="cur"/>
<xsl:template match="/page">
<xsl:apply-templates select="document[generate-id() = generate-id(key('ids',id)[1])]"/>
</xsl:template>
<xsl:template match="document">
<xsl:for-each select="key('ids',id)[generate-id() = generate-id(key('currencies', cur)[id=current()/id][1])]">
<xsl:variable name="bills" select="key('ids', id)[cur = current()/cur]"/>
<xsl:text>Bill: id=</xsl:text>
<xsl:value-of select="id"/>
<xsl:text>, cur=</xsl:text>
<xsl:value-of select="cur"/>
<xsl:for-each select="$bills">
<xsl:text> date=</xsl:text>
<xsl:value-of select="date"/>
<xsl:text> amount=</xsl:text>
<xsl:value-of select="amount"/>
</xsl:for-each>
<xsl:text> total amount=</xsl:text>
<xsl:value-of select="sum($bills/amount)"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>