|
Subject: RE: [xsl] position From: "Andrew Welch" <AWelch@xxxxxxxxxxxxxxx> Date: Mon, 16 Feb 2004 09:15:39 -0000 |
> I'm having trouble using position() in the following
> situation. The xml looks like this:
>
> <root>
> <page>
> <line>
> <w>one</w> <w>two<note text="first note"/></w>
> <w>three</w>
> </line>
> <line>
> <w>four</w> <w>five</w> <w>six<note text="second
> note"/></w>
> </line>
> <line>
> <w>seven<note text="third note"/></w>
> <w>eight</w> <w>nine</w>
> </line>
> </page>
> <page>
> <line>
> <w>ten</w> <w>eleven<note text="4th
> note"/></w> <w>twelve</w>
> </line>
> <line>
> <w>thirteen</w> <w>fourteen</w> <w>fifteen<note
> text="5th note"/></w>
> </line>
> <line>
> <w>sixteen<note text="6th note"/></w>
> <w>seventeen</w> <w>eighteen</w>
> </line>
> </page>
> </root>
>
> And the xsl file like this:
>
> <xsl:template match="/">
> <html>
> <body>
> <xsl:apply-templates select="root/page"/>
> <br/>
> <xsl:text>Notes:</xsl:text>
> <br/>
> <xsl:for-each select="//note">
> <xsl:value-of select="position()"/>
> <xsl:text> </xsl:text>
> <xsl:value-of select="@text"/>
> <br/>
> </xsl:for-each>
> </body>
> </html>
> </xsl:template>
>
> <xsl:template match="page">
> <xsl:apply-templates select="line"/>
> <hr/>
> </xsl:template>
>
> <xsl:template match="line">
> <xsl:apply-templates/>
> <br/>
> </xsl:template>
>
> <xsl:template match="w">
> <xsl:text> </xsl:text>
> <xsl:apply-templates/>
> <xsl:if test="note">
> <span
> style="vertical-align:super;font-size:7pt">*</span>
> <!--
> --------------------------------------------------------^
> position should go here -->
> </xsl:if>
> </xsl:template>
>
> Instead of the asterisk in the <span>, I'd like to put the
> value of the position of the <note> there, just like I did in
> the root template (where it works as it should), but I can't
> get the correct value there.
>
> Has anyone got any ideas on how to do this?
The for-each each in the root template will select a list of <note>
nodes to process, so you can use position() here to return the position
of the node within that list.
A template match will process just a single node, so position() will
return 1.
You will need to use: <xsl:number level="any"/>
I would change the 'w' matching template to:
<xsl:template match="w">
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</xsl:template>
And add the template:
<xsl:template match="note">
<span style="vertical-align:super;font-size:7pt">
<xsl:number level="any"/>
</span>
</xsl:template>
You don't need the if test in the <w> matching template, as the <note>
matching template will only be fired if there is a child <note> of <w>
(this is the 'push' style of processing being mentioned).
cheers
andrew
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] position, Michael Kay | Thread | [xsl] select 1st occurence of eleme, Nikolas Nehmer |
| AW: AW: [xsl] select 1st occurence , Nikolas Nehmer | Date | RE: [xsl] SAXON: Generate 10 elemen, SHEIKH Sajjad |
| Month |