前の兄弟軸、フィルター、およびインデクサーを使用して、for-each で前のノードを取得しようとしています。
問題は、セレクターの XPath に一致する最初の項目のみが必要ですが、フィルターとインデクサーの両方を適用できないようです。インデクサーはフィルターをオーバーライドしているように見えるため、フィルターに一致する最初の兄弟ではなく、常に最初の前の兄弟を取得します。
これを foreach 内の変数に入れてみましたが、変数を変更できないため、ノードセットは常に 2 番目のアイテムの前の兄弟の値になります。
関連するコードは次のとおりです(可能な限り多くのノイズを切り捨てました)。アンブラコ ノイズについてお詫びします (XSLT は、簡単に変更できないサブナビゲーション用のかなり複雑なマークアップを生成するためのものです)。
<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>
2 番目のセレクターをインラインで使用しますが、インデクサー フィルターが他のフィルターをオーバーライドしているため、umbracoNaviHide = 1 の場合は正しい値が得られません。