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

Discussion in 'XML' started by Cali, Aug 10, 2005.

  1. Cali

    Cali Guest

    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
    Cali, Aug 10, 2005
    #1
    1. Advertising

  2. 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" <> 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
    Steve Jorgensen, Aug 10, 2005
    #2
    1. Advertising

  3. Cali

    Joris Gillis Guest

    Hi,

    Tempore 08:01:15, die Wednesday 10 August 2005 AD, hinc in foro {comp.text.xml} scripsit Cali <>:

    > 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
    Joris Gillis, Aug 10, 2005
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. asd
    Replies:
    3
    Views:
    417
    Arnaud Berger
    May 23, 2005
  2. Michael Reiche
    Replies:
    3
    Views:
    10,806
    Michael Reiche
    Feb 5, 2004
  3. Xamle Eng

    Why treat text nodes as nodes?

    Xamle Eng, May 13, 2005, in forum: XML
    Replies:
    8
    Views:
    476
    Fredrik Lundh
    May 28, 2005
  4. th3dude
    Replies:
    0
    Views:
    419
    th3dude
    Jan 3, 2007
  5. www
    Replies:
    1
    Views:
    319
    Andrew Thompson
    Apr 19, 2007
Loading...

Share This Page