Kann ich einen Wert für ein fehlendes Tag in XPath erstellen?

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.

Ist das möglich?

    
JPLemme 02.09.2008, 19:25
quelle

5 Antworten

5

Dies ist nur möglich, wenn der Rückgabewert, wenn der Knoten vorhanden ist, der Zeichenfolgenwert des Knotens und nicht der Knoten selbst ist. Der XPath

%Vor%

gibt den String-Wert des baz -Elements zurück, wenn es existiert, andernfalls die Zeichenfolge "N / A".

Um den Ansatz zu verallgemeinern:

%Vor%

Dabei ist $null-value die Nullwertzeichenfolge und $node der Ausdruck zum Auswählen des Knotens. Beachten Sie, dass wenn $node zu einem Knotensatz ausgewertet wird, der mehr als einen Knoten enthält, der Zeichenfolgenwert des ersten Knotens verwendet wird.

    
jelovirt 03.09.2008, 03:58
quelle
3

Kurze Antwort: Nein. Eine solche Funktion wurde für Version 2 der XPath-Spezifikation berücksichtigt und ausdrücklich abgelehnt (siehe die nicht normative Illustrative User-written Abschnitt Funktionen ).

    
Hank Gay 02.09.2008 20:01
quelle
2

Für leere Knoten benötigen Sie

%Vor%

(Sie können den Aufruf von number() weglassen, da die Umwandlung von boolesch zu Zahl hier implizit ist.)

    
jelovirt 04.09.2008 03:28
quelle
1

Dies kann mit XPath 1.0 geschehen. Angenommen, Sie haben

%Vor%

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

%Vor%

gibt "N / A" zurück, wenn der Ausdruck /foo/baz eine leere Knotenmenge zurückgibt, andernfalls wird eine leere Zeichenfolge zurückgegeben.

    
jelovirt 03.09.2008 03:40
quelle
1

@jelovirt

Wenn ich das also richtig verstehe, verketten wir die Standardantwort und den Wert des Knotens und nehmen dann die korrekte Teilmenge der resultierenden Zeichenkette, indem wir auf die Existenz des Knotens prüfen, um den Versatz entweder auf Null oder auf die Position zu setzen 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.

    
JPLemme 03.09.2008 13:54
quelle

Tags und Links