2013-04-09 120 views
14

我已經在這條線的輸入XML的東西:如何判斷一個元素是否存在而非空,使用XPath?

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

我對這個XML操作取決於如果<PolNumber>(其架構中的可選元素)的值或沒有。我使用的騾子3.3 xpath評估要做到這一點,我的XPath表達式如下這樣:

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

這隻要<PolNumber>元素存在或<PolNumber/>是空元素工作正常。但是,如果<PolNumber>不存在,則上述表達式會引發異常。

我嘗試使用XPath boolean函數,但它返回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> 

回答

21

使用

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

這將產生true()如果//acord:Holding/acord:Policy/acord:PolNumber具有第一文本節點孩子,和false()否則。

請注意:這比計算所有的文本節點孩子剛與0

+0

我同意這樣更好比計算所有文本節點的孩子,但即使這種解決方案不是完整的證明。這個xpath將返回爲''。我不知道如何在評論中顯示新行,但是我的意圖是在''和'' – 2013-04-10 16:39:04

+2

@Learner之間有新的行字符,這是直接的:'boolean(// acord:Holding/acord :Policy/acord:PolNumber/text()[normalize-space()] [1])' – 2013-04-10 17:22:07

+1

謝謝Dimitre。我沒有用xpath進行曝光,所有這些都對我非常有幫助。 – 2013-04-10 18:07:23

1

有關使用count獲得文本節點的數量是什麼:

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

感謝您的回覆。 '沒有這樣的功能{org.jaxen.SimpleFunctionContext:127'異常是拋出計數功能{0}。 – 2013-04-09 18:31:16

+0

我把上面的表達式改成了''然後這個工作,但是,''計數是非零,就像'boolean'函數 – 2013-04-09 18:43:44

+0

奇怪你必須用'fn'作爲前綴編輯你的問題並顯示如何配置你的名字空間管理器。 – 2013-04-09 18:43:46

8

您可以使用boolean(...)檢查是否爲空,但請務必看看裏面的元素。

boolean(//PolNumber/node()) 

這也適用於包含其他節點的情況。如果要限制爲文本節點,請將node()替換爲text()。您可能想要使用//text()來代替,那麼查詢也會在<PolNumber/>的其他子元素內的文本節點上生成true。

2

如何expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"比較計數更有效率?這應該在所有情況下工作

0

也許我在這裏有點晚,但答案有點混亂。 當文字爲空或空格但沒有字符時,這一個將始終返回false。

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()] 
相關問題