471,624 Members | 1,767 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,624 software developers and data experts.

How do i select/compare multiple text nodes spread out in a document?

Please bear with me, I have been reading about XSL for a couple hours.

I have an XML document that contains multiple <page> tags interspersed
throughout the tree.

<text>
....
<page>1</page>
....
<page>2</page>
</text>

These are not always going to be in the same level. To get the sequence
of all the pages I correctly figured I could use:

<xsl:template match="/">
<xsl:for-each select='.//page'>
Page <xsl:value-of select="text()"/><br/>
</xsl:for-each>
</xsl:template>

I also want to evaluate whether the text value of the current <page>
node is in sequence with the previous one, if not then mark the output.
I would have imagined that it would be something like this but it
doesnt work:

<xsl:template match="/">
<xsl:for-each select='.//page'>
<xsl:variable name="this_page_number" select="text()"/>
<xsl:variable name="thispos" select="position()"/>
<xsl:variable name="prev_page_number" select=".//page[$thispos
- 1]/text()"/>
<xsl:variable name="expected_prev_page_number"
select="$this_page_number - 1"/>
<xsl:if test="$expected_prev_page_number != $prev_page_number">
<strong>Sequence broken!</strong>
</xsl:if>
Page <xsl:value-of select="$this_page_number"/><br/>
</xsl:for-each>
</xsl:template>

I obviously have not yet grasped XSL. What is the correct solution?

Thank you,

Cali

Aug 10 '05 #1
2 1561
I think what might work is to get the sequence of page nodes, then do a
recursive template call where each call examines the first 2 nodes, and passes
a copy of the node set, minus the first node to itself using the remove()
function to remove the node.

On 9 Aug 2005 23:01:15 -0700, "Cali" <ki********************@yahoo.com> wrote:
Please bear with me, I have been reading about XSL for a couple hours.

I have an XML document that contains multiple <page> tags interspersed
throughout the tree.

<text>
...
<page>1</page>
...
<page>2</page>
</text>

These are not always going to be in the same level. To get the sequence
of all the pages I correctly figured I could use:

<xsl:template match="/">
<xsl:for-each select='.//page'>
Page <xsl:value-of select="text()"/><br/>
</xsl:for-each>
</xsl:template>

I also want to evaluate whether the text value of the current <page>
node is in sequence with the previous one, if not then mark the output.
I would have imagined that it would be something like this but it
doesnt work:

<xsl:template match="/">
<xsl:for-each select='.//page'>
<xsl:variable name="this_page_number" select="text()"/>
<xsl:variable name="thispos" select="position()"/>
<xsl:variable name="prev_page_number" select=".//page[$thispos
- 1]/text()"/>
<xsl:variable name="expected_prev_page_number"
select="$this_page_number - 1"/>
<xsl:if test="$expected_prev_page_number != $prev_page_number">
<strong>Sequence broken!</strong>
</xsl:if>
Page <xsl:value-of select="$this_page_number"/><br/>
</xsl:for-each>
</xsl:template>

I obviously have not yet grasped XSL. What is the correct solution?

Thank you,

Cali


Aug 10 '05 #2
Hi,

Tempore 08:01:15, die Wednesday 10 August 2005 AD, hinc in foro {comp.text.xml} scripsit Cali <ki********************@yahoo.com>:
Please bear with me, I have been reading about XSL for a couple hours.

I have an XML document that contains multiple <page> tags interspersed
throughout the tree.

<text>
...
<page>1</page>
...
<page>2</page>
</text>

I also want to evaluate whether the text value of the current <page>
node is in sequence with the previous one, if not then mark the output.
I would have imagined that it would be something like this but it
doesnt work.


Instead of going to mess with 'position()', try the more reliable 'preceding' axis:

<xsl:template match="/">
<xsl:for-each select='.//page'>
<xsl:variable name="this_page_number" select="."/>
<xsl:variable name="prev_page_number" select="preceding::page[1]"/>
<xsl:variable name="expected_prev_page_number" select="$this_page_number - 1"/>
<xsl:if test="$expected_prev_page_number != $prev_page_number">
<strong>Sequence broken!</strong>
</xsl:if>
Page <xsl:value-of select="$this_page_number"/><br/>
</xsl:for-each>
</xsl:template>
regards,
--
Joris Gillis (http://users.telenet.be/root-jg/me.html)
Vincit omnia simplicitas
Keep it simple
Aug 10 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Colman | last post: by
6 posts views Thread by Ben Hallert | last post: by
4 posts views Thread by Michael Schuerig | last post: by
6 posts views Thread by Adam Tilghman | last post: by
1 post views Thread by XIAOLAOHU | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.