Я пытаюсь указать атрибут раздела диапазона номеров specific-use
в одном элементе para. Я получаю одно значение <span style="case">
с group-by
и получаю значение group-by="ancestor::sec[1]"
. Возможно ли сделать диапазон, когда приходит <span style="case">
значение продолжить descendant::
или following-sibling::
, тогда мы можем получить последнее specific-use
значение. Входные XML
<book>
<sec disp-level="1" specific-use="1">
<p>aaaaaa</p>
<sec disp-level="2" specific-use="2">
<p><span style="case">super</span></p>
</sec>
<sec disp-level="2" specific-use="3">
<blockquote>
<p><span style="case">super</span></p>
</blockquote>
</sec>
<sec disp-level="2" specific-use="4">
<p><span style="case">super</span></p>
</sec>
</sec>
<sec disp-level="1" specific-use="5">
<p><span style="case">super</span>, <span style="case">active</span></p>
<sec disp-level="2" specific-use="6">
<p><span style="case">active</span></p>
</sec>
</sec>
<sec disp-level="1" specific-use="7">
<p><span style="case">active</span></p>
<sec disp-level="2" specific-use="8">
<p><span style="case">active</span></p>
</sec>
<sec disp-level="2" specific-use="9">
<p><span style="case">super</span></p>
</sec>
<sec disp-level="2" specific-use="10">
<p><span style="case">active</span></p>
</sec>
</sec>
XSLT-код
<xsl:template match="book">
<xsl:copy>
<xsl:for-each-group select="//*" group-by="span[@style='case']">
<xsl:text>
</xsl:text>
<p>
<case><xsl:value-of select="current-grouping-key()"/></case><xsl:text> </xsl:text>
<sec>
<xsl:for-each select="current-group()">
<number>
<xsl:value-of select="ancestor::sec[1]/@specific-use"/>
</number>
<xsl:if test="position()!=last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</sec>
</p>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
Мой XSLT-вывод на выходе https://xsltfiddle.liberty-development.net/3NSTbfj/7 Мой ожидаемый результат
<book>
<p><case>super</case> <sec><number>2</number>–<number>4</number>, <number>5</number>, <number>9</number></sec></p>
<p><case>active</case> <sec><number>5</number>–<number>8</number>, <number>10</number></sec></p>
</book>
Например:
super 2–4, 5, 9
активный 5–8, 10
2–4
: Создать диапазон, потому что <span style="case">super</span>
поиск продолжился с тем же значением child::
или following-sibling::
. 5–8
: Создать диапазон, потому что <span style="case">active</span>
поиск продолжился с тем же значением child::
или following-sibling::
.