string() 将节点转为字符串值(所有后代文本拼接),而 . 表示当前上下文节点对象;前者用于提取纯文本,后者用于节点导航与结构判断。

string() 和 . 在 XPath 中看起来相似,但作用完全不同:前者是把节点转成字符串值(即文本内容),后者是当前上下文节点本身(一个节点对象,不是字符串)。
string() 是强制类型转换函数
它接收一个节点集(或任意类型),返回该节点集的字符串值——也就是该节点下所有直接/间接文本子节点拼接后的结果(按文档顺序),忽略标签、属性、注释等。如果传入多个节点,只取第一个节点的字符串值。
-
//div/string() → 返回第一个
<div> 元素的文本内容(不含 HTML 标签) <li> <font color="gray">string(//input[@name='email'])</font> → 取该 input 元素的 <code>value属性值(因为 input 的字符串值默认是其 value 属性) -
string(//p) → 只取第一个
<p></p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill12116" title="DeepBI DHTML 页面生成器"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20d3191a227.jpg" alt="DeepBI DHTML 页面生成器" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill12116" title="DeepBI DHTML 页面生成器">DeepBI DHTML 页面生成器</a> <p>生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur</p> </div> <a href="/xiazai/skill12116" title="DeepBI DHTML 页面生成器" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>的全部纯文本(包括子元素里的文字) -
//div[.//span] → 找有
<span></span>子元素的<div>(<strong>.</strong> 指代每个遍历到的 div) <li> <font color="gray">//*[@id]/.</font> → 选中所有带 id 属性的元素,并返回它们自身(和 <font color="gray">//*[@id]</font> 等价)</li> <li> <font color="gray">//a[.='点击这里']</font> → 找文本内容**恰好等于**“点击这里”的 <code><a></a>元素(这里 . 是节点,XPath 自动将其转为字符串用于比较) - 要提取文本内容 → 用 string(XXX) 或依赖自动转换(如 XXX = 'abc')
- 要筛选、导航或判断节点结构 → 用 .(比如 ./@class、./child::img)
- 注意:text() 只取直接文本子节点,string(XXX) 取全部后代文本拼接
. 表示当前上下文节点(节点引用)
. 不是函数,是 XPath 中的“当前节点”简写,代表当前正在处理的那个节点对象本身。它保持节点类型,可用于进一步定位子节点、属性,或参与节点比较、谓词判断等。
关键区别在类型和用途
你不能对 . 直接做字符串操作(比如用 substring(.,1,5) 是合法的,因为 XPath 会隐式调用 string(.);但 ./text() 就是在取它的子节点,不是字符串);而 string() 明确输出字符串,适合需要纯文本的场景(如断言、拼接、匹配)。

















