如何匹配xslt / xpath中具有某个兄弟元素的元素

时间:2012-08-07 17:41:47

标签: xslt xpath xslt-2.0

我正在尝试匹配具有a/c兄弟的所有b元素。我试过了:

<xsl:template match="a/b/../c">

但我得到“无法将表达式{..}转换为撒克逊的模式”。

我的XSLT / XPath技能最基本......

2 个答案:

答案 0 :(得分:5)

<xsl:template match="a[b]/c">

说明:匹配任何c元素,该元素是具有a子元素的b元素的子元素。

您还应该能够在谓词中使用..

<xsl:template match="a/c[../b]">

与您尝试的类似。

您无法在匹配模式中直接使用..(即在谓词之外)的原因是模式不是XPath表达式,即使它们的外观和行为非常相似。特别是,只有“向下”轴(child::descendant::attribute::)才能直接在模式中使用。 (规范允许的唯一显式轴是child::attribute::descendant:: //隐式允许descendant::之间descendant-or-self::。{Saxon}似乎违反了规则这里有一点,允许明确的current()轴,甚至是parent::!)

限制轴的原因是(a)模式中很少需要其他轴,(b)这使得XSLT处理器在测试匹配时效率更高。

但是模式中的谓词 是用pattern steps定义的,如XPath表达式一样(在XSLT 1.0中有一些限制,比如不允许变量引用或{{ 1}})。因此,您可以使用其他轴,例如..或缩写{{1}}。

答案 1 :(得分:1)

这个XPath表达式似乎完成了这项工作(可能不是最佳的):

//a|//c[following-sibling::b or preceding-sibling::b]

编辑:

如果LarsH是正确的,则应该是//a/c而不是//a|//c