1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <xsl:template match="PARA">
<!-- On recense tous les élément de type block en prenant soin de les mettre entre chevron (caractère non utilisable dans les noms d'élément) -->
<xsl:variable name="block-elems" select="'<LISTE><PARA>'"/>
<xsl:for-each select="child::node()[position() = 1]|child::*[contains($block-elems, concat('<', local-name(), '>'))]">
<!-- On calcule la position du prochain élément de type block -->
<xsl:variable name="pos" select="count((following-sibling::node()[contains($block-elems, concat('<', local-name(), '>'))])[1]/preceding-sibling::node()) + 1"/>
<!-- On calcule la position de l'élément courant -->
<xsl:variable name="curpos" select="position()"/>
<xsl:choose>
<xsl:when test="not(contains($block-elems, concat('<', local-name(), '>')))">
<!-- L'élément courant n'est pas de type block (possible seulement pour le premier élément) -->
<!-- On crée un élément block pour contenir les éléments inline -->
<fo:block>
<!-- On applique les templates sur l'élément courant -->
<xsl:apply-templates select="."/>
<!-- On recherche tous les éléments suivants de type inline se trouvant avant le prochain élément de type block -->
<xsl:for-each select="../node()[position() > $curpos and ($pos = 1 or position() < $pos) and not(contains($block-elems, concat('<', local-name(), '>')))]">
<!-- On applique les templates sur l'élément inline -->
<xsl:apply-templates select="."/>
</xsl:for-each>
</fo:block>
</xsl:when>
<xsl:otherwise>
<!-- L'élément courant est de type block -->
<!-- On applique les templates sur l'élément courant -->
<xsl:apply-templates select="."/>
<!-- On crée un élément block pour contenir les éléments inline -->
<fo:block>
<!-- On recherche tous les éléments suivants de type inline se trouvant avant le prochain élément de type block -->
<xsl:for-each select="../node()[position() > $curpos and ($pos = 1 or position() < $pos) and not(contains($block-elems, concat('<', local-name(), '>')))]">
<!-- On applique les templates sur l'élément inline -->
<xsl:apply-templates select="."/>
</xsl:for-each>
</fo:block>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template> |
Partager