Subject: RE: grouping, xslt 2.0
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 3 Apr 2007 09:25:00 +0100
|
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.jacks@xxxxxxxxxxx]
> Sent: 03 April 2007 08:49
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: 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
|