从XPath中选择First match

时间:2014-07-25 15:43:14

标签: xpath

XPath(书店/书籍/书名|书店/书籍/作者)选择标题,作者是否存在

如何选择这两者的第一场比赛,而不是两者,并为文档中的所有“书籍”节点获取此值

(书店/书籍/标题|书店/书籍/作者)[1]将结果限制在第一本书中的第一个“标题”。但我需要能够从文档中的其他书籍节点获得结果

1 个答案:

答案 0 :(得分:0)

我假设第一个'你的意思是“首先按文档顺序排列'而不是在我的XPath表达式中首次引用。'

在XPath 2.0中,您可以说

bookstore/book/((title|author)[1])

如果您只有XPath 1.0,请告诉我们,我们可以从那里开始。另外,让我们了解更广泛的环境(XSLT?XQuery?Javascript?),因为其中一些可能必须在XPath之外完成。

更新:我刚刚使用XPath 2.0的Simple Online XPath Tester对此进行了测试。给出以下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">
  <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>

和XPath表达式

/bookstore/book/((title|author)[1])

我得到以下输出,这似乎是你要求的:

  <title lang="en">Everyday Italian</title>
  <author>J K. Rowling</author>
  <title lang="en">XQuery Kick Start</title>
  <title lang="en">Learning XML</title>

对于XPath 1.0

如果您没有XPath 2.0,我怀疑您没有,并且您仍然希望在XPath中完成所有操作,这就是我要做的事情:

/bookstore/book/title[1] | /bookstore/book[not(title)]/author[1]

这是做什么的?它给出了每本书都有标题的(第一)标题,以及每本书没有标题的(第一)作者。

这个表达式不像你要求的那样完全:它假设<title>出现在<author>之前,就像它在你的样本数据中一样。如果你的数据在标题之前有作者,那么尽管有订单,上面的表达仍然会更喜欢标题。

如果您确实需要两者的第一,无论是作者还是作者,请尝试

/bookstore/book/title[1][not(preceding-sibling::author)] |
  /bookstore/book/author[1][not(preceding-sibling::title)]