69 votes

XSLT avec une source XML dont l'espace de nom par défaut est défini sur xmlns

J'ai un document XML avec un espace de nom par défaut indiqué à la racine. Quelque chose comme ça:

 <MyRoot xmlns="http://www.mysite.com">
   <MyChild1>
       <MyData>1234</MyData> 
   </MyChild1> 
</MyRoot>
 

Le XSLT pour analyser le code XML ne fonctionne pas comme prévu en raison de l'espace de nom par défaut, c'est-à-dire que lorsque je supprime l'espace de nom, tout fonctionne comme prévu.

Voici mon XSLT:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
			xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:template match="/" >
  <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
     <NewRoot xmlns="http://wherever.com">
       <NewChild>
         <ChildID>ABCD</ChildID>
         <ChildData>
            <xsl:value-of select="/MyRoot/MyChild1/MyData"/>
         </ChildData>
       </NewChild>
     </NewRoot>
   </soap:Body>
  </soap:Envelope>
 </xsl:template>
</xsl:stylesheet>
 

Que faut-il faire avec un document XSLT pour que la traduction fonctionne correctement? Que doit-on faire exactement dans un document XSLT?

77voto

Pavel Minaev Points 60647

Vous devez déclarer l'espace de noms dans votre XSLT, et de l'utiliser dans des expressions XPath. E. g.:

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

Notez que vous devez fournir un certain préfixe si vous voulez faire référence à des éléments de cet espace de noms dans XPath. Alors que vous pouvez juste faire xmlns="..." sans le préfixe, et il va travailler pour littérale éléments, il ne fonctionnera pas pour XPath - en XPath, un unprefixed nom est toujours considéré comme étant dans l'espace de noms avec vide URI, indépendamment de toute xmlns="..." de la portée.

38voto

vinh Points 91

Si vous utilisez XSLT 2.0, spécifiez xpath-default-namespace="xyz" dans la section stylesheet .

4voto

hama4g Points 21

S'il s'agissait d'un problème d'espace nominatif, il est possible d'essayer de modifier deux éléments du fichier xslt:

  • ajouter "mon" définition de l'espace de noms dans xsl: balise stylesheet
  • utilisez le préfixe "my:" lorsque vous appelez des éléments pour parcourir le fichier XML.

=== résultat ===

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X