If I have an xml with namespaces and want to apply some values replacement, what do I have to change?
http://xslt.online-toolz.com/tools/xslt-transformation.php
<?xml version="1.0"?>
<accounts>
<account>
<name>Alex</name>
</account>
<account>
<name>Fiona</name>
</account>
</accounts>
This will change alle name values to “Johndoe”:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="account/name/text()">
<xsl:text>JohnDoe</xsl:text>
</xsl:template>
</xsl:stylesheet>
But what if I have a namespace before very tag, like:
<?xml version="1.0"?>
<my:accounts>
<my:account>
<my:name>Alex</my:name>
</my:account>
<my:account>
<my:name>Fiona</my:name>
</my:account>
</my:accounts>
Two ways of doing this. Either include the ‘my’ namespace in the stylesheet tag like this:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="(insertnamespacehere)">and do
<xsl:template match="my:account/my:name/text()">or do the rather clumsier:
<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()">I’d be inclined to discourage the latter approach though- namespaces exist to distinguish between elements that have the same local name (such as
employee:nameandcompany:namefor example), by usinglocal-name()you ignore that distinction. In other words, if your document happens to containsfoo:account/foo:name, you’ll accidentally replace that too.Incidentally, your last sample XML isn’t valid- the
mynamespace is not declared. Your rootmy:accountswould need to include this with<my:accounts xlmns:my="(insertnamespacehere)">