XSLT怎么从多个XML输入文件合并数据 document()函数

4次阅读

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

XSLT怎么从多个XML输入文件合并数据 document()函数

用 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.xmlproducts.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() 不复杂,但容易忽略路径基准和加载时机,多试几次路径、加个变量缓存,合并就稳了。

text=ZqhQzanResources