【发布时间】:2015-01-25 04:27:42
【问题描述】:
我正在尝试“漂亮”一个 XML 文件。正如其他一些 SO 问题中所建议的那样,我正在使用以下样式表进行转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="UTF-16" />
<xsl:strip-space elements="*"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是,这并没有产生预期的结果。对于输入文件:
<A><B><C /></B></A>
生成的输出是:
<?xml version="1.0" encoding="UTF-16"?>
<A>
<B>
<C>
</C>
</B>
</A>
但我期望的输出是(标题行无关紧要):
<A>
<B>
<C />
</B>
</A>
所以有两个问题:
- 输出中没有缩进
-
<C />标签已被“解包”,这是我不想要的。
我已尝试使用 MSXSL.exe ,并通过使用(通过 C++)IXMLDOMDocument2::transformNode 输出到 BSTR,两种方法产生相同的输出。
这里出了什么问题?
【问题讨论】:
-
MSXSL.exe 实用程序已有 11 年历史。
IXMLDOMDocument2也非常老了。我建议使用XmlCompiledTransform制作您自己的简单实用程序。这是推荐的用于执行 XSLT 的 .NET API,并且肯定会正确处理缩进。您也可以使用 Saxon 之类的东西,但当前版本是 XSLT 2.0,如果您正在编写 XSLT 1.0,您可能会遇到一些兼容性问题。 -
@JLRishe 我的目标是从 C++(不是 .NET)以编程方式执行此操作,是否有 COM 版本(或其他版本)? MSXSL 只有 25KB,所以大概它只是卸载到其他一些应该是最新的 Windows 工具。
-
是的,MSXSL.exe 只是 XSLT 的几个不同 COM 接口的包装器(您可以从您提供的链接获取实用程序的源代码并查看 msxmlinf.cxx 文件),这很可能11年没更新了。恐怕我不知道 COM 有更好的选择。我通常不使用 COM 或本机代码。
-
@JLRishe 好的,谢谢。我有一个使用 SAXXMLReader 和 MXXMLWriter 的备份选项。 XSLT 选项虽然不那么丑陋,但如果能让它工作就好了。
-
This SO answer 提供了一个 XSLT,可以手动为 XML 文档添加缩进。也许您可以将其用作后处理步骤?