XSLT:获取具有指定值的最近项目? (Sitecore的)

时间:2010-02-07 09:36:59

标签: xslt sitecore

我有当前的结构;

Item 1
 - Subitem 1
 - Subitem 2
 - Subitem 3
 - - Sub subitem 1
 - - Sub subitem 2
 - - Sub subitem 3
 - - etc

我有一个仅在“第1项”中定义的字段。我们称之为'Header'。

当我在“第1项”时,它很容易提取这个值,但是当我在其他项目上时呢?有没有办法我可以通过树(向上)直到我找到一个名为'Header'的字段并且它有一个值,然后停止并将其用作我的子项目中的参考点?

2 个答案:

答案 0 :(得分:1)

如果您当前的上下文不是Item 1而是其中一个子项,则可以使用ancestor轴获取其数据。

因此,假设您的Item 1元素具有名为Header的属性,您可以执行以下操作:

<xsl:value-of select="ancestor::Item1/@Header"/>

这假设你的XML结构(你真的应该在你的问题中提供)看起来像这样:

<Item1 Header="a header">
  <Subitem1/>
  <Subitem2/>
  <!-- etc -->
</Item1>

并且名称“Item1”在此结构中是唯一的。

答案 1 :(得分:1)

如果你想查找树并找到包含带有值的 Header 属性的最近元素,那么这样的东西应该可以工作。

  <xsl:value-of select="(ancestor::*/@Header[.!=''])[last()]" />

这使用ancestor轴来查找树,xpath表达式查找具有 Header 属性且值不为空的任何元素。

第二个过滤器用于评估 last 。如果有一个具有值@Header的祖先不止一个,那么 last 将最接近上下文节点,因为结果是文档顺序

编辑:另一种查找相同结果的方法,利用ancestor轴在反向文档顺序中返回的事实将放置过滤条件在ancestor轴步骤的谓词中,选择第一个(与上下文节点最匹配),然后进入@Header:

<xsl:value-of select="ancestor::*[@Header!=''][1]/@Header" />