This is one of the most FAQ in XPath / XSLT:
XPath interprets an unprefixed element name as belonging to "no namespace" and this is the reason elements with unprefixed names belonging to a default (nonempty) namespace aren't selected when only their unprefixed name is specified as a node-test in an XPath expression.
The solution is either:
Create a namespace binding where a prefix (say "x") is associated with the default namespace, then specify x:elementName instead of elementName.
Use long, ugly and unreliable expressions like: *[name() = 'elementName']
Here is an XSLT transformation using the above method1. :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://some_url"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select= "/root/items/item/details/a:data/a:weight"/> </xsl:template> </xsl:stylesheet>
When this transformation is applied (using Saxon 6.5.4 or any other compliant XSLT 1.0 processor) on the provided XML document:
<root> <items> <item> <title>Item</title> <details> <data xmlns="http://some_url"> <length>10</length> <weight>1.2</weight> </data> </details> </item> </items> </root>
The correct/wanted node is selected and its string value is copied to the output:
1.2
alias:data/alias:length. We can't get more specific than that without knowing what you are using to evaluate the XPath.