Java的TransformerFactory怎么设置缩进

19次阅读

java中缩进需在transformer实例上设置OutputKeys.INDENT为”yes”及apache扩展属性”{http://xml.apache.org/xslt}indent-amount”指定空格数,而非transformerFactory;不同JDK实现支持该扩展,但domSource可能因空白节点干扰缩进效果。

Java的TransformerFactory怎么设置缩进

Java 的 TransformerFactory 本身不直接提供缩进设置,缩进控制是在创建 Transformer 后,通过设置输出属性(OutputKeys)来实现的,关键在于启用缩进并指定缩进大小。

启用缩进输出

默认情况下,XSLT 或 DOM 转换生成的 XML 是无格式(无换行、无缩进)的。要开启缩进,需在 Transformer 实例上调用 setOutputProperty 设置以下两个属性:

  • OutputKeys.INDENT 设为 "yes"
  • "{http://xml.apache.org/xslt}indent-amount"(Apache Xalan 扩展属性)设为缩进空格数,如 "2"

注意 Transformer 实现差异

不同 JAXP 实现对缩进的支持程度不同:

  • oracle JDK 自带的 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 支持 indent-amount
  • 较新版本(如 JDK 17+)默认可能切换为 jdk.xml.transform.TransformerFactoryImpl,它也支持该扩展属性,但需确保未禁用扩展功能
  • 若使用外部 Xalan(如 xalan.jar),需显式设置系统属性:System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");

完整示例代码

以下是一个启用 4 空格缩进的典型写法:

立即学习Java免费学习笔记(深入)”;

TransformerFactory factory = TransformerFactory.newinstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // 接着用 transformer.transform(...) 执行转换

DOM Source 场景下的注意事项

如果输入是 DOMSource(比如从 Document 构建),部分 JDK 版本可能忽略缩进设置,尤其当 Document 中已有文本节点(如换行符)干扰了格式化逻辑。建议:

  • 转换前清理空白文本节点(调用 Document.normalizeDocument()
  • 或改用 streamSource + 字符串/文件输入,避免 DOM 解析带来的格式干扰
  • 确认 transformer 确实被用于输出(不是只做 XSLT 处理而未实际序列化)

不复杂但容易忽略的是:缩进属性必须在 transformer 上设置,而不是 factory;且 indent-amount 是扩展属性,不是标准 JAXP 属性,不能用 OutputKeys 常量代替。

text=ZqhQzanResources