有一页如下所示:
<html>
<head></head>
<body>
<p> 5-8 </p>
<p></br>5-8</br></p>
<p> </br>5-8 </br></p>
</body>
</html>目标是抽象每个p中的文本,不需要空格和空格。如何做到这一点?
提前感谢!谨致问候!
-第一次更新另一篇文章建议使用normalize_space()。我试过了,嗯,它可以移除空间。但是,只剩下一个节点。如果没有不需要的空格,我如何才能得到所有30个节点文本?提前感谢并致以最美好的祝愿!
发布于 2022-07-19 06:23:40
在XPath 1.0中不可能完全实现您想要的结果,但是在XPath 2.0或更高版本中这是可能的。
你没有说你有什么XPath解释器,但是你提到了Chrome的XPath助手,它依赖于Chrome内置的支持XPath 1.0的XPath解释器(这是浏览器的规范)。
但是,您可能只是使用Chrome来检查数据,并拥有另一个更现代化的XPath解释器,例如Saxon。如果是这样的话,XPath 2.0解决方案将适用于您,尽管您显然无法在Chrome中使用它。
我已经整理了您的XML示例:
<html>
<head></head>
<body>
<p> 5-8 </p>
<p><br/>5-8<br/></p>
<p> <br/>5-8 <br/></p>
</body>
</html>这些都是不破的空间。
在XPath 2.0中:
for $paragraph in //p
return normalize-space(
translate($paragraph, codepoints-to-string(160), ' ')
)注意,这使用translate函数将不中断的空格( char与Unicode代码点160)转换为空格,然后使用normalize-space来修剪前导和尾随空格(我不确定如果段落中间有空格,而不是开始或结束;这将将任何这样的空格序列转换为单个空格字符)。您可能会认为normalize-space就足够了,但实际上,一个不间断的空间不属于normalize-space的“空白”类别,因此不会被裁剪。
在XPath中,不完全可能做你想做的事情。您可以使用一个XPath表达式将每个p元素返回到宿主语言,然后遍历这些p元素,为每个p元素执行第二个XPath表达式,并以该p作为上下文。本质上,这意味着将for ... in ... return迭代器从XPath移到宿主语言中。选择以下段落:
//p..。然后对每个人:
normalize-space(
translate(., ' ', ' ')
)注:在该表达式中,第一个字符串文字是一个非断续空格字符,第二个字符串是空格.XPath 1.0没有codepoints-to-string函数,或者为了清晰起见,我会使用它。.是translate函数的第一个参数,它表示上下文节点(当前节点)。在以宿主语言执行此XPath表达式时,需要将其中一个p元素作为上下文节点传递。您没有说明您使用的是哪种主机语言,但是在JavaScript中,您可以使用document.evaluate函数来执行第一个XPath,接收iterator of p元素。然后,对于每个元素,调用其evaluate方法来执行第二个XPath,这将确保p元素是XPath的上下文节点(即表达式中的. )。
https://stackoverflow.com/questions/73002401
复制相似问题