Access only next sibling element with XSL

M

Michael K?nig

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
 
R

Richard Tobin

Michael K?nig said:
<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
 
D

David Carlisle

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top