xpath使用//和descendant-or-self和self

时间:2016-11-20 19:00:56

标签: xml xpath

我试图获得与哈利波特同年的所有书名

"/bookstore/book[year=//descendant-or-self::book[title='Harry Potter']/year]/title"

同年出版的所有书名称为“哈利波特”一书。正确地

"/bookstore/book[year=descendant-or-self::book[title='Harry Potter']/year]/title";

只收录名为“哈利波特”的书籍

虽然,我最初做了:

"/bookstore/book[year=self::book[title='Harry Potter']/year]/title";

只收录名为“哈利波特”的书籍。同样。

XML文档来自:http://www.w3schools.com/xml/xml_xpath.asp

为什么最后两个不能得到我想要的所有结果,只有书本身?

1 个答案:

答案 0 :(得分:1)

首先,出于所有实际目的,//descendant-or-self::book//book的含义相同,因此您的第一个表达式是正确的但不必要的冗长。

您的第二个表达式使用book[year=descendant-or-self::book...]。在您的示例XML文档中,书籍没有后代书籍,因此这等同于book[year=self::book...],这是您的第三个表达。

您的第三个表达式/bookstore/book[year=self::book[title='Harry Potter']/year]/title非常多余。如果我们删除内部谓词,那就是

/bookstore/book[year=self::book/year]/title

选择书籍年份与书籍年份相同的每本书 - 如果书籍有一年的话,这本书总是如此。

如果你忽略了那种同义反复的情况,你就会离开

/bookstore/book[title='Harry Potter']/title

选择标题为“哈利波特”的所有书籍的标题,这些书籍只能是“哈利波特”的零次或多次重复。

基本上,您还没有理解上下文的重要性。您需要重新阅读您最喜欢的XPath教科书的那一部分。