Использование переменных в <xsl: sort select = "" /> - PullRequest
12 голосов
/ 24 февраля 2010

Привет, я создаю общий шаблон для отображения моего контента. Но Контент может быть отсортирован по разным @ или node (). Итак, хотите передать xPath.

<xsl:variable name="sort" select="@sortBy"/>
<xsl:variable name="order" select="@order"/>

<xsl:for-each select="Content[@type=$contentType]">
  <xsl:sort select="$sort" order="{$order}" data-type="text"/>
  <xsl:sort select="@update" order="{$order}" data-type="text"/>
    <xsl:copy-of select="."/>
</xsl:for-each>

Использование переменной для вставки по возрастанию или по убыванию в order="" РАБОТЫ.

Почему нельзя сделать это на select=""?

Я надеюсь сделать эту супер динамическую переменную выбора может быть xPtah, либо @publish, либо Title / node (), либо любым xPath.

Нет ошибки - она ​​просто игнорирует сортировку.

Ответы [ 2 ]

14 голосов
/ 24 февраля 2010

Это дизайн . Атрибут select является единственным, который не принимает AVT (Атрибут - Шаблоны значений).

Обычным решением является определение переменной с именем дочернего элемента, который должен использоваться в качестве ключа сортировки. Ниже приведен небольшой пример:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vsortKey" select="'b'"/>
 <xsl:variable name="vsortOrder" select="'descending'"/>

 <xsl:template match="/*">
   <xsl:for-each select="*">
    <xsl:sort select="*[name() = $vsortKey]" order="{$vsortOrder}"/>

    <xsl:copy-of select="."/>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML :

<t>
  <a>
   <b>2</b>
   <c>4</c>
  </a>
  <a>
   <b>5</b>
   <c>6</c>
  </a>
  <a>
   <b>1</b>
   <c>7</c>
  </a>
</t>

желаемый результат получен :

<a>
   <b>5</b>
   <c>6</c>
  </a>
<a>
   <b>2</b>
   <c>4</c>
  </a>
<a>
   <b>1</b>
   <c>7</c>
</a>
0 голосов
/ 24 февраля 2010

| (оператор объединения) работает ... Должно быть, я немного ошибся при попытке раньше. Это был ответ @Dimitre Novatchev, ведущий меня по правильному пути !!

Следующие работы:

<xsl:sort select="@*[name()=$sort] | *[name()=$sort]" 
          order="{$order}" data-type="text"/>

Позволяет сортировать по атрибутам и узлам. Очевидно, до тех пор, пока они не имеют одинаковые name(), но разные значения.

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