如果节点具有某个属性且其父节点具有相同的属性,则匹配该节点?

时间:2011-11-08 20:15:54

标签: xml xslt xpath

好的,我有一个像这样的寻找援助结构:

<c01 level="file">

<c02 level="file"></c02>

</c01>

对于我的XSLT模板,我希望能够只匹配具有level =“file”属性的节点,这些节点的父级也具有level =“file”的属性,这样我就可以制定一些特定的格式对孩子。

通常匹配level =“file”我只使用以下内容:

<xsl:template match="*[@level="file"]">

但是,出于格式化(缩进等)的目的,我需要将具有相同属性的节点的子节点与其父节点区别对待。如下所示:

<xsl:template match="*[@level="file"] and parent::[@level="file"]">

有什么想法吗?我希望这是有道理的。谢谢!

3 个答案:

答案 0 :(得分:1)

匹配父级具有与我自己相同的@level属性的任何节点,以及我的@level属性='file'

<xsl:template match="*[../@level=./@level][./@level='file']">
 ...
</xsl:template>

答案 1 :(得分:1)

使用

<xsl:template match="*[@level='file' ]/*[@level='file']">

此模板匹配其level属性为"file"的字符串值的任何元素,并且该元素是其level属性为"file"的字符串值的子元素

请注意:未使用..parent::轴或//,这可能是最简单,最精确的匹配模式。

答案 2 :(得分:-1)

我认为你正在寻找像

这样的东西
<xsl:apply-templates select="//*[@level='file' and parent::*/@level='file']" />

也就是说,选择具有“level”属性“file”的任何元素,并且还具有“level”属性为“file”的父元素。然后,您就可以在其上匹配模板。我不确定模板上的匹配语法是否足够复杂,以满足您正在寻找的复杂性;我认为我通常采用的方法是选择我正在寻找的节点,并且只使用模板上的匹配来实现非常简单的差异。什么是最清楚的可能取决于你的转换的其余部分是什么样的。

但是,我不确定我是否完全理解你的问题。