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.