In an XSLT pattern, current() refers to the node you are trying to match. So
the pattern
group-starting-with="*[name() = translate(name(current()),'1234','2345')]">
is wrong. Try assigning the result of the translate() to a variable first.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: john jacks [mailto:john(_dot_)jacks(_at_)yahoo(_dot_)co(_dot_)uk]
Sent: 03 April 2007 08:49
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] grouping, xslt 2.0
I'm trying to get an example working from MKay book, using
starting-with.
The idea is to nest a flat structure properly, based on heading level.
The p elements are not being processed as I'd want
(duplicated etc) and the nesting isn't correct.
Any suggestions what's wrong please?
JJ
xml
<grpStart>
<h1>Usual html example, flat, with properly stacked
levels</h1> <p>Each block must have one child</p>
<h1>The instance must start with <b>h1</b></h1> <p>I.e. the
headings can follow with no more than one difference</p>
<p>1 2 3 3 4 5 4 3 etc</p>
<h2>Invalid sequences</h2>
<h2>Which might be, in fact</h2>
<p>are 1 followed by 3</p>
<p>or 4 2</p>
<h3>That's the way it goes</h3>
<p>Each block must have at least one child</p> <h3>The hard
part is persuading authors to follow style guidelines</h3>
<p>All blocks must have children</p> </grpStart>
xsl
xmlns:xs="http://www.w3.org/2001/XMLSchema-datatypes"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/">
<op>
<xsl:apply-templates select="//grpStart"/>
</op>
</xsl:template>
<xsl:template match="grpStart">
<xsl:for-each-group select="*"
group-starting-with="h1">
<xsl:apply-templates select="."/>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="*[starts-with(name(),'h')]">
<xsl:message>
Match on <xsl:value-of select="name()"/>
Population is <xsl:value-of select="count(current-group())"/>
</xsl:message>
<section level="{substring-after(name(),'h')}">
<head><xsl:apply-templates/></head>
<xsl:for-each-group select="current-group() except ."
group-starting-with="*[name() =
translate(name(current()),'1234','2345')]">
<xsl:apply-templates select="current-group()"/>
</xsl:for-each-group>
</section>
</xsl:template>
<xsl:template match="p">
<para><xsl:apply-templates/></para>
</xsl:template>
<xsl:template match="b">
<emph><xsl:apply-templates/></emph>
</xsl:template>
</xsl:stylesheet>
actual output
<op>
<section level="1">
<head>Usual html example, flat, with properly stacked
levels</head>
<para>Each block must have one child</para>
</section>
<section level="1">
<head>The instance must start with <emph>h1</emph>
</head>
<para>I.e. the headings can follow with no more than
one difference</para>
<para>1 2 3 3 4 5 4 3 etc</para>
<section level="2">
<head>Invalid sequences</head>
<para>1 2 3 3 4 5 4 3 etc</para>
<section level="2">
<head>Which might be, in fact</head>
<para>1 2 3 3 4 5 4 3 etc</para>
</section>
</section>
<section level="2">
<head>Which might be, in fact</head>
<para>1 2 3 3 4 5 4 3 etc</para>
<section level="2">
<head>Invalid sequences</head>
<para>1 2 3 3 4 5 4 3 etc</para>
</section>
</section>
<para>are 1 followed by 3</para>
<para>or 4 2</para>
<section level="3">
<head>That's the way it goes</head>
<para>or 4 2</para>
</section>
<para>Each block must have at least one child</para>
<section level="3">
<head>The hard part is persuading authors to follow
style guidelines</head>
<para>Each block must have at least one child</para>
</section>
<para>All blocks must have children</para>
</section>
</op>
___________________________________________________________
New Yahoo! Mail is the ultimate force in competitive
emailing. Find out more at the Yahoo! Mail Championships.
Plus: play games and win prizes.
http://uk.rd.yahoo.com/evt=44106/*http://mail.yahoo.net/uk
--~------------------------------------------------------------------
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>
--~--