remplacer un noeud XSL

remplacer un noeud XSL - XML/XSL - Programmation

Marsh Posté le 08-03-2005 à 16:03:47    

Bonjour à tous,
Je cherche à modifier une transformation XSL, par une autre transformation XSL dans le but précis de modifier un noeud particulier.
 
Je souhaite en fait remplacer un <xsl:value-of select="."/> par un <xsl:copy-of select=".//*"/>
 
le problème c'est que je n'arrive pas à atteindre correctement mon xsl:value-of.
 
Voila la partie de mon XSL que je veux modifier :  

 <xsl:template match="/ns0:root/ns0:image">
    <ns0:image>
      <xsl:for-each select="@ns0:*|@*[namespace-uri()='']">
        <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
          <xsl:value-of select="." />
        </xsl:attribute>
      </xsl:for-each>
      <w:p>
        <w:pPr>
          <w:ind w:hanging="1080" />
        </w:pPr>
        <w:r>
          <w:t>
            <xsl:value-of select="." />
          </w:t>
        </w:r>
      </w:p>
    </ns0:image>
  </xsl:template>


 
et la partie de mon xsl qui devrait le modifier qui ne marche pas:

<xsll:template match="//ns0:image//xsl:value-of/@select">
  LL
 </xsll:template>


 
alors que  

<xsll:template match="//ns0:image//@select">
  LL
 </xsll:template>


me remplace bien la valeur par LL
 
 
Ma question est :
comment puis je transformer mes 2 <xsl:value-of select="." />
par mon <xsl:copy-of select=".//*"/> ?
 
Merci d'avance


Message édité par llasserre le 08-03-2005 à 22:27:39
Reply

Marsh Posté le 08-03-2005 à 16:03:47   

Reply

Marsh Posté le 08-03-2005 à 22:28:44    

le prochain coup utilise les balises [ fixed] ... [ /fixed] (sans les espaces) pour entourer ton code, parce qu'avec des smiley à la place du texte c'est illisible (là je l'ai fait à ta place)


Message édité par benou le 08-03-2005 à 22:29:28
Reply

Marsh Posté le 09-03-2005 à 00:49:24    

chez moi, match="//ns0:image//xsl:value-of/@select" ca fonctionne :
 
XML


<?xml version="1.0" encoding="UTF-8"?>
 <xsl:template match="/ns0:root/ns0:image" xmlns:ns0="toto" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <ns0:image>  
      <xsl:for-each select="@ns0:*|@*[namespace-uri()='']">  
        <xsl:attribute name="{name()}" namespace="{namespace-uri()}">  
          <xsl:value-of select="." />  
        </xsl:attribute>  
      </xsl:for-each>  
    </ns0:image>  
 </xsl:template>


 
XSL


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="toto">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 
 <xsl:template match="*">
  <xsl:element name="{name()}">
   <xsl:apply-templates select="@*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
 
 <xsl:template match="//ns0:image//xsl:value-of/@select">
  <xsl:attribute name="{name()}">LL</xsl:attribute>
 </xsl:template>
 
 <xsl:template match="@*">
  <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
 </xsl:template>
</xsl:stylesheet>


 
OUT


<?xml version="1.0" encoding="UTF-8"?>
<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="/ns0:root/ns0:image">
 <ns0:image xmlns:ns0="toto">
  <xsl:for-each select="@ns0:*|@*[namespace-uri()='']">
   <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
    <xsl:value-of select="LL"/>
   </xsl:attribute>
  </xsl:for-each>
 </ns0:image>
</xsl:template>


Message édité par benou le 09-03-2005 à 00:56:03
Reply

Marsh Posté le 09-03-2005 à 12:11:35    

Effectivement ceci fonctionne, je doit donc avoir un problème de xpath.
 
J'ai modifier ton xsl en ceci :
 
XSL


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="toto">
 <xsl:output method="xml" version="1.0" encoding="UTF-8"/>
 
 <xsl:template match="*">
  <xsl:element name="{name()}">
   <xsl:apply-templates select="@*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
 
 <xsl:template match="//ns0:image//xsl:value-of">
   <xsl:element name="xsl:copy-of">
     <xsl:attribute name="select">.//*</xsl:attribute>
   </xsl:element>
 </xsl:template>
 
 <xsl:template match="@*">
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
 </xsl:template>
</xsl:stylesheet>  


 
et j'obtient bien le résultat voulu à savoir remplacer le value-of par un copy of.
 
Mais si je rajoute le tag stylesheet dans mon document source, le transformateur XSL ne passe plus dans le template //ns0: ...
 
XML


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ns0="schemas-MSWordXmlToolbox#03022005-162442">
 
 <xsl:template match="/ns0:root/ns0:image">
    <ns0:image>  
      <xsl:for-each select="@ns0:*|@*[namespace-uri()='']">  
        <xsl:attribute name="{name()}" namespace="{namespace-uri()}">  
          <xsl:value-of select="." />  
        </xsl:attribute>  
      </xsl:for-each>  
    </ns0:image>  
 </xsl:template>
 </xsl:stylesheet>


 
Peux me dire ou est ce que je me loupe ? :)
Merci beaucoup

Reply

Marsh Posté le 09-03-2005 à 12:40:22    

c'est parce que les namspace de tes 2 documents ne correspondent plus : faut que tu mettes la bonne uri pour le prefix ns0 dans ta XSL. dis toi que les prefix c'est juste un raccourcit pour ne pas avoir à écrire l'uri complète => quand tu matches ns0:image, en fait tu matches le tag 'image' du namespace correspondant au prefix ns0 c'est à dire 'toto' (c'est défini comme ca dans l'url que je t'ai filé), hors dans ton document xml, le tag image est dans le namespace "schemas-MSWordXmlToolbox#03022005-162442" => ca matche pas ...


Message édité par benou le 09-03-2005 à 14:21:36
Reply

Marsh Posté le 09-03-2005 à 14:21:10    

Houla oui, autant pour moi, dans l’euphorie j’avais oublier cela.
 
Merci beaucoup.  

Reply

Marsh Posté le 09-03-2005 à 14:21:49    

you're welcome :jap:

Reply

Sujets relatifs:

Leave a Replay

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