У меня есть следующий фрагмент HTML:
<p>
This is
<font>start</font>
just some <i>happy</i> text
<font>stop</font>
that might continue here.
</p>
и я хочу использовать XSLT, чтобы превратить его в это:
<p>
This is
<hi>
just some <i>happy</i> text
</hi>
that might continue here.
</p>
так что все (узлы, текст и комментарии) между font[text() = "start"] и font[text() = "stop"] вложено в новый элемент hi.
Я попытался:
<!-- identity template here-->
<xsl:template match="font[text()='start']">
<xsl:element name="hi">
<!-- FOLLOWING:SIBLING UNTIL THE NEXT font[text()='stop'] -->
<xsl:value-of select="following-sibling[????]"/>
</xsl:element>
</xsl:template>
<xsl:template match="font[text()='stop']"><!-- do nothing--></xsl:template>
но ???? где я не мог найти правильное правило. Я поигрался с полчаса, потом подумал, что спрашивать может быть быстрее.
Важно, чтобы это было именно до следующей остановки, так как таких конструкций в одном p-элементе может быть множество.
Спасибо
xsl:for-each-group
, в 1.0 вам придется использовать родственную рекурсию, что довольно сложно. Это также зависит от того, можете ли вы иметь несколько пар начала/конца в абзаце, и от того, что вы хотите сделать, если они неправильно соединены. Пожалуйста, в вопросах XSLT всегда говорите, какая версия вам требуется. - person Michael Kay   schedule 19.11.2019