我试图使用前一个兄弟轴,一个过滤器和一个索引器来查找它。

问题是,我只想要与选择器中的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时没有给出正确的值。

有帮助吗?

解决方案

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

这意味着: 选择所有前面的兄弟姐妹 node 具有至少一个子项的元素 data 没有一个元素 alias 属性或带有 alias 属性不等于"umbracoNaviHide"

编辑:这是正确的XPath为此:

我想要前面的第一个节点 包含数据元素的元素 它有一个属性别名 不含的umbracoNaviHide 的值1。

preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top