remplacement XML avec XSL
Question
Salut, je suis en train de convertir un fichier XML de FpML 4 à 5 FpML.
La seule chose que je dois changer l'en-tête est FpML suit Voici un exemple:
fichier d'entrée 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>
Maintenant, le fichier obtenu devrait ressembler à:
<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>
J'ai essayé avec des tutoriels et rien autour de XSL vraiment aidé. Toute personne idées serait la bienvenue.
@Update:
Pour l'instant, juste pour voir ce que je travaille essayé cette 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>
Merci
La solution
Cette feuille de style:
<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>
Sortie:
<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>
Modifier : mieux avec un espace de noms par défaut ...
Autres conseils
Voici une feuille de style exemple qui fait le changement de l'échantillon d'entrée que vous avez demandé:
<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>
Si une telle transformation simple est suffisante pour satisfaire le schéma que je n'ai pas vérifié du tout.