【问题标题】:XSLT Filtering and indices on node set节点集上的 XSLT 过滤和索引
【发布时间】:2010-08-09 13:37:08
【问题描述】:

我正在尝试使用前一个兄弟轴、一个过滤器和一个索引器来检索 for-each 中的前一个节点。

问题是,我只想要与选择器中的 XPath 匹配的第一项,但是,我似乎无法同时应用过滤器和索引器。索引器似乎覆盖了过滤器,所以我总是得到第一个前面的兄弟而不是第一个匹配过滤器的兄弟。

我尝试将它放在 foreach 中的一个变量中,但由于该变量无法更改,因此节点集始终是第二个项目的前一个兄弟项的值。

这是相关代码(尽可能多地消除噪音)。为 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 时它没有给出正确的值。

【问题讨论】:

    标签: xslt variables loops umbraco axes


    【解决方案1】:
    preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
    

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

    编辑:这是正确的 XPath:

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

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

    【讨论】:

    • 我不想要前面的第二个元素 我想要前面的第一个节点元素,它包含一个数据元素,该元素具有一个名为 umbracoNaviHide 的属性别名,它不包含值 1。但是,您已经指出出我的过滤器不正确谢谢!那解决了它。我已经编辑了你的答案以反映我真正想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多