我目前的结构;
Item 1
- Subitem 1
- Subitem 2
- Subitem 3
- - Sub subitem 1
- - Sub subitem 2
- - Sub subitem 3
- - etc
我有一个只能在“项目1”中定义的字段。 让我们把它叫做“标头”。
当我在“项目1”,它很容易提取此值,但对于当我在其他项目? 有没有一种方法我可以去通过树(最多),直到我找到一个名为“标题”字段,它有一个值,然后停下来,用这个作为我的子项的参考点?
如果你想看看这棵树,发现包含值的头属性最接近的元素,这样的事情应该工作。
<xsl:value-of select="(ancestor::*/@Header[.!=''])[last()]" />
它使用ancestor
轴来查找树和XPath表达式查找与页眉属性是谁的价值元素不是空的。
第二滤波器用于评估的最后一个。 如果是具有一个以上的祖先@Header
用一个值, 最后一个将是最接近上下文节点,因为结果是文档顺序 。
编辑:一种替代的方式找到了相同的结果,利用以下事实: ancestor
以相反的文档顺序轴返回将是把过滤标准在断言对于ancestor
轴步骤中,选择第一个(最匹配的上下文节点) ,然后步入@Header:
<xsl:value-of select="ancestor::*[@Header!=''][1]/@Header" />
如果您目前的情况下是不是Item 1
,但其子,而一个,你可以使用ancestor
轴来获取其数据。
因此,假设您的Item 1
元具有称为属性Header
,你可以这样做:
<xsl:value-of select="ancestor::Item1/@Header"/>
这是假设你的XML结构(你真的应该在你的问题已经提供)看起来是这样的:
<Item1 Header="a header">
<Subitem1/>
<Subitem2/>
<!-- etc -->
</Item1>
而那名“项目1”是在这个结构中是独一无二的。