RE: [xsl] Recursive selection, elegantly

Subject: RE: [xsl] Recursive selection, elegantly
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Sun, 6 Jun 2004 04:09:25 -0700 (PDT)
Hi Stephen,
  I would have written something like this -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="html" version="1.0"
encoding="UTF-8" indent="yes"/>
	
<xsl:template match="/root">
  <html>
    <head>
      <title/>
    </head>
    <body>
      <table>
 	<tr>
	  <xsl:apply-templates select="menu[@ref =
'main_menu']/item"/>
	</tr>
      </table>
    </body>
  </html>
</xsl:template>
	
<xsl:template match="menu/item">
  <xsl:call-template name="x-page">
    <xsl:with-param name="resource"
select="@resource"/>
  </xsl:call-template>
</xsl:template>
	
<xsl:template name="x-page">
  <xsl:param name="resource"/>
  <xsl:variable name="x-name"
select="/root/page[@about = $resource]/name"/>
  <xsl:variable name="y-name"
select="/root/category[@about = $resource]/name"/>
  <td>
    <a href="{$resource}">
       <xsl:value-of select="$x-name"/><xsl:value-of
select="$y-name"/>
    </a>
  </td>
</xsl:template>
	
</xsl:stylesheet>

Regards,
Mukul

--- Stephen Tredrea <stephen.tredrea@xxxxxxxxxxxxx>
wrote:
> Thanks Mukul for your response (and showing me how
> to use {} - that's new to
> me). Unfortunately your solution doesn't cater for
> instances where:
> 
>   a) an item in the menu is not a 'page', or
>   b) only a selection of resources constitute the
> menu
> 
> ...which is why I want to build the menu from the
> menu node.
> 
> My apologies for providing an insufficient sample,
> here's alternative xml:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
>    <menu ref="main_menu">
>      <item resource="/"/>
>      <item resource="/who_we_are"/>
>      <item resource="/contact_us"/>
>      <item resource="/mulberries"/>
>    </menu>
>    <page about="/">
>      <name>Home</name>
>    </page>
>    <page about="/who_we_are">
>      <name>About us</name>
>    </page>
>    <page about="/contact_us">
>      <name>Contact us</name>
>    </page>
>    <page about="/disclaimer">
>      <name>Disclaimer</name>
>    </page>
>    <category about="/mulberries">
>      <name>Top fruit</name>
>    </category>
> </root>
> 
> Note that in this sample I don't want 'Disclaimer'
> in the menu.
> 
> This XSL below works but... I think it's clunky and
> I don't understand why
> the simpler version I provided in my prior example
> doesn't work.
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
>   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
>   <xsl:output method="html" version="1.0"
> encoding="UTF-8" indent="yes"/>
> 
>   <xsl:template match="/">
>      <xsl:apply-templates
> select="//menu[@ref='main_menu'" mode="main_menu"
> />
>   </xsl:template>
> 
>   <xsl:template match="menu" mode="main_menu">
>     <table>
>     <tr>
>       <xsl:apply-templates select="item" />
>     </tr>
>     </table>
>   </xsl:template>
> 
>   <xsl:template match="item">
>     <xsl:param name="resource"><xsl:value-of
> select="@resource"
> /></xsl:param>
>     <xsl:apply-templates select="/root/*[@about =
> $resource]"
> mode="menu_item" />
>   </xsl:template>
> 
>   <xsl:template match="*" mode="menu_item">
>     <td>
>       <a href="{@about}">
>         <xsl:value-of select="name"/>
>       </a>
>     </td>
>   </xsl:template>
> </xsl:stylesheet>
> 
> Regard, Stephen
> 
> -----Original Message-----
> From: Mukul Gandhi [mailto:mukul_gandhi@xxxxxxxxx]
> Sent: 06 June 2004 10:02 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Recursive selection, elegantly
> 
> 
> Hi Stephen,
>   Given the XML -
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
>    <menu ref="main_menu">
>      <item resource="/"/>
>      <item resource="/who_we_are"/>
>      <item resource="/contact_us"/>
>      <item resource="/disclaimer"/>
>    </menu>
>    <page about="/">
>      <name>Home</name>
>    </page>
>    <page about="/who_we_are">
>      <name>About us</name>
>    </page>
>    <page about="/contact_us">
>      <name>Contact us</name>
>    </page>
>    <page about="/disclaimer">
>      <name>Disclaimer</name>
>    </page>
> </root>
> 
> The following XSL -
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> <xsl:output method="html" version="1.0"
> encoding="UTF-8" indent="yes"/>
> 
> <xsl:template match="/root">
>   <html>
>     <head>
>       <title/>
>     </head>
>     <body>
>       <table>
> 	<tr>
> 	  <xsl:apply-templates select="page"/>
> 	</tr>
>       </table>
>     </body>
>   </html>
> </xsl:template>
> 
> <xsl:template match="page">
>   <td>
>     <a href="{@about}">
>       <xsl:value-of select="name"/>
>     </a>
>   </td>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> produces output -
> 
> <html>
> <head>
>   <title></title>
> </head>
> <body>
>   <table>
>     <tr>
>       <td><a href="/">Home</a></td>
>       <td><a href="/who_we_are">About us</a></td>
>       <td><a href="/contact_us">Contact us</a></td>
>       <td><a href="/disclaimer">Disclaimer</a></td>
>     </tr>
>   </table>
> </body>
> </html>
> 
> Regards,
> Mukul
> 
> --- Stephen Tredrea <stephen.tredrea@xxxxxxxxxxxxx>
> wrote:
> > Any suggestion on getting this to work? I can do
> it
> > in four steps but not in
> > three as attempted here!
> >
> > Thanks, Stephen
> >
> > XML (snippet):
> >
> >   <menu ref="main_menu">
> >     <item resource="/" />
> >     <item resource="/who_we_are" />
> >     <item resource="/contact_us" />
> >     <item resource="/disclaimer" />
> >   </menu>
> >
> >   <page about="/">
> >     <name>Home</name>
> >   </page>
> >
> >   <page about="/who_we_are">
> >     <name>About us</name>
> >   </page>
> >
> >   ...etc...
> >
> > XSL (snippet):
> >
> >   <xsl:template match="/">
> >     <xsl:apply-templates
> > select="//menu[@ref='main_menu'" mode="main_menu"
> > />
> >   </xsl:template>
> >
> >   <xsl:template match="menu" mode="main_menu">
> >     <table>
> >     <tr>
> >       <xsl:apply-templates select="//*[@about =
> > item/resource]"
> > mode="menu_item" />
> >     </tr>
> >     </table>
> >   </xsl:template>
> >
> >   <xsl:template match="*" mode="menu_item">
> >     <td>
> >       <xsl:element name="a">
> >         <xsl:attribute name="href"><xsl:value-of
> > select="@about"
> > /></xsl:attribute>
> >         <xsl:value-of select="name" />
> >       </xsl:element>
> >     </td>
> >   </xsl:template>
> >
> > Required HTML:
> >
> >   <table>
> >   <tr>
> >     <td><a href="/">Home</a></td>
> >     <td><a href="/who_we_are">About us</a></td>
> >     ...etc...
> >   </tr>
> >   </table>
> >
> >
> >
>
--+------------------------------------------------------------------
> > XSL-List info and archive:
> > http://www.mulberrytech.com/xsl/xsl-list
> > To unsubscribe, go to:
> > http://lists.mulberrytech.com/xsl-list/
> > or e-mail:
> >
> <mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx>
> > --+--
> >
> 
> 
> 
> 
> 
> __________________________________
> Do you Yahoo!?
> Friends.  Fun.  Try the all-new Yahoo! Messenger.
> http://messenger.yahoo.com/
> 
>
--+------------------------------------------------------------------
> XSL-List info and archive: 
> http://www.mulberrytech.com/xsl/xsl-list
> To unsubscribe, go to:
> http://lists.mulberrytech.com/xsl-list/
> or e-mail:
> <mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx>
> --+--
> 
> 
> 
>
--+------------------------------------------------------------------
> XSL-List info and archive: 
> http://www.mulberrytech.com/xsl/xsl-list
> To unsubscribe, go to:
> http://lists.mulberrytech.com/xsl-list/
> or e-mail:
> <mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx>
> --+--
> 



	
		
__________________________________
Do you Yahoo!?
Friends.  Fun.  Try the all-new Yahoo! Messenger.
http://messenger.yahoo.com/ 

Current Thread