如何使用基于位置的新元素对元素进行分组?

时间:2016-09-02 17:07:57

标签: xml xslt

我有大量的诗句,我想将它们分组成诗节(见下面的例子)。我想每八节添加元素<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>

谢谢!

1 个答案:

答案 0 :(得分:0)

使用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>