[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Re: AW: AW: global variable and position() once mo

Subject: Re: Re: AW: AW: global variable and position() once more
From: fe.sola@xxxxxxxxxxxxxx
Date: Mon, 1 Sep 2003 10:40:53 -0400
xsl position tutorial
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:  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:  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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.