XSLT3.0中transform()函数无法传递encapsulateNodes参数问题
问题排查与解决方案
1. 检查样式表中的参数声明
确保目标样式表$generated-xslt中严格匹配参数名称的<xsl:param>声明,注意Saxon对XML元素/属性名称是大小写敏感的:
<!-- 样式表中必须存在该声明,名称要和传递的参数完全一致 --> <xsl:param name="encapsulateNodes"/>
如果需要默认值,可补充select属性避免空值报错:
<xsl:param name="encapsulateNodes" select="()"/>
2. 验证参数类型兼容性
Saxon 9.9的transform函数中,parameters映射的值需与样式表参数预期类型匹配:
- 若
$node是单个元素节点,直接传递合法; - 若
$node是文档节点,样式表中需用$encapsulateNodes/*获取根元素,避免因节点类型不匹配导致逻辑失效。
3. 添加调试输出确认参数接收状态
在目标样式表中插入调试代码,直观验证参数是否被接收:
<!-- 放在样式表顶层或转换逻辑起始位置 --> <xsl:message select="concat('Received parameter content: ', serialize($encapsulateNodes))" terminate="no"/>
执行转换后查看Oxygen控制台:
- 无输出说明参数未传递成功;
- 输出内容不符则检查
$node的结构或类型。
4. 确认动态生成样式表的正确性
确保$generated-xslt确实包含encapsulateNodes参数声明,可在转换前序列化查看内容:
<xsl:variable name="xslt-content" select="serialize($generated-xslt)"/> <xsl:message select="$xslt-content" terminate="no"/>
5. 排查Saxon版本限制
Saxon-PE 9.9.1.7的transform函数parameters映射仅支持原子值、节点或节点序列,若$node是自定义复杂类型,需先转换为节点序列再传递。
内容的提问来源于stack exchange,提问作者Sharath Kashyap
相关产品推荐
相关产品推荐

