2013-04-22 59 views
1

我想構建一個xpath表達式,該表達式評估XML代碼,然後僅在當前段落後跟編號列表時匹配。XPath以下兄弟表達式似乎返回子文本而不是跟隨兄弟節點

這裏是我的XML:

<para><b>Some text</b></para> 
<numlist> 
    <numlitem><para>List item #1</para></numlitem> 
    <numlitem><para>List item #2</para></numlitem> 
    <numlitem><para>List item #3</para></numlitem> 
</numlitem> 

我使用XPath表達式是:

para[following-sibling::*[1]=numlist] 

然而,這並沒有返回true。如果我評估以下xpath表達式

para[following-sibling::*[1] 

結果是「某些文本」。但由於< b>是< para>的孩子,所以我不會期待這些結果。

下面的表達式返回true

para[following-sibling::numlist] 

,所以我知道它看到numlist爲下面的兄弟姐妹,但我只希望它返回true,如果< numlist>是繼<對第一個兄弟>。

我正在使用XML軟件應用程序,該應用程序基於元素的特定上下文和條件應用樣式,其中xpath可用於確定。我試圖找出問題出在軟件上(我需要提交一個錯誤報告),或者如果這是我的xpath表達式的問題,我需要找出正確的表達式。

任何幫助,非常感謝!

回答

1

元素名稱進行評估在當前的情況下,所以para[numlist]的意思是「帶小孩numlist元素」。同樣:

para[following-sibling::*[1]=numlist] 

辦法「para其第一following-sibling::*具有相同的字符串值作爲任何一個孩子numlist」元素。由於該段沒有numlist孩子,所以這個謂詞總是假的。

相等性測試使用節點的字符串值,而不是節點標識或節點名稱,因此[element=otherelement]幾乎從不是您想要使用的。

如果您想要血淋淋的細節,請閱讀XPath spec中關於布爾表達式的這些段落。這裏最重要的是這樣的:

如果兩個要比較的對象都是節點集,那麼當且僅當第一個節點集中存在一個節點而第二個節點集中有一個節點節點集合,使得對兩個節點的字符串值執行比較的結果是真實的。

你真正的意思是說名以下同胞元素的是 'numlist':

para[name(following-sibling::*[1])='numlist'] 

或者:

para[following-sibling::*[1]/self::numlist] 
+0

感謝您的澄清。我去了第一個選項: 'para [name(following-sibling :: * [1])='numlist']' 我看到我的錯誤,並且這個工作完美。謝謝!! – tcarano 2013-04-22 22:28:05

+0

@JLRishe,修改。 – 2013-04-22 22:46:19

+0

很酷。我收回了我的評論。 – JLRishe 2013-04-22 22:54:51

0

1)您的xml示例格式不正確。

2)試試這個XPath表達式:

para/following-sibling::*[1][self::numlist] 

上述表達式只是匹配的節點,如果你想要一個布爾結果,你需要的boolean()功能:

boolean(para/following-sibling::*[1][self::numlist]) 
+0

的XML錯誤是一個錯字.. 。源XML是格式良好的,但是我手動輸入了結束標籤,因爲我在複製時沒有抓住它。感謝您指出了這一點;我編輯了原件來修復它。 我使用了之前的評論者的建議 'para [name(follow-sibling :: * [1])='numlist']' 它工作得很好。感謝您的答覆! – tcarano 2013-04-22 22:31:25