XPath 3.1是W3C推出的XML路径语言新版本,在XPath 3.0的基础上进一步扩展了功能边界,适配更多复杂的XML数据处理场景,让开发者可以用更简洁的语法完成复杂的查询逻辑。

XPath 3.1核心新功能梳理
1. 新增更多内置数据类型支持
XPath 3.1新增了对array和map两种复合数据类型的原生支持,解决了之前版本处理复杂结构化数据的痛点。这两种类型可以和XML节点无缝结合,方便存储和传递多值数据。
以下是创建和使用array类型的示例:
(: 创建一个包含三个元素的数组 :)
let $arr := array { 1, "test", <node>content</node> }
return (
array:size($arr), (: 获取数组长度,返回3 :)
array:get($arr, 2) (: 获取第二个元素,返回"test" :)
)
使用map类型的示例:
(: 创建一个键值对映射 :)
let $m := map { "name": "张三", "age": 25, "score": 90 }
return map:get($m, "name") (: 获取name对应的值,返回"张三" :)
2. 扩展内置函数库
XPath 3.1新增了数十个实用内置函数,覆盖字符串处理、数学计算、日期时间操作等多个领域,减少了开发者自定义函数的需求。
string:pad-left和string:pad-right:实现字符串的左右补位,比如把数字3补成"003"math:pow:计算幂运算,支持整数和小数指数date:diff-seconds:计算两个日期时间之间的秒数差array:filter:对数组元素进行过滤,返回符合条件的新数组
以下是string:pad-left函数的使用示例:
string:pad-left("3", 3, "0") (: 返回"003" :)
string:pad-left("12", 5, "*") (: 返回"***12" :)
3. 路径表达式功能增强
XPath 3.1对路径表达式做了多项优化,支持更灵活的节点筛选和导航逻辑。
新增了!运算符,用于对每个上下文项应用后续表达式,类似映射操作:
(: 获取所有book节点的title子节点,再提取其文本内容 :) /bookstore/book ! title/text()
同时支持在路径表达式中使用箭头函数语法,简化函数调用逻辑:
(: 对价格大于30的book节点,调用自定义函数计算折扣价 :) /bookstore/book[price > 30] => local:calculate-discount()
4. 增强与其他XML技术的兼容性
XPath 3.1和XSLT 3.0、XQuery 3.1做了更好的适配,支持在XSLT样式表中直接使用新增的数组、映射类型,也可以在XQuery中调用XPath 3.1的所有新函数。
以下是XSLT 3.0中使用XPath 3.1数组的示例:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="data" select="array { 10, 20, 30 }"/>
<result>
<xsl:value-of select="array:sum($data)"/>
</result>
</xsl:template>
</xsl:stylesheet>
5. 新增静态分析相关特性
XPath 3.1支持静态类型检查,可以在查询执行前发现类型不匹配的问题,减少运行时错误。同时新增了fn:trace函数,方便调试时输出中间结果。
静态类型检查的示例:
(: 声明变量类型为xs:integer,如果赋值字符串会报静态错误 :) declare variable $num as xs:integer := 10;
新功能适用场景总结
如果需要处理包含复杂嵌套结构的XML数据,XPath 3.1的数组和映射类型可以大幅简化逻辑;如果需要做大量字符串、数值计算,新增的内置函数能减少重复代码;如果项目同时使用XSLT 3.0或XQuery 3.1,升级到XPath 3.1可以获得更好的技术栈兼容性。
| 新功能分类 | 核心特性 | 适用场景 |
|---|---|---|
| 数据类型 | 原生支持array、map | 复杂结构化XML数据处理 |
| 函数库 | 新增数十个内置函数 | 字符串、数值、日期时间计算 |
| 路径表达式 | 新增!运算符、箭头函数语法 | 复杂节点筛选和导航 |
| 兼容性 | 适配XSLT 3.0、XQuery 3.1 | 多XML技术栈协同开发 |