xml - node - xpath pattern
¿Cómo saber usar XPath si un elemento está presente y no está vacío? (5)
Tengo una entrada XML algo en esta línea:
<Holding id="12">
<Policy>
<HoldingForm tc="1">Individual</HoldingForm>
<PolNumber>848433</PolNumber>
<LineOfBusiness tc="1">Life</LineOfBusiness>
<CarrierCode>67644</CarrierCode>
</Policy>
</Holding>
Mi manipulación en este XML depende de si <PolNumber>
(es un elemento opcional en el esquema) tiene un valor o no. Estoy usando el evaluador xpath
Mule 3.3 para hacer esto y mi expresión XPath tiene este aspecto:
<expression-filter expression="#[xpath(''//acord:Holding/acord:Policy/acord:PolNumber'').text != empty]"/>
Esto funciona bien siempre y <PolNumber>
elemento <PolNumber>
esté presente o <PolNumber/>
esté vacío. Pero si <PolNumber>
está ausente, la expresión por encima de la excepción arroja una excepción.
Intenté usar la función booleana XPath pero devuelve true
para <PolNumber/>
. ¿Hay una mejor manera de verificar si un elemento está presente y no está vacío?
EDITAR:
Esta es la configuración del gestor de espacio de nombres en mi mule config.
<xm:namespace-manager includeConfigNamespaces="true">
<xm:namespace prefix="acord" uri="http://ACORD.org/Standards/Life/2" />
<xm:namespace prefix="soap" uri="http://schemas.xmlsoap.org/soap/encoding/" />
</xm:namespace-manager>
¿Qué hay de expression="#[?xpath(''//acord:Holding/acord:Policy/acord:PolNumber'').text != empty]"
? Esto debería funcionar en todas las situaciones.
¿Qué pasa con el uso de count
para obtener el número de nodos de texto:
<expression-filter
expression="#[xpath(''count(//Holding/Policy/PolNumber/child::text())'') != 0]"/>
Puede usar boolean(...)
para verificar si está vacío, pero asegúrese de mirar dentro del elemento.
boolean(//PolNumber/node())
Esto también funciona si otros nodos están contenidos. Si desea limitar los nodos de texto, reemplace el node()
por text()
. Es posible que desee utilizar //text()
lugar, entonces la consulta también será verdadera para los nodos de texto dentro de otros elementos secundarios de <PolNumber/>
.
Tal vez llego un poco tarde aquí, pero las respuestas son un poco confusas. Este siempre devolverá falso cuando el texto esté en blanco o con espacios pero sin caracteres.
boolean//Holding/Policy/PolNumber/child/text()[normalize-space()]
Uso :
boolean(//acord:Holding/acord:Policy/acord:PolNumber/text()[1])
esto produce true()
if //acord:Holding/acord:Policy/acord:PolNumber
tiene un primer hijo de nodo de texto, y false()
caso contrario.
Tenga en cuenta : Esto es más eficiente que contar todos los hijos de nodos de texto solo para comparar el recuento con 0.