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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top