Hi Martin,
To add to what Syd says:
You don't want to use the @value attribute on xsl:number. It isn't
what you want, and it is getting in the way.
No, you don't need the for-each. Actually, how you select and process
the nodes -- whether by way of xsl:apply-templates or for-each or
what have you, is entirely immaterial to what number is generated and
how it comes out.
Like Syd, I recommend Mike Kay's treatment. Additionally, I recommend
spending a few minutes playing with a minimal test case (such as what
you posted us). Start with xsl:number, then add @count, @level, @from
and @format attributes to see what they do. Keep in mind that the
calculation of the number by xsl:number is always done by examining
the placement of the current node in its tree -- unless, that is, you
override it by putting @value on there, which is probably what's
accounting for your problems.
Cheers,
Wendell
At 03:17 PM 2/16/2010, you wrote:
I think you may be working too hard, and that the following will do
what you want:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<wrap>
<xsl:apply-templates select="//level1 | //level2 | //level3"/>
</wrap>
</xsl:template>
<xsl:template match="level1|level2|level3">
<xsl:number level="multiple" count="level1|level2|level3"
format="1.1. "/>
<xsl:value-of select="@title"/><br/><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
It is worth reading the discussion of <xsl:number> in a worthwhile
reference (I use Kay's) a few times, and playing around with it.
Martin Jackson writes:
> I'm trying to create a table of content that looks like this:
>
> 1. Fruit
> 1.1. Citrus
> 1.1.1. Orange
> 1.1.2. Lemon
> 1.1.3. Lime
> 1.2. Apple
> 2. Vegetables
> 2.1. Tomato
> 2.2. Carrot
>
>
> from an xml file with this structure
>
> <level1 title="fruit">
> <level2 title="citrus">
> <level3 title="orange"/>
> <level3 title="lemon"/>
> <level3 title="lime"/>
> </level2>
> <level2 title="apple"/>
> </level1>
> <level1 title="vegetables">
> <level2 title="tomato"/>
> <level2 title="carrot"/>
>
>
> But I can't figure out how to make my xsl transformation write the
> numbers for all the levels in the hierarchy. Right now it just outputs
> the bottom level, so it looks like this:
>
> 1. Fruit
> 1. Citrus
> 1. Orange
> 2. Lemon
> 3. Lime
> 2. Apple
> 2. Vegetables
> 1 Tomato
> 2 Carrot
>
>
> This is what my code looks like:
>
> <xsl:for-each select="level1">
> <xsl:number level="multiple" count="h1" value="position()"
format="1.1. "/>
> <xsl:value-of select="@title"/><br />
>
> <xsl:for-each select="level2">
> <xsl:number level="multiple" count="h1|h2"
value="position()" format="1.1. "/>
> <xsl:value-of select="@title"/><br />
>
> <xsl:for-each select="level3">
> <xsl:number level="multiple"
count="h1|h2|h3" value="position()"
> format="1.1. "/>
> <xsl:value-of select="@title"/><br />
> </xsl:for-each>
> </xsl:for-each>
> </xsl:for-each>
>
> From some stuff I have read I have gathered that this probably should
> be possible to solve without nested for-each-loops, with just one
> <xsl:number> tag having correctly formulated attributes. But for
> reasons hard to explain, right now I need to solve this using
> for-each.
>
> So I have two questions:
> 1. Is it possible to solve it using roughly the structure I have now,
> with the for-each-loops, and how would I do that?
> 2. If that code structure is unnecessarily complicated (which I
> suspects it is), what would be a more optimal way of achieving the
> same result (still using xsl:number)?
>
> Regards,
> Martin Jackson
>
> --~------------------------------------------------------------------
> 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(_at_)lists(_dot_)mulberrytech(_dot_)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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
======================================================================
Wendell Piez
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc. http://www.mulberrytech.com
17 West Jefferson Street Direct Phone: 301/315-9635
Suite 207 Phone: 301/315-9631
Rockville, MD 20850 Fax: 301/315-8285
----------------------------------------------------------------------
Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================
--~------------------------------------------------------------------
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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--