【问题标题】:XPath 1.0: Substitute for using paranthesesXPath 1.0:使用括号代替
【发布时间】:2012-02-12 02:15:59
【问题描述】:

考虑以下 XML:

<A>
  <B />
</A>
<A>
  <B />
</A>

有没有办法避免在这个 XPath 1.0 表达式中使用括号来获取第二个 B 元素?

(/A/B)[2]

如果我使用 /A/B[2],则返回空集,因为在任何 A 下都没有第二个 B。我需要的是告诉 XPath 处理器评估前面的表达式并将谓词应用于结果的东西.

我需要这个的原因是,在构造 XPath 表达式时,我不知道前面和后面的部分(即我无法放置左括号)。目前,我只知道我想将 /B 附加到表达式并将谓词应用于结果。

【问题讨论】:

    标签: xpath


    【解决方案1】:

    这个 XML 格式不正确 - 它应该只有一个根。假设顶部有&lt;R&gt;

    您现在可以搜索/R/A[2]/B 以获得第二个B。但是一旦您找到/R/A,唯一可能的方法是将整个表达式括在括号中并添加B[2]。为什么把括号放在开头会有问题?

    【讨论】:

    • 不,它是一个内部部分,整个 xml 格式当然是正确的。 XPath 表达式的构建方式我不知道表达式的其他部分,正如我在问题中已经提到的那样。这就是为什么我试图寻找其他东西而不是括号。
    【解决方案2】:

    以下仍然使用括号,但仅在谓词过滤器内部,因此您可以在构建 XPath 时附加它:

    /A/B[count(.|(/A/B)[2])=1]
    

    它使用Kaysian technique 设置差异。当前节点的并集计数和第二个/A/B的选择如果当前节点相同,则为1。

    【讨论】:

    • 如果我知道表达式的前面部分,我可以使用括号作为更简单的解决方案..
    【解决方案3】:

    你应该使用这个:

        //A/B[@id='2']
    

    【讨论】:

    • 不幸的是,真实文档中没有这样的id。我在这里使用它来轻松识别我需要选择的元素。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2011-05-04
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多