2013-05-01 16 views
0

J'ai un code XML qui ressemble à ceci;Comment référencer génériquement un nœud racine XML

<Root attr1="ABC"> 
    <Element1> 
     <Element2> 
      <Element3 />  
     </Element2> 
     <Element2> 
      <Element3 />  
     </Element2> 
    <Element1> 
</Root> 

J'ai quelques XSLT qui traite ce, et pour une raison ou une autre, il fait référence au nœud racine comme « racine » (sans les guillemets).

Je suis maintenant dans une position où je vais avoir un XML à structure identique, à l'exception du nœud racine qui est appelé par exemple. Je ne veux pas deux versions de mon XSLT, donc je peux référencer le nœud racine d'une manière plus générique.

À titre d'exemple de ce que je veux dire ...

<xsl:when test="/Root/@attr1 = 'ABC'"> 

J'ai besoin que cela fonctionne aussi pour

<xsl:when test="/NewRoot/@attr1 = 'ABC'"> 

Je l'ai noté dans ma lecture sur le sujet que les soins doivent être prises pour assurer que la référence est le nœud racine, et non l'élément Document, ce dernier je suppose est cette partie de la XML

<?xml version="1.0" encoding="UTF-8"?> 

Toute aide est toujours appréciée.

Merci

Répondre

1

Je suggère d'utiliser par exemple

<xsl:template match="/Root | /NewRoot"> 
    <xsl:if test="@attr1 = 'ABC'">...</xsl:if> 
</xsl:template> 

ou peut-être il pourrait même être préférable de mettre l'attribut vérifier dans un schéma de correspondance de modèle ainsi par exemple

<xsl:template match="/Root | /NewRoot"> 
     <xsl:apply-templates select="@*"/> 
    </xsl:template> 

<xsl:template match="/Root/@attr1[. = 'ABC'] | /NewRoot/@attr1[. = 'ABC']"> 
    <!-- now output here what you want to output if the condition is met --> 
</xsl:template> 

Si vous avez vraiment besoin d'utiliser un xsl:whentest avec un chemin complet puis utilisez test="/Root/@attr1 = 'ABC' or /NewRoot/@attr1 = 'ABC'". Puis-je référencer le nœud racine d'une manière plus générique?

+0

Eh oui, cela l'a fait. Merci Je le prends alors il n'y a pas une façon «générique» de se référer au nœud racine? – Nerdio

+0

'name (/ *)' vous renverra le nom du noeud racine, mais à moins que vous n'utilisiez XSLT 2.0 ou supérieur, il n'est pas trivial de l'utiliser dans une expression XPath. – davmos

2

Il suffit d'utiliser:

/*/@attr1 = 'ABC' 

ce produit true() exactement quand l'élément supérieur (quel que soit son nom) du document XML a un attribut nommé attr1, dont la valeur chaîne est la chaîne: " ABC".

Ici, nous utilisons le fait qu'un document XML bien formé doit avoir exactement un élément supérieur - donc on n'a pas besoin d'écrire: /*[1]

Questions connexes