Subject: RE: [xsl] Can't solve the following XSL transformation From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Mon, 25 Jul 2005 10:51:24 +0100 |
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@xxxxxx] > Sent: 25 July 2005 10:46 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > 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@xxxxxxxxxxxx> > PISAL(A): > > > 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@xxxxxx] > >> Sent: 25 July 2005 09:13 > >> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > >> 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@xxxxxxxxxxxx> > >> PISAL(A): > >> > >> > 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@xxxxxx] > >> >> Sent: 25 July 2005 06:22 > >> >> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > >> >> 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@xxxxxxxxxxxx> > >> >> PISAL(A): > >> >> > >> >> > 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@xxxxxx] > >> >> >> Sent: 24 July 2005 22:45 > >> >> >> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > >> >> >> 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> > >> > > >> > >> > >> > >> --- > >> GSM.By.COM - INTERNET-MAGAZIN SOTOWYH TELEFONOW STANDARTA GSM, > >> AKSESSUAROW I ZAP^ASTEJ K NIM. {IROKIJ WYBOR, RAZUMNYE CENY, > >> OPERATIWNAQ DOSTAWKA. rEMONT TELEFONOW. http://www.gsm.by.com > > > > > > --- > GSM.By.COM - INTERNET-MAGAZIN SOTOWYH TELEFONOW STANDARTA GSM, > AKSESSUAROW I ZAP^ASTEJ K NIM. {IROKIJ WYBOR, RAZUMNYE CENY, > OPERATIWNAQ DOSTAWKA. rEMONT TELEFONOW. http://www.gsm.by.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Can't solve the following, John Robb | Thread | Re: [xsl] Can't solve the following, John Robb |
Re: [xsl] Can't solve the following, John Robb | Date | Re: [xsl] Can't solve the following, John Robb |
Month |