Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XSLT - Comparing preceding-sibling's elements with current's node element

Tags:

xml

xslt

xpath

I have this XML file:

<recursos>
    <recurso url="http://w3c.com">
        <descripcion>Consorcio W3C</descripcion>
        <tipo>externo</tipo>
        <idioma>ingles</idioma>
        <contenido>General</contenido>
        <unidad>Unidad 2</unidad>
    </recurso>
    <recurso url="http://html.com">
        <descripcion>Especificación HTML</descripcion>
        <tipo>externo</tipo>
        <idioma>castellano</idioma>
        <contenido>HTML</contenido>
        <version>4.01</version>
        <unidad>Unidad 3</unidad>
    </recurso>
</recursos>

I want to compare one "recurso"'s preceding sibling element "unidad" with the "unidad" of the current "recurso" to check if they're different.

I was trying:

<xsl:if test="preceding-sibling::recurso[position()=1]::unidad != unidad">
</xsl:if>

But I know it's horribly wrong :( I hope you could help me, thank you very much.

like image 691
siondream Avatar asked Jun 07 '10 14:06

siondream


1 Answers

Almost correct.

<xsl:if test="preceding-sibling::recurso[1]/unidad != unidad">
</xsl:if>

The :: is for axes, not for moving along a path ("making a location step"). In XPath terminology:

preceding-sibling::recurso[1]/unidad != unidad
'''''''''''''''''  ++++++++++ ++++++
                          ###
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~

'  = axis name       (optional, defaults to "child")
+  = node test       (required)
#  = predicate       (optional, for filtering)
~  = location step   (required at least once per select expression)

The [1] is a shorthand for [position()=1].

The child axis is implicit in a location step, so this

preceding-sibling::recurso[1]/unidad != unidad

is equivalent to this:

preceding-sibling::recurso[1]/child::unidad != unidad
like image 114
Tomalak Avatar answered Sep 22 '22 12:09

Tomalak