Нет. Текущий контекст не может знать, какие узлы являются «следующими» или «предыдущими».
Это потому, что, когда, например, применяются шаблоны, механика выглядит следующим образом:
- Вы делаете:
<xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
- Процессор XSLT составляет список узлов для обработки (a, b, c)
- Для каждого из этих узлов процессор XSLT выбирает и выполняет соответствующий шаблон
- Когда вызывается шаблон, определяется узел
current()
и определяется position()
, но кроме этого шаблон не знает о потоке выполнения.
- Порядок выполнения зависит от предпочтений процессоров, если результат гарантированно будет одинаковым. Ваши (теоретические) прогнозы могут быть верны для одного процессора и неверны для другого. Я думаю, что для языка программирования без побочных эффектов, такого как XSLT, такие знания были бы опасны (потому что люди начали бы полагаться на порядок выполнения).
Вы можете использовать оси following::sibling
или preceding::sibling
XPath, но это не то же самое, что знать, какой узел будет обрабатываться следующим
EDIT
Приведенное выше объяснение пытается ответить на вопрос так, как он был задан, но ОП означало нечто иное. Речь идет о группировании / выводе только уникальных узлов.
В соответствии с запросом OP, здесь быстрая демонстрация того, как добиться группировки с использованием осей XPath.
XML (элементы предварительно отсортированы):
<items>
<item type="a"></item>
<item type="a"></item>
<item type="a"></item>
<item type="a"></item>
<item type="b"></item>
<item type="e"></item>
</items>
1035 * XSLT *
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="/items">
<!-- copy the root element -->
<xsl:copy>
<!-- select those items that differ from any of their predecessors -->
<xsl:apply-templates select="
item[
not(@type = preceding-sibling::item/@type)
]
" />
</xsl:copy>
</xsl:template>
<xsl:template match="item">
<!-- copy the item to the output -->
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
Выход:
<items>
<item type="a"></item>
<item type="b"></item>
<item type="e"></item>
</items>