XPath查询:查询无法按预期工作

时间:2012-11-02 07:16:24

标签: xpath

我正在使用以下xml文档学习XPath:http://www.w3schools.com/xpath/xpath_examples.asp

现在,当我执行查询时:

bookstore/book/author[contains(.,'G')]

我按预期得到结果:Giada De Laurentiis, James McGovern。现在,由于contains()返回一个布尔值,我希望以下查询返回所有作者:

bookstore/book/author[true]

然而,它返回一个空集。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

您需要bookstore/book/author

更新:要将true传递到XPATH,您必须使用bookstore/book/author[true()]
author[true]仅表示您希望获取具有author子元素的所有true元素。

您可以自己检查,尝试表达式

bookstore/book[author1] vs bookstore/book[author]

第一个没有返回任何内容,因为没有带有book子元素的author1元素。第二个返回所有元素。但是,如果您从某些图书节点中删除author个子节点,则只会获得具有author子节点的子节点。

所以如果你像这样使用xml

<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>
    </book>
</bookstore>

然后 bookstore/book[author]返回

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

bookstore/book[title]返回

<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>
</book>

答案 1 :(得分:0)

  

我希望以下查询返回所有作者:

bookstore/book/author[true]
     

然而,它返回一个空集。有人可以解释一下吗?

上面的表达式选择具有名为bookstore/book/author的子元素的所有true元素。在提供的XML文档中,没有author元素具有名为true的子元素 - 因此XPath表达式不会选择任何内容。

在评论中,OP要求

  

但为什么bookstore/book/author[true]不起作用,因为如果是的话   类似于contains()总是返回true的情况

contains()永远不会返回(字符串)“true” - 它返回 boolean true() - 这与字符串“true”不同。

<强>解释

您对布尔值true()到sting的序列化是字符串“true”这一事实感到困惑。

这个事实并不意味着字符串“true”和布尔值true()是相同的。