108 votes

Existe-t-il un élément XSLT name-of ?

Dans XSLT, il y a le

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

pour obtenir la valeur d'un élément, mais existe-t-il un moyen de sélectionner le nom de la 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 un résultat comme celui-ci :

name : Robert
profession : programmer
hobby : photography

Bien sûr, le XSLT ci-dessus ne compilera pas car

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

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

0 votes

La balise la plus pertinente pour cette question est XPath. Les deux fonctions sont des fonctions XPath standard et peuvent être utilisées dans une expression XPath dans le contexte de n'importe quel langage d'hébergement (C#, XSLT, XQuery, ...) S'il vous plaît, re-tagger

0 votes

Ce texte : "Dans XSLT, il y a le <xsd:value-of select="expression"/>" -- contient une erreur. Le préfixe habituellement utilisé pour les instructions XSLT est "xsl". Habituellement, lorsque nous utilisons XML Schema, nous utilisons le préfixe "xsd" ou "xs". Veuillez corriger.

168voto

Rashmi Pandit Points 9341

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

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

OP-Edit : Cela fera également l'affaire :

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

13 votes

Local-name est ce que vous voulez 9 fois sur 10

21 votes

Local-name est sans espace de noms, c'est pourquoi il est généralement meilleur.

109voto

Dimitre Novatchev Points 147842

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

  • name(someNode) renvoie la version complète de nom complet du noeud, qui inclut le préfixe et les deux points dans le cas où le nœud est un élément ou un attribut.
  • local-name(someNode) ne renvoie que le nom local du nœud, et cela n'inclut pas le préfixe et les deux points dans le cas où le noeud est un élément ou un attribut.

Par conséquent, dans les situations où un nom peut appartenir à deux espaces de noms différents, il faut utiliser l'attribut name() afin que ces noms puissent encore être distingués.

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

name() est l'abréviation de name(.)

local-name() est l'abréviation de local-name(.)

Enfin (n'oubliez pas que les éléments et les attributs ne sont pas les seuls à avoir des noms, ces deux fonctions peuvent également être utilisées sur les IP et elles sont identiques).

15voto

codemeit Points 9327
<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>

0 votes

Comme bonne pratique, utilisez toujours normalize-space() lorsque vous obtenez la valeur du noeud <xsl:value-of select="normalize-space(.)"/> Cela coupera les espaces supplémentaires.

0 votes

Une telle normalisation/sanitisation ne serait nécessaire que si elle n'avait pas été traitée au stade de la collecte des données. Le faire alors évite d'avoir à le faire au moment de l'accès, ce qui est généralement beaucoup plus fréquent. Il faut le faire avant d'ajouter des données à une BDR, et un document xml est simplement une autre base de données.

9voto

Tim Points 362

Pour ceux qui sont intéressés, il n'y en 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>

Ceci 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.

6voto

Rowland Shaw Points 22860
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>

0 votes

Alors pourquoi est-ce que ça a été rejeté ? Il est vrai que l'on aurait pu mentionner local-name() si l'on ne voulait pas de l'espace de noms, mais il serait utile à l'ensemble de la communauté d'expliquer pourquoi cela ne fonctionne pas.

0 votes

Peut-être n'a-t-il pas pu transformer le XML donné. Le nom (.) sera "personne" dans ce cas. Il devrait être "nom", "profession" et "hobby".

0 votes

@CodeMelt Pourquoi n'avez-vous pas rétrogradé la réponse acceptée ? Elle est bonne, mais elle est encore moins précise que celle-ci. J'ai up-voté la réponse de Rowland Shaw car elle fournit la réponse à la question. Plese, downvote uniquement lorsqu'une réponse contient des informations erronées, incorrectes ou trompeuses.

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