无法使用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
相关产品推荐
相关产品推荐

