この行に何か入力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>
使用:
_boolean(//acord:Holding/acord:Policy/acord:PolNumber/text()[1])
_
これは、_//acord:Holding/acord:Policy/acord:PolNumber
_に最初のテキストノードの子がある場合はtrue()
を生成し、そうでない場合はfalse()
を生成します。
注意してください:これは、カウントを0と比較するためにすべてのテキストノードの子をカウントするよりも効率的です。
boolean(...)
を使用して空かどうかを確認できますが、内部を見るエレメントを確認してください。
_boolean(//PolNumber/node())
_
これは、他のノードが含まれている場合にも機能します。テキストノードに制限する場合は、node()
をtext()
に置き換えます。代わりに//text()
を使用することもできます。その場合、クエリは_<PolNumber/>
_の他の子要素内のテキストノードに対してもtrueを生成します。
expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"
はどうですか?これはすべての状況で機能するはずです
count
を使用してテキストノードの数を取得する方法は次のとおりです。
<expression-filter
expression="#[xpath('count(//Holding/Policy/PolNumber/child::text())') != 0]"/>
私はここで少し遅れているかもしれませんが、答えは少し混乱しています。これは、テキストが空白またはスペースはあるが文字はない場合、常にfalseを返します。
boolean//Holding/Policy/PolNumber/child/text()[normalize-space()]