質問

前の兄弟軸、フィルター、インデクサーを使用してそれを見つけるために、前のノードを実際のノードで再取得しようとしています。

問題は、セレクターの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]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top