2011-01-16 11 views
7

Ho un file XML in ingresso con una struttura della lista:xsl: value-of utilizzato come xsl: nome dell'elemento

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

che sto cercando di convertire in questa struttura:

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

Questo è una logica facile da implementare con XSL, ma mi sto imbattendo in complicazioni.

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

non funziona perché presumo le virgolette doppie sequenziali stanno rompendo il <xsl:element> tag

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

non funziona perché non posso usare << o >> e

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

Non funziona perché alla fine mi trovo con > e < nel mio codice invece che XML analizzabile < o >. Mi aspettavo che questa fosse una soluzione molto semplice, ma non trovo alcun record su Internet. Qual è la semplice soluzione che sto trascurando?

+0

Buona domanda, +1.Vedi la mia risposta per una soluzione completa e breve, usando ''. :) –

risposta

11

Ecco una soluzione completa e breve, utilizzando l'istruzione <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> 

Quando questa trasformazione è applicato sul documento XML fornito (corretto da ben formato):

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

il risultato voluto è prodotto:

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

nota impegno:

  1. L'uso dell'istruzione <xsl:element> per creare un elemento con nome staticamente sconosciuto.

  2. L'uso di AVT (Attribute-Value-Template) per specificare l'attributo name in modo compatto e più leggibile.

  3. E 'possibile che un errore venga sollevata se i valori di stringa di elementOne e elementTwo non obbediscono regole lessicali/sintattico per un nome di elemento (QName).

6

credo è possibile utilizzare le parentesi graffe invece di <xsl:value-of>:

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

Stavo cercando qualcos'altro ma questa è la risposta che stavo cercando ... Grazie! – confiq

0

non l'ho provato, ma questo lavoro 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

chiudi ma devi sfuggire alla variabile AntonK