我正在尝试“漂亮”一个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
,两种方法都会产生相同的输出。
这里出了什么问题?
答案 0 :(得分:2)
使用MSXML 6.0的以下WSH(Windows Scripting Host)JScript程序(默认情况下在所有受支持的Microsoft OS上都可用,没有任何安装)输出
<?xml version="1.0" encoding="UTF-16"?>
<A>
<B>
<C></C>
</B>
</A>
计划
var msxmlVersion = '6.0';
var xml = new ActiveXObject('Msxml2.DOMDocument.' + msxmlVersion);
xml.async = false;
xml.load('test2015012501.xml');
var xsl = new ActiveXObject('Msxml2.DOMDocument.' + msxmlVersion);
xsl.async = false;
xsl.load('test2015012501.xsl');
var resultDoc = new ActiveXObject('Msxml2.DOMDocument.' + msxmlVersion);
xml.transformNodeToObject(xsl, resultDoc);
WScript.Echo(resultDoc.xml);
输入和XSLT是您的样本。因此,使用MSXML 6.0和transformNodeToObject可以获得更好的缩进结果,但是根据我的需要,缩进使用了太多的缩进字符。
当然,您应该能够将MSXML 6与C ++结合使用而不是使用JScript,并获得相同的结果。
如果你想要一个文件而不是一个字符串,你当然可以使用resultDoc.save('file.xml')
。