ノードセットのXSLTフィルタリングとインデックス
質問
前の兄弟軸、フィルター、インデクサーを使用してそれを見つけるために、前のノードを実際のノードで再取得しようとしています。
問題は、セレクターのXPathに一致する最初のアイテムのみが必要ですが、フィルターとインデクサーの両方を適用できないようです。インデクサーはフィルターをオーバーライドしているように見えるので、フィルターに一致する最初の兄弟ではなく、常に最初の兄弟を取得します。
これをforeach内の変数に入れようとしましたが、変数を変更できないため、ノードセットは常に2番目の項目の前の兄弟の値です。
関連するコードは次のとおりです(できるだけ多くのノイズを切り刻んだ)。 Umbracoノイズについて謝罪します(XSLTは、簡単に変更できないSubNavのかなり複雑なマークアップを生成するためです)。
<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の場合は正しい値が表示されません。
解決
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
これの意味は: 前の兄弟をすべて選択します node
少なくとも1人の子供を持つ要素 data
ANなしの要素 alias
属性またはand alias
「umbraconavihide」に等しくない属性
編集: :これはこれの正しいxpathです:
値1を含まないumbraconavihideと呼ばれる属性エイリアスを持つデータ要素を含む最初の前のノード要素が必要でした。
preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]
所属していません StackOverflow