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

Subject: Re: AW: AW: [xsl] global variable and position() once more
From: fe.sola@xxxxxxxxxxxxxx
Date: Sun, 31 Aug 2003 17:24:31 -0400
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-space(.),
> > '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


Current Thread