我可以使用xpath找到只有锚点作为子节点的段落吗?

时间:2013-03-12 19:45:48

标签: xpath

是否可以使用XPath找到仅具有锚点(和可选空格)的段落作为子项?我可以得到“// p [a而不是(* [not(self :: a)]或text())]”,如果段落和锚标记之间没有任何空格,它可以很好地工作。

为了给出一些具体的例子,我想要一个匹配这些的查询(目前只匹配第一个):     

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

3 个答案:

答案 0 :(得分:1)

关闭。使用normalize-space

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

string-join用于解决normalize-space仅接受单个字符串作为输入的事实。

答案 1 :(得分: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兼容。

答案 2 :(得分:0)

我发现以下内容比@ wst的解决方案更好一点,它也适用于XPath 1.0:

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