RE: [xsl] work-around for poor XML design needed

Subject: RE: [xsl] work-around for poor XML design needed
From: "Dion Houston" <dionh@xxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 23 Oct 2002 12:08:23 -0700
Hi John:

The way I'd attack this is by creating a key on the country which
contains the preceding region's country element as the value:

<xsl:key name="parent-region" match="/states/country"

This then will give you the associated region for any given region.

I'd then write a template that matches on region, and to display the
list apply templates on those elements with the current region as it's
parent perhaps with a different mode i.e.

<xsl:template match="region">
   <xsl:apply-templates select="key('parent-region', country)"

And then in your root template simply do your separate processing for
those countries with no region.



-----Original Message-----
From: jdunning [mailto:jdunning@xxxxxxxxx] 
Sent: Wednesday, October 23, 2002 9:57 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] work-around for poor XML design needed

Hi all,
I need a workaround for a poor XML design.  The XML structure is as
<!-- countries which belong to no regional organization -->
<!-- a regional organization -->
      <!-- the name of the regional org. is a country code -->
<!-- countries following a region are members of that regional org. -->
<!-- another regional org. -->
      <!-- the other regional org.'s name -->
<!-- members of that regional org. -->

What I need is to display a list of regional organizations with members,
followed by all countries not in an organization as such:

AP: (GH, GM, KE, UG); EP: (AT, BE, CH, LI, CY); AA, AB, AC, AD

The problem is that the countries that make up a region are not
contained and I'm unsure of a way to specify "the <country> elements
this <region> and the next <region>"

This is the template I've been working with:

<xsl:for-each select="states/region/country">
    <xsl:value-of select="."/>:(
    <!-- PROBLEM: all following countries are siblings (regardless of
               which region they should belong to -->
                 <xsl:value-of select="."/>
                 <xsl:if test="not(position()=last)">
                    <xsl:text> </xsl:text>
     <xsl:if test="parent::region[1]/preceding-sibling::country">
                <xsl:value-of select="."/>
                <xsl:if test="not(position()=last)">
                    <xsl:text> </xsl:text>

Any help is always appreciated.  TIA, John

 XSL-List info and archive:

 XSL-List info and archive:

Current Thread