1

我下面的代码似乎合乎逻辑,但我不知道为什么排序不适用于错误“变量或参数'排序'未定义。” “?我怀疑在 xsl 中声明参数有问题。谁能指出我的错误?谢谢

传递参数的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>
4

1 回答 1

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需要一个表达式,它不会像您期望的那样将字符串值转换为 XPath 。

这是一个解决方案<xsl:sort select=""/>.

你基本上会做类似的事情:

<xsl:sort select="*[name() = $sort]"/>
于 2012-05-19T12:08:52.940 回答