XPath中string()、number()和count()是常用易误用的函数:string()将任意值转字符串(取首节点文本或语义转换),number()转浮点数(失败返回NaN),count()仅统计节点个数(参数须为节点集)。

XPath 中的 string()、number() 和 count() 是最常用、也最容易被误用的三个类型转换与统计函数。它们不改变原始 XML 结构,而是对匹配结果做数据类型处理或数量统计,关键在于“什么时候该用”和“怎么用才不出错”。
string():把任意值转成字符串,但要注意空节点和布尔值
string() 接收一个节点集、数值、布尔值或其它对象,返回其字符串表示。它不是简单地加引号,而是按 XPath 规则做语义转换:
- 对节点集:取第一个节点的文本内容(不含标签),若为空节点则返回空字符串;例如
string(//title)返回的文本部分XPath指南 "XPath指南" - 对布尔值:
string(true())→"true",string(false())→"false" - 对数字:
string(3.14)→"3.14",string(NaN)→"NaN" - 常见误用:直接对属性写
string(@id)没问题,但写string(//div[@class='x'])可能返回空串——因为该 div 元素本身没文本子节点时,string()就不提取任何内容
number():强制转为浮点数,NaN 是它的“失败信号”
number() 把参数解析为双精度浮点数。它不报错,但会静默返回特殊值 NaN(Not-a-Number)来表示无法转换的情况:
-
number("123")→123,number("3.1415")→3.1415 -
number("abc")→NaN,number("")→NaN,number("12px")→NaN(开头非数字即失败) - 常用于数值比较:比如筛选价格大于 100 的商品,得写
//item[number(@price) > 100],否则字符串比较"20" > "100"会返回 true - 注意:
number()对布尔值也有定义:number(true())是1,number(false())是0
count():只数节点个数,不能数文本或属性值长度
count() 的参数必须是节点集(node-set),返回其中包含的节点数量。它不管节点内容是什么,只管“有多少个”:
-
count(//book)→ 所有 book 元素的数量 -
count(//book/author)→ 所有 author 子元素总数(每个 book 下多个 author 也会被累加) - 不能写
count(@class)—— 属性不是节点集,会报错或返回 0(取决于实现);想统计某个属性是否存在,该用boolean(@class) - 配合谓词很实用:比如找“至少有两个作者”的书,可写
//book[count(author) >= 2] - 注意:count() 不递归,
count(//book//para)是所有 para 节点总数,不是每个 book 下的 para 数量
这三个函数看似简单,但真正用好,核心就两点:明确输入类型是否符合要求,再确认输出是否是你预期的语义。不复杂但容易忽略细节。










