xslt

xslt - XML/XSL - Programmation

Marsh Posté le 27-08-2008 à 14:40:41    

Bonjour
 
Je cherche a faire une action dans un element xml grace a un caractere
 
Pour exemple j'ai <toto>123 ; 456</toto>
 
et je voudrais que cela devienne <toto> <tata>123</tata> <tata>456</tata> </toto>
 
Merci d'avance si vous avez une solutions XSLT a me proposer

Reply

Marsh Posté le 27-08-2008 à 14:40:41   

Reply

Marsh Posté le 28-08-2008 à 10:24:11    

Rien de sorcier... tu fais un template pour ton élément toto:
 
- tu obtiens le premier et le deuxième caractère avec une des fonctions XPath comme substring(), substring-after(), substring-before().
 
- tu génère une élément toto avec deux tata's avec xsl:element et xsl:attribute.
 

Reply

Marsh Posté le 15-09-2008 à 14:39:26    

Merci de ton aide mais il me reste un probleme
 
Voici mon code
 <xsl:template match="toto">
        <xsl:choose>
  <xsl:when test="contains(.,';')">
            <xsl:call-template name="traitetoto">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
  </xsl:when>
  <xsl:otherwise>
            <toto><xsl:value-of select="."/></toto>
        </xsl:otherwise>
        </xsl:choose>
 </xsl:template>
 
 
 
 
 
 
 <xsl:template name="traitetoto">
        <xsl:param name="text"/>
        <xsl:choose>
  <xsl:when test="not(contains($text,';'))">
            <toto><xsl:value-of select="."/></toto>
  </xsl:when>
  <xsl:otherwise>
            <toto><xsl:value-of select="substring(.,';')"/></toto>
            <xsl:call-template name="traitetoto">
                <xsl:with-param name="text" select="substring-after(.,';')"/>
            </xsl:call-template>
        </xsl:otherwise>
        </xsl:choose>
 </xsl:template>
 
 
 
 
Au debut j'ai  
 
<toto>123 ; 456</toto>
 
Je me retrouve avec  
 
<toto>123 </toto>
 
<toto>123 ; 456</toto>
 
Au lieu de  
 
<toto>123 </toto>
 
<toto>456</toto>
 
Nota bene je boucle car je peux avoir n+ <toto> (<toto>123 ; 456 ; 789</toto> )
 
Est ce que je suis bien parti et comment faire pour supprimer texte que j'ai deja repris  
 
 
Merci bcp


Message édité par popcorn93 le 15-09-2008 à 14:42:31
Reply

Marsh Posté le 16-09-2008 à 09:45:23    

Voici toujours un stylesheet similaire qui remplace les retours à la ligne par des <br /> dans les élements <code>, c'est le même problème et il utilise également la récursivité:
 

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<!-- general settings -->
  <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- global variables -->
  <xsl:variable name="gReplace"><!-- replace target here is CR -->
    <xsl:text>
</xsl:text></xsl:variable>
 
<!-- transformations -->
 
  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
 
 
  <xsl:template match="//code/text()"><!-- replace only in code elements -->
    <xsl:call-template name="doReplace">
      <xsl:with-param name="text" select="."/>
    </xsl:call-template>
 
  </xsl:template>
 
 
  <xsl:template name="doReplace">
    <xsl:param name="text"/>
 
    <xsl:choose>
      <xsl:when test="contains( $text, $gReplace)">
        <xsl:value-of select="substring-before( $text, $gReplace)"/>
        <!-- substitue gReplace occurence with <BR /> string -->
        <xsl:element name="br"/>
        <xsl:call-template name="doReplace"><!-- recurse -->
          <xsl:with-param name="text" select="substring-after( $text, $gReplace)"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


Message édité par avander le 16-09-2008 à 09:46:09
Reply

Marsh Posté le 16-09-2008 à 14:27:27    

<xsl:template name="traitetoto">  
        <xsl:param name="text"/>  
        <xsl:choose>  
  <xsl:when test="not(contains($text,';'))">  
            <toto><xsl:value-of select="."/></toto>  
  </xsl:when>  
  <xsl:otherwise>  
            <toto><xsl:value-of select="substring(.,';')"/></toto>  
            <xsl:call-template name="traitetoto">  
                <xsl:with-param name="text" select="substring-after(.,';')"/>  
            </xsl:call-template>  
        </xsl:otherwise>  
        </xsl:choose>  
 </xsl:template>  
 
Dans ton template, tu as l'air de croire que le . designe le parametre $text à certains endroits, ce qui n'est pas le cas. Emploies le parametre, comme il est d'ailleurs fait dans l'exemple que tu viens de poster.
De plus, tu as confondu dans le deuxieme ligne en rouge, substring et substring-before.
A+,


Message édité par gilou le 16-09-2008 à 15:25:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-09-2008 à 14:55:29    

Un grand merci  
 
cela m'a bcps avancer
 
Cordialement POPCORN

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed