XSLT 合并多个 XML 文件的核心是 document() 函数,它可加载外部 XML 并返回文档节点,支持单路径、字符串序列(XSLT 2.0+)或节点集参数,路径相对于主输入文档 URI,需注意同源策略、处理器兼容性及缓存优化。

用 XSLT 合并多个 XML 文件,核心就是 document() 函数 —— 它能从当前样式表之外加载并访问其他 XML 文档的内容。
document() 函数怎么用
基本语法:document('path/to/file.xml') 或 document(('file1.xml','file2.xml'))。参数可以是单个字符串(路径)、字符串序列,甚至是一个节点集(用于动态解析 URI)。路径支持相对路径(相对于当前 XML 文档位置)或绝对路径;如果在浏览器中运行,需注意同源策略限制;命令行工具(如 Saxon、xsltproc)通常无此限制。
返回的是一个文档节点(document-node()),可像处理主输入文档一样用 XPath 访问,比如:document('users.xml')/users/user。
合并多个文件的典型写法
假设你有 orders.xml(主文件),想把 customers.xml 和 products.xml 的数据一起读进来做关联:
- 在模板中直接调用:
- 用变量缓存结果,避免重复加载:
,后面用$cust-doc/customers/customer - 批量加载多个文件:
,此时$all-data是一个文档节点序列,可用for $d in $all-data return $d//item(XSLT 2.0+)遍历所有匹配项
注意路径和上下文问题
document() 中的路径是相对于发起调用的 XML 文档的 URI(即主输入文档所在位置),不是相对于 XSLT 样式表。如果主文档是本地文件 C:/data/orders.xml,那么 document('customers.xml') 就会尝试加载 C:/data/customers.xml。
若想用相对于 XSLT 文件的路径,部分处理器(如 Saxon)支持扩展函数,例如 saxon:base-uri(/) 配合 resolve-uri() 构造路径;更稳妥的做法是把所有 XML 放在同一目录,或统一用绝对路径/URL。
兼容性与版本差异
XSLT 1.0 支持 document(),但只接受单个字符串或节点集,不支持字符串序列;XSLT 2.0/3.0 增强了灵活性,允许传入序列,并支持更丰富的类型转换。如果你用 document() 加载失败,先检查文件路径是否可达、编码是否一致(特别是含中文路径时),以及处理器是否启用外部文档访问(Saxon 默认开启,某些安全模式下可能禁用)。
基本上就这些 —— document() 不复杂,但容易忽略路径基准和加载时机,多试几次路径、加个变量缓存,合并就稳了。










