IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] Transformer du texte en élément


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut [XSLT] Transformer du texte en élément
    Bonjour,

    Je suis actuellement en stage, stage qui implique pas mal de transformation de documents. Dans ce cadre, je dois transformer du xml en xml, et j'utilise XSLT.

    J'aimerais donc pouvoir extraire du texte contenu dans un élément, et le mettre dans un nouvel élément. Un exemple sera sans doute plus parlant :

    Contenu original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <balise>
    #ligne de texte 1
    #ligne de texte 2
    #ligne de texte 3
    </balise>
    Résultat souhaité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <autre balise>ligne de texte 1</autre balise>
    <autre balise>ligne de texte 2</autre balise>
    <autre balise>ligne de texte 3</autre balise>
    Je précise que le caractère # ait partie du texte original, mais ne doit pas apparaître dans le résultat souhaité.

    J'ai pensé à l'utilisation des expressions régulières et la fonction replace, mais je ne sais pas la syntaxe correct.

    Merci pour votre aide,
    Hefbee

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    il suffit de faire une boucle sur le retour chariot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <xsl:template select="balise">
     <xsl:call-template name="getFormat">
      <xsl:with-param name="stringSp" select=." />
     </xsl:call-template>
    </xsl:template>
    <xsl:template name="getFormat">
     <xsl:param name="stringSp" />
     <xsl:choose>
      <xsl:when test="contains($stringSp, '&#xa;')">
       <xsl:variable name="value"><xsl:value-of select="substring-before($stringSp,'&#xa;')" /></xsl:variable>
       <xsl:if test="string-length($value) &gt; 0">
        <autre_balise><xsl:value-of select="$value"/></autre_balise>
       </xsl:if>
       <xsl:call-template name="getFormat">
        <xsl:with-param name="stringSp" select="substring-after($stringSp,'&#xa;')" />
       </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
       <xsl:variable name="value"><xsl:value-of select="$stringSp" /></xsl:variable>
       <xsl:if test="string-length($value) &gt; 0">
        <xsl:call-template name="getFormat">
         <xsl:with-param name="stringSp" select="$stringSp" />
        </xsl:call-template>
       </xsl:if>
      </xsl:otherwise>
     </xsl:choose>
    </xsl:template>

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse rapide.
    Je suis en train de tester (pour le moment, ça ne fonctionne pas, mais il n'y pas de message d'erreur, cela doit être un problème mineur...)

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Cela fontionne presque parfaitement !

    En sortie, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <balise>
    <autre balise>#Texte1</autre balise>
    </balise>
    <balise>
    <autre balise>#Texte2</autre balise>
    </balise>
    <balise>
    <autre balise>#Texte3</autre balise>
    </balise>
    Comment faire pour supprimer les éléments <balise></balise> et la # ?
    Merci

    EDIT : j'ai modifié la premiere ligne par :
    <xsl:template match="balise"/>
    Celan ne fonctionnait pas sinon...

  5. #5
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    pourrais tu nous donner son xsl car je ne comprend pas d'ou vient la balise "<balise>"
    je ne comprend d'ailleurs pas le changement que tu as fait mais si cela fonctionne.
    Sinon une remarque la balise nommé "autre balise" n'est pas conforme il ne faut pas d'espace dans tes nom de balise.

    si tu nous fournis ton xsl je regarderai
    @+

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Voila la partie de mon code où rentre en jeu mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    	<xsl:template match="mediawiki">
    		  <xsl:copy>
    			<xsl:for-each select="page">			
    				<xsl:variable name="title_in" select="title" />
    				<xsl:variable name="concept_id" select="translate($title_in,' ','')"/>
    				<xsl:variable name="file" select="title" />
    				<xsl:variable name="file_out_name" select="concat('../DITAInput/',$file,'.dita')" />
    				<xsl:variable name="author" select="revision/contributor/username"/>
    				<redirect:write file="{$file_out_name}"> 
    					<web_content>
    					<concept id="{$concept_id}">
     						<title><xsl:value-of select="$title_in"/></title>
     						<shortdesc><xsl:value-of select="revision/text/shortdesc"/></shortdesc>
     						<prolog>
     							<author><xsl:value-of select="$author"/></author>
     							<permissions >
     								<xsl:attribute name="view">
     									<xsl:value-of select="revision/text/permissions"/>
     								</xsl:attribute>
     							</permissions>
    							<metadata>
    			 					<keywords>
    			 						<xsl:apply-templates select="//keyword"/>  	
     								</keywords>
     							</metadata>
     						</prolog> 
    						<conbody>
    							<!--  <p><xsl:value-of select="$body"/></p>-->
    							<xsl:apply-templates name="revision/text/body"/>
    							<xsl:apply-templates select="revision/text/body/*"/> 
    						</conbody>
    						<related-links>
    							<xsl:apply-templates select="//link"/>
    						</related-links> 
    					</concept>
    					</web_content>
    				</redirect:write>
    			</xsl:for-each>
    		</xsl:copy>		
    	</xsl:template>
    et la partie de code que vous m'avez fournis (légèrement modifié):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <xsl:template match="revision/text/body">
    	<xsl:call-template name="getFormat">
    	<xsl:with-param name="stringSp" select="." />
    </xsl:call-template>
     
    </xsl:template> 
    	<xsl:template name="getFormat">
    	<xsl:param name="stringSp" />
    	<xsl:choose>
    		<xsl:when test="contains($stringSp, '&#xa;')" >
    				<xsl:variable name="value"><xsl:value-of select="substring-before($stringSp,'&#xa;')" /></xsl:variable>
    					<xsl:if test="string-length($value) &gt; 0">
    						<li><xsl:value-of select="$value"/></li>
    					</xsl:if>
    					<xsl:call-template name="getFormat">
    						<xsl:with-param name="stringSp" select="substring-after($stringSp,'&#xa;')" />
    					</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:variable name="value"><xsl:value-of select="$stringSp" /></xsl:variable>
    			<xsl:if test="string-length($value) &gt; 0">
    				<xsl:call-template name="getFormat">
    					<xsl:with-param name="stringSp" select="$stringSp" />
    				</xsl:call-template>
    			</xsl:if>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    Quand j'écrit "autre balise", ça veut juste dire que le contenu peut être emmené à varier.

    J'aimerais également pouvoir mettre une condition supplémentaires, mais ni le and, ni le & ne semble fonctionner.

    Merci

    EDIT : Quand j'essaye de remplacer le &#xa; par n'importe quel autre caractère, j'obtient l'erreur :

    java.lang.StackOverflowError

  7. #7
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    bonjour
    en faite au vu du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:apply-templates name="revision/text/body"/>
    <xsl:apply-templates select="revision/text/body/*"/>
    je pense qu'il ne passe jamais par mon bout de code.
    EN effet il cherche un template ayant pour nom "revision/text/body" et non un template répondant à la balise "revision/text/body"
    donc je remplacerais par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:apply-templates select="revision/text/body"/>
    <xsl:apply-templates select="revision/text/body/*"/>
    puis si tu cherches à avoir comme séparateur la lettre a par exemple cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    </xsl:template> 
    	<xsl:template name="getFormat">
    	<xsl:param name="stringSp" />
    	<xsl:choose>
    		<xsl:when test="contains($stringSp, 'a')" >
    				<xsl:variable name="value"><xsl:value-of select="substring-before($stringSp,'a')" /></xsl:variable>
    					<xsl:if test="string-length($value) &gt; 0">
    						<li><xsl:value-of select="$value"/></li>
    					</xsl:if>
    					<xsl:call-template name="getFormat">
    						<xsl:with-param name="stringSp" select="substring-after($stringSp,'a')" />
    					</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:variable name="value"><xsl:value-of select="$stringSp" /></xsl:variable>
    			<xsl:if test="string-length($value) &gt; 0">
    				<xsl:call-template name="getFormat">
    					<xsl:with-param name="stringSp" select="$stringSp" />
    				</xsl:call-template>
    			</xsl:if>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    on pourrait rajouter un test pour tester la présence du séparteur dans la chaine du départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:template match="revision/text/body">
    <xsl:if test="contains(.,'&#xa;')">
    	<xsl:call-template name="getFormat">
    	<xsl:with-param name="stringSp" select="." />
            </xsl:call-template>
    </xsl:if>
     
    </xsl:template>

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    En effet, pardon pour l'erreur grossière, j'ai fait un mauvais copié collé du à un mauvais retour en arrière sous eclipse.

    Donc, en gros, le code fonctionne, mais j'ai toujours une erreur quand je remplace le séparateur (java.lang.StackOverflowError).

    Le problème semble venir de ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    </xsl:template> 
    	<xsl:template name="getFormat">
    	<xsl:param name="stringSp" />
    	<xsl:choose>
    		<xsl:when test="contains($stringSp, 'a')" >
    				<xsl:variable name="value"><xsl:value-of select="substring-before($stringSp,'a')" /></xsl:variable>
    					<xsl:if test="string-length($value) &gt; 0">
    						<li><xsl:value-of select="$value"/></li>
    					</xsl:if>
    					<xsl:call-template name="getFormat">
    						<xsl:with-param name="stringSp" select="substring-after($stringSp,'a')" />
    					</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:variable name="value"><xsl:value-of select="$stringSp" /></xsl:variable>
    			<xsl:if test="string-length($value) &gt; 0">
    				<xsl:call-template name="getFormat">
    					<xsl:with-param name="stringSp" select="$stringSp" />
    				</xsl:call-template>
    			</xsl:if>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    puisque quand je les commente, je n'ai plus l'erreur, mais le fonctionnement est aléatoire (il manque une ligne)

  9. #9
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    A oui en effet la on peux ce lancer dans une boucle infini.
    Imaginons qu'il reste à traiter une chaine de type 'dbgd' qui ne contient donc pas a.
    On va lancer le template getFormat, hors comme $value ne contient pas a on va relancer getFormat et ainsi de suite sans fin.
    donc il faut modifier les éléments en gras de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:if test="string-length($value) &gt; 0">	
        <li><xsl:value-of select="$value"/></li>
    </xsl:if>

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Youhou !

    Ca tourne, merci pour ta patience et tes réponses quotidiennes... Content d'avoir résolu ça, un autre soucis est là !
    (je suis débutant, mais je pense que cela s'est vu...)

Discussions similaires

  1. [XSLT]Transformer une valeur d'attribut en élément
    Par heffer69 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 01/02/2008, 11h48
  2. [XSLT]XML vers XML avec des transformations de texte au passage
    Par samcsharpandco dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/11/2007, 17h15
  3. [XSLT] Affichage du texte initial apres transformation
    Par nickola dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/10/2007, 10h42
  4. [XSLT] transformation xml vers fichier .text !
    Par kader78190 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/11/2006, 12h45
  5. [XSLT][xalan] transformation et renommage d'éléments
    Par bernols dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo