Сортировка по селектбоксу в XSLT - PullRequest
2 голосов
/ 28 октября 2010

У меня есть этот селектор на сайте, который я сейчас создаю, и я хочу отсортировать список элементов, отображаемых на странице, по выбранному значению. Проблема в том, что я получил разные типы данных, например, расположение и цена. Если я хочу отсортировать по местоположению, нет проблем, он сортирует по алфавиту в порядке расположения названий. Но если я сортирую по «Низкому бюджету», от низкой до высокой цены, мне нужно добавить дополнительные теги к сортировке (data-type = "number"). Это хорошо работает, но тогда местоположение и тому подобное уже не работают.

Как решить эту проблему, чтобы он обрабатывал все типы различных типов данных?

Мой XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

<xsl:param name="url-filter" select="'recommended'" />

<xsl:template name="resort-list" match="data/resorts/entry">
    <form name="sort-form" action="{$root}/resorts/" method="get">
            <select name="filter" onChange="document.getElementById('sort-form').submit();">
                <option value="">Sort By...</option>
                <option value="recommended">Recommended</option>
                <option value="location">Location</option>
                <option value="prices-from">Low budget</option>
                <option value="prices-till">High budget</option>
            </select>
    </form>

      <xsl:for-each select="data/resorts/entry">
         <!-- this is were I sort the items --> 
         <xsl:sort select="*[name() = $url-filter]" />
        <a href="{$root}/koh-lipe-resorts/resort-view/{resort-name/@handle}">
                    <h3 class="resort-item-heading grey"><xsl:value-of select="resort-name"/></h3>
                    <p> 
                        <xsl:call-template name="truncate">
                            <xsl:with-param name="value" select="resort-description" />
                            <xsl:with-param name="length" select="150" />
                        </xsl:call-template>
                    </p>
        </a>
     </xsl:for-each>
</xsl:template>

<xsl:include href="../utilities/master.xsl"/>
</xsl:stylesheet>

Мой XML:

<data>
    <events />
    <resorts>
        <pagination total-entries="11" total-pages="2"
        entries-per-page="10" current-page="1" />
        <section id="9" handle="resorts">Resorts</section>
        <entry id="114">
            <price-from handle="1200">1200</price-from>
            <price-till handle="1900">1900</price-till>
            <recommended>No</recommended>
            <lipe-green-aware-resort>No</lipe-green-aware-resort>
            <name>Baja Resort</name>
            <location>Sunrise Beach</location>
        </entry>
    </resorts>
</data>

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Это преобразование правильно сортирует для каждого возможного значения параметра : "recommended" или "price-from":

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:param name="url-filter" select="'price-from'" />

 <xsl:variable name="vSortOrder">
  <xsl:choose>
   <xsl:when test="$url-filter = 'price-from'">
    <xsl:text>ascending</xsl:text>
   </xsl:when>
   <xsl:otherwise>descending</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>

 <xsl:variable name="vSortType">
  <xsl:choose>
   <xsl:when test="$url-filter = 'price-from'">
    <xsl:text>number</xsl:text>
   </xsl:when>
   <xsl:otherwise>text</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>

 <xsl:template name="resort-list" match="data/resorts">
    <form name="sort-form" action="/*/resorts/" method="get">
            <select name="filter" onChange="document.getElementById('sort-form').submit();">
                <option value="">Sort By...</option>
                <option value="recommended">Recommended</option>
                <option value="location">Location</option>
                <option value="prices-from">Low budget</option>
                <option value="prices-till">High budget</option>
            </select>
    </form>

      <xsl:for-each select="entry">
         <!-- this is were I sort the items -->
         <xsl:sort select="*[name() = $url-filter]"
          data-type="{$vSortType}" order="{$vSortOrder}" />
        <a href="/*/koh-lipe-resorts/resort-view/{resort-name/@handle}">
                    <h3 class="resort-item-heading grey"><xsl:value-of select="name"/></h3>
        </a>
     </xsl:for-each>
 </xsl:template>

 <xsl:template match="/">
  <html>
   <xsl:apply-templates/>
  </html>
 </xsl:template>
</xsl:stylesheet>

С этим документом XML (расширение предоставлено еще одной записью):

<data>
    <events />
    <resorts>
        <pagination total-entries="11" total-pages="2"
        entries-per-page="10" current-page="1" />
        <section id="9" handle="resorts">Resorts</section>
        <entry id="114">
            <price-from handle="1200">1400</price-from>
            <price-till handle="1900">1900</price-till>
            <recommended>No</recommended>
            <lipe-green-aware-resort>No</lipe-green-aware-resort>
            <name>Baja Resort</name>
            <location>Sunrise Beach</location>
        </entry>
        <entry id="115">
            <price-from handle="1500">1500</price-from>
            <price-till handle="1700">1700</price-till>
            <recommended>Yes</recommended>
            <lipe-green-aware-resort>No</lipe-green-aware-resort>
            <name>Blah-Blah Resort</name>
            <location>Blah-Blah Beach</location>
        </entry>
    </resorts>
</data>

и при каждом из двух возможных значений параметра $url-filter будут получены правильные результаты, отсортированные с правильным типом данных ключа сортировки и в правильном порядке сортировки (по возрастанию или по убыванию).

1 голос
/ 28 октября 2010

Хороший вопрос.Вот способ сделать это:

  • Создайте именованный шаблон для вашего внутреннего элемента <a>, назовите его «ссылка», например.
  • Создайте два именованных шаблона для вашего отсортированного для-each: «sort-by-alpha» и «sort-by-number».
  • «sort-by-number» выполняет for-each, сортирует по номеру и вызывает шаблон «link».
  • "sort-by-alpha" выполняет for-each, сортирует (по альфа-каналу) и вызывает шаблон "link".
  • Во внешнем шаблоне, вне того места, где у вас сейчас естьfor-each на data/resorts/entry, установите параметр «выбор при проверке», в противном случае решается вызвать «сортировку по номеру», если критерий сортировки равен prices-from или prices-till;в противном случае он вызывает сортировку по альфа.

Имеет ли это смысл?Дайте мне знать, если это не поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...