0

前の兄弟軸、フィルター、およびインデクサーを使用して、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 の場合は正しい値が得られません。

4

1 に答える 1

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

つまり、属性を持たない、または「umbracoNaviHide」と等しくない属性を持つ少なくとも 1 つの子要素を持つ先行するすべての兄弟要素を選択します。nodedataaliasalias

編集:これはこれの正しいXPathです:

値 1 を含まない umbracoNaviHide という属性エイリアスを持つデータ要素を含む最初の先行ノード要素が必要でした。

preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]
于 2010-08-09T14:11:19.413 に答える