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

Re: Search for efficiency...(building nodes dynamicall

Subject: Re: Search for efficiency...(building nodes dynamically)
From: "Ahsan Ali" <doubleletter@xxxxxxxxx>
Date: Sat, 4 Mar 2006 10:30:54 +0400
xml search node
Thanks Andrew !

This works great (I'm using xsl 1.0 - msxml) !

Best Regards,

Ahsan

On 3/2/06, andrew welch <andrew.j.welch@xxxxxxxxx> wrote:
> On 3/2/06, Ahsan Ali <doubleletter@xxxxxxxxx> wrote:
> > Hi all,
> >
> > I have an XML file of 6588 Airport elements as follows:
> >
> > <apt code="AAF" city="Apalachicola" country="United States"
> > state="FL">Municipal Apt.</apt>
> > ....
> >
> > In an XSLT program, I am processing yet another XML document that has
> > the following format:
> >
> > <availabilitytable>
> >         <avail>
> >                 <origin>XYZ</origin>
> >                 <destination>XYZ</destination>
> >         </avail>
> >
> >         <avail>
> >                 <origin>XYZ</origin>
> >                 <destination>XYZ</destination>
> >         </avail>
> > </availabilitytable>
> >
> > These are an approx of 15-20 'avail' elements.
> >
> > The problem: I have written the XSL sheet in such a way that for every
> > 'origin' and 'destination' element, the
> > <apt> nodeset is traversed to get the airport name of a given code.
> >
> > Therefore, if there are duplicate origins/destinations (which is very
> > probable in my case) there will be unnecessary multiple traversals.
> >
> > So I thought of building a nodeset of all origins/destinations,
> > removing duplicates, and then looking up the <apt> file.
> >
> > The Question(s): Since I will need the result node later on in the XSL
> > file, where do I store it ? And how do I build a result node like this
> > ? If this is not feasible, what is the best method to avoid multiple
> > traversals of such a large tree ?
>
> Use a key:
>
> <xsl:key name="airports-by-code" match="apt" use="@code"/>
>
> then in your <origin> and <destination> templates:
>
> <xsl:template match="origin">
>   <xsl:apply-templates select="key('airports-by-code', .)"/>
>
> You may have to do a little extra work to change the context to the
> correct document - this is done differently between XSLT 1.0 or 2.0
> but it's pretty trivial either way:
>
> For 1.0, you have to change the context node to the airport XML using
> a for-each, keeping track of the value of the origin node:
>
> <xsl:template match="origin">
>   <xsl:variable name="origin" select="."/>
>   <xsl:for-each select="$airportsDoc">
>     <xsl:apply-templates select="key('airports-by-code', $origin)"/>
>
> For 2.0, you can use the 3rd argument of key() to specify the XML that
> should keyed into:
>
> <xsl:template match="origin">
>   <xsl:apply-templates select="key('airports-by-code', ., $airportsDoc)"/>
>
> Another great feature of 2.0!
>
> cheers
> andrew

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.