在这种情况下有“distinct-values()”的解决方法吗?

问题描述 投票:0回答:1

第一次海报和 XPath 初学者。我希望你能帮助我解决我遇到的这个 XPath 问题。这是我的文件的简化示例。

<town>
  <library>
    <section>
      <book>
        <title>ABC
        </title>
      </book>
      <book>
        <title>DEF
        </title>
      </book>
    </section>
    <section>
      <book>
        <title>ABC
        </title>
      </book>
      <book>
        <title>DEF
        </title>
      </book>
    </section>
  </library>
  <library>
    <section>
      <book>
        <title>ABC
        </title>
      </book>
      <book>
        <title>DEF
        </title>
      </book>
    </section>
    <section>
      <book>
        <title>ABC
        </title>
      </book>
      <book>
        <title>DEF
        </title>
      </book>
      <book>
        <title>GHI
        </title>
      </book>
    </section>
  </library>
</town>

我试图通过 XPath 获得的是具有唯一“标题”的“book”元素,但在两个“library”元素中都是唯一的,而不是在根“town”节点中唯一的。

所以,根据我上面的例子,我期望得到第一个“library”的第一个“ABC”和第一个“DEF”,以及第一个“ABC”,第一个“DEF”和第一个“GHI”第二个“图书馆”。

distinct-values(//library[1]//book | //library[2]//book)
这可行,但我无法使用它,因为我需要使用 XPath 的 CMS 无法识别该功能...

//library//book[not(./title = preceding::*/title)]
这不会选择第二个“库”中的第一个“ABC”和第一个“DEF”,我不明白为什么。有没有办法限制“前一个”轴的范围,使其停止在自己的“库”元素处?

如果有人理解我想要实现的目标,我将非常感谢任何帮助!

xpath xpath-1.0
1个回答
0
投票

看来您使用的CMS仅支持XPath 1.0。首先游说他们改变这一点 - XPath 1.0 于 2007 年被 2.0 取代,现在应该已经成为历史。

这在单个 XPath 1.0 表达式中很难(也许不可能)完成。 (很难证明任何事情都是不可能的,但是你可以从 XPath 1.0 不是关系完备的前提开始,即它不支持整个一阶谓词演算;特别是它不支持范围变量.)

不幸的是,我不知道您还有哪些其他选择。

© www.soinside.com 2019 - 2024. All rights reserved.