xpath 使用 // 以及后代或自我和自我

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

我正在尝试获得与哈利·波特同年的所有书名

"/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>
xml xpath
1个回答
5
投票

首先,出于所有实际目的,

//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 教科书的该部分。

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