Java XSLT转换时如何传递参数 Transformer.setParameter

Transformer.setParameter()是Java中向XSLT传递参数的标准方式,需在XSLT中用声明同名参数,调用前设置且名称严格匹配;支持String、Boolean等基本类型,null会回退默认值;带命名空间需用QName;调试可用输出验证。

在Java中使用XSLT进行XML转换时,Transformer.setParameter() 是向XSLT样式表传递参数的标准方式。关键在于:XSLT中必须用 声明同名参数,且参数类型默认为 StringObject(如 BooleanNumberNodeList 等),JAXP会自动做适配。

参数声明与命名需严格匹配

XSLT文件中必须显式定义参数,否则传入无效:


Java端调用时名称必须完全一致(区分大小写),且应在 transformer.transform() 之前设置:

  • transformer.setParameter("userName", "Alice");
  • transformer.setParameter("showDetails", Boolean.TRUE);

支持的参数类型及注意事项

JAXP支持多种参数类型,但实际行为取决于XSLT处理器(如Xalan、Saxon):

  • 基本类型(StringBooleanDoubleInteger)会被自动转换为XPath等效值
  • 若传入自定义对象,需确保其可被XSLT引擎序列化(多数情况下仅推荐用简单类型)
  • null 表示该参数未设置,XSLT中将回退到 select 默认值

动态参数与命名空间处理

如果XSLT中参数名带命名空间(较少见),Java中也需用带命名空间的QName对象:

  • QName qname = new QName("http://example.com/ns", "token");
  • transformer.setParameter(qname, "abc123");

普通场景无需命名空间,直接用字符串名即可。

调试技巧:确认参数是否生效

若参数未起作用,可临时在XSLT中加入诊断输出:

userName = 

运行时查看控制台输出,或启用Transformer的调试日志(如Xalan的 -Dorg.apache.xalan.xslt.verbose=true)。