首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在xPath中消除文本周围的换行符和空格

如何在xPath中消除文本周围的换行符和空格
EN

Stack Overflow用户
提问于 2022-07-16 07:34:34
回答 1查看 167关注 0票数 0

有一页如下所示:

代码语言:javascript
复制
<html>
<head></head>
<body>
   <p>&nbsp;&nbsp;5-8&nbsp;&nbsp;</p>
   <p></br>5-8</br></p>
   <p>&nbsp;</br>5-8&nbsp</br></p>
 </body>
</html>

目标是抽象每个p中的文本,不需要空格和空格。如何做到这一点?

提前感谢!谨致问候!

-第一次更新另一篇文章建议使用normalize_space()。我试过了,嗯,它可以移除空间。但是,只剩下一个节点。如果没有不需要的空格,我如何才能得到所有30个节点文本?提前感谢并致以最美好的祝愿!

在这里输入图像描述

EN

回答 1

Stack Overflow用户

发布于 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示例:

代码语言:javascript
复制
<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中:

代码语言:javascript
复制
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移到宿主语言中。选择以下段落:

代码语言:javascript
复制
//p

..。然后对每个人:

代码语言:javascript
复制
normalize-space(
   translate(., ' ', ' ')
)

注:在该表达式中,第一个字符串文字是一个非断续空格字符,第二个字符串是空格.XPath 1.0没有codepoints-to-string函数,或者为了清晰起见,我会使用它。.translate函数的第一个参数,它表示上下文节点(当前节点)。在以宿主语言执行此XPath表达式时,需要将其中一个p元素作为上下文节点传递。您没有说明您使用的是哪种主机语言,但是在JavaScript中,您可以使用document.evaluate函数来执行第一个XPath,接收iterator of p元素。然后,对于每个元素,调用其evaluate方法来执行第二个XPath,这将确保p元素是XPath的上下文节点(即表达式中的. )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73002401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档