J'ai un document XML avec un espace de noms 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 XML ne fonctionne pas comme prévu en raison de l'espace de noms par défaut, c'est-à-dire lorsque je supprime l'espace de noms, 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 le document XSLT pour que la traduction fonctionne correctement? Que doit-on faire exactement dans le document XSLT?
Vous devez déclarer l'espace de noms dans votre XSLT et l'utiliser dans les expressions XPath. Par exemple.:
<xsl:stylesheet ... xmlns:my="http://www.mysite.com">
<xsl:template match="/my:MyRoot"> ... </xsl:template>
</xsl:stylesheet>
Notez que vous devez fournir un préfixe si vous voulez faire référence aux éléments de cet espace de noms dans XPath. Alors que vous pouvez simplement faire xmlns="..."
sans le préfixe, et cela fonctionnera pour les éléments de résultat littéraux, cela ne fonctionnera pas pour XPath - dans XPath, un nom non préfixé est toujours considéré comme étant dans un espace de noms avec un URI vide, indépendamment de tout xmlns="..."
portée.
Si vous utilisez XSLT 2.0, spécifiez xpath-default-namespace="http://www.example.com"
dans la section stylesheet
.
S'il s'agissait d'une sorte de problème d'espace de nom, il est possible d'essayer de modifier deux choses dans le fichier xslt:
<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>