Java的TransformerFactory怎么设置缩进

发布时间 - 2025-12-30 00:00:00    点击率:
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 空格缩进的典型写法:

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


# oracle  # java  # apache  # win  # stream 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 HTTPS报错整理常见问题及解决方案  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  新三国志曹操传主线渭水交兵攻略  如何快速上传建站程序避免常见错误?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  ,怎么在广州志愿者网站注册?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Android 常见的图片加载框架详细介绍  如何在云服务器上快速搭建个人网站?  WEB开发之注册页面验证码倒计时代码的实现  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  网站制作企业,网站的banner和导航栏是指什么?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  b2c电商网站制作流程,b2c水平综合的电商平台?  Laravel如何配置任务调度?(Cron Job示例)  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何在万网利用已有域名快速建站?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何在万网开始建站?分步指南解析  JS经典正则表达式笔试题汇总  Android中AutoCompleteTextView自动提示  linux top下的 minerd 木马清除方法  如何挑选高效建站主机与优质域名?  EditPlus中的正则表达式 实战(2)  Laravel如何创建自定义Artisan命令?(代码示例)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何使用模型观察者?(Observer代码示例)  高防服务器租用如何选择配置与防御等级?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Laravel如何实现API版本控制_Laravel版本化API设计方案  nodejs redis 发布订阅机制封装实现方法及实例代码  Firefox Developer Edition开发者版本入口  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  php485函数参数是什么意思_php485各参数详细说明【介绍】  制作电商网页,电商供应链怎么做?  如何做网站制作流程,*游戏网站怎么搭建?