Python实现XML转XSLT后写入文件仅一行的问题排查
解决XML转换后写入文件仅一行的问题
这种情况我之前也碰到过,大概率是输出格式化设置或者文件写入逻辑的问题,下面分两种常见场景给你排查方向:
1. 检查XSLT的输出配置
如果你的XSLT没有明确设置输出格式,转换后的XML会是紧凑的单行结构(控制台打印时可能因为终端自动换行看起来是多行,但实际字符串本身没有换行符)。
你需要在XSLT的根节点<xsl:stylesheet>里添加<xsl:output>元素,开启缩进和换行:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 新增这行,启用缩进和换行 --> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 你的转换逻辑 --> <xsl:template match="/"> <!-- ... --> </xsl:template> </xsl:stylesheet>
indent="yes"会让XSLT处理器生成带换行和缩进的格式化XML,这样写入文件时就会保留多行结构。
2. 检查脚本的文件写入逻辑
如果XSLT已经设置了缩进,但写入文件还是单行,那可能是你的脚本在处理输出时丢失了换行符。比如用Python的话,要确保写入时保留格式化后的换行;有些语言的输出流默认是缓冲的,需要手动刷新或正确关闭流。
举个Python的正确示例:
import lxml.etree as ET # 加载XML和XSLT xml_tree = ET.parse("input.xml") xslt_tree = ET.parse("transform.xsl") transformer = ET.XSLT(xslt_tree) # 执行转换 result_tree = transformer(xml_tree) # 写入文件,确保保留格式化 with open("output.xml", "wb") as f: f.write(ET.tostring(result_tree, pretty_print=True, encoding="UTF-8"))
这里的pretty_print=True会强制生成带换行和缩进的输出,和XSLT的indent="yes"配合效果更好。
如果是Java的话,要确保TransformerFactory启用了缩进:
TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource("transform.xsl")); // 启用缩进 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); // 执行转换并写入文件 transformer.transform(new StreamSource("input.xml"), new StreamResult(new File("output.xml")));
总结
先优先检查XSLT的<xsl:output>配置,再确认脚本写入时是否正确处理了格式化输出。一般调整这两处就能解决文件单行的问题。
内容的提问来源于stack exchange,提问作者KARAN SHAH
相关产品推荐
相关产品推荐

