1
由於某種原因,很簡單的xsl:sort對我來說不起作用。 (道歉,如果我犯愚蠢的錯誤)xsl:sort在JDK 1.6中不起作用/默認xalan 2.7.0
我在JDK 1.6中打擊這個奇怪的巫術魔術行爲(檢查我的xalan版本是2.7.0)。從java運行時,以下xml,xslt,xsl:sort不起作用。
在我的代碼中,xslt被編譯和緩存,每次我都會得到一個Template來進行轉換。
這是我的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);
}
}
}
你的代碼看起來是正確的,應該工作。你可以嘗試在你的排序中明確指定一個'select'屬性(' ')? –
Tomalak
一個不合格的「它不起作用」對試圖幫助你的人非常討厭。當您嘗試XSLT時會得到什麼結果? – JLRishe
@Tomalak感謝您的建議。我試着明確指定一個選擇屬性。仍然不起作用。我添加了用於我的測試程序的java代碼。 – Sanjit