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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top