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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…