我的下面的代码似乎合乎逻辑但我不知道为什么排序不适用于错误“变量或参数'sort'未定义。'”?我怀疑在xsl中声明param有什么问题。谁能指出我的错误?感谢
传递参数的java代码
String sort = "rating";
transformer.setParameter("sort", sort); /It will control the sort in xsl
xml文件
<?xml version="1.0" ?>
<cd>
<title>A Funk Odyssey</title>
<artist>Jamiroquai</artist>
<tracklist>
<track id="1">
<title>Feels So Good</title>
<time>4:38</time>
<rating>2</rating>
</track>
<track id="2">
<title>Little L</title>
<time>4:10</time>
<rating>5</rating>
</track>
<track id="3">
<title>You Give Me Something</title>
<time>5:02</time>
<rating>3</rating>
</track>
<track id="4">
<title>Corner of the Earth</title>
<time>3:57</time>
<rating>1</rating>
</track>
</tracklist>
</cd>
这是我的xsl
<?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" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:param name="sort" select="title"/>
<xsl:template match="/">
<table border="1">
<thead>
<tr>
<th><a href="#">Title</a></th>
<th><a href="#">Time</a></th>
<th><a href="#">Rating</a></th>
</tr>
</thead>
<tbody>
<xsl:for-each select="cd/tracklist/track">
<xsl:sort select="$sort"/>
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="time" /></td>
<td><xsl:value-of select="rating" /></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:4)
在xsl:param
声明中,您尝试默认为$sort
,而xsl:param
在评估<xsl:param name="sort"/>
时未定义。它看起来像是对自己的引用。
如果您不需要默认值,则只需将参数声明更改为:
<xsl:param name="sort" select="'title'"/>
或默认为字符串值:
<xsl:param name="sort">title</xsl:param>
或
xsl:sort
那就是说,我们只解决了参数声明问题。现在进行排序。 <xsl:sort select="*[name() = $sort]"/>
需要expression,它不会像预期的那样将字符串值转换为XPath。
这是解决方案:Using Variables in <xsl:sort select=""/>
。
你基本上会做类似的事情:
{{1}}