2009-02-25 12 views
90

En XSLT no es el¿Hay un nombre de elemento XSLT?

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

para obtener el valor de un elemento, pero ¿hay algo para seleccionar la etiqueta de nombre 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 compilará porque

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

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

+0

La etiqueta más relevante para esta pregunta es XPath. Ambas funciones son funciones estándar de XPath y se pueden usar dentro de una expresión XPath en el contexto de cualquier lenguaje de alojamiento (C#, XSLT, XQuery, ...) Por favor, vuelva a etiquetar –

+0

Este texto: "En XSLT está el < xsd: value-of select = "expression" /> "- contiene un error. El prefijo generalmente usado para las instrucciones XSLT es "xsl". Por lo general, cuando utilizamos el esquema XML usamos el prefijo "xsd" o "xs". Por favor, corrige. –

+0

Gracias, esos necesitan arreglo. –

Respuesta

139

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

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

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

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

local-name es lo que quiere 9 veces de cada 10 – annakata

+16

local-name es el espacio de nombres sin, por eso es usualmente mejor. –

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

¿Por qué votó esto? De acuerdo, podría haber mencionado local-name() si no deseara también el espacio de nombres, pero sería útil para la comunidad en general explicar por qué esto no funcionaría. –

+0

Quizás, no pudo transformar el XML dado. el nombre (.) será "persona" en este caso. debe ser "nombre", "profesión" y "hobby". –

+0

@CodeMelt ¿Por qué no rechazaste la respuesta aceptada? Es bueno, pero es incluso menos específico que este. Elegí la respuesta de Rowland Shaw porque proporciona la respuesta a la pregunta. Plese, downvote solo cuando un aswer contiene información incorrecta, incorrecta o engañosa –

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

Como una buena práctica utilizar siempre normalizar el espacio() al obtener el valor del nodo Esto recortar los espacios adicionales –

+0

@Rashimi , gracias por señalar esto. –

+0

Dicha normalización/sanitización solo sería necesaria si no se hubiera manejado en la etapa de recopilación de insumos. Al hacerlo, ahorra tener que hacerlo en el momento del acceso, que suele ser mucho más frecuente. Uno lo haría antes de agregar a un RDB, y un documento xml es solo otra base de datos. – Patanjali

93

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 que incluye el prefijo y el colon en caso de que el nodo es un elemento o un atributo.
  • local-name(someNode) devoluciones solamente el nombre local del nodo, y que no incluye el prefijo y el colon en caso de que el nodo es un elemento o un atributo .

Por lo tanto, en situaciones donde un nombre puede pertenecer a dos espacios de nombres diferentes, se 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 de name(.)

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

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

7

Para los interesados, no existe:

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

Sin embargo, puede volver a crear el/elemento de etiqueta 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 los mangos formatear 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.

Cuestiones relacionadas