Как определить использование 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()]