XSL: SORT не работает? - PullRequest
       0

XSL: SORT не работает?

1 голос
/ 27 ноября 2011

У меня есть XML-файл, который содержит значение цены. Я хочу отсортировать таблицу по порядку цены: вот мой код, но в IE он не работает, и значения других элементов вместе отображаются в таблице цен:

        <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: таблица стилей>

Спасибо за помощь

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

sort само по себе не производит вывод.Он определяет порядок, в котором отсортированный набор узлов передается чему-либо в текущей области видимости - поэтому вам нужно будет добавить что-то вроде <xsl:value-of select="price"/> под ним - инструкция value-of выведет цены в порядке размера вместоестественного порядка файла.

edit # 1: я заметил, что вы используете его внутри apply-templates, а не for-each.В этом случае вам нужно определить шаблон, который соответствует узлу price.Затем этот шаблон будет вызываться на каждом ценовом узле в вашем порядке сортировки, а не на их порядке в файле.

edit # 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 голос
/ 27 ноября 2011

Вам нужен код в соответствии с

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...