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(_dot_)sola(_at_)infomed(_dot_)sld(_dot_)cu
Gesendet: Donnerstag, 28. August 2003 17:53
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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