Ich versuche eine Xpath-Anweisung (1.0) zu schreiben, die Informationen von einem "Such" -Knoten lesen und eine Suche damit durchführen kann.Wie kann ich die Xpath-Funktion 'contains()' verwenden, um nichts zurückzugeben, wenn der Suchparameter leer ist oder fehlt/false?
Ich machte einige nette Fortschritte, stieß aber auf ein Problem, wo, wenn ein Attribut (für einen Wert in der Suche verwendet) leer ist oder nicht existiert, schlägt es fehl.
-Code Edited zu vereinfachen Beispiel:
So Hier ist mein Beispiel XML:
<xml>
<files>
<file name="foo" description="" rating="4"/>
<file name="food" description="" rating="4"/>
<file name="foobar" description="" rating="3"/>
<file name="bar" description="" rating="3"/>
<file name="barter" description="" rating="3"/>
<file name="barterer" description="" rating="2"/>
</files>
<searches>
<search id="1">
<exclude>
<file term="foo"/>
</exclude>
</search>
</searches>
</xml>
und Arbeits XPATH:
//files/file[
not(contains(@name, //search[@id='1']/exclude/file/@term))
]
Es funktioniert wie erwartet ...
Wenn jedoch das erwartete Attribut i s fehlt oder leer es wird nicht funktionieren. Ich denke, weil: enthält (@attrib, "") passt alles aus irgendeinem Grund, daher wird ein not() immer nichts zusammen, wenn das Attribut "" oder nicht vorhanden ist.
Zum Beispiel, wenn ich das ausschließen Fragment von XML dies ändern scheitert es:
<exclude>
<file term=""/>
</exclude>
mit diesem zu:
<exclude></exclude>
Gibt es eine Möglichkeit für einen leeren Wert zu prüfen und nicht die Auswahl durchführen? Oder gibt es vielleicht einen besseren Weg, die Logik zu strukturieren? Ich kann nicht Conditionals oder die anderen Funktionen in Xpath2.0 verwenden.
Könnten Sie bitte, bearbeiten Sie die Frage und die Regeln beschreiben für eine Suche Spiel zu finden - diese werden nicht zur Verfügung gestellt und den langen XPath-Ausdruck ist ziemlich verwirrend - Ich vermute, dass ein kürzerer Ausdruck verwendet werden kann. Zum Beispiel: 'cond1 und cond2 oder cond1 oder cond2' kann einfach durch den kürzeren, äquivalenten Ausdruck' cond1 oder cond2' ersetzt werden. –
Entschuldigung. Ich habe die Code-Beispiele aktualisiert, um deutlicher auf mein Problem hinzuweisen. – Futile32
@ Futile32, vielleicht bekommt Ihr XPath die Knoten mit name = "", und weil Sie keine leer haben, bekommen Sie keine. –