Использование переменных в <xsl: sort select = "/" >

Привет, создайте общий шаблон, чтобы перечислить мой контент. Но контент можно сортировать по разным @или 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="" WORKS.

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

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

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

Ответ 1

Это по дизайну. Атрибут 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>

Ответ 2

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

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

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

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