Я пытаюсь восстановить предыдущий узел в каждом из них, используя ось предшествующего брата, фильтр и индекс, чтобы найти его.XSLT Фильтрация и индексы на наборе узлов
Проблема в том, что мне нужен только первый элемент, который соответствует XPath в селекторе, однако я не могу применить фильтр и индекс. Индексатор, кажется, переопределяет фильтр, поэтому я всегда получаю первый предшествующий брат, а не первый, соответствующий фильтру.
Я попытался поместить это в переменную внутри foreach, но поскольку переменная не может быть изменена, набор узлов всегда является вторым значением предшествующего словаря второго элемента.
Вот соответствующий код (нарезанный как можно больше шума). Извинения за шум 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.
Я не хочу второй предшествующий элемента Я хотел элемент первого предшествующий узла, содержащий элемент данных, который имеет ДТО а также псевдоним под названием umbracoNaviHide, который не содержит значения 1. Однако вы указали, что мой фильтр неверен! Это решило. Я отредактировал ваш ответ, чтобы отразить то, что я действительно хотел. –