Merci Frederic je suis allé voir les exemples et j'ai refais un exemple épuré de tout le reste.
C'est un peu long .....
Peut être ce la pourra t'il servir à quelqu'un un jour :
------------------------------------------------------
Fichier XML Origine
--------------------------------------------------------
<?xml version="1.0"?>
<Document>
<Texte Style="Titre1">Texte du titre 1 </Texte>
<Texte Style="Titre2">Texte du titre 1.1 </Texte>
<Texte Style="Titre2">Texte du titre 1.2 </Texte>
<Texte Style="Titre3">Texte du titre 1.2.1 </Texte>
<Texte Style="Titre1">Texte du titre 2 </Texte>
<Texte Style="Titre2">Texte du titre 2.1 </Texte>
<Texte Style="Titre2">Texte du titre 2.2 </Texte>
</Document>
-------------------------------------------------
Fichier XSL
---------------------------------------------------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Document">
<xsl:element name="Document">
<!-- Il faut ammorcer la pompe avec chaque fils (les Titre1) -->
<xsl:apply-templates select="Texte[@Style='Titre1']" mode="DansNiveau">
<xsl:with-param name="Profondeur">0</xsl:with-param>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="Texte" mode="DansNiveau">
<xsl:param name="Profondeur"/>
<xsl:variable name="Niveau" select="substring-after(@Style,'Titre')"/>
<xsl:choose>
<xsl:when test="$Niveau > $Profondeur">
<xsl:element name="Niveau">
<xsl:attribute name="Profondeur">
<xsl:value-of select="$Niveau"/>
</xsl:attribute>
<xsl:apply-templates select="text()"/> <!-- Ici il faut faire le traitement pour les fils autre que Texte -->
<xsl:apply-templates select="following::*[1]" mode="DansNiveau">
<xsl:with-param name="Profondeur" select="$Profondeur + 1"/>
</xsl:apply-templates>
</xsl:element>
<xsl:apply-templates select="following::*[1]" mode="HorsNiveau">
<xsl:with-param name="Profondeur" select="$Profondeur + 1"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<!-- On ne fait rien car se sera dans HorsNiveau -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Texte" mode="HorsNiveau">
<xsl:param name="Profondeur"/>
<xsl:variable name="Niveau" select="substring-after(@Style,'Titre')"/>
<xsl:choose>
<xsl:when test="$Niveau = $Profondeur">
<xsl:element name="Niveau">
<xsl:attribute name="Profondeur">
<xsl:value-of select="$Niveau"/>
</xsl:attribute>
<xsl:apply-templates select="text()"/> <!-- Ici il faut faire le traitement pour les fils autre que Texte -->
<xsl:apply-templates select="following::*[1]" mode="DansNiveau">
<xsl:with-param name="Profondeur" select="$Profondeur"/>
</xsl:apply-templates>
</xsl:element>
<xsl:apply-templates select="following::*[1]" mode="HorsNiveau">
<xsl:with-param name="Profondeur" select="$Profondeur"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$Niveau < $Profondeur">
<!-- Il n'y a rien à faire on remonte tout seul -->
</xsl:when>
<xsl:otherwise>
<!-- si > c'est déja fait dans DansNiveau -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
-----------------------------------------------------------------
Fichier résultat
----------------------------------------------------------
<?xml version="1.0" encoding="UTF-16"?>
<Document>
<Niveau Profondeur="1">Texte du titre 1
<Niveau Profondeur="2">Texte du titre 1.1 </Niveau>
<Niveau Profondeur="2">Texte du titre 1.2
<Niveau Profondeur="3">Texte du titre 1.2.1 </Niveau></Niveau></Niveau>
<Niveau Profondeur="1">Texte du titre 2
<Niveau Profondeur="2">Texte du titre 2.1 </Niveau>
<Niveau Profondeur="2">Texte du titre 2.2 </Niveau></Niveau>
</Document>
------------------------------------------------------------
On Mon, 11 Oct 2004 10:06:03 +0200, you wrote:
>Bonjour,
>Je suis face à un problème que je na sais par quel bout prendre, je veux hierarchisé un document qui ne l'est pas.
>Je pense que cela doit être un cas d'école, mais je n'ai rien trouvé alros qu'il me semble avoir déja lu quelque chose là dessus.
>Je m'explique :
>J'ai un document OpenOffice, donc les niveaux sont indiqués par des styles différents et ne sont pas imbriqués les uns dans les autres.
>Mon document de sortie lui est composé de balises imbriquées avec une notion de profondeur.
>Exemple :
><Texte Style="Titre1>Texte du titre 1 </Texte>
><Texte Style="Titre2>Texte du titre 1.1 </Texte>
><Texte Style="Titre2>Texte du titre 1.2 </Texte>
><Texte Style="Titre1>Texte du titre 2 </Texte>
><Texte Style="Titre2>Texte du titre 2.1 </Texte>
><Texte Style="Titre2>Texte du titre 2.2 </Texte>
>devrait donner :
><Niveau Profondeur=1>Texte du titre1
> <Niveau Profondeur=2>Texte du titre 1.1</Niveau>
> <Niveau Profondeur=2>Texte du titre 1.2</Niveau>
></Niveau>
><Niveau Profondeur=1>Texte du titre2
> <Niveau Profondeur=2>Texte du titre 2.1</Niveau>
> <Niveau Profondeur=2>Texte du titre 2.2</Niveau>
></Niveau>
>
>L'attribut Profondeur n'étant pas obligatoire, car inutile.
>
>Je ne vois absolument pas comment faire, mais il doit y avoir un truc!
>
>Marc
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Mon Oct 11 18:01:26 2004