2010-04-06 8 views
4

Cela peut être une question très simple, mais c'est une question que je n'arrive pas à comprendre et qui m'arrache les cheveux. J'ai le code XML suivant:XSL et Namespaces

<?xml-stylesheet type="text/xsl" href="email.xsl"?> 
<Example xmlns=""> 
    <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name> 
</Example> 

Et essaie d'utiliser la XSLT suivante:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <table width="90%" border="0" cellpadding="0" cellspacing="0"> 
      <tr> 
      <td> 
       <p>AUTOMATED CONFIRMATION: This confirmation email is unable to take replies. For further assistance please visit our Help pages or Contact us</p> 
       <p>Dear <xsl:value-of select="Name"/>,</p> 
       <p>Thank you for blah blah... </p> 
      </td> 
      </tr> 
     </table> 
     <xsl:apply-templates/> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Je ne peux pas obtenir le nom à apparaître quand je suis en utilisant le xmlns=urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1 dans le flux XML, lorsque je retire le xmlns, le nom s'affiche très bien.

Y a-t-il une syntaxe qui me manque? Je l'ai essayé d'ajouter l'espace de noms à l'élément <xsl:stylesheet>:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rpg="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1" 
> 

Ensuite, en utilisant le préfixe j'ai donné au XSLT dans l'expression XPath:

<xsl:value-of select="Name"/> 

Mais cela ne fonctionne pas non plus. Quelqu'un peut-il aider? Merci d'avance.

Répondre

0

Vous pouvez également utiliser un prédicat et local- prénom(). E.g .:

<xsl:value-of select="*[local-name() = 'Name']"/> 
+0

C'est une mauvaise idée, car elle n'est pas seulement inefficace (lent à cause de la comparaison de chaînes) mais ne tient pas compte des espaces de noms, ce qu'elle devrait faire. – Lucero

+1

... Si les espaces de noms sont pertinents (si un comportement différent est souhaité pour différents espaces de noms). Si le XSL ne fait que formater le contenu du XML brut qui vous intéresse, alors l'espace de noms n'est pas si pertinent et peut être ignoré. Dans l'exemple OP, l'espace de nom n'est * pas * destiné à être conservé dans le fichier XML de sortie, seul le contenu textuel de l'élément est. Je ne suis pas sûr de la performance. Rappelez-vous que selon les définitions de la fonction XPath "* [name() = name]" est équivalent à "name"; et de toute façon un compilateur est libre de 'réécrire 'les expressions XPath à des expressions équivalentes dans le but d'optimiser. – user268396

+0

+1 Ce n'est pas une mauvaise ou une mauvaise réponse qui mérite un score négatif. Cela a certaines implications, mais elles ont été nommées. L'argument performance dépend fortement du nombre d'enfants du nœud actuel et de l'optimisation du processeur XSLT.L'argument namespace dépend fortement de si vous vous en souciez ou non. ;) – Tomalak

4

Vous devez utiliser le même espace de noms dans le fichier XSLT afin que l'expression XPath correspondant à Name corresponde.

<xsl:value-of select="x:Name" xmlns:x="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1"/> 
+2

Il est regrettable que si peu d'exemples de tutoriels XSL comprennent des espaces de noms, il s'agit d'une confusion courante. S'il y a un espace de noms associé à un élément, en ce qui concerne XSL, son nom est un nom qualifié (http://en.wikipedia.org/wiki/QName), pas le nom simple. –

+0

Ce n'est pas la meilleure méthode pour le faire, car la déclaration des espaces de noms à la 'xsl: value-of' bloate le code XSL inutilement. Les déclarer au niveau du document est la voie à suivre. – Tomalak

+0

@Tomalak, cela dépend de la portée de l'espace de noms. Si elle est utilisée uniquement sur cet élément, l'utiliser comme ceci permet de savoir quel espace de noms représente le préfixe. Bien sûr, si l'espace de noms devait être utilisé à plusieurs endroits, je le déplacerais aussi vers le document. – Lucero

6

Votre approche de déclarer l'espace de noms à <xsl:stylesheet> était déjà la bonne direction. Maintenant, tout ce que vous avez à faire est utiliser le préfixe aussi:

<xsl:value-of select="Example/rpg:Name" /> 

Je recommande en outre un petit changement à votre modèle afin de mieux refléter votre entrée:

<xsl:template match="Example"> 
    <!-- ... --> 
    <xsl:value-of select="rpg:Name" /> 
</xsl:template>