Похоже, вы имеете дело с параллельной/перекрывающейся разметкой, где элементы commentrangestart и commentrangeend действуют как теги «веха». Существует обширная литература по обработке перекрывающейся разметки, и было бы полезно потратить некоторое время на изучение предмета.
Детали немного зависят от того, существует ли только один комментарий в пределах родительского элемента, всегда ли он начинается и заканчивается внутри одного и того же элемента и так далее.
В XSLT 2.0 вы можете обрабатывать такие конструкции с помощью <xsl:for-each-group group-starting-with="commentrangestart">
или <xsl:for-each-group group-ending-with="commentrangeend">
. Вы также можете использовать операторы < < и >>, например <xsl:for-each select="*[. >> $start and . << $end]">
.
Если вы застряли с XSLT 1.0, это намного сложнее, но не невозможно. Методика использования (которая заслуживает изучения, потому что она также полезна с XSLT 2.0) называется «рекурсия сестры». Вы пишете шаблон, соответствующий элементу commentrangestart, и делает <xsl:apply-templates mode="sibling" select="following-sibling::*[1]"/>
; у вас есть два правила шаблона в режиме = «собрат», один из которых соответствует элементу commentrangeend и оканчивающейся рекурсию, другие процессы элементов между ними, и приходит к выводу, выполнив рекурсивный вызов <xsl:apply-templates mode="sibling" select="following-sibling::*[1]"/>
Это не ясно, если вы хотите ** выбрать ** эти узлы или вы хотите ** сопоставить ** их (как в шаблоне). Кроме того, есть много ответов на эту задачу группировки ... –
Хороший вопрос, +1. См. Мой ответ для полного однострочного решения. :) –