代码之家  ›  专栏  ›  技术社区  ›  Rob Stevenson-Leggett

XSLT过滤和节点集索引

  •  0
  • Rob Stevenson-Leggett  · 技术社区  · 14 年前

    我正在尝试使用前面的同级轴、筛选器和索引器来检索for each中的前一个节点。

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

    我试着把它放在foreach中的一个变量中,但是由于变量不能更改,nodeset总是第二个项的前一个同级值。

    <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>
    

    我会使用第二个选择器内联,但因为索引器过滤器覆盖了另一个过滤器,所以当umbracanvihide=1时,它不会给出正确的值。

    1 回复  |  直到 14 年前
        1
  •  1
  •   user357812 user357812    14 年前
    preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
    

    node data 不带 alias 属性或带有 别名 属性不等于“umbracanavihide”

    编辑 :这是正确的XPath:

    包含数据元素的元素 值为1。

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