Re: [xsl] Recursive selection, elegantly

Subject: Re: [xsl] Recursive selection, elegantly
From: Marcus Andersson <marcus@xxxxxxxxxx>
Date: Sun, 06 Jun 2004 13:48:29 +0200
How about this one:

  <xsl:template match="/root">
    <html>
      <head>
        <title/>
      </head>
      <body>
        <table>
          <tr>
            <xsl:apply-templates select="menu/item"/>
          </tr>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="item">
    <xsl:variable name="resource" select="/root/*[@about = current()/@resource]"/>
    <td><a href="{$resource/@about}"><xsl:value-of select="$resource/name"/></a></td>
  </xsl:template>

/Marcus

Stephen Tredrea 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>
--+--





Current Thread