我在使用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