2010-08-09 22 views
0

我試圖在for-each中使用前面的兄弟軸,篩選器和索引器來查找它的前一個節點。XSLT節點集上的篩選和索引

問題是,我只想在選擇器中匹配XPath的第一項,但我似乎無法同時應用篩選器和索引器。索引器似乎覆蓋了過濾器,所以我總是得到第一個前面的兄弟,而不是第一個匹配過濾器。

我試着把它放在foreach中的一個變量上,但由於變量不能被改變,所以nodeset總是第二項的前一個兄弟的值。

下面是相關的代碼(儘可能多地剔除噪音)。對於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> 

我會使用第二選擇內嵌但因爲索引過濾器重寫其他過濾器不會給出正確的值時,umbracoNaviHide = 1

回答

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

這意味着:選擇所有前面的同級具有至少一個子data元件沒有alias屬性或與aliasnode元素屬性不等於「umbracoNaviHide」

EDIT:這是此正確的XPath:

我想要的第一在前節點 元件,它包含一個具有屬性別名叫做 umbracoNaviHide的數據元素 不含 值1 。

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

我不想第二在前元件我想它包含具有ATT的數據元素第一在先節點元件ribute別名叫umbracoNaviHide其中不包含值1. 但是,您已經指出我的過濾器是不正確的謝謝!這解決了它。我已經編輯了你的答案,以反映我真正想要的。 – 2010-08-09 15:05:58