1

是否可以使用 XPath 找到只有锚(和可选空格)作为子级的段落?我可以达到“//p[a and not(*[not(self::a)] or text())]”,如果段落和锚标记之间没有任何空格,它会很好地工作。

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

    <p><a>链接</a></p>
    <p> <a>带前导空格的链接</a></p>
    <p><a>带有尾随空格的链接</a> </p>
    <p> <a>用前导和尾随空格链接</a> </p>
    
但与这些不匹配:
    <p>介绍文字<a>链接</a>结尾文字。</p>
    <p><a>链接</a>结尾文本。</p>
    <p>介绍文字<a>链接</a></p>
    

4

3 回答 3

1

关闭。使用normalize-space

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

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

于 2013-03-12T19:50:58.703 回答
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 兼容的。

于 2013-03-13T07:39:08.483 回答
0

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

//p[a and not(*[not(self::a)] or text()[normalize-space()])]
于 2013-03-12T20:37:57.377 回答