XSLT-фильтрация и индексы на множестве узлов - PullRequest
0 голосов
/ 09 августа 2010

Я пытаюсь получить предыдущий узел для каждого, используя ось предшествующего брата, фильтр и индексатор, чтобы найти его.

Проблема в том, что мне нужен только первый элемент, которыйсоответствует 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.

1 Ответ

1 голос
/ 09 августа 2010
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]

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

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

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

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