la sostituzione XML con XSL
Domanda
Ciao Sto cercando di convertire un file XML di FpML 4 a FpML 5.
L'unica cosa che devo cambiare è l'intestazione FpML Ecco qui di seguito un esempio:
file di input FpML 4
<FpML version="4-0" xsi:type="DataDocument" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.fpml.org/2003/FpML-4-0 ../fpml-main-4-0.xsd" xmlns="http://www.fpml.org/2003/FpML-4-0">
<trade>...</trade>
<party id="partyA">...</party>
<party id="partyB">...</party>
</FpML>
Ora il file risultante dovrebbe essere simile:
<dataDocument xmlns="http://www.fpml.org/FpML-5/confirmation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" fpmlVersion="5-0" xsi:schemaLocation="http://www.fpml.org/FpML-5/confirmation ../../fpml-main-5-0.xsd">
<trade>...</trade>
<party id="partyA">...</party>
<party id="partyB">...</party>
</dataDocument>
Ho provato con tutorial XSL in giro e nulla di veramente aiutato. Delle idee chiunque sarebbe il benvenuto.
@Update:
Per il momento solo per vedere che sta funzionando Ho provato questo XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FpML">
<xsl:element name="test">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Grazie
Soluzione
Questo foglio di stile:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fpml4="http://www.fpml.org/2003/FpML-4-0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.fpml.org/FpML-5/confirmation"
exclude-result-prefixes="fpml4">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="fpml4:FpML">
<dataDocument fpmlVersion="5-0"
xsi:schemaLocation=
"http://www.fpml.org/FpML-5/confirmation ../../fpml-main-5-0.xsd">
<xsl:apply-templates select="node()"/>
</dataDocument>
</xsl:template>
<xsl:template match="fpml4:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Output:
<dataDocument fpmlVersion="5-0"
xsi:schemaLocation="http://www.fpml.org/FpML-5/confirmation ../../fpml-main-5-0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.fpml.org/FpML-5/confirmation">
<trade>...</trade>
<party id="partyA">...</party>
<party id="partyB">...</party>
</dataDocument>
Modifica : Meglio con un default namespace ...
Altri suggerimenti
Ecco un foglio di stile di esempio che fa il cambiamento del campione di input che hai chiesto:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fpml4="http://www.fpml.org/2003/FpML-4-0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.fpml.org/FpML-5/confirmation"
exclude-result-prefixes="fpml4"
version="1.0">
<xsl:template match="fpml4:*">
<xsl:element name="{name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="fpml4:FpML">
<dataDocument fpmlVersion="5-0" xsi:schemaLocation="http://www.fpml.org/FpML-5/confirmation ../../fpml-main-5-0.xsd">
<xsl:apply-templates/>
</dataDocument>
</xsl:template>
<xsl:template match="@* | text() | comment() | processing-instruction()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
Se una semplice trasformazione tale è sufficiente a soddisfare lo schema non ho controllato a tutti.