我正在尝试使用前一个兄弟轴,一个过滤器和一个索引器来检索for-each中的前一个节点。
问题是,我只想要在选择器中匹配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时它没有给出正确的值。
答案 0 :(得分:1)
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
这意味着:选择所有前面的兄弟node
元素,这些元素至少有一个子data
元素没有alias
属性或alias
属性不相等到“umbracoNaviHide”
编辑:这是正确的XPath:
我想要第一个前面的节点 包含数据元素的元素 具有属性别名的名称 umbracoNaviHide不包含 值1。
preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]