Похоже, что вы имеете дело с параллельной / перекрывающейся разметкой, где элементы "commentrangestart" и "commentrangeend" действуют как теги "milestone". Существует обширная литература по обработке перекрывающихся разметок, и вам стоит потратить некоторое время на изучение предмета.
Детали в некоторой степени зависят от того, существует ли только один диапазон комментариев в родительском элементе, всегда ли диапазон начинается и заканчивается в одном и том же элементе и т. Д.
В 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]"/>
; у вас есть два правила шаблона в mode = "sibling", одно из которых соответствует элементу commentrangeend и завершает рекурсию, другое обрабатывает промежуточные элементы и завершает рекурсивный вызов <xsl:apply-templates mode="sibling" select="following-sibling::*[1]"/>