Как определить использование XPath, если элемент присутствует и не пуст?

У меня есть входной XML-код в этой строке:

<Holding id="12">
    <Policy>
        <HoldingForm tc="1">Individual</HoldingForm>
        <PolNumber>848433</PolNumber>
        <LineOfBusiness tc="1">Life</LineOfBusiness>
        <CarrierCode>67644</CarrierCode>
    </Policy>
</Holding>

Мои манипуляции с этим XML зависят от того, имеет ли значение <PolNumber> (его необязательный элемент в схеме) или нет. Я использую оценщик Mule 3.3 xpath для этого, и выражение XPath выглядит так:

<expression-filter expression="#[xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"/> 

Это работает отлично, пока присутствует элемент <PolNumber> или <PolNumber/> - пустой элемент. Но если <PolNumber> отсутствует, выражение выше генерирует исключение.

Я попытался использовать XPath boolean, но он возвращает true для <PolNumber/>. Есть ли лучший способ проверить, присутствует ли элемент и не пуст?

EDIT:

Это конфигурация менеджера пространства имен в моей конфигурации mule

<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>

Ответы

Ответ 1

Использование

boolean(//acord:Holding/acord:Policy/acord:PolNumber/text()[1])

получается true(), если //acord:Holding/acord:Policy/acord:PolNumber имеет первый текст node, а false() в противном случае.

Обратите внимание. Это более эффективно, чем подсчет всех текстовых node детей, чтобы сравнить количество с 0.

Ответ 2

Вы можете использовать boolean(...) для проверки того, пуст ли он, но обязательно посмотрите внутри элемента.

boolean(//PolNumber/node())

Это также работает, если содержатся другие узлы. Если вы хотите ограничить текстовые узлы, замените node() на text(). Вместо этого вы можете использовать //text(), тогда запрос также даст true для текстовых узлов внутри других дочерних элементов <PolNumber/>.

Ответ 3

Как насчет expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"? Это должно работать во всех ситуациях.

Ответ 4

Как насчет использования count для получения количества текстовых узлов:

<expression-filter
    expression="#[xpath('count(//Holding/Policy/PolNumber/child::text())') != 0]"/>

Ответ 5

Возможно, я немного опоздал, но ответы немного запутанны. Это всегда будет возвращать false, когда текст пуст или с пробелами, но без символов.

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()]