XPath(书店/书籍/书名|书店/书籍/作者)选择标题,作者是否存在
如何选择这两者的第一场比赛,而不是两者,并为文档中的所有“书籍”节点获取此值
(书店/书籍/标题|书店/书籍/作者)[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 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)]