2010-06-07 10 views
16

tengo este archivo XML:XSLT - Comparación de los elementos de la anterior-hermanos con el elemento del nodo actual

<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> 

quiero comparar un "recurso" 's anterior hermano elemento de 'Unidad' con la 'Unidad' de la "recurso" actual para verificar si son diferentes.

yo estaba tratando:

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

Pero sé que es muy mal :( espero que me podría ayudar, muchas gracias

+4

buena primera cuestión de tiempo, por cierto. Bien formateado, bien redactado, con una muestra de código completa, pero la más corta posible. Desearía que más personas lo hicieran de esa manera. :-) – Tomalak

Respuesta

35

Casi correcta

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

.. El :: es para ejes, no para moverse a lo largo de una ruta ("realizar un paso de ubicación"). En la terminología de XPath:

 
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) 

El [1] es una abreviatura de [position()=1].

El eje child está implícito en un paso de localización, por lo que este

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

es equivalente a esto:

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