给定以下简化的XML,我需要计算/root/a/下有1个以上节点的节点数。因此,尽管总共有8个节点,但对我来说,正确的答案是3,因为第一个和最后一个/root/a总共有1.3个以上。我这里的xslt只会给我值8。我曾考虑过使用按键、位置功能等,但都没有成功。。。但我认为可能还有更简单的答案。谢谢你的帮助。
<root>
<a>
<b>
<c>valuex</c>
</b>
<b>
<c>valuey</c>
</b>
</a>
<a>
<b>
<c>valuez</c>
</b>
</a>
<a>
<b>
<c>valuex</c>
</b>
</a>
<a>
<b>
<c>valuex</c>
</b>
</a>
<a>
<b>
<c>valuex</c>
</b>
<b>
<c>valuey</c>
</b>
<b>
<c>valuey</c>
</b>
</a>
<a>
</a>
</root>
我的样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="addCount">
<xsl:choose>
<xsl:when test="/root/a/b">
<xsl:value-of select="count(/root/a/b)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$addCount"/>
</xsl:template>
</xsl:stylesheet>
根据您的评论,听起来好像您想查找b
元素的计数,这些元素是/root/a
的子元素,但不是每个a
元素下的第一个b
元素。
您可以使用以下选项来选择作为/root/a
子级的所有b
元素,并从每个集合中排除第一个b
:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="count(/root/a/b[position() > 1])"/>
</xsl:template>
</xsl:stylesheet>
您还可以使用以下内容来获得具有preceding-sibling
(即b
元素(的所有b
元素的计数:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="count(/root/a/b[preceding-sibling::b])"/>
</xsl:template>
</xsl:stylesheet>
如果我正确理解你的澄清(这是一个很大的假设!(,你想做:
<xsl:template match="/root">
<xsl:variable name="a" select="a[count(b) > 1]" />
<xsl:value-of select="count($a/b) - count($a)"/>
</xsl:template>
可以缩短为:
<xsl:template match="/root">
<xsl:value-of select="count(a/b[position() != 1])"/>
</xsl:template>