我现在面临一个奇怪的问题(恕我直言)的,总之,是一个节点列表:XSL:排序为PARAM传递给一个模板
作为参数传递到模板的节点列表不能排序。
下面是一个例子。
输入文件是:
<root>
<a>BBB</a>
<a>AAA</a>
</root>
而且转型是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
<Root>
<xsl:call-template name="processThis">
<xsl:with-param name="nodeList" select="/*/a"/>
</xsl:call-template>
</Root>
</xsl:template>
<xsl:template name="processThis">
<xsl:param name="nodeList" />
<xsl:for-each select="$nodeList">
<xsl:sort /><!-- ***** This causes the problem -->
<xsl:variable name="thisVal" select="." />
<result value="{$thisVal}" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
预期输出是:
<Root>
<result value="AAA" />
<result value="BBB" />
</Root>
但是,如果我运行转换,只是一个空生成了“根”元素,没有子节点。
如果我注释掉标有'*****'的行,生成的根元素确实包含子元素,但未排序(如本例所期望的那样)。
如果我直接处理元素(而不是在模板中传递列表作为参数处理),那么我可以使用'sort',并且一切都按预期工作。这里是“直接”改造:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
<Root>
<xsl:for-each select="/*/a">
<xsl:sort />
<xsl:variable name="thisVal" select="." />
<result value="{$thisVal}" />
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
所以我的问题是:为什么不是作为参数传递给一个“排序”选项处理的模板传递一个列表?从2016年3月7日
更新:
XMLSPY和一些在线XSL处理器实现预期(排序)输出。
我试过用独立的Java程序,它给了我错误的结果。这里的程序:
package my.test;
import java.io.File;
import java.io.StringWriter;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class Transform {
public static void main(String[] args) throws Exception {
String inputFileName = "Q:\\MiscThings\\t\\a.xml";
String xslFileName = "Q:\\MiscThings\\t\\trans.xsl";
Source xmlSource = new StreamSource(new File(inputFileName));
Source xslSource = new StreamSource(new File(xslFileName));
StringWriter stringWriter = new StringWriter();
Result transformationResult = new StreamResult(stringWriter);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xslSource);
transformer.transform(xmlSource, transformationResult);
stringWriter.flush();
String xmlResult = stringWriter.toString();
System.out.println(xmlResult);
}
}
我无法重现您的问题。你在使用哪种处理器? –
我使用Ant中内建的一个(我从Ant脚本开始转换),我不知道它到底是什么。 你是否在这两种情况下得到相同的结果? – fml2
@ fml2 - 下面是一个正常工作的例子。 http://xsltransform.net/ncdD7n5尝试任何可用的处理器;他们排序正确。 (为了便于阅读,我添加了'indent =“yes”'。) –