/ / XSL per copiare il nodo radice in + aggiungere attributi - xml, xslt, copia

XSL per copiare il nodo radice in + aggiungere attributi - xml, xslt, copia

Sono un nuovo utente di XSLT e sono stato alle prese con questo problema.

XML di origine:

<ABC X="" Y="" Z=""/>

Risultato XML:

<CDE F="">
<ABC X="" Y="" Z"" G=""/>
</CDE>

Quindi ho bisogno di

  • Creare un nodo radice con un attributo con un valore predefinito nel risultato xml.
  • Copia nodo (l'origine ha solo un nodo) dall'origine al risultato xml.
  • Aggiungi ulteriori attributi al nodo copiato dall'origine XML.

Sono in grado di farlo separatamente ma non sono in grado di fare tutto ciò in un XSLT.

risposte:

2 per risposta № 1

Date le tue ipotesi, sembra che tu abbia bisogno di un modello minimale:

<xsl:template match="ABC">
<CDE F="">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="G">hello</xsl:attribute>
</xsl:copy>
</CDE>
</xsltemplate>

o, se preferisci:

<xsl:template match="/">
<CDE F="">
<xsl:apply-templates select="ABC"/>
</CDE>
</xsl:template>

<xsl:template match="ABC">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="G">hello</xsl:attribute>
</xsl:copy>
</xsl:template>

0 per risposta № 2

Il tuo esempio XML non ne ha bisogno (vedi @empo "srisposta), ma quando si inizia la singola cosa più importante da imparare è il modello di "trasformazione dell'identità". In pratica copia tutto il tuo input XML così com'è e non modificato. Le modifiche che è necessario apportare di solito possono essere eseguite sovrascrivendo la trasformazione dell'identità con altri modelli.

Ecco un foglio di stile di esempio che ti dà l'output che stai cercando:

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

<!--IDENTITY TRANSFORM-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/ABC">
<CDE F="">
<ABC G="">
<xsl:copy-of select="@*"/>
</ABC>
</CDE>
</xsl:template>

</xsl:stylesheet>

NOTA: la "trasformazione dell'identità" non viene utilizzata durante l'elaborazione dell'XML di input perché match="/ABC" modello gestisce l'unico elemento che hai. Tuttavia, se dovessi aggiungere qualcosa al tuo XML, verrebbe incluso nell'output invariato.

Ad esempio, questo input XML modificato:

<ABC X="" Y="" Z="">
<FOO BAR=""/>
</ABC>

transfomed con il seguente foglio di stile (come sopra, solo ho aggiunto il <xsl:apply-templates/> al /ABC modello):

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

<!--IDENTITY TRANSFORM-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/ABC">
<CDE F="">
<ABC G="">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</ABC>
</CDE>
</xsl:template>

</xsl:stylesheet>

produce il seguente risultato:

<CDE F="">
<ABC G="" X="" Y="" Z="">
<FOO BAR=""/>
</ABC>
</CDE>