I have been trying to transform an XML file using XSLT but due to some problem, namely "xmlns", It is not transforming. I, for the life of me can't find what is wrong.
The XML file:
<?xml version="1.0" encoding="utf-8"?>
<restoreCredit fpmlVersion="5-6"
xsi:schemaLocation="http://www.fpml.org/FpML-5/pretrade d:\_Test\_PM\FpML\5.6\pretrade\fpml-main-5-6.xsd"
xmlns="http://www.fpml.org/FpML-5/pretrade"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<header>
<messageId messageIdScheme="http://www.test.com/fpml">4000001</messageId>
<sentBy>Test</sentBy>
<sendTo>SEF1</sendTo>
<creationTimestamp>2012-07-25T08:57:00Z</creationTimestamp>
</header>
<parentCorrId corrIdScheme="http://www.test.com/fpml">RestoreCreditOnSEF</parentCorrId>
<corrId corrIdScheme="http://www.test.com/fpml">4000123</corrId>
<sqNumber>1</sqNumber>
<party id="cb12">
<partyId>CM1</partyId>
</party>
<account id="acc1">
<accountId>account112</accountId>
</account>
</restoreCredit>
This is the XSLT File:
<xsl:stylesheet version="1.0"
xmlns="http://www.fpml.org/FpML-5/pretrade"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.fpml.org/FpML-5/pretrade d:\_test\_PM\FpML\5.6\pretrade\fpml-main-5-6.xsd"
>
<xsl:output method ="xml" indent="yes"/>
<!-- NOTE: All tags have been checked if present, if not , the tags will not be shown in the output -->
<xsl:strip-space elements= "*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="rCredit">
<rCredit>
<xsl:if test="header">
<!-- Header -->
<header>
<FpHdMsgID>
<xsl:attribute name = "FpHdMsgIDScheme">
<xsl:value-of select = "header/messageId/@messageIdScheme" />
</xsl:attribute>
<xsl:value-of select = "header/messageId"/>
</FpHdMsgID>
<FpHdSentBy>
<xsl:value-of select = "header/sentBy" />
</FpHdSentBy>
<FpHdSentTo>
<xsl:value-of select="header/sendTo" />
</FpHdSentTo>
<FpHdCreateTime>
<xsl:value-of select= "header/creationTimestamp" />
</FpHdCreateTime>
<xsl:if test = "header/expiryTimeStamp">
<FpHdExpTime>
<xsl:value-of select= "header/expiryTimeStamp" />
</FpHdExpTime>
</xsl:if>
</header>
</xsl:if>
<!-- parentCorrId -->
<xsl:if test="parentCorrId">
<FpParentCorID>
<xsl:attribute name = "FpParentCorIDCorSch">
<xsl:value-of select = "parentCorrId/@corrIdScheme" />
</xsl:attribute>
<xsl:value-of select = "parentCorrId"/>
</FpParentCorID>
</xsl:if>
<!-- corrId -->
<xsl:if test="corrId">
<FpCorID>
<xsl:attribute name = "FpCorIDSch">
<xsl:value-of select = "corrId/@corrIdScheme" />
</xsl:attribute>
<xsl:value-of select = "corrId"/>
</FpCorID>
</xsl:if>
<!-- sqNumber -->
<xsl:if test="sqNumber">
<FpSeqNum>
<xsl:value-of select="sqNumber"/>
</FpSeqNum>
</xsl:if>
<!-- party -->
<xsl:if test="party">
<FpPartyID>
<xsl:value-of select = "party/@id" />
</FpPartyID>
<FpPartyIDValue>
<xsl:value-of select = "party/partyId" />
</FpPartyIDValue>
</xsl:if>
<!-- account -->
<xsl:if test="account">
<FpAccountId>
<xsl:value-of select="account/@id"/>
</FpAccountId>
<FpAccountIdAcc>
<xsl:value-of select="account/accountId"/>
</FpAccountIdAcc>
</xsl:if>
</rCredit>
</xsl:template>
</xsl:stylesheet>
Expected Ouput:
<?xml version="1.0" encoding="UTF-8"?>
<restoreCredit xmlns="http://www.fpml.org/FpML-5/pretrade" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<header>
<FpHdMsgID FpHdMsgIDScheme="http://www.test.com/fpml">4000001</FpHdMsgID>
<FpHdSentBy>Test</FpHdSentBy>
<FpHdSentTo>SEF1</FpHdSentTo>
<FpHdCreateTime>2012-07-25T08:57:00Z</FpHdCreateTime>
</header>
<FpParentCorID FpParentCorIDCorSch="http://www.test.com/fpml">RestoreCreditOnSEF</FpParentCorID>
<FpCorID FpCorIDSch="http://www.test.com/fpml">4000123</FpCorID>
<FpSeqNum>1</FpSeqNum>
<FpPartyID>cb12444</FpPartyID>
<FpPartyIDValue>CM1</FpPartyIDValue>
<FpAccountId>acc1</FpAccountId>
<FpAccountIdAcc>account1</FpAccountIdAcc>
</restoreCredit>
Resulting Output:
<?xml version="1.0" encoding="UTF-8"?>
<restoreCredit xmlns="http://www.fpml.org/FpML-5/pretrade" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" fpmlVersion="5-6" xsi:schemaLocation="http://www.fpml.org/FpML-5/pretrade d:\_test\_PM\FpML\5.6\pretrade\fpml-main-5-6.xsd">
<header>
<messageId messageIdScheme="http://www.test.com/fpml">4000001</messageId>
<sentBy>test</sentBy>
<sendTo>SEF1</sendTo>
<creationTimestamp>2012-07-25T08:57:00Z</creationTimestamp>
</header>
<parentCorrId corrIdScheme="http://www.test.com/fpml">RestoreCreditOnSEF</parentCorrId>
<corrId corrIdScheme="http://www.test.com/fpml">4000123</corrId>
<sqNumber>1</sqNumber>
<party id="c3321">
<partyId>CM1</partyId>
</party>
<account id="acc1">
<accountId>account12</accountId>
</account>
</restoreCredit>
The expected output only comes when I remove xmlns="http://www.fpml.org/FpML-5/pretrade"
This also works if, In the XML file, I add a tag to "xmlns" Eg xmlns:AAA="http://www.fpml.org/FpML-5/pretrade" But I have to transform this without editing the XML file.
The elements in your XML source are in the
xmlns="http://www.fpml.org/FpML-5/pretrade"
namespace. You must declare this namespace in your stylesheet, assign it a prefix, and use that prefix when selecting or matching the elements in your XML. Here's a minimized example:XSLT 1.0
When this is applied to your input example, the result will be:
IMPORTANT:
Note the double declaration of the same namespace:
The first declaration, the one that assigns the
fpml prefix
, is intended to enable you to address the elements in the input XML.The second declaration declares a default namespace for the stylesheet itself: any literal element you write into the stylesheet - such as the
<header>
in the example - will be placed into the default namespace.The fact that two namespaces are the same (i.e. have the same URI) could be said to be a coincidence.