我使用 Xalan 转换器来格式化带有缩进的 xml 文件。但是,当我将格式化程序应用于已包含缩进的 xml 文件时,它会创建大量空行。
例如输入
<foo><bar/></foo>
变换为
<?xml version="1.0" encoding="UTF-8"?><foo>
<bar/>
</foo>
(我认为这是正确的),但是将变压器应用于此会产生
<?xml version="1.0" encoding="UTF-8"?><foo>
<bar/>
</foo>
并且连续的转换会添加更多的空行。
我不记得撒克逊变形金刚有这种行为。如何设置我的 Xalan 变压器不创建空行?
更具体地说,这是一个对上面的示例进行编码的简单测试,我想通过适当配置的变压器来传递:
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
class TransformerTest {
@Test
void formattingShouldBeIdempotent() throws Exception
{
TransformerFactory factory = TransformerFactory.newDefaultInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
String transformed1 = transform("<foo><bar/></foo>", transformer);
String transformed2 = transform(transformed1, transformer);
Assert.assertEquals(transformed1, transformed2);
}
private String transform(String input, Transformer transformer) throws TransformerException
{
Source source = new StreamSource(new StringReader(input));
StringWriter outWriter = new StringWriter();
StreamResult result = new StreamResult(outWriter);
transformer.transform(source, result);
return outWriter.getBuffer().toString();
}
}
如果您必须使用 Xalan 而不是 Saxon,我建议在序列化之前进行一个简单的转换,该转换本质上只是执行
<xsl:strip-space elements="*"/>
,然后复制输入不变。