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"
不同 JAXP 实现对缩进的支持程度不同:
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 支持 indent-amount
jdk.xml.transform.TransformerFactoryImpl,它也支持该扩展属性,但需确保未禁用扩展功能System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
以下是一个启用 4 空格缩进的典型写法:
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(...) 执行转换
如果输入是 DOMSource(比如从 Document 构建),部分 JDK 版本可能忽略缩进设置,尤其当 Document 中已有文本节点(如换行符)干扰了格式化逻辑。建议:
Document.normalizeDocument())StreamSource + 字符串/文件输入,避免 DOM 解析带来的格式干扰transformer 确实被用于输出(不是只做 XSLT 处理而未实际序列化)不复杂但容易忽略的是:缩进属性必须在 transformer 上设置,而不是 factory;且 indent-amount 是扩展属性,不是标准 JAXP 属性,不能用 OutputKeys 常量代替。