¿Puedo crear un valor para una etiqueta que falta en XPath?
Pregunta
Tengo una aplicación que extrae datos de un archivo XML mediante XPath.Si falta un nodo en ese archivo fuente XML, quiero devolver el valor "N/A" (muy parecido a la función Oracle NVL).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?
Solución
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 baz
elemento 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)))
dónde $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 como un conjunto de nodos que contiene más de un nodo, el valor de cadena del primero Se utiliza el nodo.
Otros consejos
Respuesta corta:No.Esta 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 Sección ilustrativa de funciones escritas por el usuario).
Para nodos vacíos, necesita
boolean(string-length($node))
(Puedes omitir la llamada a number()
ya que la conversión de booleano a número está implícita aquí).
Se puede hacer con XPath 1.0.di que tienes
<foo>
<bar/>
</foo>
Si quieres probar si foo
tiene un baz
niño,
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.
@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 en cero o en la posición justo después de mi cadena predeterminada.Ésa es la torsión de lenguaje más perversa que he visto jamás.(¡Me encanta!)
Para aclarar lo que dijiste, este enfoque funciona cuando falta el nodo, no cuando el nodo está vacío.Pero al reemplazar "número (booleano ($ nodo))" con "longitud de cadena ($ nodo)", funcionará en nodos vacíos.