【问题标题】:How do you identify duplicate values in a numerical sequence using XPath 2.0?如何使用 XPath 2.0 识别数字序列中的重复值?
【发布时间】:2010-09-13 01:59:37
【问题描述】:

我有一个 XPath 表达式,它为我提供了一系列值,如下所示:

1 2 2 3 4 5 5 6 7

使用distinct-values() 很容易将其转换为一系列唯一值1 2 3 4 5 6 7。但是,我要提取的是重复值列表 = 2 5。我想不出一个简单的方法来做到这一点。有人可以帮忙吗?

【问题讨论】:

    标签: xml xpath xpath-2.0


    【解决方案1】:

    使用这个简单的 XPath 2.0 表达式

    $vSeq[index-of($vSeq,.)[2]]
    

    其中$vSeq 是我们要在其中查找重复项的值序列。

    有关此“工作原理”的说明,请参阅

    http://dnovatchev.wordpress.com/2008/11/16/xpath-2-0-gems-find-all-duplicate-values-in-a-sequence-part-2/

    TLDR; 这张图可以直观的解释一下。

    如果序列是:

    $vSeq  =  1,   2,   3,   2,   4,   5,   6,   7,   5,   7,   5
    

    然后评估上面的 XPath 表达式产生:2, 5, 7


    【讨论】:

    • 非常好。我经常忽略 index-of() 函数。
    • 会接受这个作为答案,但似乎我不再能够
    • 没关系,谢谢@Woody。我很高兴找到你。也许版主可以帮助您恢复/连接/合并您以前的自己?
    【解决方案2】:

    怎么样:

    distinct-values(
      for $item in $seq
      return if (count($seq[. eq $item]) > 1)
             then $item
             else ())
    

    这将遍历序列中的项目,如果序列中等于该项目的项目数大于一个,则返回该项目。然后,您必须使用 distinct-values() 从该列表中删除重复项。

    【讨论】:

    • 嗨 Jeni,似乎有一个更简单的解决方案 :) $vSeq[index-of($vSeq,.)[2]] 干杯,Dimitre
    【解决方案3】:

    计算原始值集与不同值集之间的差异。这是多次出现的一组数字。请注意,如果此结果集中的数字在原始序列中出现两次以上,则它们不一定是不同的,因此如果需要,请再次转换为一组不同的值。

    【讨论】:

      【解决方案4】:

      xslt 呢? 是否适用于您的要求?

          <xsl:for-each select="/r/a">
              <xsl:variable name="cur" select="." />
              <xsl:if test="count(./preceding-sibling::a[. = $cur]) > 0 and count(./following-sibling::a[. = $cur]) = 0">
                  <xsl:value-of select="." />
              </xsl:if>
          </xsl:for-each>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        • 2018-11-27
        • 2019-01-19
        • 1970-01-01
        相关资源
        最近更新 更多