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.

¿Fue útil?

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]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top