online node example attribute xml xslt xpath

xml - node - ¿Hay un nombre de elemento XSLT?



xpath xml (5)

En XSLT está el

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

para obtener el valor de un elemento, pero ¿hay algo para seleccionar el nombre de etiqueta del elemento?

En una situación como esta:

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

Para obtener una salida como esta:

name : Robert profession : programmer hobby : photography

Por supuesto, el XSLT anterior no se compilará porque

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

no existe Pero, ¿cómo podría hacerse esto?


Esto le dará el nombre del elemento actual (nombre de la etiqueta)

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

OP-Edit: Esto también hará el truco:

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


Para aquellos interesados, no hay:

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

Sin embargo, puede volver a crear la etiqueta / elemento yendo:

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

Esto es útil en una plantilla xslt que, por ejemplo, maneja el formato de los valores de datos para muchos elementos diferentes. Cuando no se conoce el nombre del elemento en el que se está trabajando y aún se puede generar el mismo elemento, y modificar el valor si es necesario.


Nadie señaló la sutil diferencia en la semántica de las funciones name() y local-name() .

  • name(someNode) devuelve el nombre completo del nodo, y eso incluye el prefijo y los dos puntos en caso de que el nodo sea un elemento o un atributo.
  • local-name(someNode) devuelve solo el nombre local del nodo, y eso no incluye el prefijo y los dos puntos en caso de que el nodo sea un elemento o un atributo.

Por lo tanto, en situaciones donde un nombre puede pertenecer a dos espacios de nombres diferentes, uno debe usar la función name() para que estos nombres se sigan distinguiendo.

Y, por cierto, es posible especificar ambas funciones sin ningún argumento :

name() es una abreviatura para name(.)

local-name() es una abreviatura para local-name(.)

Finalmente , recuerde que no solo los elementos y atributos tienen nombres, estas dos funciones también se pueden usar en IP y en estos son idénticos).


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


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