[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

namespace aware template matching

Subject: namespace aware template matching
From: tom.kirkpatrick@xxxxxxxxxxxx
Date: Thu, 27 Oct 2005 09:03:18 +0100
namespace aware
I'm trying to do some rather complicated, namespace aware XPath (XSLT1) 
template matching:

Given a structure like this, where <dynamic> could actually be any number 
(including 0) of elements in a namespace other than 'uri://ns-namespace':

<ns:root xmlns:ns="uri://ns-namespace">
    <ns:id> id from ns:root/ns:id </ns:id>
    <dynamic>
        <ns:article>
            <dynamic>
                <ns:id> id from ns:root/ns:article/ns:id </ns:id>
            </dynamic>
        </ns:article>
        <ns:issue>
            <dynamic>
                <more tags>
                   <ns:id> id from ns:root/ns:issue/ns:id </ns:id>
                </more tags>
            </dynamic>
        </ns:issue>
    </dynamic>
</ns:root>


I need a template which matches all <ns:id> elements whoose path from the 
<ns:root> node is simply 'ns:root/ns:article/ns:id'. So I need to be able 
o exclude all elements from any namespace which is not 'ns'.

What I mean is something like this: (although it doesn't work!)

<xsl:template match="ns:root/*[namespace-uri() != 
'uri://ns-namespace']/ns:article/*[namespace-uri() != 
'uri://ns-namespace']/ns:id"/>
</xsl:template>

But this doesn't match the case where there are no foreign elements (whose 
namespace is not 'ns') or more than one foreign element in between ns:root 
and ns:article or between ns:article and ns:id.


The clocest I came was:
<xsl:template match="ns:id[ancestor::ns:article/ancestor::ns:root]"/>

But this one doesn't stipulate that the ancestor::ns:article who has an 
ancestor::ns:root must be the first 'ns' ancestor we meet, so It will also 
match:

<ns:root xmlns:ns="uri://ns-namespace">
    <ns:id> id from ns:root/ns:id </ns:id>
    <dynamic>
        <ns:test>
            <ns:article>
                <ns:test2>
                    <dynamic>
                        <ns:id> id from 
ns:root/ns:test/ns:article/ns:test2/ns:id </ns:id>

How can I specify that the ancestor::ns:article element must be the first 
one we come accross when working up the acnestor chain?

any thoughts?


thanks

-- 
Tom Kirkpatrick
Web Developer - Virus Bulletin

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.