You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法使用document()函数时,如何在XSLT中处理外部XML节点

解决Saxon.js中传递XML节点参数的问题

1. 调整XSLT样式表,定义节点类型参数

把原来用document()加载的变量改成节点类型的入参,替换掉原来的xsl:variable:

<!-- 替换原来的document()变量定义 -->
<xsl:param name="scProject" as="node()"/>

<!-- 原有的查找逻辑完全不用改,直接复用即可 -->
<xsl:attribute name="src">
    <xsl:for-each select="$scProject/shfb:Project/shfb:ItemGroup/shfb:Image">
        <xsl:if test="$myID=./shfb:ImageId" >
            <xsl:value-of select="substring-after(@Include,'Media\')" />
        </xsl:if>
    </xsl:for-each>
</xsl:attribute>

这里用as="node()"明确指定参数类型为节点,确保XSLT能按节点集处理,而非文本。

2. TypeScript端解析XML并传递节点参数

在VS Code Webview的TypeScript代码里,先把读取到的XML字符串解析成DOM节点,再传给Saxon.js的转换方法:

import * as SaxonJS from "saxon-js";

// 1. 读取外部XML内容(假设已拿到XML字符串)
const xmlContent = await fs.readFile("path/to/vx_all.xml", "utf-8");

// 2. 把XML字符串解析成DOM文档对象
const parser = new DOMParser();
const scProjectDoc = parser.parseFromString(xmlContent, "application/xml");

// 3. 调用Saxon.js执行转换,传入节点参数
const result = await SaxonJS.transform({
    stylesheetLocation: "预编译的XSLT文件路径.sef.json",
    sourceText: "你的源XML内容", // 也可使用sourceNode指定源节点
    parameters: {
        // 直接传入解析后的DOM节点
        scProject: scProjectDoc
    },
    destination: "serialized" // 根据需求指定输出形式
});

关键注意点

  • 必须用DOMParser把XML字符串转成DOM节点,不能直接传字符串,否则XSLT会将其视为文本类型处理
  • XSLT里的参数类型声明as="node()"不能省略,否则Saxon.js可能自动转换类型,导致节点集操作失效

内容的提问来源于stack exchange,提问作者tubwreck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:43:30