online node example attribute and xml xslt xpath

xml - node - ¿Puedo crear un valor para una etiqueta faltante en XPath?



xpath xml (5)

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.

¿Es eso posible?


Respuesta corta: no. Dicha función se consideró y se rechazó explícitamente para la versión 2 de la especificación XPath (consulte la sección no normativa de Funciones escritas por el usuario ).


@jelovirt

Entonces, si entiendo esto correctamente, concatenamos la respuesta predeterminada y el valor del nodo, y luego tomamos el subconjunto correcto de la cadena resultante probando 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. (¡Lo amo!)

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


Se puede hacer con XPath 1.0. Digamos que tienes

<foo> <bar/> </foo>

Si quieres probar si foo tiene un hijo baz ,

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

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


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 existe, de lo contrario la cadena "N / A".

Para 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 para seleccionar el nodo. Tenga en cuenta que si $node evalúa a un conjunto de nodos que contiene más de un nodo, se utiliza el valor de cadena del primer nodo.


Para nodos vacíos, necesita

boolean(string-length($node))

(Puede omitir la llamada al number() ya que el reparto de booleano a número está implícito aquí).