Как сгруппировать элементы с новым элементом на основе позиции?

У меня есть большое количество стихов, которые я хотел бы сгруппировать в строфы (см. пример ниже). Я хотел бы добавить элемент <lg> каждые восемь стихов. Как я могу добиться этого с помощью XSLT?

Вход:

 <text>
  <body>
     <l>Gozaba, juvenil, el trace Orfeo,</l>
     <l>de libre edad, la primavera ociosa,</l>
     <l>dando a sus años regalado empleo</l>
     <l>la lira dulcemente numerosa.</l>
     <l>No al vínculo legal del Himeneo</l>
     <l>afectos cede, ni a la cipria diosa,</l>
     <l>cual si anteviera el ánimo presago,</l>
     <l>ya por su medio, el venidero estrago.</l>
     <l>Ama su voz, que, en dulce melodía,</l>
     <l>de otro amor le divierte y le enajena;</l>
     <l>bien que la misma voz, con tiranía,</l>
     <l>toda hermosura libre a amar condena.</l>
     <l>Así que en unas armas poseía</l>
     <l>propia defensa, con ofensa ajena,</l>
     <l>siendo el sonoro canto, mientras pudo,</l>
     <l>del Amor flecha, y a su flecha escudo.</l>

Желаемый результат:

<text>
 <body>
   <lg>
         <l>Gozaba, juvenil, el trace Orfeo,</l>
         <l>de libre edad, la primavera ociosa,</l>
         <l>dando a sus años regalado empleo</l>
         <l>la lira dulcemente numerosa.</l>
         <l>No al vínculo legal del Himeneo</l>
         <l>afectos cede, ni a la cipria diosa,</l>
         <l>cual si anteviera el ánimo presago,</l>
         <l>ya por su medio, el venidero estrago.</l>
</lg>
<lg>
         <l>Ama su voz, que, en dulce melodía,</l>
         <l>de otro amor le divierte y le enajena;</l>
         <l>bien que la misma voz, con tiranía,</l>
         <l>toda hermosura libre a amar condena.</l>
         <l>Así que en unas armas poseía</l>
         <l>propia defensa, con ofensa ajena,</l>
         <l>siendo el sonoro canto, mientras pudo,</l>
         <l>del Amor flecha, y a su flecha escudo.</l>
</lg>

Спасибо!


person Antonio Rojas Castro    schedule 02.09.2016    source источник
comment
Можно ли использовать процессор XSLT 2.0?   -  person Martin Honnen    schedule 02.09.2016


Ответы (1)


Используя XSLT 2.0, вы можете использовать

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:param name="size" as="xs:integer" select="8"/>

    <xsl:output indent="yes"/>

    <xsl:template match="body">
        <xsl:copy>
            <xsl:for-each-group select="l" group-adjacent="(position() - 1) idiv $size">
                <lg>
                    <xsl:copy-of select="current-group()"/>
                </lg>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
person Martin Honnen    schedule 02.09.2016