У меня есть ситуация, когда перебираю отсортированный набор узлов и применяю шаблон для каждого из узлов:
<div id="contractscontainer">
<xsl:for-each select="document">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
Я хочу сделать что-то особенное с «первыми» 5 узлами в наборе узлов и отобразить их как вложенный элемент. Проблема в том, что они должны быть в том же порядке, как если бы они были отсортированы (как в цикле).
Я планировал сделать это, используя два xsl:for-each
элемента, каждый с правильными узлами, выбранными из набора. Я не могу сделать это, однако, потому что они должны быть отсортированы до Я могу выбрать "первый" 5.
Пример:
<div id="contractscontainer">
<div class="first-five">
<xsl:for-each select="document[position() < 6]">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
<div class="rest-of-them">
<xsl:for-each select="document[position() > 5]">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
</div>
Не думаю, что это сработает, потому что я выбираю узлы по позиции до сортировки, но я не могу использовать xsl:sort
вне xsl:for-each
.
Я неправильно подхожу к этому?
Редактировать : Мое текущее решение состоит в том, чтобы отсортировать их и сохранить отсортированный набор в другой переменной:
<xsl:variable name="sorted-docs">
<xsl:for-each select="document">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:variable>
Работает, но есть ли лучший способ?