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.

Foi útil?

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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top