2010-06-07 14 views
16

Ben bu XML dosyası var: Ben 'Unidad' ile kardeş öğe 'Unidad' önceki bir "recurso" 'ler karşılaştırmak istiyorumXSLT - güncel istasyonun düğüm elemanı ile önceki-kardeş elemanları karşılaştırılması

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

Farklı "olup olmadığını" kontrol etmek için geçerli "yeniden". çok teşekkür ederim,

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

Ama korkunç bir yanlış olduğunu biliyorum :(bana yardımcı olabilir umut

+4

İyi İlk kez soru, BTW. İyi biçimlendirilmiş, iyi yazılmış, ancak mümkün olan en kısa kod örneği. Keşke daha fazla insan böyle yapardı. :-) – Tomalak

cevap

35

Neredeyse doğru

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

:

ben çalışıyordum.. ::, bir yol boyunca hareket etmek için değil (bir konum adımı oluşturmak için) eksenler içindir XPath terminolojisinde:

 
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) 

, [position()=1] için bir kısa yoldur.

child ekseni bir yere adımda örtülü, bu nedenle bu

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

bu eşdeğerdir:

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