我试图获得与哈利波特同年的所有书名
"/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
为什么最后两个不能得到我想要的所有结果,只有书本身?
答案 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教科书的那一部分。