Filtragem e índices XSLT no conjunto de nós
Pergunta
Estou tentando recuperar o nó anterior em um para-cada, usando o eixo de cinto anterior, um filtro e um indexador para encontrá-lo.
O problema é que eu quero apenas o primeiro item que corresponde ao XPath no seletor, no entanto, pareço incapaz de aplicar o filtro e o indexador. O indexador parece substituir o filtro, então eu sempre recebo o primeiro irmão anterior, em vez do primeiro que corresponde ao filtro.
Tentei colocar isso em uma variável dentro do foreach, mas como a variável não pode ser alterada, o NodEset é sempre o valor do segundo item anterior do irmão.
Aqui está o código relevante (cortado o máximo de barulho possível). Desculpas pelo ruído da Umbraco (o XSLT é para gerar uma marcação bastante complicada para um subnav que eu não posso mudar facilmente).
<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>
Eu usaria o segundo seletor em linha, mas como o filtro indexador está substituindo o outro filtro, ele não fornece os valores corretos quando umbaconavihide = 1.
Solução
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
Isso significa: Selecione todo o irmão anterior node
elementos tendo pelo menos um filho data
elemento sem um alias
atributo ou com um alias
atributo não igual a "umbraconavihide"
EDITAR: Este é o XPath correto para isso:
Eu queria o primeiro elemento do nó anterior que contém um elemento de dados que possui um alias de atributo chamado Umbraconavihide, que não contém o valor 1.
preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]