第一次海报和 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”,我不明白为什么。有没有办法限制“前一个”轴的范围,使其停止在自己的“库”元素处?
如果有人理解我想要实现的目标,我将非常感谢任何帮助!
看来您使用的CMS仅支持XPath 1.0。首先游说他们改变这一点 - XPath 1.0 于 2007 年被 2.0 取代,现在应该已经成为历史。
这在单个 XPath 1.0 表达式中很难(也许不可能)完成。 (很难证明任何事情都是不可能的,但是你可以从 XPath 1.0 不是关系完备的前提开始,即它不支持整个一阶谓词演算;特别是它不支持范围变量.)
不幸的是,我不知道您还有哪些其他选择。