Posso creare un valore per un tag mancante in XPath?
Domanda
Ho un'applicazione che estrae i dati da un file XML utilizzando XPath.Se manca un nodo nel file sorgente XML, voglio restituire il valore "N/A" (molto simile alla funzione Oracle NVL).Il problema è che l'applicazione non supporta XSLT;Mi piacerebbe farlo utilizzando XPath e XPath da solo.
È possibile?
Soluzione
Può essere fatto, ma solo se il valore restituito quando il nodo esiste è il valore stringa del nodo, non il nodo stesso.L'XPath
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
restituirà il valore stringa di baz
elemento se esiste, altrimenti la stringa "N/A".
Per generalizzare l’approccio:
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
Dove $null-value
è la stringa con valore nullo e $node
l'espressione per selezionare il nodo.Tieni presente che se $node
restituisce un set di nodi che contiene più di un nodo, il valore stringa di Primo viene utilizzato il nodo.
Altri suggerimenti
Risposta breve:NO.Tale funzione è stata presa in considerazione ed esplicitamente rifiutata per la versione 2 delle specifiche XPath (vedi non-normative Sezione illustrativa delle funzioni scritte dall'utente).
Per i nodi vuoti, è necessario
boolean(string-length($node))
(Puoi omettere la chiamata a number()
poiché la conversione da booleano a numero è qui implicita.)
Può essere fatto con XPath 1.0.Di' di averlo fatto
<foo>
<bar/>
</foo>
Se vuoi testare se foo
ha un baz
bambino,
substring("N/A", 4 * number(boolean(/foo/baz)))
restituirà "N/A" se l'espressione /foo/baz
restituisce un set di nodi vuoto, altrimenti restituisce una stringa vuota.
@jelovirt
Quindi, se ho capito bene, concateniamo la risposta predefinita e il valore del nodo, quindi prendiamo il sottoinsieme corretto della stringa risultante verificando l'esistenza del nodo per impostare l'offset su zero o sulla posizione subito dopo il mio stringa predefinita.Questa è la distorsione linguistica più perversa che abbia mai visto.(Lo adoro!)
Per chiarire quello che hai detto, questo approccio funziona quando manca il nodo, non quando il nodo è vuoto.Ma sostituendo "number(boolean($node))" con "string-length($node)" funzionerà invece su nodi vuoti.