2008-09-02 17 views
8

Tengo una aplicación que extrae datos de un archivo XML usando XPath. Si falta un nodo en ese archivo fuente XML, quiero devolver el valor "N/A" (muy parecido a la función NVL de Oracle). El truco es que la aplicación no es compatible con XSLT; Me gustaría hacer esto usando XPath y XPath solo.¿Puedo crear un valor para una etiqueta faltante en XPath?

¿Es esto posible?

Respuesta

5

Se puede hacer pero solo si el valor de retorno cuando el nodo existe es el valor de cadena del nodo, no el nodo en sí. El XPath

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

devolverá el valor de cadena del elemento baz si es que existe, de lo contrario la cadena "N/A".

generalizar el enfoque:

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

donde $null-value es la cadena de valor nulo y $node la expresión de seleccionar el nodo. Tenga en cuenta que si $node se evalúa como un conjunto de nodos que contiene más de un nodo, se utiliza el valor de cadena del primer nodo .

1

Se puede hacer con XPath 1.0. Digamos que tiene

<foo> 
    <bar/> 
</foo> 

Si desea probar si foo tiene un niño baz,

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

volverá "N/A" si la expresión /foo/baz devuelve un conjunto de nodos vacío, de lo contrario devuelve una cadena vacía

1

@jelovirt

Así que si lo entiendo correctamente, se concatena la respuesta defecto y el valor del nodo, y luego tomar el subconjunto correcto de la cadena resultante mediante pruebas de la existencia del nodo para establecer el desplazamiento a cero o la posición justo después de mi cadena por defecto. Ese es el giro más perverso de un idioma que he visto en mi vida. (¡Me encanta!)

Para aclarar lo que dices, este enfoque funciona cuando el nodo falta, no cuando el nodo está vacío. Pero reemplazando "number (boolean ($ node))" con "string-length ($ node)" funcionará en los nodos vacíos.

2

Para nodos vacíos, es necesario

boolean(string-length($node)) 

(se puede omitir la llamada a number() como el reparto del número booleano que está implícito aquí.)

Cuestiones relacionadas