There are two ways of doing a two-pass transformation
(a) use two stylesheets, saving the result of the first one in a temporary
file
(b) use a single stylesheet, with the structure
<xsl:variable name="temp">
<xsl:apply-templates select="/" mode="phase1"/>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="xx:node-set($temp)" mode="phase2"/>
</xsl:template>
Then label all the templates used during phase 1 with mode="phase1", and
similarly for phase2. The xx:node-set() function is needed with XSLT 1.0
processors but not with XSLT 2.0, and the namespace xx: depends on the
processor you are using.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: John Robb [mailto:john_ok(_at_)tut(_dot_)by]
Sent: 25 July 2005 10:46
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Can't solve the following XSL transformation
In the algorithm you mentioned about the second pass.What did
you mean
and where to save the tree from the first pass?
Mon, 25 Jul 2005 10:35:17 +0100, "Michael Kay" <mike(_at_)saxonica(_dot_)com>
писал(а):
You just generalize the solution I gave you. Instead of using
"@lines" as a
specific attribute, you have to use count(*) or something
similar to
count
how many child elements there are.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: John Robb [mailto:john_ok(_at_)tut(_dot_)by]
Sent: 25 July 2005 09:13
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Can't solve the following XSL transformation
But how is it possible to determine,if the following Subsector can
be
shown on this page or on the following.The problem is how
to output
page-breaks exactly before sector/subsector only and no
more than 25
elements per pag.
Mon, 25 Jul 2005 07:31:26 +0100, "Michael Kay"
<mike(_at_)saxonica(_dot_)com>
писал(а):
Here's a simplified form of the problem. Given this input:
<chap>
<para lines="3"/>
<para lines="5"/>
<para lines="8"/>
etc
</chap>
produce a copy of the input, with a <page-break/>
element inserted
after any
para that causes the cumulative number of lines to exceed 30.
The answer to this is what I call "sibling recursion", something
like this:
<xsl:template match="chap">
<xsl:copy>
<xsl:apply-templates select="para[1]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="para">
<xsl:param name="lines-so-far" select="0"/> <!-- 0 is the
default
value
of the parameter -->
<xsl:copy-of select="."/>
<xsl:choose>
<xsl:when test="$lines-so-far + @lines <= 30">
<xsl:apply-templates select="following-sibling::para[1]">
<xsl:with-param name="lines-so-far"
select="$lines-so-far +
@lines"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<page-break/>
<xsl:apply-templates select="following-sibling::para[1]"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Sibling recursion using xsl:apply-templates has a couple of
advantages over
call-template recursion: the sequence over which you are
iterating
is an
implicit parameter (it's identified implicitly by the
context node);
and the
recursion terminates naturally when there are no more siblings.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: John Robb [mailto:john_ok(_at_)tut(_dot_)by]
Sent: 25 July 2005 06:22
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Can't solve the following XSL transformation
I'm a novice in XSLT and it's not very easy for me to
realize the
second part of the algorithm.Can you please give me a
short example.
Thank you in advance.
Sun, 24 Jul 2005 23:26:09 +0100, "Michael Kay"
<mike(_at_)saxonica(_dot_)com>
писал(а):
The first stage is a classical grouping problem: see
http://www.jenitennison.com/xslt/grouping for advice on using
Muenchian
grouping in XSLT 1.0, or use the new xsl:for-each-group
instruction
in 2.0.
(Note, XSLT 1.1 doesn't really exist, it was a working
draft that
wasn't
followed up).
Insert the page breaks in a second pass through the
data. This is
a
little
tricky (I use it as an exercise on courses) and requires
processing
the
sequence using recursion, passing a parameter in the
recursive
call
that
indicates the number of lines processed so far.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: John Robb [mailto:john_ok(_at_)tut(_dot_)by]
Sent: 24 July 2005 22:45
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Can't solve the following XSL transformation
I'm a novice in XSLT and doesn't have any experience.Can
you help me
to perform the following transformation:
trasformed data should look as follows:
****************
Sector 1
****************
Subsector 1
++++++++++++++++
ID[t]Value
----------------
id1[t]value1
...
idN valueN
----------------
Subsector 2
++++++++++++++++
ID[t]Value
----------------
id1[t]value1
...
idN valueN
...
****************
Sector 2
****************
Subsector 1
++++++++++++++++
ID[t]Value
----------------
id1[t]value1
...
idN valueN
----------------
Subsector 2
++++++++++++++++
ID[t]Value
----------------
id1[t]value1
...
idN valueN
...
There is a limitation: no more than 25 data rows (idX
valueX) per
page.Page breaks (<span style="page-break-before:
always"></span>)
cannot be inserted in the middle of data section but before
sector/subsector only.I'm using XSLT v1.1.
Here is the xml:
<?xml version="1.0" encoding="iso-8859-1" ?>
<data>
[t]<item id="i1"[t]sector="s1"[t]subsector="u1">561</item>
[t]<item id="i10"[t]sector="s3"[t]subsector="u4">15</item>
[t]<item id="i22"[t]sector="s2"[t]subsector="u2">1234</item>
[t]<item id="i11"[t]sector="s1"[t]subsector="u2">123</item>
[t]<item id="i17"[t]sector="s1"[t]subsector="u3">165</item>
[t]<item id="i61"[t]sector="s2"[t]subsector="u1">346</item>
[t]<item id="i12"[t]sector="s2"[t]subsector="u5">3425</item>
[t]<item id="i2"[t]sector="s3"[t]subsector="u4">78</item>
[t]<item id="i14"[t]sector="s3"[t]subsector="u4">51</item>
[t]<item id="i21"[t]sector="s1"[t]subsector="u5">346</item>
[t]<item id="i39"[t]sector="s3"[t]subsector="u2">463</item>
[t]<item id="i44"[t]sector="s2"[t]subsector="u3">151</item>
[t]<item id="i89"[t]sector="s1"[t]subsector="u1">451</item>
[t]<item id="i81"[t]sector="s2"[t]subsector="u4">771</item>
[t]<item id="i36"[t]sector="s2"[t]subsector="u5">5654</item>
[t]<item id="i27"[t]sector="s3"[t]subsector="u3">362</item>
[t]<item id="i15"[t]sector="s1"[t]subsector="u5">234</item>
[t]<item id="i18"[t]sector="s3"[t]subsector="u2">73</item>
[t]<item id="i51"[t]sector="s3"[t]subsector="u5">567</item>
[t]<item id="i26"[t]sector="s1"[t]subsector="u4">17</item>
[t]<item id="i95"[t]sector="s3"[t]subsector="u5">67489</item>
[t]<item id="i13"[t]sector="s1"[t]subsector="u3">54</item>
[t]<item id="i71"[t]sector="s1"[t]subsector="u3">2</item>
[t]<item id="i23"[t]sector="s2"[t]subsector="u1">345</item>
[t]<item id="i7"[t]sector="s2"[t]subsector="u1">67</item>
[t]<item id="i80"[t]sector="s1"[t]subsector="u3">7754</item>
[t]<item id="i9"[t]sector="s3"[t]subsector="u4">343</item>
[t]<item id="i4"[t]sector="s1"[t]subsector="u2">51</item>
[t]<item id="i99"[t]sector="s3"[t]subsector="u5">5637</item>
[t][t]
[t][t]<sector id="s1">Sector 1</sector>
[t]<sector id="s2">Sector 2</sector>
[t]<sector id="s3">Sector 3</sector>
[t]<subsector id="u1">Subsector 1</subsector>
[t]<subsector id="u2">Subsector 2</subsector>
[t]<subsector id="u3">Subsector 3</subsector>
[t]<subsector id="u4">Subsector 4</subsector>
[t]<subsector id="u5">Subsector 5</subsector>
</data>
--~------------------------------------------------------------------
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>
--~--
--~------------------------------------------------------------------
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>
--~--
---
GSM.By.COM - интернет-магазин сотовых телефонов стандарта GSM,
аксессуаров и запчастей к ним. Широкий выбор, разумные цены,
оперативная доставка. Ремонт телефонов. http://www.gsm.by.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>
--~--
--~------------------------------------------------------------------
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>
--~--
---
GSM.By.COM - интернет-магазин сотовых телефонов стандарта GSM,
аксессуаров и запчастей к ним. Широкий выбор, разумные цены,
оперативная доставка. Ремонт телефонов. http://www.gsm.by.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>
--~--
--~------------------------------------------------------------------
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>
--~--