无法在XSLT二级转换中引用或传入LabelsInfo.xml的问题
解决XSLT二级转换中无法读取LabelsInfo.xml的问题
核心问题分析
- 二级XSL中
document()加载失败:WebView2的执行上下文与主XSL不同,相对路径基准变化,或安全策略限制了跨文档访问 - 字符串传入后无法用XPath查询:XML字符串未被解析为DOM节点集,XPath仅能作用于XML节点而非纯文本
具体解决方案
方案1:修正document()的路径引用
在二级XSL中使用绝对路径或WebView2可识别的本地URI加载文件,避免相对路径的上下文差异:
<!-- 使用本地绝对URI示例 --> <xsl:variable name="labelsDoc" select="document('file:///C:/your-project/LabelsInfo.xml')"/> <!-- 或基于页面根路径的绝对路径 --> <xsl:variable name="labelsDoc" select="document('/LabelsInfo.xml')"/>
方案2:JS中解析XML为DOM节点后传入二级XSL
不要直接传递字符串,先将LabelsInfo.xml解析为XML DOM对象,再作为节点参数传入转换:
function filterHistory() { fetch('LabelsInfo.xml') .then(res => res.text()) .then(xmlText => { const parser = new DOMParser(); const labelsDom = parser.parseFromString(xmlText, 'text/xml'); // 初始化二级XSL处理器 const xsltProc = new XSLTProcessor(); const xsltDoc = /* 加载二级XSL文件的DOM对象 */; xsltProc.importStylesheet(xsltDoc); // 传入解析后的XML节点参数 xsltProc.setParameter(null, 'labelsDoc', labelsDom); // 执行转换并处理结果 const resultDoc = xsltProc.transformToDocument(/* 待转换的源XML */); // 渲染结果到页面... }); }
二级XSL中直接接收节点参数并使用XPath查询:
<xsl:param name="labelsDoc"/> <!-- 根据索引匹配值班描述示例 --> <xsl:value-of select="$labelsDoc//Label[@index=$currentRowIndex]/@description"/>
方案3:从主XSL传递已加载的节点集
利用主XSL已成功加载LabelsInfo.xml的优势,直接将节点集作为参数传递给二级转换:
主XSL代码:
<xsl:variable name="labelsDoc" select="document('LabelsInfo.xml')"/> <!-- 调用二级模板时传递节点集 --> <xsl:apply-templates select="historyData"> <xsl:with-param name="labelsDoc" select="$labelsDoc"/> </xsl:apply-templates>
二级XSL接收参数后直接使用,与方案2的XSL代码一致。
额外注意事项
- 检查WebView2权限:确保允许访问本地文件,初始化时可配置
CoreWebView2Settings开启相关权限 - 验证XML格式:确保
LabelsInfo.xml无语法错误,否则解析或加载会失败 - XSLT版本兼容:若使用XSLT 1.0,节点集参数传递需严格遵循规范;XSLT 2.0+支持更灵活的节点处理
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

