Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting xsl:sort不';不能在JDK1.6/Default xalan 2.7.0中工作_Sorting_Xslt_Xslt 1.0 - Fatal编程技术网

Sorting xsl:sort不';不能在JDK1.6/Default xalan 2.7.0中工作

Sorting xsl:sort不';不能在JDK1.6/Default xalan 2.7.0中工作,sorting,xslt,xslt-1.0,Sorting,Xslt,Xslt 1.0,出于某种原因,非常简单的xsl:sort对我不起作用。(如果我犯了愚蠢的错误,请道歉) 我在JDK1.6中遇到了这种奇怪的巫术行为(我的xalan版本是2.7.0)。从java运行时,以下xml、xslt、xsl:sort不起作用 在我的代码中,xslt被编译和缓存,每次我都会得到一个模板来进行转换 这是我的xml: <?xml version="1.0" encoding="UTF-8"?> <stats> <matches> <

出于某种原因,非常简单的xsl:sort对我不起作用。(如果我犯了愚蠢的错误,请道歉)

我在JDK1.6中遇到了这种奇怪的巫术行为(我的xalan版本是2.7.0)。从java运行时,以下xml、xslt、xsl:sort不起作用

在我的代码中,xslt被编译和缓存,每次我都会得到一个模板来进行转换

这是我的xml:

<?xml version="1.0" encoding="UTF-8"?>
<stats>
    <matches>
        <match>
            <goal>10</goal>
            <goal>2</goal>
            <goal>30</goal>
            <goal>344</goal>
            <goal>59</goal>
            <goal>6</goal>
            <goal>27</goal>
            <goal>18</goal>
            <goal>999</goal>
        </match>
    </matches>
</stats>

我可以确认这与Saxon 9.5的预期效果一样。所以我认为你的代码没有任何问题。因此,要么您正在使用的Xalan版本中存在错误,要么您错误地调用了它。(如果你告诉我们它是如何失败的,而不是仅仅说“它不起作用”,那么我们就会有一个线索。)


现在除了将Xalan嵌入JDK的便利性之外,没有任何合理的理由使用Xalan。它已经好几年没有更新了,没有人修复这些bug。它只提供XSLT1.0,这严重限制了您的能力。切换到Saxon。

您的代码看起来不错,应该可以工作。您能否在排序(
)中显式指定
select
属性?不合格的“它不起作用”对于试图帮助您的人来说是非常讨厌的。当您尝试XSLT时会得到什么结果?@Tomalak感谢您的建议。我尝试显式指定一个select属性。但还是不行。我正在添加用于测试程序的java代码。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />
    <xsl:template name="min">
        <xsl:param name="nodes" />
        <xsl:for-each select="$nodes">
            <xsl:sort data-type="number" />
            <xsl:if test="position() = 1">
                <xsl:element name="result">
                    <xsl:value-of select="number(.)" />
                </xsl:element>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="max">
        <xsl:param name="nodes" />
        <xsl:for-each select="$nodes">
            <xsl:sort data-type="number" order="descending" />
            <xsl:if test="position() = 1">
                <xsl:element name="result">
                    <xsl:value-of select="number(.)" />
                </xsl:element>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="/">
        <xsl:variable name="tails"
            select="/stats/matches/match/goal" />
        <xsl:call-template name="min">
            <xsl:with-param name="nodes" select="$tails" />
        </xsl:call-template>
        <xsl:call-template name="max">
            <xsl:with-param name="nodes" select="$tails" />
        </xsl:call-template>
    </xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<result>2</result>
<result>999</result> 
import java.io.File;
import java.io.StringWriter;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XsltTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.print("XsltTest");
        TransformerFactory tf = TransformerFactory.newInstance();
        try {
            Templates templates = tf.newTemplates(new StreamSource(new File(
                    "src/main/resources/test.xsl")));
            Transformer tr = templates.newTransformer();
            StringWriter sw = new StringWriter();
            tr.transform(new StreamSource(new File("src/main/resources/test.xml")), new StreamResult(sw));
            System.out.println();
            System.out.println(sw.toString());

        } catch (Exception e) {
            System.err.print(e);
        }

    }

}