У меня есть ситуации, когда петля через отсортированный набор узлов и применить шаблон на каждом из узлов:Сортировка набор узлов, прежде чем перейти к XSL: для-каждого
<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>
Я не думаю, что это будет работать, потому что я 'm выбор узлов по положению до их сортировка, но я не могу использовать xsl:sort
за пределами xsl:for-each
.
Я подхожу к этому неправильно?
Edit: Мой текущий решение сортировать их и хранить отсортированный набор в другой переменной:
<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>
Он работает, но есть способ лучше?
Хороший вопрос (+1). Ваше текущее решение неплохое, но переменная xsl: с отсортированными элементами имеет тип RTF, и вам нужно использовать функцию расширения xxx: node-set() в XSLT 1.0. Посмотрите мое решение, как это сделать без необходимости каких-либо функций расширения. –
Да, я закончил с этим: using exsl: node-set(). Спасибо за ваше решение! –