是否可以使用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>
答案 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()])]