pattern node attribute xml xpath mule

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.