XSLT需要计算父节点中计数大于1的节点数

  • 本文关键字:大于 节点 计算 父节点 XSLT xslt
  • 更新时间 :
  • 英文 :


给定以下简化的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) &gt; 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>

最新更新