Filtrado XSLT e índices en el conjunto de nodos
Pregunta
Estoy tratando de retener el nodo anterior en un para cada uno utilizando el eje de hermana anterior, un filtro y un indexador para encontrarlo.
El problema es que solo quiero el primer elemento que coincida con el XPath en el selector, sin embargo, parece que no puedo aplicar tanto el filtro como el indexador. El indexador parece anular el filtro, por lo que siempre obtengo el primer hermano anterior en lugar del primero que coincide con el filtro.
He intentado poner esto en una variable dentro del foreach, pero dado que la variable no se puede cambiar, el nodo es siempre los valores del hermano anterior del segundo elemento.
Aquí está el código relevante (cortado el mayor ruido posible). Disculpas por el ruido Umbraco (el XSLT es para generar un marcado bastante complicado para un subnav que no puedo cambiar fácilmente).
<xsl:for-each select="$currentPage/ancestor-or-self::node[(@nodeTypeAlias='Discover' or @nodeTypeAlias='CampaignHome') and data[@alias='umbracoNaviHide'] != 1]/child::node[(@nodeTypeAlias='Discover' or @nodeTypeAlias='CampaignHome') and data[@alias='umbracoNaviHide'] != 1]">
<!--This variable is always set to the second item's preceding sibling-->
<xsl:variable name="precedingItem" select="preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]" />
<!--This variable always contains the second item even if /data/@alias='umbracoNaviHide' = 1 -->
<xsl:variable name="predingItemWithIndexer" select="preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]][1]" />
<!-- this always prints out the id of the first item -->
<xsl:value-of select="position()" /> <xsl:value-of select="$precedingItem[1]/@id" />
</xsl:foreach>
Usaría el segundo selector en línea, pero debido a que el filtro indexador está anulando el otro filtro, no da los valores correctos cuando UmBraconaviHide = 1.
Solución
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
Esto significa: Seleccione todos los hermanos anteriores node
elementos que tienen al menos un hijo data
elemento sin un alias
atributo o con un alias
atributo no igual a "Umbraconavihide"
EDITAR: Este es el XPath correcto para esto:
Quería el primer elemento de nodo anterior que contiene un elemento de datos que tiene un alias de atributo llamado UmbraconaviHide que no contiene el valor 1.
preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]