web-dev-qa-db-ja.com

要素が存在し、空でないかどうかを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 関数を使用してみましたが、<PolNumber/>に対してtrueを返します。要素が存在し、空でないかどうかを確認するより良い方法はありますか?

編集:

これは、ラバの設定での名前空間マネージャーの設定です

<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>
20
Charu Khurana

使用

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

これは、_//acord:Holding/acord:Policy/acord:PolNumber_に最初のテキストノードの子がある場合はtrue()を生成し、そうでない場合はfalse()を生成します。

注意してください:これは、カウントを0と比較するためにすべてのテキストノードの子をカウントするよりも効率的です。

26

boolean(...)を使用して空かどうかを確認できますが、内部を見るエレメントを確認してください。

_boolean(//PolNumber/node())
_

これは、他のノードが含まれている場合にも機能します。テキストノードに制限する場合は、node()text()に置き換えます。代わりに//text()を使用することもできます。その場合、クエリは_<PolNumber/>_の他の子要素内のテキストノードに対してもtrueを生成します。

11
Jens Erat

expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"はどうですか?これはすべての状況で機能するはずです

2
user3190499

countを使用してテキストノードの数を取得する方法は次のとおりです。

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

私はここで少し遅れているかもしれませんが、答えは少し混乱しています。これは、テキストが空白またはスペースはあるが文字はない場合、常にfalseを返します。

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