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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top