Domanda

Sto cercando di ritirare il nodo precedente in un per essere utilizzato l'asse del fratellastro precedente, un filtro e un indicizzatore per trovarlo.

Il problema è che voglio solo il primo elemento che corrisponda a XPath nel selettore, tuttavia, sembro incapace di applicare sia il filtro che l'indicizzatore. L'indicizzatore sembra sovrascrivere il filtro, quindi ottengo sempre il primo fratello precedente piuttosto che il primo che corrisponde al filtro.

Ho provato a metterlo in una variabile all'interno di Foreach, ma poiché la variabile non può essere modificata, il nodo è sempre i valori del fratello precedente del secondo elemento.

Ecco il codice pertinente (eliminato il maggior rumore possibile). Ci scusiamo per il rumore di Umbraco (l'XSLT è per generare un markup abbastanza complicato per un subnav che non posso cambiare 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>

Userei il secondo selettore in linea ma poiché il filtro indicizzatore sta sovrascrivendo l'altro filtro, non fornisce i valori corretti quando ombraconavihide = 1.

È stato utile?

Soluzione

preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]

Questo significa: Seleziona tutto il fratello precedente node elementi che hanno almeno un figlio data elemento senza un alias attributo o con un file alias attributo non uguale a "ombraconavihide"

MODIFICARE: Questo è l'XPath corretto per questo:

Volevo il primo elemento nodo precedente che contiene un elemento di dati che ha un alias di attributo chiamato Umbraconavihide che non contiene il valore 1.

preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top