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

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 常量代替。










