我有以下XML:
<bookstore>
<books>
<book name="book1" title="Title 1" author="Author 1"/>
<book name="book2" title="Title 2" author="Author 2"/>
<book name="book3" title="Title 1" author="Author 2"/>
</books>
<myBooks>
<book name="Test1" title="Title 1" author="Author 1"/>
<book name="Test2" title="Title 2" author="Author 1"/>
<book name="Test3" title="Title 1" author="Author 2"/>
</myBooks>
</bookstore>
Run Code Online (Sandbox Code Playgroud)
我想所有name的book在myBooks那没有一个相应book的books(标题和作者).
因此,对于该示例,我想要检索:该书,"Test2"因为该对("Title 2", "Author 1")不存在books.
到目前为止,我有:
//myBooks/book[not(@title = //books/book/@title and @author = //books/book/@author)]
Run Code Online (Sandbox Code Playgroud)
但是,当然,在这种情况下,上述XPath不起作用,因为存在组合("标题2","作者1")(来自"book2"和"book1").
如何and在同一节点上应用运算符?
Ian*_*rts 11
这取决于XPath的版本.
您不能在单个XPath 1.0表达式中执行此操作,因为它需要类似的结构
/bookstore/myBooks/book[/bookstore/books/book[
@title = _outer-predicate_/@title and
@author = _outer-predicate_/@author]]/@name
Run Code Online (Sandbox Code Playgroud)
即你需要捕获外部谓词测试的书,这样你就可以将它与内部谓词进行比较.纯XPath 1.0不支持这一点,你必须迭代myBooks你自己的内容(例如xsl:for-each,你已经标记了你的问题"xslt").
在XPath 2.0中,您可以使用显式量词在一个表达式中执行此操作
/bookstore/myBooks/book[not(some $book in /bookstore/books/book satisfies
($book/@author = @author and $book/@title = @title))]/@name
Run Code Online (Sandbox Code Playgroud)