首页 > 解决方案 > XSLT 需要计算父节点内 count 大于 1 的节点数

问题描述

鉴于以下简化的 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>

标签: xslt

解决方案


根据您的评论,听起来好像您想查找属于 的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具有 a 元素的元素preceding-sibling的计数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>

推荐阅读