XSL:SORT不起作用?

时间:2011-11-27 11:21:05

标签: xml xslt

我有一个包含价格值的XML文件。我想按价格排序我的表:这是我的代码,但在IE中它不起作用,其他元素的价值一起显示在price tabledata中:

        <td>
          <xsl:apply-templates >
            <xsl:sort select="price" data-type="number" order="descending" />
          </xsl:apply-templates>
        </td>

和我的xml文件(book.xml

这是我的XSLT文件:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
  <xsl:template match="catalog">
    <html>
      <head>
        <title>
           <xsl:text>Buchhandlung</xsl:text> 
        </title> 
      </head>
      <table border="1">
        <tr>
          <th>id</th>
          <th>author</th>
          <th>titel</th>
          <th>price</th>
          <th>description</th>
        </tr>
        <xsl:apply-templates />
  </table>
  </html>
  </xsl:template>
  <xsl:template match="book">
      <tr>
        <td>
          <xsl:apply-templates select="@id" />
        </td>

        <td>
          <xsl:apply-templates select="author" />
        </td>

        <td>
          <xsl:apply-templates select="title" />
        </td>

        <td>
          <xsl:apply-templates select="book" >
            <xsl:sort select="price" data-type="number" order="descending"  />
          </xsl:apply-templates>
        </td>
        <!--<td>
          <xsl:apply-templates select="price" />
        </td>-->

        <td>
          <xsl:apply-templates select="description" />
        </td>
      </tr>
  </xsl:template>
<

/ XSL:样式表&GT;

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

sort本身不会产生输出。它规定了排序节点集传递给当前范围内任何内容的顺序 - 因此您需要在其下面添加<xsl:value-of select="price"/>之类的内容 - 指令值将按照以下顺序打印出价格大小而不是文件的自然顺序。

编辑#1:我现在已经注意到您在apply-templates内使用它而不是for-each。在这种情况下,您需要定义与price节点匹配的模板。然后,将按排序顺序在每个价格节点上调用此模板,而不是在文件中调用它们。

编辑#2:一个例子;要按照书的价格打印书籍详细信息列表,您可能需要以下内容:

  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
  <xsl:template match="catalog">
    <html>
      <head>
        <title>
           <xsl:text>Buchhandlung</xsl:text> 
        </title> 
      </head>
      <table border="1">
        <tr>
          <th>id</th>
          <th>author</th>
          <th>titel</th>
          <th>price</th>
          <th>description</th>
        </tr>
        <xsl:apply-templates select="book">
          <xsl:sort select="price"/>
        </xsl:apply-templates>
  </table>
  </html>
  </xsl:template>
  <xsl:template match="book">
      <tr>
        <td>
          <xsl:apply-templates select="@id" />
        </td>

        <td>
          <xsl:apply-templates select="author" />
        </td>

        <td>
          <xsl:apply-templates select="title" />
        </td>  

        <td>
          <xsl:apply-templates select="description" />
        </td>
      </tr>
  </xsl:template>

请注意,目录模板现在包含排序逻辑,我已从书籍模板中删除了类似的逻辑。书籍模板无权对传递给它的节点进行排序,您必须指定目标节点传递给书籍模板的顺序,以获得您所追求的结果。目录模板确保每个book元素按价格顺序传递到template match="book",而不是文件中的顺序。我假设您不想在图书详细信息中打印图书价格,因为您提供的示例也不会这样做,但如果您想要包含此信息,则将以与完全相同的方式完成其他字段的td输出。

答案 1 :(得分:1)

您需要符合

的代码
<xsl:template match="catalog">
  <table>
    <tbody>
     <xsl:apply-templates select="book">
       <xsl:sort select="price" data-type="number" order="descending"/>
     </xsl:appl-templates>
   </tbody>
  </table>
</xsl:template>

<xsl:template match="book">
  <tr>
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="book/*">
 <td>
  <xsl:value-of select="."/>
 </td>
</xsl:template>