Kann ich einen Wert für ein fehlendes Tag in XPath erstellen?
Frage
Ich habe eine Anwendung, die mithilfe von XPath Daten aus einer XML-Datei extrahiert.Wenn ein Knoten in dieser XML-Quelldatei fehlt, möchte ich den Wert „N/A“ zurückgeben (ähnlich wie die Oracle NVL-Funktion).Der Trick besteht darin, dass die Anwendung kein XSLT unterstützt.Ich würde dies gerne mit XPath und XPath allein tun.
Ist das möglich?
Lösung
Dies ist jedoch nur möglich, wenn der Rückgabewert vorhanden ist, wenn der Knoten vorhanden ist der Zeichenfolgenwert des Knotens, nicht der Knoten selbst.Der XPath
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
gibt den String-Wert zurück baz
Element, falls vorhanden, andernfalls die Zeichenfolge „N/A“.
Um den Ansatz zu verallgemeinern:
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
Wo $null-value
ist die Nullwertzeichenfolge und $node
der Ausdruck zum Auswählen des Knotens.Beachten Sie, dass wenn $node
ergibt einen Knotensatz, der mehr als einen Knoten enthält, den Zeichenfolgenwert des Erste Knoten verwendet wird.
Andere Tipps
Kurze Antwort:NEIN.Eine solche Funktion wurde für Version 2 der XPath-Spezifikation in Betracht gezogen und explizit abgelehnt (siehe die nicht normative Abschnitt „Veranschaulichende benutzerdefinierte Funktionen“.).
Für leere Knoten benötigen Sie
boolean(string-length($node))
(Sie können den Anruf weglassen number()
da die Umwandlung von Boolesch in Zahl hier implizit ist.)
Dies ist mit XPath 1.0 möglich.Sagen wir, das haben Sie
<foo>
<bar/>
</foo>
Wenn Sie testen möchten, ob foo
hat ein baz
Kind,
substring("N/A", 4 * number(boolean(/foo/baz)))
gibt „N/A“ zurück, wenn der Ausdruck /foo/baz
gibt eine leere Knotenmenge zurück, andernfalls wird eine leere Zeichenfolge zurückgegeben.
@jelovirt
Wenn ich das also richtig verstehe, verketten wir die Standardantwort und den Wert des Knotens und nehmen dann die richtige Teilmenge der resultierenden Zeichenfolge, indem wir die Existenz des Knotens testen, um den Offset entweder auf Null oder auf die Position direkt nach my zu setzen Standardzeichenfolge.Das ist die perverseste Sprachverdrehung, die ich je gesehen habe.(Ich liebe es!)
Um zu verdeutlichen, was Sie gesagt haben: Dieser Ansatz funktioniert, wenn der Knoten fehlt, nicht, wenn der Knoten leer ist.Wenn Sie jedoch „number(boolean($node))“ durch „string-length($node)“ ersetzen, funktioniert es stattdessen auf leeren Knoten.