2013-03-12 64 views
1

是否有可能找到只有anchor(和可選空白)的段落作爲使用XPath的子項?我可以得到「// p [a和not(* [not(self :: a)]或text())]」,如果段落和錨點標記之間沒有任何空格,則可以很好地工作。我可以使用xpath查找僅帶錨點的段落嗎?

舉一些具體的例子,我想有一個查詢,將匹配這些(目前只匹配第一個):

 
    <p><a>link</a></p> 
    <p> <a>link with leading spaces</a></p> 
    <p><a>link with trailing spaces</a> </p> 
    <p> <a>link with leading and trailing spaces</a> </p> 
但不匹配這些:
 
    <p>Intro text <a>link</a> outro text.</p> 
    <p><a>link</a> outro text.</p> 
    <p>Intro text <a>link</a></p> 

回答

0

我發現下面略高於@ WST的解決方案更好,它也可以使用XPath 1.0:

//p[a and not(*[not(self::a)] or text()[normalize-space()])] 
+0

到目前爲止,我喜歡這個簡單! – 2013-03-13 16:04:40

1

關閉。使用normalize-space

//p[a and not(*[not(self::a)] or normalize-space(string-join(text(),"")))] 

string-join用於獲取周圍正常化空間只接受一個字符串作爲輸入的事實。

1

我解決這樣說:

您正在尋找包含所有<p>元素<a>元素和它們的標準化文本等於<a>子元素的標準化文本:

//p[a and normalize-space(.) = normalize-space(a)] 

爲您例如,它會返回以下結果(Demo):

0: <p><a>link</a></p> 
1: <p> <a>link with leading spaces</a></p> 
2: <p><a>link with trailing spaces</a> </p> 
3: <p> <a>link with leading and trailing spaces</a> </p> 

與您的特定數據。例如它甚至有可能做足了第二normalize-space功能:

//p[a and normalize-space(.) = a] 
然而

,可能是太脆弱你在找什麼。這是Xpath 1.0兼容。

+0

這是一個非常好的解決方案,但它也會匹配除「」之外的空元素的段落。看到這[你的演示的分支](http://eval.in/12633)。 – nwellnhof 2013-03-13 16:50:25

相關問題