XPath的number()函数是用于将输入值转换为数字类型的核心函数,在XML数据解析、XPath查询条件判断、数值计算等场景中应用广泛,了解它的转换规则能帮助开发者正确处理XML中的字符串数值内容。

number()函数的基本语法
number()函数的语法非常简单,它接受一个参数,参数可以是字符串、节点集、布尔值等类型,最终返回对应的数字结果,语法格式如下:
number(arg)
当参数是字符串类型时,number()函数会尝试将该字符串解析为数字,不同类型的字符串会有不同的转换结果。
不同字符串的转换规则
1. 合法数字字符串
如果字符串是符合数字格式的,比如整数、小数、带正负号的数字,number()函数会直接将其转换为对应的数字值。
以下是一个包含商品价格信息的XML示例:
<products>
<product>
<name>笔记本</name>
<price>2999.5</price>
</product>
<product>
<name>鼠标</name>
<price>-129</price>
</product>
</products>
使用XPath查询价格转换为数字后的结果:
//product/price/number(text())
上述查询会返回2999.5和-129两个数字结果。
2. 非数字字符串
如果字符串不包含合法的数字格式,比如包含字母、特殊符号等,number()函数会返回NaN(非数字)。
例如XML中的价格节点内容为199元,执行以下XPath查询:
number(//product[price='199元']/price/text())
返回结果就是NaN。
3. 空字符串或空白字符串
如果字符串是空字符串,或者只包含空格、制表符等空白字符,number()函数会返回0。
示例XML片段:
<product> <name>键盘</name> <price> </price> </product>
对应的XPath查询:
number(//product[name='键盘']/price/text())
返回结果为0。
4. 科学计数法格式字符串
如果字符串是合法的科学计数法格式,比如1e3、2.5E-2,number()函数也可以正确转换。
测试XML内容:
<data>1e3</data>
查询语句:
number(//data/text())
返回结果为1000。
实际应用场景示例
在实际开发中,经常需要使用number()函数对XML中的数值字符串做比较或计算,比如筛选价格大于2000的商品:
//product[number(price/text()) > 2000]
上述XPath表达式会先使用number()函数将price节点的文本转换为数字,再和2000比较,筛选出符合条件的商品节点。
注意事项
- number()函数转换时不会忽略字符串前后的空白字符,空白字符会被识别为非数字内容,导致返回NaN,因此需要先处理字符串的前后空白。
- 如果传入的参数是节点集,number()函数会先取节点集的第一个节点的字符串值,再进行转换。
- 不同XPath解析器对NaN的表示可能略有差异,但处理逻辑是一致的。