【问题标题】:XSLT Need to count number of nodes where count is more than 1 within the parent nodeXSLT 需要计算父节点内 count 大于 1 的节点数
【发布时间】:2018-11-17 02:39:16
【问题描述】:

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

【问题讨论】:

  • 为什么拥有超过 1 个子元素的 a 元素的计数不是 2?我不明白你为什么认为它会是 3,除非你想要拥有超过 1 个子元素的 a 元素的子元素计数的 max() 值?
  • 感谢您的回复 Mads。这很令人困惑。我实际上需要计算大于1的节点的数量。所以第一个节点有2个,计为1。第2个,第3个和第4个只有1个 所以我一个都不算。第 5 个 有 3 个 ,所以算作 2. 3 个。
  • 而且我不能只计算所有的并减去,因为有时我可能在下没有
  • 你说第1个和第5个a元素算作两个,所以总共是3个……嗯?您始终可以将计数加 1,但如果有两个符合您的条件,为什么计数为 3?
  • 好的,我想我明白了。您想要不是第一个子 b 元素的 b 元素的计数吗?因此,在具有多个 b 元素的两个 a 元素中,第一个元素中有 2 个 b 元素,第五个 b 元素有 3 个 a 元素,总共有 5 个,从每个元素中排除第一个 b 元素,所需的计数为 3。

标签: xslt


【解决方案1】:

根据您的评论,听起来好像您想查找 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-siblingb 元素的所有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>

【讨论】:

  • 是的,这正是我需要的!谢谢疯子!
【解决方案2】:

如果我正确理解了您的说明(这是一个很大的如果!),您想这样做:

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

【讨论】:

  • 是的,米迦勒!这就是我需要的!您的答案和下面的 Mads 答案都有效。谢谢!
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2014-08-12
  • 1970-01-01
相关资源
最近更新 更多