Access only next sibling element with XSL

Discussion in 'XML' started by Michael K?nig, Apr 22, 2005.

  1. Hello,

    I've an XML-file structured like this

    <table>
    <tr>
    <td>Nombre:</td>
    <td>Joseph</td>
    <td>Apellido:</td>
    <td>Ratzinger</td>
    <td>Posición:</td>
    <td>Pope</td>
    </tr>
    </table>

    I'like to extract the personal data depending on the label which
    stands in the sibling <td> before, the result should look like this:

    <person>
    <name>Joseph</name>
    <surname>Ratzinger</surname>
    <profession>Pope</profession>
    </person>


    I know what labels can appear ("Nombre:", "Apellido:","Posición:") but
    I don't know if they appear within the <tr>-Element and in which
    order, so I can't use [position()=2] etc.

    How do I realize this using XSLT?

    I tried

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:eek:utput method="text" encoding="ISO-8859-1"/>
    <xsl:template match="table">
    <person>
    <name><xsl:apply-templates
    select="td[text()='Nombre:']"/></name>
    <surname><xsl:apply-templates
    select="td[text()='Appellido:']"/></surname>
    <profession><xsl:apply-templates
    select="td[text()='Posición:']"/></profession>
    </person>
    </xsl:template>

    <xsl:template match="td[text()='Nombre:']">
    <xsl:value-of select="following-sibling::td" />
    </xsl:template>

    <xsl:template match="td[text()='Appellido:']">
    <xsl:value-of select="following-sibling::td" />
    </xsl:template>

    <xsl:template match="td[text()='Posición:']">
    <xsl:value-of select="following-sibling::td" />
    </xsl:template>
    </xsl:stylesheet>

    But the problem I have is that 'following-sibling::td' accesses ALL
    following-siblings and not only the next.
    I could imagine a solution making use of something like

    [position()=td[text()='Nombre:']position()+1]

    but I don't know how to implemt it in XSLT.

    Any suggestion? Thanks in advance.


    Michael
    Michael K?nig, Apr 22, 2005
    #1
    1. Advertising

  2. In article <>,
    Michael K?nig <> wrote:

    > <xsl:template match="td[text()='Nombre:']">
    > <xsl:value-of select="following-sibling::td" />
    > </xsl:template>


    You probably want:

    <xsl:value-of select="following-sibling::td[1]" />

    which will give you the first following td sibling.

    -- Richard
    Richard Tobin, Apr 22, 2005
    #2
    1. Advertising


  3. > But the problem I have is that 'following-sibling::td' accesses ALL
    > following-siblings and not only the next.


    That is true but is not your problem as you are using this with
    xsl:value-of
    <xsl:value-of select="following-sibling::td" />
    and value-of _always_ discards all but the first node in document order
    and gives the string value of that first node only.

    If you want to make it explicit (and legal in xslt2) you can go

    <xsl:value-of select="following-sibling::td[1]" />

    But this makes no difference in xslt1.


    David
    David Carlisle, Apr 22, 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. Philipp Lenssen

    Select next sibling XPath?

    Philipp Lenssen, Nov 25, 2003, in forum: XML
    Replies:
    1
    Views:
    3,759
    Dimitre Novatchev
    Nov 25, 2003
  2. Replies:
    1
    Views:
    2,383
    Bjoern Hoehrmann
    Dec 6, 2005
  3. Replies:
    11
    Views:
    651
    Fredrik Lundh
    Jan 23, 2006
  4. Deniz Bahar
    Replies:
    2
    Views:
    465
    Andrey Tarasevich
    Mar 9, 2005
  5. jman
    Replies:
    2
    Views:
    120
    Martin Honnen
    Dec 12, 2008
Loading...

Share This Page