2016-03-06 80 views
1

我现在面临一个奇怪的问题(恕我直言)的,总之,是一个节点列表: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); 
    } 

} 
+0

我无法重现您的问题。你在使用哪种处理器? –

+0

我使用Ant中内建的一个(我从Ant脚本开始转换),我不知道它到底是什么。 你是否在这两种情况下得到相同的结果? – fml2

+0

@ fml2 - 下面是一个正常工作的例子。 http://xsltransform.net/ncdD7n5尝试任何可用的处理器;他们排序正确。 (为了便于阅读,我添加了'indent =“yes”'。) –

回答

1

我解决了这个问题,明确指定要使用的XSL处理器。在我看来,我使用的JDK(我试过JRE7和JRE8)包含一个旧版本的XSL处理器,它不能正确处理文件。

我下载了Xalan 2.7.2并在'xslt'ant任务中指定了它的JAR,并立即得到了正确的结果。

我也试过撒克逊9号,也得到了正确的结果。

我很惊讶现代JRE与有缺陷的XSL处理器打包在一起。我认为我所执行的转变并不复杂。

相关问题