我在使用CLR4.0中的XslCompiledTransform对XSL文件进行排序时遇到问题。这里是我的示例XML文件(注:有第二<foo>
元素之后有一个空格):XSL排序的问题
<?xml version="1.0" encoding="utf-8"?>
<reflection>
<apis>
<api id="A">
<foos>
<foo/>
</foos>
</api>
<api id="B">
<foos>
<foo/>
</foos>
</api>
</apis>
</reflection>
当我申请以下XSL文件:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
<xsl:template match="/">
<html>
<body>
<table>
<xsl:apply-templates select="/reflection/apis/api">
<xsl:sort select="@id" />
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="api">
<tr>
<td>
<xsl:value-of select="@id" />
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
我得到以下结果:
<html>
<body>
<table>
<tr>
<td>B</td>
</tr>
<tr>
<td>A</td>
</tr>
</table>
</body>
</html>
但是,如果我删除第二个<foo>
元素后的空格,则生成的文件会正确排序。这似乎可能是XslCompiledTransform中的一个错误,但我希望有人可能有一个解决方法。
编辑:如果有人有困难复制它,这里是我使用的代码:
XslCompiledTransform xslt = new XslCompiledTransform();
XsltSettings transformSettings = new XsltSettings(true, true);
xslt.Load("CreateVSToc.xsl", transformSettings, new XmlUrlResolver());
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreWhitespace = true;
Stream readStream = File.Open("reflection.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
using (XmlReader reader = XmlReader.Create(readStream, readerSettings))
{
Stream outputStream = File.Open("toc.xml", FileMode.Create, FileAccess.Write, FileShare.Read | FileShare.Delete);
using (XmlWriter writer = XmlWriter.Create(outputStream, xslt.OutputSettings))
{
XsltArgumentList arguments = new XsltArgumentList();
xslt.Transform(reader, arguments, writer);
}
}
这个问题似乎是不可重现排序(测试用MSXSL 4和3)。 **如果**在'XslCompiledTransform'中有一个错误,这应该是一个'xsltprocessor'标记的问题。 – 2010-11-10 16:50:24
如果有人想跟踪它,我也将它提交给微软。我用稍微不同的文件内容,但结果是一样的:https://connect.microsoft.com/VisualStudio/feedback/details/620628/problem-with-xsl-sort-nodes-when-using-xslcompiledtransform – 2010-11-10 22:56:07
我试过了很难和*不能重现*它。 ! – 2010-11-12 02:59:35