Почти правильно.
<xsl:if test="preceding-sibling::recurso[1]/unidad != unidad">
</xsl:if>
::
предназначен для осей, а не для перемещения по траектории («создание шага локации»). В терминологии 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)
[1]
является сокращением для [position()=1]
.
Ось child
неявна на шаге местоположения, поэтому это
preceding-sibling::recurso[1]/unidad != unidad
эквивалентно этому:
preceding-sibling::recurso[1]/child::unidad != unidad