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

时间:2018-11-17 02:39:17

标签: 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>

2 个答案:

答案 0 :(得分:0)

根据您的评论,听起来好像您要查找b的子元素/root/a的计数,但不是每个元素下的第一个b元素a元素。

您可以使用以下内容选择b的子元素中的所有/root/a元素,并从每个集合中排除第一个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>

您还可以使用以下命令获取所有b元素为preceding-sibling的{​​{1}}元素的计数:

b

答案 1 :(得分:0)

如果我正确理解了您的澄清(如果这样的话,那就太好了!),您想这样做:

<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>