A better and more elegant way to solve this would be to use a prefix for your namespace. I prefer to work with the default null namespace and use prefixes for all defined namespaces.
Matching fn:local-name() will match the local name of the node in all namespaces. All that is required in your consent, if a prefix is used for your namespace, is my:item[last()] .
Input:
<?xml version="1.0" encoding="UTF-8"?> <items xmlns="http://mynamespace.com/definition"> <item> <number id="1"/> </item> <item> <number id="2"/> </item> </items>
XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:my="http://mynamespace.com/definition"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:param name="addRef"> <reference xmlns="http://mynamespace.com/definition"> <refNo id="a"/> <refNo id="b"/> </reference> </xsl:param> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="my:item[last()]"> <xsl:call-template name="identity"/> <xsl:copy-of select="$addRef"/> </xsl:template> </xsl:stylesheet>
Conclusion:
<?xml version="1.0" encoding="UTF-8"?> <items xmlns="http://mynamespace.com/definition"> <item> <number id="1"/> </item> <item> <number id="2"/> </item> <reference> <refNo id="a"/> <refNo id="b"/> </reference> </items>
source share