我想计算XML中两个节点之间存在的节点。下面是演示XML。
<?xml version="1.0" encoding="UTF-8"?>
<body>
<a></a>
<b></b>
<b></b>
<b></b>
<a></a>
<b></b>
<a></a>
<a></a>
<b></b>
<b></b>
<a></a>
</body>
我正在使用下面的XSLT。
<xsl:template match="a">
<xsl:text>Number of B </xsl:text>
<xsl:value-of select="count(preceding::a[1]/following::b)"/>
</xsl:template>
我当前的输出。
<body>
Number of B 0
<b></b>
<b></b>
<b></b>
Number of B 6
<b></b>
Number of B 3
Number of B 2
<b></b>
<b></b>
Number of B 2
</body>
但我的预期输出如下。
<body>
Number of B 0
<b></b>
<b></b>
<b></b>
Number of B 3
<b></b>
Number of B 1
Number of B 0
<b></b>
<b></b>
Number of B 2
</body>
基本上我想在a
之间计算。
请让我知道如何完成这项工作。
这是工作示例
http://xsltransform.net/6r5Gh3F
由于
答案 0 :(得分:2)
您可以做的是创建一个将b
元素链接到第一个a
元素的键
<xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" />
然后您可以计算当前b
元素之前的a
元素,如下所示:
<xsl:value-of select="count(key('b', generate-id()))"/>
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" />
<xsl:template match="a">
<xsl:text>Number of B </xsl:text>
<xsl:value-of select="count(key('b', generate-id()))"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
您可以计算以下b
的数量,并在以下b
之后减去a
的数量:
<xsl:template match="a">
<xsl:text>Number of B </xsl:text>
<xsl:value-of select="count(following::b) - count(following::a/following::b)"/>
</xsl:template>