This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Checking node position
- To: xsl-list at mulberrytech dot com
- Subject: Re: Checking node position
- From: Gary L Peskin <garyp at firstech dot com>
- Date: Fri, 01 Sep 2000 12:02:14 -0700
- Organization: The Firstech Corporation
- References: <CANNPCMHACLFAAAA@mailcity.com>
- Reply-To: xsl-list at mulberrytech dot com
"David W. Black" wrote:
> I essentially have an undifferentiated list of elements (old html) that I need to > transform to xml, and the only hooks I have are certain textual consistencies:
>
> <p>textxtxtxt</p>
> <p>head1</p>
> <p>text_associated_semantically_with_head1</p>
> <p>text_associated_semantically_with_head1</p>
> <p>head2</p>
>
> etc.
>
> Thus I want to itentify the position of the <p> with text="head1" (ie. 2), the
> position of <p> with text="head2" (ie.5) so that I can then wrap all <p>s between 2
> and 5 with an element in the result tree.
>
> I can, I suppose, pre-process using generate-id() to ascribe and id attribute to each
> <p> and then do my transformations.... but I'd really like to ties this up in one
> stylesheet, not two?
>
> Any ideas, anyone??
David --
I'm not 100% sure what you want to do but you did say "any ideas". I
think this will get you started:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="parent" match="p"
use="generate-id(preceding-sibling::p[. = 'head1' or . = 'head2'])" />
<xsl:template match="p[. = 'head1' or . = 'head2']">
<xsl:element name="{.}">
<xsl:apply-templates
select="key('parent', generate-id())[. != 'head1' and . !=
'head2']"
mode="inner"/>
</xsl:element>
</xsl:template>
<xsl:template match="p"/>
<xsl:template match="p" mode="inner">
<sub>
<xsl:copy-of select="."/>
</sub>
</xsl:template>
</xsl:stylesheet>
HTH,
Gary
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list