XSL: Как лучше всего сохранить узел в переменной и затем нас это в будущих выражениях XPath?

Я должен быть в состоянии сохранить набор узлов в переменной и затем выполнить больше filting/sorting на нем позже. Все примеры, которые я видел этого, включают или использующий XSL2 или расширения, ни одно из которых действительно опция.

У меня есть список отелей в моем документе XML, который может сортироваться/фильтроваться и затем пролистал 5 за один раз. Я нахожу, хотя я повторяю большую логику как в настоящее время, я не нашел хороший способ сохранить наборы узлов в xsl переменной и затем использовать xpath на них для дальнейшей фильтрации/сортировки.

Это - вид вещи, которая я, после (извиняют код, написанный вершины моей головы так, не могли бы быть 100%):

<xsl:variable name="hotels" select="/results/hotels[active='true']" />
<xsl:variable name="3_star_or_less" select="/results/hotels[number(rating) <= 3]" />
<xsl:for-each select="3_star_or_less">
  <xsl:sort select="rating" />
</xsl:for-each>

Кто-либо получил пример того, как лучше всего сделать этот вид вещи?

17
задан Pete Duncanson 23 December 2009 в 17:40
поделиться

2 ответа

Попробуйте этот пример:

<xsl:variable name="hotels" select="/results/hotels[active='true']" />
<xsl:variable name="three_star_or_less"
              select="$hotels[number(rating) &lt;= 3]" />
<xsl:for-each select="$three_star_or_less">
    <xsl:sort select="rating" />
    <xsl:value-of select="rating" />
</xsl:for-each>
22
ответ дан 30 November 2019 в 12:13
поделиться

В XSLT 1.0 нет проблем с хранением набора узлов в переменной, и расширения не нужны. Если вы просто используете выражение XPath в атрибуте select переменной xsl:variable, то в конце концов, вы сделаете именно это.

Проблема только в том, что вы хотите хранить узлы, которые вы сами сгенерировали в переменной, и даже тогда, только если вы хотите запросить их позже. Проблема здесь в том, что выводимые вами узлы не имеют типа "node-set" - вместо этого, они являются тем, что называется "фрагментом дерева результата". Вы можете сохранить это в переменной, а в дальнейшем использовать эту переменную для вставки фрагмента в вывод (или другую переменную), но вы не можете использовать XPath для запроса к нему. Тогда вам понадобится либо функция EXSLT node-set() (которая преобразует фрагмент дерева результата в node-set), либо XSLT 2.0 (в которой нет фрагментов дерева результата, только последовательности узлов, независимо от того, откуда они взялись).

В приведенном примере это не выглядит проблемой. Ответ Рубенса дает точный синтаксис

.
6
ответ дан 30 November 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: