This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Finding the ancestor that declared a namespace?
- From: David N Bertoni/Cambridge/IBM <david_n_bertoni at us dot ibm dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Mon, 5 Aug 2002 14:59:09 -0700
- Subject: Re: [xsl] Finding the ancestor that declared a namespace?
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hi Roger,
In the XPath data model, namespaces are not attributes, so searching for
attributes will not work. In addition, I'm not sure you want to look for
the namespace prefix. Wouldn't it be better to look for a namespace
declaration that matches the namespace URI of the bk:Book element in
question? Here's a sample of what I'm talking about:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:bk="http://www.book-category.com"
exclude-result-prefixes="bk">
<xsl:template match="/">
<out>
<xsl:for-each select="//bk:Book">
<xsl:call-template name="find-ancestor-with-nsdecl">
<xsl:with-param name="node" select="."/>
</xsl:call-template>
</xsl:for-each>
</out>
</xsl:template>
<xsl:template name="find-ancestor-with-nsdecl">
<xsl:param name="node" select="/.."/>
<xsl:variable name="namespace-uri" select="namespace-uri()"/>
<xsl:variable name="ns-elmt" select="$node/ancestor::*[namespace::* =
$namespace-uri][1]"/>
<xsl:if test="$ns-elmt">
<xsl:text>Found the element "</xsl:text>
<xsl:value-of select="name($ns-elmt)"/>
<xsl:text>" with a namespace declaration for "</xsl:text>
<xsl:value-of select="$namespace-uri"/>
<xsl:text>"</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
I'm only using for-each as a quick way of selecting the starting node(s).
Running against this document:
<?xml version="1.0"?>
<bk:BookStore xmlns:bk="http://www.amazon.com">
<bk:Category xmlns:bk="http://www.book-category.com">
<bk:Book/>
</bk:Category>
</bk:BookStore>
Yields the following result:
<?xml version="1.0" encoding="UTF-8"?>
<out>Found the element "bk:Category" with a namespace declaration for
"http://www.book-category.com"</out>
Hope that helps...
Dave
"Roger L. Costello"
<costello@mitre.org> To: xsl-list@lists.mulberrytech.com
Sent by: owner-xsl- cc: "Costello,Roger L." <costello@mitre.org>, (bcc: David N Bertoni/Cambridge/IBM)
list@lists.mulberrytech. Subject: [xsl] Finding the ancestor that declared a namespace?
com
08/05/2002 02:12 PM
Please respond to xsl-list
Hi Folks,
I would like to see if someone has an elegant solution to this problem:
Suppose that my stylesheet template is situated at an element with a
namespace qualifier, e.g.,
<bk:Book>
I would like to find the element which declared the bk: namespace
qualifier. Further, I want the first ancestor element that declared
bk: For example, with this document:
<bk:BookStore xmlns:bk="http://www.amazon.com">
<bk:Category xmlns:bk="http://www.book-category.com">
<bk:Book>
The XPath expression should give me the bk:Category element. Here's my
attempt (which didn't work):
<xsl:variable name="ns-elmt"
select="ancestor::*[name(@.)='xmlns:bk'][1]"/>
This yielded no value for ns-elmt. Any ideas? /Roger
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list