【问题标题】:Transformer.transform() writes the first tag on the same line as <?xml>Transformer.transform() 将第一个标记写入与 <?xml> 相同的行
【发布时间】:2017-09-08 13:31:45
【问题描述】:

当我使用 Transformer 的 transform() 方法将 Document 写入 XML 时,生成的 XML 文档的格式很好 - 所有元素都写在单独的行上并缩进。除了第一个元素与定义写在同一行之外: &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;&lt;first_element&gt;

我想要的只是将&lt;first_element&gt; 写在下一行,如下所示: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <first_element>

有没有办法在将 XML 写入文件之前预先格式化 XML 以完成此操作?

【问题讨论】:

标签: java xml


【解决方案1】:

这种效果可能取决于您使用的 XSLT 处理器(因为有六个处理器已经实现了 JAXP API,告诉我们您使用 Transformer.transform() 调用它并没有给我们这个信息)。

您还需要告诉我们您是否设置了&lt;xsl:output indent="yes"/&gt; - 您的输出“格式良好......并且缩进”这一事实并不能告诉我们任何一种方式。

一致性规则取决于您使用的 XSLT 版本。一般来说,序列化规则在规范的每个后续版本中都变得更加规范。

如果您使用indent="no",则处理器不允许在 XML 声明之后插入空格,除非您的转换显式生成它(尽管我知道某些处理器会这样做)。这是因为,如果输出被用作外部实体而不是完整的文档,这里的换行符实际上是重要的内容。碰巧的是,当您设置standalone="no" 时,输出不能用作外部实体,但序列化规则不会考虑到这一点。

如果您使用indent="yes",则规则允许在此处添加空格,但它们不需要它 - 这是由 XSLT 实现自行决定的。

【讨论】:

  • 说实话,我不明白 XSLT 处理器是什么。如果 Transformer 类属于哪个库的问题是javax.xml.transform.Transformer。回到我最初的问题,我没有使用 indent 属性,一旦我将其设置为“是”,它就解决了问题——第一个元素写在新行上。非常感谢!
  • 如果您不知道您使用的是哪个 XSLT 处理器,它可能是 JDK 附带的非常古老的 Xalan 版本。它大约有 15 年没有显着更新,不支持 XSLT 2.0,更不用说 XSLT 3.0。
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2018-09-01
相关资源
最近更新 更多