如何将XSLT转换结果保存到新XML文件?Oxygen终端输出问题
解决XSLT转换结果无法保存到文件的问题
核心问题分析
你之前的错误主要有两点:
<xsl:result-document>不能直接作为<xsl:stylesheet>的子元素,必须放置在**模板(<xsl:template>)**内部。- 你使用了空的
<xsl:result-document/>标签,没有包裹任何要输出的内容;同时把它放在匹配所有节点的identity模板里,导致每个节点处理时都尝试创建文件,触发重复创建的错误,最终生成空文件。
两种解决方案
方案1:通过Oxygen配置直接指定输出文件(推荐,无需修改XSLT)
这是最便捷的方式,不用改动现有XSLT代码:
- 点击Oxygen中运行XSLT按钮旁的下拉箭头,选择「Configure Transformation Scenario」。
- 在弹出的配置窗口切换到「Output」标签页。
- 勾选「Save as」,选择输出文件的路径和文件名(比如
new_badius.xml)。 - 保存配置后运行转换,结果会自动保存到指定文件。
方案2:修改XSLT,正确使用<xsl:result-document>
如果必须通过XSLT代码控制输出文件,需要把要输出的内容完整包裹在<xsl:result-document>内部,且只在主模板中执行一次(比如匹配根节点的模板):
<xsl:stylesheet xmlns="http://www.tei-c.org/ns/1.0" xmlns:telota="http://www.telota.de" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xpath-default-namespace="http://www.tei-c.org/ns/1.0" exclude-result-prefixes="xs" version="2.0"> <!-- 匹配根节点的主模板,仅执行一次 --> <xsl:template match="/"> <!-- 包裹所有转换内容,指定输出文件 --> <xsl:result-document href="new_badius.xml"> <!-- 这里放置你的转换逻辑,例如复制整个文档结构 --> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:result-document> </xsl:template> <!-- 保留identity模板,用于复制所有节点维持原结构 --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
修改后,转换时只会创建一次输出文件,并且把完整的转换结果写入其中。
内容的提问来源于stack exchange,提问作者piah
相关产品推荐
相关产品推荐

