By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,609 Members | 3,812 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,609 IT Pros & Developers. It's quick & easy.

Access only next sibling element with XSL

P: n/a
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:output 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
Jul 20 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
In article <99**************************@posting.google.com >,
Michael K?nig <ko****@gmail.com> 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
Jul 20 '05 #2

P: n/a
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
Jul 20 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.