我正在尝试获得与哈利·波特同年的所有书名
"/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(请参阅下面复制粘贴的 XML 文档以供参考)
为什么最后两个不能产生我想要的所有结果,而只能产生书本身?
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
首先,出于所有实际目的,
//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 教科书的该部分。