2010-08-09 2 views
0

Я пытаюсь восстановить предыдущий узел в каждом из них, используя ось предшествующего брата, фильтр и индекс, чтобы найти его.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.

ответ

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

Это означает: выбрать все предыдущий родственный node элементы, имеющие по меньшей мере, один дочерний элемент data без атрибута alias или с alias атрибута не равно «umbracoNaviHide»

РЕДАКТИРОВАТЬ: Это правильный XPath, для этого:

Я хотел первый предшествующий узел элемента, который содержит элемент данных, который имеет псевдоним атрибута под названием umbracoNaviHide, который не содержит значения 1 .

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

Я не хочу второй предшествующий элемента Я хотел элемент первого предшествующий узла, содержащий элемент данных, который имеет ДТО а также псевдоним под названием umbracoNaviHide, который не содержит значения 1. Однако вы указали, что мой фильтр неверен! Это решило. Я отредактировал ваш ответ, чтобы отразить то, что я действительно хотел. –

Смежные вопросы