我有当前的结构;
Item 1
- Subitem 1
- Subitem 2
- Subitem 3
- - Sub subitem 1
- - Sub subitem 2
- - Sub subitem 3
- - etc
我有一个仅在“第1项”中定义的字段。我们称之为'Header'。
当我在“第1项”时,它很容易提取这个值,但是当我在其他项目上时呢?有没有办法我可以通过树(向上)直到我找到一个名为'Header'的字段并且它有一个值,然后停止并将其用作我的子项目中的参考点?
答案 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" />