21

この行に何か入力 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.3xpathエバリュエーターを使用しています。私の XPath 式は次のようになります。

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

<PolNumber>要素が存在するか<PolNumber/>空の要素である限り、これは正常に機能します。しかし、<PolNumber>が存在しない場合、上記の式は例外をスローします。

XPath ブール関数を使用してみましたが、 for が返さtrue<PolNumber/>ます。要素が存在し、空でないかどうかを確認するより良い方法はありますか?

編集:

これは、私のミュール構成の名前空間マネージャーの構成です

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

5 に答える 5

29

使用:

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

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

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

于 2013-04-10T02:38:46.623 に答える
2

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

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()]
于 2015-10-01T07:39:35.907 に答える
2

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

于 2014-09-17T18:19:16.230 に答える