2011-01-16 14 views
7

Tengo un archivo XML entrante con una estructura de lista:xsl: value-of utilizado como XSL: nombre del elemento

<list> 
    <listItem> 
    <name>elementOne</name> 
    <value>elementOneValue</name> 
    </listItem> 
    <listItem> 
    <name>elementTwo</name> 
    <value>elementTwoValue</name> 
    </listItem> 
</list> 

la que estoy tratando de convertir a esta estructura:

<elementOne>elementOneValue</elementOne> 
<elementTwo>elementTwoValue</elementTwo> 

Este es fácil de implementar con XSL, pero estoy teniendo complicaciones.

<xsl:for-each select="/list/listItem"> 
    <xsl:element name="<xsl:value-of select="name"/>"> 
    <xsl:value-of select="value"/> 
    </xsl:element> 
</xsl:for-each> 

no funciona porque supongo que las comillas dobles secuenciales están violando la etiqueta <xsl:element>

<xsl:for-each select="/list/listItem"> 
    <<xsl:value-of select="name"/>> 
    <xsl:value-of select="value"/> 
    </<xsl:value-of select="name"/>> 
</xsl:for-each> 

no funciona porque no puedo usar << o >> y

<xsl:for-each select="/list/listItem"> 
    &lt;<xsl:value-of select="name"/>&gt; 
    <xsl:value-of select="value"/> 
    &lt;/<xsl:value-of select="name"/>&gt; 
</xsl:for-each> 

No funciona porque termino con > y < en mi código en lugar de XML parseable < o >. Esperaba que esta fuera una solución muy fácil, pero no puedo encontrar ningún registro en Internet. ¿Cuál es la solución simple que estoy pasando por alto?

+0

Buena pregunta, +1.Vea mi respuesta para una solución completa y breve, usando ''. :) –

Respuesta

11

Aquí es una solución completa y definitiva, usando la instrucción <xsl:element> XSLT:

<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="listItem"> 
    <xsl:element name="{name}"> 
    <xsl:value-of select="value"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en el documento XML proporcionado (corregido para ser bien formada):

<list> 
    <listItem> 
     <name>elementOne</name> 
     <value>elementOneValue</value> 
    </listItem> 
    <listItem> 
     <name>elementTwo</name> 
     <value>elementTwoValue</value> 
    </listItem> 
</list> 

el resultado deseado se produce:

<elementOne>elementOneValue</elementOne> 
<elementTwo>elementTwoValue</elementTwo> 

hacer la nota:

  1. El uso de la instrucción <xsl:element> para crear un elemento con un nombre estáticamente desconocido.

  2. El uso de la AVT (Attribute-Value-Template) para especificar el atributo name de una manera compacta y más fácil de leer.

  3. Es posible que un error que se planteó si los valores de cadena de elementOne y elementTwo no obedecen las reglas léxicas/sintáctica para un nombre de elemento (QName).

6

Creo que se puede utilizar llaves en lugar de <xsl:value-of>:

<xsl:element name="{name}"> 
    <xsl:value-of select="value"/> 
</xsl:element> 
+0

Estaba buscando algo más, pero esta es la respuesta que estaba buscando ... ¡Gracias! – confiq

0

no lo probamos, pero este trabajo sould ...

<xsl:for-each select="/list/listItem"> 
     <xsl:variable name="elemName" select="name"/> 
     <xsl:element name="$elemName"> 
     <xsl:value-of select="value"/> 
     </xsl:element> 
    </xsl:for-each> 
+0

cerca, pero debe escapar de la variable AntonK