2008-09-02 2 views
8

Ich habe eine Anwendung, die Daten aus einer XML-Datei mit XPath extrahiert. Wenn ein Knoten in dieser XML-Quelldatei fehlt, möchte ich den Wert "N/A" zurückgeben (ähnlich der Oracle NVL-Funktion). Der Trick ist, dass die Anwendung XSLT nicht unterstützt; Ich möchte dies nur mit XPath und XPath tun.Kann ich einen Wert für ein fehlendes Tag in XPath erstellen?

Ist das möglich?

Antwort

5

Es kann aber nur ausgeführt werden, wenn der Rückgabewert, wenn der Knoten existiert, der String-Wert des Knotens ist, nicht der Knoten selbst. Die XPath

substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz))) 

den String-Wert des baz Element zurück, wenn es vorhanden ist, sonst wird die Zeichenfolge "N/A".

den Ansatz zu verallgemeinern:

substring(concat($null-value, $node), 
      (string-length($null-value) + 1) * number(boolean($node))) 

wo $null-value der Nullwert-String ist und $node der Ausdruck den Knoten auszuwählen. Wenn $node zu einem Knotensatz ausgewertet wird, der mehr als einen Knoten enthält, wird der Zeichenfolgenwert des ersten Knotens verwendet.

1

Es kann mit XPath 1.0 durchgeführt werden. Sagen Sie bitte

<foo> 
    <bar/> 
</foo> 

haben Wenn Sie testen möchten, ob foo ein baz Kind hat,

substring("N/A", 4 * number(boolean(/foo/baz))) 

zurückkehren wird „N/A“, wenn der Ausdruck /foo/baz eine leere Knotenmenge zurückgibt, andernfalls ist das Ergebnis eine leere Zeichenfolge.

1

@jelovirt

Also wenn ich das richtig verstehen, verketten wir die Standardantwort und den Wert des Knotens, und nehmen Sie dann die richtige Teilmenge des resultierenden Strings durch die Existenz des Knotens Testen der einzustellen Offset auf entweder Null oder die Position direkt nach meiner Standardzeichenfolge. Das ist das perverseste Verdrehen einer Sprache, die ich je gesehen habe. (Ich liebe es!)

Um zu verdeutlichen, was Sie gesagt haben, funktioniert dieser Ansatz, wenn der Knoten fehlt, nicht wenn der Knoten leer ist. Aber wenn "number (boolean ($ node))" durch "string-length ($ node)" ersetzt wird, funktioniert es stattdessen auf leeren Knoten.

2

Für leere Knoten, müssen Sie

boolean(string-length($node)) 

(Sie können den Anruf zu number() als die Besetzung von boolean Nummer implizit wird hier verzichtet werden.)

Verwandte Themen