Saxon-JS浏览器XSLT转换报XPDY0002焦点缺失错误排查
Saxon-JS 转换报 XPDY0002 焦点不存在错误修复方案
错误根因
报错和入口上下文缺失直接相关,出现在xsl:for-each段完全符合执行逻辑:
- 你当前HTML里的
SaxonJS.transform调用只传了stylesheetLocation参数指定SEF样式表路径,没有传入待转换的源XML文件路径。 - 当你把模板同时命名为
xsl:initial-template作为转换入口时,Saxon-JS不会自动加载默认源文档,启动转换时整个上下文没有绑定任何输入节点,也就是XPath求值所需的焦点(上下文节点.)完全为空。 - 执行到
xsl:for-each select="order/job"这行时,XPath需要从当前上下文根节点查找子节点order,但没有上下文节点可以依托,直接抛出XPDY0002错误。
修复步骤
- 修正HTML中的Saxon-JS调用参数,补充源文件路径和输出目标配置,替换原有onload里的脚本:
window.onload = function() { SaxonJS.transform({ stylesheetLocation: "pack3.sef.json", sourceLocation: "pack3.xml", // 替换为你实际存放XML文件的相对路径 destination: "replaceBody" // 直接将转换结果替换页面body内容,无需保留原有错误提示 }, "async"); }
- 修正源文件里的语法隐患,避免后续触发其他转换错误:
- 打开XML文件,第二个
<job>节点下的<Complete_by>2022-05-27</Complete_by>>末尾多了一个多余的>,直接删除即可。 - 你XML里所有
Complete_by元素的文本内容前后带空白字符,直接调用xs:date()转换会报类型错误,把XSL里的dueDateOP变量定义修改为:<xsl:variable name="dueDateOP" select="xs:date(normalize-space(Complete_by))"/>
- 打开XML文件,第二个
- 重新用XSLT3编译器生成新的SEF文件,刷新页面即可正常渲染出排期表格。
内容的提问来源于stack exchange,提问作者Benjamin Howland
相关产品推荐
相关产品推荐

