web-dev-qa-db-fra.com

Existe-t-il un nom XSLT-of-element?

En XSLT il y a le

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

pour obtenir la valeur d'un élément, mais y a-t-il quelque chose pour sélectionner le nom de balise de l'élément?

Dans une situation comme celle-ci:

<person>
  <!-- required stuff -->
  <name>Robert</name>
  <!-- optional stuff, free form for future extension. 
       Using XMLSchema's xsd:any -->
  <profession>programmer</profession>
  <hobby>photography</hobby>
</person>

<xsl:for-each select="person">
   <xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>

Pour obtenir une sortie comme ceci:

name : Robert
profession : programmer
hobby : photography

Bien sûr, le XSLT ci-dessus ne sera pas compilé car

 <xsl:tag-of select="expression"/>

n'existe pas. Mais comment cela pourrait-il être fait?

96
Robert Gould

Cela vous donnera le nom de l'élément actuel (nom de la balise)

<xsl:value-of select ="name(.)"/>

OP-Edit: Cela fera aussi l'affaire:

<xsl:value-of select ="local-name()"/>
150
Rashmi Pandit

Personne n'a souligné la différence subtile dans la sémantique des fonctions name() et local-name() .

  • name(someNode) renvoie le nom complet du nœud, qui inclut le préfixe et les deux points si le nœud est un élément ou un attribut.
  • local-name(someNode) ne renvoie que le nom local du noeud, sans compter le préfixe et les deux points si le noeud est un élément ou un attribut.

Par conséquent, dans les cas où un nom peut appartenir à deux espaces de nom différents, il est nécessaire d’utiliser la fonction name() pour que ces noms soient toujours distingués.

Et, BTW, il est possible de spécifier les deux fonctions sans aucun argument :

name() est une abréviation de name(.)

local-name() est une abréviation de local-name(.)

Enfin , rappelez-vous que non seulement les éléments et les attributs ont des noms, ces deux fonctions peuvent également être utilisées sur des PI et qu'elles sont identiques).

99
Dimitre Novatchev
<xsl:for-each select="person">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
  </xsl:for-each>  
</xsl:for-each>
14
Ray Lu

Pour ceux intéressés, il n'y a pas:

<xsl:tag-of select="."/>

Cependant, vous pouvez recréer le tag/élément en allant:

<xsl:element name="{local-name()}">
  <xsl:value-of select="substring(.,1,3)"/>
</xsl:element>

Cela est utile dans un modèle xslt qui, par exemple, gère le formatage des valeurs de données pour de nombreux éléments différents. Lorsque vous ne connaissez pas le nom de l'élément sur lequel vous travaillez, vous pouvez toujours sortir le même élément et modifier la valeur si nécessaire.

9
Tim
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>
6
Rowland Shaw