Mehrere Bedingungen (und Operator) in XPath

8

Ich habe folgendes XML:

%Vor%

Ich möchte alle name von book in myBooks erhalten, die keine entsprechende book in books (Titel und Autor) haben.

Also, für das Beispiel möchte ich Folgendes abrufen: das Buch "Test2" , weil das Paar ("Title 2", "Author 1") nicht in books existiert.

Bisher habe ich:

%Vor%

Aber natürlich funktioniert in diesem Fall der obige XPath nicht, weil die Kombination ("Titel 2", "Autor 1") existiert (aus "book2" und "book1").

Wie kann ich den Operator and auf demselben Knoten anwenden?

    
Cédric Bignon 23.06.2014, 19:07
quelle

3 Antworten

7

Das hängt von der Version von XPath ab.

Dies ist in einem einzelnen XPath 1.0-Ausdruck nicht möglich, da hierfür eine Struktur wie

erforderlich wäre %Vor%

d. Sie müssten das zu testende Buch mit dem äußeren Prädikat aufnehmen, damit Sie es mit dem inneren Prädikat vergleichen können. Pure XPath 1.0 unterstützt dies nicht, Sie müssten den Inhalt von myBooks selbst durchlaufen (z. B. mit einem xsl:for-each , da Sie Ihre Frage "xslt" getaggt haben).

In XPath 2.0 können Sie dies in einem Ausdruck mit einem expliziten Quantifizierer tun

%Vor%     
Ian Roberts 23.06.2014, 19:21
quelle
3

Unter der Annahme von XSLT würde ich einen Schlüssel <xsl:key name="book" match="books/book" use="concat(@title, '|', @author)"/> definieren und dann im Prädikat [not(key('book', concat(@title, '|', @author)))] überprüfen.

    
Martin Honnen 23.06.2014 19:25
quelle
2

Sie können Attributwerte mit concat() verketten und vergleichen:

%Vor%

Für jedes book in myBook wird die Verkettung der Attribute title und author abgerufen und für jede book in books mit derselben Verkettung verglichen.

Demo (mit xmllint ):

%Vor%     
alecxe 23.06.2014 19:31
quelle

Tags und Links