Как понять такое поведение XPath?

программирование xml xslt xpath

В следующем примере выбираются элементы, предшествующие элементу five, т.е: four, three, two, one. Из этих элементов все, кроме первого выводятся. Почему тогда при выводе порядок не по возрастанию значения position(), то есть: "three two one"?

=== XML =================================
<root>
<one/>
<two/>
<three/>
<four/>
<five/>
</root>
========================================

=== XSLT ================================
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" omit-xml-declaration="yes"/>

<xsl:template match="/root">
<xsl:for-each select="five">
<xsl:for-each select="preceding-sibling::*[position() > 1]">
<xsl:value-of select="name()" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>
========================================

=== Вывод ===============================
one two three
========================================
Ответы:
Если не имеется дочерних элементов <xsl:sort>, выбранные узлы обрабатываются в порядке появления в документе.
Я не нашел в стандарте спецификации на порядок элементов, выбираемых в ось. Соотвественно, они могут идти и в естественном порядке (как встречаются в документе), от старшей позиции 4 для one до 2 для three (пока position > 1).
Вот ссылка на рекомендации W3C:
http://www.zvon.org/xxl/XSLTreference/W3C/xpath.html#axes
По ссылке приведенной ub для инструкции for-each:
Узлы обрабатываются в том порядке как они следуют в документе, если нет указаний относительно сортировки.
Иными словами, порядок обработки узлов в for-each не зависит от выбора оси/осей в атрибуте select, а только от порядка в документе или элемента(ов)  sort.


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.