|
Subject: Re: [xsl] following nodes until "stop-node" reached (content between two nodes) From: "jakob Beetz" <mailinglists.jakob@xxxxxxxxx> Date: Wed, 9 Apr 2008 15:57:18 +0200 |
Gentlemen,
thank you all for your valuable and quick suggestions, they were
really helpful for understanding the whole thing.
On Tue, Apr 8, 2008 at 3:05 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>
> Assuming you know there is only one "start" node and one "stop" node:
>
unfortunatly that is not the case (trying to scrape information from
hundreds of html pages), I missed to mention this in my original
problem statement. This meant for me that I could not tackle the
problem with any of the XPath and grouping solutions that were
suggested.
> There are lots of other solutions. The most elegant use recursion, but
> beginners tend to find that difficult.
That was the key to the solution.
Below is my quick'n'dirty recursive approach to it (works fine for my
real-world problem)
A big "Thank you" to all of you again,
Cheers
Jakob
<xsl:template match="/">
<xsl:apply-templates select="//somenode[@value='start']"/>
</xsl:template>
<xsl:template match="//somenode[@value='start']">
<xsl:call-template name="copy-until-stop">
<xsl:with-param name="current_node"
select="self::node()/following-sibling::*[1]"/>
<xsl:with-param name="count" select="0"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="copy-until-stop">
<xsl:param name="current_node" />
<xsl:param name="count" />
<!--test if stop tag is reached. To avoid endless recursion break out
after at most 5000 nodes-->
<xsl:if test="not($current_node[@value='stop']) and $count < 5000" >
<xsl:copy-of select= "$current_node"/>
<xsl:call-template name="copy-until-stop">
<xsl:with-param name="current_node"
select="$current_node/following-sibling::*[1]"/>
<xsl:with-param name="count" select="$count+1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
> >
> > <somenode value="stop">something else</somenode> [...]
> >
> >
> > how would I select anything (but not including) that is
> > between "somenode" with the attribute "start" and "stop"?
> >
> > This is my beginers approach:
> > <xsl:template match="//somenode[@value='start']">
> > <xsl:element name="entity">
> > <xsl:value-of select="."/>
> > </xsl:element>
> > <xsl:for-each select="following-sibling::*">
> > <td><xsl:value-of select="."/></td>
> > </xsl:for-each>
> > </xsl:template>
> >
> > how do check wether the current node in the for-eachnode is
> > the "somenode"-node with "stop" as attribute value? Can I
> > "break out" of for each or somehow if-then the inclusion of
> > anything that comes _after_ that?
> >
> > As you probably see I do not have a really good undstanding
> > of XSL/XPATH. Browsing the docs and XSL FAQ did not make me
> > wiser either.
> >
> > Any help is greatly appreciated
> > Thanks in advance and
> > Cheers
> > Jakob
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] following nodes until "st, Michael Kay | Thread | Re: [xsl] following nodes until "st, Chris von See |
| Re: [xsl] Refreshing data, XSL-List Owner | Date | Re: [xsl] Diagramming XSLT, CyberSpace Industrie |
| Month |