XPath-Abfrage mit variable mehrere Bedingungen
Lange Zeit Zuhörer, zum ersten mal Anrufer. Ich bin relativ neu in XPath und sah mehrere andere threads hier und anderswo, aber ich kann nicht scheinen, um eine Abfrage zu arbeiten, jede Hilfe wäre toll.
Ich habe die XML wie folgt:
<catalog>
<book pgid="28054" lang="en">
<title>The Brothers Karamazov</title>
<author>Dostoyevsky, Fyodor</author>
<friendly_title>The Brothers Karamazov by Fyodor Dostoyevsky</friendly_title>
<file>
<type>ePub</type>
<path>cache/generated/28054/</path>
<name>pg28054.epub</name>
<size>800</size>
</file>
<file>
<type>PDF</type>
<path>2/8/0/5/28054/</path>
<name>28054-pdf.pdf</name>
<size>5829</size>
</file>
<file>
<type compression="zipped">PDF</type>
<path>2/8/0/5/28054/</path>
<name>28054-pdf.zip</name>
<size>1693</size>
</file>
<file>
<type encoding="utf-8" compression="zipped">Text</type>
<path>2/8/0/5/28054/</path>
<name>28054-0.zip</name>
<size>726</size>
</file>
</book>
</catalog>
(Katalog ist das root-element, und in diesem Beispiel gibt es keine <contributor>
Elemente)
Habe ich die Abfrage funktioniert auf Autor, Mitwirkende, Titel und Sprache sucht, aber ich bin immer aufgehängt, die auf das hinzufügen eines Dateityp-Zustand. Diese Abfrage finden Sie Bücher mit Autor enthält "Dostojewski" und den Titel mit "Brüder" mit der Sprache "en" ist arbeiten (D. H. der erwarteten Ergebnisse), aber wenn es einen besseren Weg, es zu schreiben, ich bin ganz Ohr:
/catalog//book/*[(contains(self::author,'Dostoyevsky') or contains(self::contributor,'Dostoyevsky')) and contains(../title,'Brothers') and ../@lang = 'en']
Was ich nicht an die Arbeit ist die Begrenzung der Abfrage-Ergebnisse, um Dateien von einem bestimmten Typ, D. H. das Anhängen and ../file/type='PDF'
oder so etwas. Hatte kein Glück mit |
Gewerkschaften entweder.
Vielen Dank im Voraus.
Oh, und wenn es darauf ankommt, die Abfrage muss gebaut werden dynamisch (form input), so muss es behalten eine Universelle syntax, die Arbeit mit einer beliebigen Anzahl von Benutzer-angegebenen Kriterien.
- Bitte, machen Sie Ihre Hausaufgaben und mindestens einen echten, wohlgeformten und sinnvollen XML-Dokument.
- Was wollen Sie, Dimitre? Das ist mein richtiger XML. Ich glaube nicht, dass der Inhalt relevant war.
- Dimitre ist richtig, dein XML ist nicht wohlgeformt. Die, wie Sie schreiben, Ihre lang-Attribut ist nicht XML. Sollten Sie aktualisieren Sie Ihre Frage, um ihn gültig zu machen (z.B. lang="...").
- Ok, sorry, zu verwirren. Es ist mehr Los als hier relevant ist diese Frage, und ich habe nur versucht, die Versorgung der entsprechenden Vorlage und so entschieden wir uns für einige Kürzel. Natürlich ist der Inhalt lang='de' (oder was auch immer).
- Auch, wenn Sie das Problem beheben mit dem Attribut, würden Sie sich die Mühe, füllen Sie die Elemente mit Inhalt? Was Sie geboten haben, sieht mehr aus wie ein "Skelett" einer realen XML-Dokument.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich dir Recht, dies sollte funktionieren :
Beachten Sie, dass der filter direkt auf die
catalog
element.Wenn Sie versuchen, um
book
Elemente, vielleicht sollte man verwenden/catalog[file/type=...]//book[test1][test2][test3]...
mit Ihren verschiedenen Einschränkungen. Jeder neue test als filter fungieren.... and contains(text(), 'Some text 1') and ../td[4] = 'Some text ...
Den XPath-Ausdruck oben ist nicht nur Recht unvollkommen und absolut un-formatiert und lesbar ist, aber, noch wichtiger ist, es nicht (wie angegeben) wählen Sie
book
element (Sie können wählen Sie eineauthor
). Auch die//
pseudo-operator ist nicht notwendig und kann erheblich reduzieren die Effizienz der XPath-Auswertung auf realen mittleren bis großen XML-Dokument.Hier ist ein XPath-Ausdruck, der auswählt, was Sie wollen:
Dieser "universal-syntax kann wie folgt Aussehen:
wo
$pName1
,$pName2
, ...,$pNameK
sollte ersetzt werden durch die Namen der Felder, die der Benutzer angegeben, die in der Suche nach form und$pString1
,$pString2
, ...,$pStringK
sollte ersetzt werden durch die Daten, die der Benutzer angegeben hat, enthalten sein soll, in die entsprechenden Felder ein.Einen einfacheren Weg, dies zu tun ist, um einen filter für die zwei/drei Bedingungen abgesondert und sich Ihnen anzuschließen,
Die pipe (|) kombinieren jedes Ergebnis