Re: [xsl] XPath matching elements with or without prefix by inherited namespace

Subject: Re: [xsl] XPath matching elements with or without prefix by inherited namespace
From: Abel Braaksma <abel.online@xxxxxxxxx>
Date: Sat, 12 Jan 2008 16:24:15 +0100
Michael Kay wrote:
How do I reliably match the "elem" element in both of the below
documents:

<?xml version="1.0" encoding="UTF-8?>
<p:example xmlns:p="something">
  <elem>value</elem>
</p:example>

<?xml version="1.0" encoding="UTF-8?>
<p:example xmlns:p="something">
  <p:elem>value</p:elem>
</p:example>

I believe that these are effectively identical as the prefix on elem in the latter case is redundant and same the namespace definition is inherited from p:example.

Wrong. In the first case elem is in no namespace, in the second case elem is in the "something" namespace. So any code that wants to match has to test for two different element names.

Or use local-name:


<xsl:apply-templates select="*[local-name() = 'elem']" />

or:

<xsl:template match="*[local-name() = 'elem']">
   .....
</

However, this use is discouraged as it may easily introduce hard to find bugs. If you use an SA processor, you effectively remove the "Aware"ness from the match using this approach.

Cheers,
-- Abel

Current Thread