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í).