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 № 1Date 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>