Я пытаюсь получить предыдущий узел для каждого, используя ось предшествующего брата, фильтр и индексатор, чтобы найти его.
Проблема в том, что мне нужен только первый элемент, которыйсоответствует XPath в селекторе, однако я не могу применить фильтр и индексатор.Кажется, что индексатор переопределяет фильтр, поэтому я всегда получаю первого предшествующего брата, а не первого, соответствующего фильтру.
Я пытался поместить это в переменную внутри foreach, но так как переменная не может быть изменена,nodeset - это всегда предшествующие значения второго брата для элемента.
Вот соответствующий код (отсеян как можно больше шума).Извиняюсь за шум Umbraco (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>
Я бы использовал второй встроенный селектор, но потому что фильтр индексатора переопределяетдругой фильтр не дает правильных значений, когда umbracoNaviHide = 1.