Re: [xsl] Re: AW: AW: global variable and position() once more

Subject: Re: [xsl] Re: AW: AW: global variable and position() once more
From: fe.sola@xxxxxxxxxxxxxx
Date: Mon, 1 Sep 2003 10:40:53 -0400
You guys are really masters of XPath...Let me read this slowly and try to understand...
Do you have any book or tutorial with this tricky constructions??
Thanks a lot!
lizet
Mensaje citado por Dimitre Novatchev <dnovatchev@xxxxxxxxx>:

> This transformation:
> 
> <xsl:stylesheet version="1.0"
>  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
>  <xsl:output omit-xml-declaration="yes" indent="yes"/>
>  <xsl:strip-space elements="*"/>
> 
>  <xsl:key name="kStart"
>   match="text()[preceding-sibling::*[1][self::br]]"
>   use="contains(., '.')
>      and
>        number(substring-before(., '.'))
>       =
>        number(substring-before(., '.'))"/>
> 
>   <xsl:key name="kTrail"
>   match="text()[preceding-sibling::*[1][self::br]]"
>    use="generate-id(
>             preceding-sibling::text()
>             [
>              contains(., '.')
>            and
>              number(substring-before(., '.'))
>             =
>              number(substring-before(., '.'))
>             ]
>             [1]
>                    )"/>
> 
>   <xsl:template match="/">
>     <xsl:for-each select="key('kStart', 'true')">
>      <Claim>
>       <xsl:copy-of select="normalize-space()"/>
>       <xsl:for-each select="key('kTrail', generate-id())">
>         <xsl:if test="not(position() = last())">
>           <xsl:copy-of
>            select="concat(substring(.,1,1),
>                           normalize-space(substring(.,2))
>                           )"/>
>         </xsl:if>
>       </xsl:for-each>
>      </Claim>
>     </xsl:for-each>
>   </xsl:template>
> </xsl:stylesheet>
> 
> 
> when applied on your source.xml:
> 
> <html>
>   <hr/>   Claims
>   <br/>
>   <br/>   I claim:
>   <br/>
>   <br/>   1. blah blah
>   <br/>
>   <br/>   more blah blah
>   <br/>
>   <br/>   2. blah blah blah
>   <br/>
>   <br/>   more blah blah
>   <br/>
>   <br/>   3. blah blah
>   <br/>
>   <br/>   more blah blah
>   <br/>
>   <br/>   4. blah blah blah
>   <br/>
>   <hr/>   Description
>   <br/>
> </html>
> 
> produces the wanted result:
> 
> <Claim>1. blah blah more blah blah</Claim>
> <Claim>2. blah blah blah more blah blah</Claim>
> <Claim>3. blah blah more blah blah</Claim>
> <Claim>4. blah blah blah</Claim>
> 
> 
> =====
> Cheers,
> 
> Dimitre Novatchev.
> http://fxsl.sourceforge.net/ -- the home of FXSL
> 
> <fe.sola@xxxxxxxxxxxxxx> wrote in message
> news:1062365071.3f52678f72c4f@xxxxxxxxxxxxxxxxx
> > Hi Markus and all,
> > Yep, that template worked fine, now I have a different problem and have
> been reading the
> > threads of "Incrementing Global variables"... The thing is I have to
> select each claim
> > on the document and enclose it in <claim></claim>
> > The input xhtml file looks like this:
> > <hr/>  Claims<br/>
> > <br/>  I claim: <br/>
> > <br/>  1. blah blah<br/>
> > <br/>  more blah blah <br/>
> > <br/>  2. blah blah blah  <br/>
> >                 <br/>  more blah blah <br/>
> > <br/>  3. blah blah<br/>
> > <br/>  more blah blah<br/>
> > <br/>  4. blah blah blah<br/>
> > <hr/>  Description<br/>
> > and I need an xml output:
> > <Claims>
> >     <Claim>1. blah blah more blah blah</Claim>
> >     <Claim>2. blah blah blah more blah blah</Claim>
> >     <Claim>3. blah blah more blah blah </Claim>
> >     <Claim>4. blah blah blah </Claim>
> > </Claims>
> >
> > The number of claims varies from document to document. I thought about
> removing the
> > <br/> tags with regexps to make things easier...
> > What I have so far:
> >  <xsl:template
> match="preceding-sibling::text()[starts-with(normalize-space
> > (.), 'Claims')]
> >     and following::text()[starts-with(normalize-space(.), 'Description']">
> >                         <xsl:variable name="counter">0</xsl:variable>
> >                         <xsl:for-each
> select="following-sibling::text()[starts-with
> > (normalized-space(.),'$counter+1')]">
> >                                     <Claim>
> >                                            <xsl:value-of
> select="normalize-space(.)"/>
> >                                    </Claim>
> >                         </xsl:for-each>
> > </xsl:template>
> > But it gives me error with the Xpath expression due to the variable
> increment, what
> > should I use, a parameter?
> > tia,
> > lizet
> >
> > Mensaje citado por Markus Abt <abt@xxxxxxxx>:
> >
> > > Hi Lizet,
> > >
> > > you can use a similar Xpath to check the following sibling axis for
> > > checking the end condition and combining the two with "and":
> > >
> > > <xsl:apply-templates select="html/body/node()[
> > >     preceding-sibling::text()[starts-with(normalize-space(.),
> 'References')]
> > >     and following-sibling::text()[starts-with(normalize-space(.),
> 'Description')]]"/>
> > >
> > >
> > > Cheers,
> > > Markus
> > > __________________________
> > > Markus Abt
> > > Comet Computer GmbH
> > > http://www.comet.de
> > >
> > >
> > >
> > > ----------
> > > Von: fe.sola@xxxxxxxxxxxxxx
> > > Gesendet: Donnerstag, 28. August 2003 23:02
> > > An: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > > Betreff: Re: AW: [xsl] global variable and position() once more
> > >
> > > Hi Markus,
> > > It worked fine, thanks. Now I'm doing a similar thing but taking the
> text nodes between
> > >
> > > a text node that starts with 'References' and the text node with
> 'Description', but
> > > it's
> > > a similar template...
> > > again thanks,
> > > lizet
> > > Mensaje citado por Markus Abt <abt@xxxxxxxx>:
> > >
> > > > Hi,
> > > >
> > > > if you want output everything after the "Description" text node, try
> this:
> > > >
> > > > <?xml version="1.0" encoding="iso-8859-1"?>
> > > > <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> > > >
> > > > <xsl:template match="/">
> > > >   <Document>
> > > >     <!-- select all nodes after the Description text node -->
> > > >     <xsl:apply-templates
> > > >
> select="html/body/node()[preceding-sibling::text()[starts-with(normalize-spa
> ce(.),
> > > > 'Description')]]"/>
> > > >   </Document>
> > > > </xsl:template>
> > > >
> > > > <!-- copy all nodes with their descendants. Adjust to your needs -->
> > > > <xsl:template match="@*|node()">
> > > >   <xsl:copy>
> > > >     <xsl:apply-templates select="@*|node()"/>
> > > >   </xsl:copy>
> > > > </xsl:template>
> > > >
> > > > </xsl:stylesheet>
> > > >
> > > >
> > > > The Xpath works as follows:
> > > > -  html/body/node() selects all child nodes of the body element.
> > > > -  [ ... ] gives a condition to the previous selection.
> > > >    It is tested for every selected node.
> > > > -  preceding-sibling::text() selects all preceding siblings (for every
> selected
> > > node
> > > > above).
> > > > -  starts-with(normalize-space(.), 'Description') tests for the
> "Description" text
> > > > node.
> > > >    It is tested for every preceding sibling.
> > > > -  So, preceding-sibling::text()[starts-with(normalize-space(.),
> 'Description')]
> > > >    selects only this node.
> > > > -  If there is such a preceding sibling, the outer condition ([...])
> is true.
> > > > -  The result is, only the html/body/node() with this condition true
> are selected.
> > > > -  apply-templates then processes this nodes.
> > > >
> > > > The second template just copies everythig through, discard it, if you
> have
> > > > your own templates to handle further processing.
> > > >
> > > >
> > > > Hope this helps,
> > > > Markus
> > > > __________________________
> > > > Markus Abt
> > > > Comet Computer GmbH
> > > > http://www.comet.de
> > > >
> > > >
> > > > ----------
> > > > Von: fe.sola@xxxxxxxxxxxxxx
> > > > Gesendet: Donnerstag, 28. August 2003 17:53
> > > > An: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > > > Betreff: RE: [xsl] global variable and position() once more
> > > >
> > > > Hello, being a newbie is a pain...
> > > > I decided to try Michael Kay's suggestion of using a global variable.
> My problem is
> > > > that
> > > > I need to select the text nodes after a text node that starts with the
> > > > word 'Description'.
> > > > The xhtml looks more or less like this: (This is a simplified sample
> version, could
> > >
> > > > provide the real one on request)
> > > >
> > > > <html>
> > > >    <head>
> > > >       <!--Something here-->
> > > >    <head>
> > > >    <body>
> > > >         blah bla blah
> > > >         <table>
> > > >           <!-- something here-->
> > > >         </table>
> > > >         Description
> > > >         <table>
> > > >           <!-- something here-->
> > > >         </table>
> > > >         text nodes to select with the description text
> > > >
> > > >    </body>
> > > > </html>
> > > >
> > > > My xsl stylesheet looks like this:
> > > > ..
> > > > <xsl:template match="/">
> > > >                 ...
> > > > <Document>
> > > >     <xsl:apply-templates select="html"/>
> > > > </Document>
> > > >                 ...
> > > > </xsl:template>
> > > > ..
> > > > <xsl:variable name="descPos"
> select="//text()[starts-with(normalize-space
> > > > (),'Description')]"/>
> > > > ..
> > > > <xsl:template match="html">
> > > >                 <xsl:element name="description">
> > > >                        <xsl:apply-templates
> select="text()[position()>$descPos]"/>
> > > >                 </xsl:element>
> > > > ..
> > > > </xsl:template>
> > > > ..
> > > > I can't manage to store in the descPos global variable the position of
> the node that
> > >
> > > > starts with 'Description', when I try
> select="//text()[starts-with(normalize-space
> > > > (),'Description')position()] or try to get the position function
> somewhere in that
> > > > XPath
> > > > expression I get errors.
> > > > So far the descPos variable gets a wrong value, always 1 and the
> mentioned text
> > > node
> > > > has
> > > > a position 30 or more on some other input documents.
> > > > thanks a lot for looking at this,
> > > > Lizet
> > > >
> > > >
> > > >
> > > > -------------------------------------------------
> > > > Este mensaje fue enviado usando el servicio de correo en web de
> Infomed
> > > > http://webmail.sld.cu
> > > >
> > > >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> > > >
> > > >
> > > >
> > > >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> > > >
> > >
> > >
> > >
> > >
> > > -------------------------------------------------
> > > Este mensaje fue enviado usando el servicio de correo en web de Infomed
> > > http://webmail.sld.cu
> > >
> > >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> > >
> > >
> > >
> > >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> > >
> >
> >
> >
> >
> > -------------------------------------------------
> > Este mensaje fue enviado usando el servicio de correo en web de Infomed
> > http://webmail.sld.cu
> >
> >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> >
> >
> 
> 
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 




-------------------------------------------------
Este mensaje fue enviado usando el servicio de correo en web de Infomed
http://webmail.sld.cu

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread