2014-11-08 113 views
0

我有以下代碼,我想通過文本選擇標籤。我不能使用//label[text()='some label']//label[text()='other label']是因爲兩個原因:如何通過文本選擇節點省略節點的childes文本

  • 「//標籤[文本()」返回當前節點包括 跨度的內容,
  • 白色空間的全部內容。

我可以使用contains()函數,但我真的不想。

<label> 
<span>some span</span> 
    some label 
</label> 

<label> 
    other label 
<span>other span</span> 
</label> 

已解決???

//label[normalize-space(text()) = 'some label'] 

但爲什麼這剝離內部節點?我不明白。根據http://www.w3.org/TR/xpath/#function-normalize-space只能刪除空格,但不能刪除節點。

回答

0

如果使用

//label[text()[normalize-space() = 'some label']] 

那麼我希望你得到你想要的東西。它將但是也可以選擇像

<label>text1<span>span text</span>some label</label> 
混合內容和幾個孩子文本節點使用XPath 1.0

一般的標籤實在是有點困難,以應付各種可能的情況下,使用XPath 2.0,你可以做//label[normalize-space(string-join(text(), '')) = 'some label']哪個更精確。

+0

哪個語法更好:// label [text()[normalize-space()='some label']] vs // label [normalize-space(text())='some label'] – 2014-11-08 16:24:57

+0

爲什麼normalize-space()修剪內部節點更爲重要。這對我的理解至關重要。 – 2014-11-08 16:27:05

+0

您需要解釋什麼是「內部節點」,以及您在「normalize-space()修剪內部節點」時想要解釋的行爲。我的建議'//label [text()[normalize-space()='some label']]'和你的代碼之間的主要區別在於我的建議選擇了具有(至少)一個文本子節點其標準化的字符串值是'some label''爲什麼你的嘗試選擇'label'元素,其中第一個文本子節點的標準化字符串值是'some label'。在您的示例中,第一個文本子節點是空白區域。 – 2014-11-08 17:09:15