|
Subject: RE: RE: [xsl] XPath question From: cknell@xxxxxxxxxx Date: Tue, 04 Feb 2003 10:37:23 -0500 |
[Andy Cups, David Carlisle, Michael Kay]
Thanks for your contributions, but upon further reflection,
this approach is going to be just as complicated, if not more,
as the recursive calling of a template with passing the id attribute
of the parent node as a parameter that I had bee trying. The template
is in the [Zack Brown] section of the reply.
I had come up with <xsl:value-of select="count(../preceding-sibling)" />,
but in the template I used, the result was always 0, so while I did have
a valid syntax, it appears I had applied it in the wrong context.
-----------------------------------------
[David Carlisle]
> you may prefer to to just generate your 1.2.3 number directly using
> <xsl:number/>
Thanks. I've started working on that approach. The Oracle XSLT processor
I am constrained to use inserts a gratuitous space at the end of the
number so that this template:
<xsl:variable name="id"><xsl:number level="multiple" format="01" /></xsl:variable>
produces output such that when I insert the variable in an id attribute:
<div id="m.{$id}">
I get a result like this:
<div id="m.01 ">
So I'm for a way to clear that up.
-----------------------------------------
[Zack Brown]
> It seems like an interesting problem. Could you post
> the precise output you'd like to see after running the
> below input through the xslt processor?
Note that in the actual output, the id numbers in the <div> with
the class value of "sub-menu" and title of "Apples" are wrong in
the third position. The should read "(s)m.02.02 ...", instead they
read "(s)m.02.01 ...".
XML document:
=============
<menu>
<item title="Vegetables">
<item title="tubers">
<item title="potatoes">
<item>Idaho</item>
<item>Maine</item>
<item>Russet</item>
<item>Yam</item>
</item>
</item>
</item>
<item title="Fruits">
<item>Peaches</item>
<item title="Apples">
<item>Fuji</item>
<item>Granny Smith</item>
<item>Rome</item>
</item>
</item>
<item>Milk</item>
</menu>
Desired output:
==============
<div id="menu-tree">
<div id="menu" class="main-menu">
<div id="mnu.01" class="menu-item">Vegetables</div>
<div id="mnu.02" class="menu-item">Fruits</div>
<div id="mnu.03" class="menu-item">Milk</div>
</div>
<div class="sub-menu" title="Vegetables" id="sm.01">
<div id="m.01.01" class="sub-menu-item">tubers</div>
</div>
<div class="sub-menu" title="tubers" id="sm.01.01">
<div id="m.01.01.01" class="sub-menu-item">potatoes</div>
</div>
<div class="sub-menu" title="potatoes" id="sm.01.01.01">
<div id="m.01.01.01.01" class="sub-menu-item">Idaho</div>
<div id="m.01.01.01.02" class="sub-menu-item">Maine</div>
<div id="m.01.01.01.03" class="sub-menu-item">Russet</div>
<div id="m.01.01.01.04" class="sub-menu-item">Yam</div>
</div>
<div class="sub-menu" title="Fruits" id="sm.02">
<div id="m.02.01" class="sub-menu-item">Peaches</div>
<div id="m.02.02" class="sub-menu-item">Apples</div>
</div>
<div class="sub-menu" title="Apples" id="sm.02.02">
<div id="m.02.02.01" class="sub-menu-item">Fuji</div>
<div id="m.02.02.02" class="sub-menu-item">Granny Smith</div>
<div id="m.02.02.03" class="sub-menu-item">Rome</div>
</div>
</div>
Almost there XSL:
=================
<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="/">
<div id="menu-tree">
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="menu">
<div id="menu" class="main-menu">
<xsl:apply-templates mode="main-menu" />
</div>
<xsl:call-template name="sub-menu">
<xsl:with-param name="items" select="item[item]" />
</xsl:call-template>
</xsl:template>
<xsl:template name="sub-menu">
<xsl:param name="items" />
<xsl:param name="pid" select="''" />
<xsl:for-each select="$items">
<xsl:variable name="parent-id">
<xsl:choose>
<xsl:when test="string-length($pid)=0">
<xsl:choose>
<xsl:when test="string-length(count(preceding-sibling::item)+1)=1">sm.0<xsl:value-of select="count(preceding-sibling::item)+1" /></xsl:when>
<xsl:otherwise>sm.<xsl:value-of select="count(preceding-sibling::*)+1" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="string-length(string(position()))=1"><xsl:value-of select="$pid" />.0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise><xsl:value-of select="$pid" />.<xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div class="sub-menu" title="{@title}" id="{$parent-id}">
<xsl:apply-templates mode="sub-menu-item">
<xsl:with-param name="pid" select="$parent-id" />
</xsl:apply-templates>
</div>
<xsl:call-template name="sub-menu">
<xsl:with-param name="items" select="item[item]" />
<xsl:with-param name="pid" select="$parent-id" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template match="menu/item[item]" mode="main-menu">
<xsl:variable name="id">
<xsl:choose>
<xsl:when test="string-length(string(position()))=1">mnu.0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise><xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div id="{$id}" class="menu-item"><xsl:value-of select="@title" /></div>
</xsl:template>
<xsl:template match="menu/item[not(item)]" mode="main-menu">
<xsl:variable name="id">
<xsl:choose>
<xsl:when test="string-length(string(position()))=1">mnu.0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise>m.<xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div id="{$id}" class="menu-item"><xsl:value-of select="." /></div>
</xsl:template>
<xsl:template match="item[item]" mode="sub-menu-item">
<xsl:param name="pid" select="''" />
<xsl:variable name="id">
<xsl:choose>
<xsl:when test="$pid = ''">
<xsl:choose>
<xsl:when test="string-length(string(position()))=1">0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise><xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="string-length(string(position()))=1"><xsl:value-of select="substring($pid,2)" />.0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($pid,2)" />.<xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div id="{$id}" class="sub-menu-item"><xsl:value-of select="@title" /></div>
</xsl:template>
<xsl:template match="item[not(item)]" mode="sub-menu-item">
<xsl:param name="pid" select="''" />
<xsl:variable name="id">
<xsl:choose>
<xsl:when test="$pid = ''">
<xsl:choose>
<xsl:when test="string-length(string(position()))=1">0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise><xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="string-length(string(position()))=1"><xsl:value-of select="substring($pid,2)" />.0<xsl:value-of select="position()" /></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($pid,2)" />.<xsl:value-of select="position()" /></xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div id="{$id}" class="sub-menu-item">
<xsl:choose>
<xsl:when test="string-length(@uri) != 0">
<a href="{@uri}"><xsl:value-of select="." /></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:template>
</xsl:stylesheet>
Actual Output:
==============
<div id="menu-tree">
<div id="menu" class="main-menu">
<div id="mnu.01" class="menu-item">Vegetables</div>
<div id="mnu.02" class="menu-item">Fruits</div>
<div id="mnu.03" class="menu-item">Milk</div>
</div>
<div class="sub-menu" title="Vegetables" id="sm.01">
<div id="m.01.01" class="sub-menu-item">tubers</div>
</div>
<div class="sub-menu" title="tubers" id="sm.01.01">
<div id="m.01.01.01" class="sub-menu-item">potatoes</div>
</div>
<div class="sub-menu" title="potatoes" id="sm.01.01.01">
<div id="m.01.01.01.01" class="sub-menu-item">Idaho</div>
<div id="m.01.01.01.02" class="sub-menu-item">Maine</div>
<div id="m.01.01.01.03" class="sub-menu-item">Russet</div>
<div id="m.01.01.01.04" class="sub-menu-item">Yam</div>
</div>
<div class="sub-menu" title="Fruits" id="sm.02">
<div id="m.02.01" class="sub-menu-item">Peaches</div>
<div id="m.02.02" class="sub-menu-item">Apples</div>
</div>
<div class="sub-menu" title="Apples" id="sm.02.01">
<div id="m.02.01.01" class="sub-menu-item">Fuji</div>
<div id="m.02.01.02" class="sub-menu-item">Granny Smith</div>
<div id="m.02.01.03" class="sub-menu-item">Rome</div>
</div>
</div>
--
Charles Knell
cknell@xxxxxxxxxx - email
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] XPath question, Ross Ken | Thread | Re: [xsl] XPath question, David Carlisle |
| RE: [xsl] <textarea>, HTML and CDAT, Passin, Tom | Date | [xsl] ANNOUNCE: XSL-FO DTD is conve, xsl-list |
| Month |