Я должен быть в состоянии сохранить набор узлов в переменной и затем выполнить больше 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>
Кто-либо получил пример того, как лучше всего сделать этот вид вещи?
Попробуйте этот пример:
<xsl:variable name="hotels" select="/results/hotels[active='true']" />
<xsl:variable name="three_star_or_less"
select="$hotels[number(rating) <= 3]" />
<xsl:for-each select="$three_star_or_less">
<xsl:sort select="rating" />
<xsl:value-of select="rating" />
</xsl:for-each>
В XSLT 1.0 нет проблем с хранением набора узлов в переменной, и расширения не нужны. Если вы просто используете выражение XPath в атрибуте select
переменной xsl:variable
, то в конце концов, вы сделаете именно это.
Проблема только в том, что вы хотите хранить узлы, которые вы сами сгенерировали в переменной, и даже тогда, только если вы хотите запросить их позже. Проблема здесь в том, что выводимые вами узлы не имеют типа "node-set" - вместо этого, они являются тем, что называется "фрагментом дерева результата". Вы можете сохранить это в переменной, а в дальнейшем использовать эту переменную для вставки фрагмента в вывод (или другую переменную), но вы не можете использовать XPath для запроса к нему. Тогда вам понадобится либо функция EXSLT node-set()
(которая преобразует фрагмент дерева результата в node-set), либо XSLT 2.0 (в которой нет фрагментов дерева результата, только последовательности узлов, независимо от того, откуда они взялись).
В приведенном примере это не выглядит проблемой. Ответ Рубенса дает точный синтаксис
.