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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    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 émérite
    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
    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
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    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
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    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 émérite
    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
    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
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    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

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