2011-12-15 38 views
7

¿Cuál es la manera de obtener un nombre de etiqueta y un nombre de atributo en XML?Obtener nombre de etiqueta/nombre de atributo en XML usando XSLT

Si tengo un archivo XML de la siguiente manera:

<a> 
<apple color="red"/> 
<banana color="yellow"/> 
<sugar taste="sweet"/> 
<cat size="small"/> 
</a> 

y parte de mi archivo XSLT es la siguiente:

<xsl:element name="AAA"> 
<???> 
</xsl:element> 

Entonces, ¿qué debo escribir en la parte ??? para que pueda obtener la salida de la siguiente manera:

Por nombre de etiqueta:

<AAA>apple</AAA> 
<AAA>banana</AAA> 
<AAA>sugar</AAA> 
<AAA>cat</AAA> 

Por nombre del atributo:

<AAA>color</AAA> 
<AAA>color</AAA> 
<AAA>taste</AAA> 
<AAA>size</AAA> 
+0

¿Puede mostrarnos lo que ha intentado hasta ahora? Y para el registro, su ejemplo no es un archivo XML válido. – larsks

+0

¿Es ese todo el documento XML? No está bien formado. ¿Puedes mostrar más contexto? –

Respuesta

10

Nombre de la etiqueta:

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

atributo de nombre del primer atributo (!). Si usted tiene más atributos, usted tendría que elegir un enfoque diferente

<xsl:value-of select="name(@*[1])"/> 

Ambas expresiones podrían utilizarse en una plantilla que coinciden con sus elementos de entrada. p.ej.

<xsl:template match="*"> 
    <xsl:element name="AAA"> 
    <!-- ... --> 
    </xsl:element> 
</xsl:template> 
+0

¡Gracias! Funciona perfectamente – ahliang1412

+1

@_Lucas Eder: '' se puede escribir correctamente como: ''.No tiene sentido que la expresión de un partido sea absoluta y en muy pocos casos consiste en más de un paso de ubicación. –

+0

@DimitreNovatchev: tienes razón, gracias –

3

salida el nombre de un elemento o atributo usando uno de name() o local-name():

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

Supongamos este documento:

<root> 
    <apple color="red"/> 
    <banana color="yellow"/> 
    <sugar taste="sweet"/> 
    <cat size="small"/> 
</root> 

A continuación, esta hoja de estilo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
     <root> 
      <xsl:apply-templates select="/*/*"/> 
      <xsl:apply-templates select="/*/*/@*"/> 
     </root> 
    </xsl:template> 
    <xsl:template match="*|@*"> 
     <AAA><xsl:value-of select="local-name()"/></AAA> 
    </xsl:template> 
</xsl:stylesheet> 

Produce:

<root> 
    <AAA>apple</AAA> 
    <AAA>banana</AAA> 
    <AAA>sugar</AAA> 
    <AAA>cat</AAA> 
    <AAA>color</AAA> 
    <AAA>color</AAA> 
    <AAA>taste</AAA> 
    <AAA>size</AAA> 
</root> 

Observe que tanto los elementos como los atributos se manejan con la misma plantilla.

3

Esta es probablemente una de las soluciones más cortos:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*/*|@*"> 
    <AAA> 
    <xsl:value-of select="name()"/> 
    </AAA> 
    <xsl:apply-templates select="@*"/> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica esta transformación en el siguiente documento XML (el fragmento envuelto en un elemento superior):

<things> 
    <apple color="red"/> 
    <banana color="yellow"/> 
    <sugar taste="sweet"/> 
    <cat size="small"/> 
</things> 

el resultado deseado, correcto se produce:

<AAA>apple</AAA> 
<AAA>color</AAA> 
<AAA>banana</AAA> 
<AAA>color</AAA> 
<AAA>sugar</AAA> 
<AAA>taste</AAA> 
<AAA>cat</AAA> 
<AAA>size</AAA> 
Cuestiones relacionadas