I need to set a namespace in an XSLT stylesheet at runtime. Here is my XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tdns="{$myNS}">
<xsl:output method="xml" encoding="iso-8859-1" />
<xsl:param name="myNS" required="yes" />
<xsl:template match="*">
<xsl:choose>
<xsl:when test="name(.)='bugs'">
<xsl:element name="tdns:bugs">
<xsl:for-each select="*">
<xsl:apply-templates select="." />
</xsl:for-each>
</xsl:element>
</xsl:when>
<xsl:when test="name(.)='bug'">
<xsl:element name="tdns:bug">
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="name(.)='Device' ">
<xsl:choose>
<xsl:when test="string-length(../tdns:Device_Tmp) > 0 ">
<xsl:element name="tdns:Device">
<xsl:value-of select="../tdns:Device_Tmp" />
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="tdns:Device">
<xsl:value-of select="." />
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:element name="tdns:ShowParamValue">
<xsl:value-of select="$myNS" />
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Input XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<bugs xmlns="http://my.com">
<bug>
<Device>
<![CDATA[Dev1]]>
</Device>
<Device_Tmp>
<![CDATA[Dev_tmp1]]>
</Device_Tmp>
</bug>
</bugs>
Java code
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer(new StreamSource(
new File(xsl)));
transformer.setParameter("myNS", "http://my.com");
transformer.transform(new StreamSource(new File(
xml)),
new StreamResult(System.out));
Output XML
<?xml version="1.0" encoding="iso-8859-1"?>
<tdns:bugs xmlns:tdns="http://my.com">
<tdns:bug>
<tdns:Device>
Dev1
</tdns:Device>
<tdns:ShowParamValue>http://my.com</tdns:ShowParamValue>
</tdns:bug>
</tdns:bugs>
As you can see, XSLT doesn't know any ../tdns:Device_Tmp
node , but if I set a static namespace:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tdns="http://my.com">
...
Then, the result is OK:
<?xml version="1.0" encoding="iso-8859-1"?>
<tdns:bugs xmlns:tdns="http://my.com">
<tdns:bug>
<tdns:Device>
Dev_tmp1
</tdns:Device>
<tdns:ShowParamValue>http://my.com</tdns:ShowParamValue>
</tdns:bug>
</tdns:bugs>
Please, tell me what I'm doing wrong.