XSLT 3.0中的map和array怎么用

幻夢星雲

幻夢星雲

2026-03-21

419人浏览

原创

map() 和 array() 是 xpath 3.1/xslt 3.0 的原生数据类型构造器函数,非高阶映射操作;需用 map:merge()、array:for-each() 等命名空间函数实现合并与转换,且必须声明命名空间并设 version="3.1"。

xslt 3.0中的map和array怎么用

map() 函数在 XSLT 3.0 中不是内置函数

直接说结论:map()array() 是 XPath 3.1 / XSLT 3.0 的**原生数据类型构造器函数**,但它们**不是“遍历处理”意义上的 map(像 JavaScript 的 Array.prototype.map)**。你在 XSLT 里不能用 map($items, function($x) { $x * 2 }) 这种语法——XSLT 没有高阶函数式映射操作符。

真正可用的是:

  • map { "key1": "val1", "key2": 42 } —— 字面量构造 map
  • array { 1, 2, 3 } —— 字面量构造 array
  • map:merge( (map { "a": 1 }, map { "b": 2 }) ) —— 来自 map 命名空间的实用函数(需声明 xmlns:map="http://www.w3.org/2005/xpath-functions/map"
  • array:for-each($arr, function($x) { $x + 1 }) —— 注意:这是 array:for-each,不是 map();它返回新 array,行为接近 map,但函数名固定

怎么安全创建和访问 map/array?

XSLT 3.0 支持 map 和 array 类型,但必须确保处理器支持(如 Saxon HE 10+、Saxon PE/EE、BaseX 10+),且启用 XPath 3.1 模式(version="3.1")。

常见写法示例:

<stylesheet version="3.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:array="http://www.w3.org/2005/xpath-functions/array"><p><template match="/"><!-- 构造一个 map --><variable name="user" as="map(*)" select="map { 'name': 'Alice', 'age': 30, 'active': true() }"></variable></template></p>
<pre class="brush:php;toolbar:false;"><!-- 访问 key -->
<xsl:value-of select="$user?name"/> <!-- → Alice -->

<!-- 构造 array -->
<xsl:variable name="scores" as="array(*)" 
  select="array { 85, 92, 78 }"/>

<!-- 取第 2 个元素(索引从 1 开始!)-->
<xsl:value-of select="$scores?2"/> <!-- → 92 -->

<!-- 用 array:for-each 实现类似 map 的转换 -->
<xsl:variable name="doubled" as="array(*)"
  select="array:for-each($scores, function($x) { $x * 2 })"/>

常见报错和坑点

以下错误几乎都源于类型或命名空间缺失:

  • XPST0003XPDY0002:未声明 xmlns:map / xmlns:array,或 XSLT 版本不是 3.1
  • XPTY0004:对非 map 变量使用 ?key 语法(比如变量类型是 xs:string 却写 $x?name
  • FORG0006:用 ?0 或负数索引访问 array(XPath array 索引从 1 开始)
  • 空 map/array 被误判为 ():注意 map {} eq ()false();要用 map:size($m) = 0 判空

替代方案:什么时候该用 XSLT 3.0 map/array?

它们适合做「结构化中间数据」,而非通用循环工具。真实场景中更常用:

  • 把 XML 节点集转成 map 做快速查找(比如 ID → 元素映射)
  • array:for-each + array:filter 处理分组后的一维结果(比嵌套 xsl:for-each 更紧凑)
  • 配合 xsl:iterate 实现状态累积(例如计数、拼接字符串)
  • 避免频繁调用 key()// —— 预建 map 查表更快

如果你只是想“对每个节点执行一个函数”,老老实实用 xsl:for-eachxsl:iterate 更稳;map/array 的价值在于表达「键值关系」和「有序集合语义」,不是语法糖。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

1259

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

388

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

298

19

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

2936

3

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

2807

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

3384

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

1794

7

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1154

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1234

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习