|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: AW: AW: global variable and position() once more
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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








