XPath中的多个条件(和运算符)

Céd*_*non 12 xml xslt xpath

我有以下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)

我想所有namebookmyBooks那没有一个相应bookbooks(标题和作者).

因此,对于该示例,我想要检索:该书,"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)