XSLT缩进不适用于MSXML

时间:2015-01-25 04:27:42

标签: xml xslt msxml

我正在尝试“漂亮”一个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,两种方法都会产生相同的输出。

这里出了什么问题?

1 个答案:

答案 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')