1

何らかの理由で、非常に単純な xsl:sort が機能しません。(ばかげた間違いをしている場合は申し訳ありません)

私はJDK 1.6でこの奇妙なブードゥー魔法の振る舞いをしています(私のxalanバージョンが2.7.0であることを確認しました)。次の xml、xslt、xsl:sort は、Java から実行すると機能しません。

私のコードでは、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>

そしてxslt:

<?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>

私の Java プログラムでは、以下の期待される出力が得られません。

<?xml version="1.0" encoding="UTF-8"?>
<result>2</result>
<result>999</result> 

--- テスト Java プログラムの追加コードを編集 ----

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);
        }

    }

}
4

1 に答える 1

2

これが Saxon 9.5 で期待どおりに動作することを確認できます。したがって、コードに問題はないと思います。つまり、使用している Xalan のバージョンにバグがあるか、正しく起動していないかのどちらかです。(単に「うまくいかない」と言うのではなく、どのように失敗したかを教えていただければ、手がかりが得られます。)

Xalan が JDK に組み込まれているという利便性以外に、最近 Xalan を使用するもっともらしい理由はありません。何年も更新されておらず、誰もバグを修正していません。できることを大幅に制限する XSLT 1.0 のみを提供します。サクソンに乗り換え。

于 2013-06-18T09:25:08.037 に答える