RE: [xsl] Need to use generate-id() or other method?

Subject: RE: [xsl] Need to use generate-id() or other method?
From: "Kathy Burke" <Kathy_Burke@xxxxxxxxx>
Date: Fri, 25 Apr 2003 11:21:34 -0400
Wow, that makes so much sense!

The only thing I'm not crystal clear on is:

>That way you can concatenate the value of $var from the calling template
with the 
>value of the variable generated with each recursive call to produce a
unique "id" 
>attribute for each button.

Not sure what <div id="{$parent-id}{substring($id, 1,
string-length($id)-1)}"> is doing? Is this similar to Input="button"
name="$var" for each <item>?

Thank you...you have excellent "teacher" qualities.

Kathy



-----Original Message-----
From: cknell@xxxxxxxxxx [mailto:cknell@xxxxxxxxxx]
Sent: Friday, April 25, 2003 12:03 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: RE: RE: RE: [xsl] Need to use generate-id() or other
method?


> -----Original Message-----
> From:     "Kathy Burke" <Kathy_Burke@xxxxxxxxx>
> Subject:  RE: RE: RE: [xsl] Need to use generate-id() 
> or other method?

I've looked over your template. If I understand what you are doing with it,
it looks like you want to identify each step with a multi-level number. A
step may be decomposed into smaller steps with the smaller steps being
numbered as part of the hierarchy. That is to say, there may exist a "step
1" which is composed of sub-steps 1.1, 1.2, 1.3, etc. And this pattern may
continued down through an arbitrary number of levels.

The step elements in the XML file have no unique indentifiers, that's why
you are using the <xsl:number> element to output a unique number for each
step.

Each step is expressed as a single row in the output HTML table. Sub-steps
are visually represented by altering the width of the cell based on the
number of ancestors the step represented in the cell has. Sub-steps are
produced by calling the step template recursively.

If these things are true, I recommend that you modify your template this
way.:

Instead of outputting the number created by the <xsl:number> element
directly, I suggest that you capture it to a variable. You can then place it
in the table division with an <xsl:value-of select="$var" />. You will
further want to add an <xsl:parameter> element to the step template which
will receive the value of $var when the template is called recursively. That
way you can concatenate the value of $var from the calling template with the
value of the variable generated with each recursive call to produce a unique
"id" attribute for each button.

I took a simple hierarchical menu XML file I have and made an XSLT along the
lines I've suggested which will produce HTML to demonstrate the technique.
My output consists of nested <div> elements rather than nested tables, but
the differences should be minor.

XML file
================================================================
<?xml version="1.0" encoding="UTF-8" ?>
<menu>
   <item title="ABC">
      <item uri="http://www.domain.com#books";>Library Home</item>
      <item uri="">Phone Directories</item>
      <item uri="">Acquisition Policy</item>
      <item uri="">Publications</item>
      <item uri="">Directives</item>
      <item uri="">HQ Offices</item>
      <item uri="">Links Library</item>
      <item uri="">Policy</item>
      <item uri="">Program Documents</item>
   </item>
   <item type="menu" title="DEF">
      <item uri="http://www.domain.com#books";>Library Home</item>
      <item uri="">Phone Directories</item>
      <item uri="">Acquisition Policy</item>
      <item uri="">Publications</item>
      <item uri="">Directives</item>
      <item uri="">HQ Offices</item>
      <item uri="">Links Library</item>
      <item uri="">Policy</item>
      <item uri="">Program Documents</item>
      <item title="Warner Bros.">
         <item uri="">Foghorn Leghorn</item>
         <item title="Elmer Fudd">
            <item uri="">Ride of the Valkyries</item>
            <item uri="">Il Trovatore</item>
         </item>
         <item uri="">Daffy Duck</item>
      </item>
   </item>
   <item uri="">Bugs Bunny</item>
</menu>

XSLT file
================================================================
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
   <xsl:output method="html" indent="yes" encoding="UTF-8" />
   <xsl:strip-space elements="*" />

   <xsl:template match="/menu">
      <div id="menu">
         <xsl:apply-templates />
      </div>
   </xsl:template>

   <xsl:template match="item">
      <xsl:param name="parent-id" select="''" />
      <xsl:variable name="id">
         <xsl:number level="multiple" count="item" format="1.1"/>
      </xsl:variable>
      <div id="{$parent-id}{substring($id, 1, string-length($id)-1)}">
         <xsl:apply-templates>
            <xsl:with-param name="parent-id" select="$id" />
         </xsl:apply-templates>
      </div>
   </xsl:template>

</xsl:stylesheet>

-- 
Charles Knell
cknell@xxxxxxxxxx - email


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread