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

4 xslt xpath xslt-2.0

我正在尝试匹配所有a/cb兄弟的元素.我试过了:

<xsl:template match="a/b/../c">
Run Code Online (Sandbox Code Playgroud)

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

我的XSLT/XPath技能至多是基本的......

Lar*_*rsH 5

<xsl:template match="a[b]/c">
Run Code Online (Sandbox Code Playgroud)

Explanation:匹配c具有子a元素的元素的b子元素.

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

<xsl:template match="a/c[../b]">
Run Code Online (Sandbox Code Playgroud)

这与你的尝试类似.

你不能..直接在匹配模式中使用(即在谓词之外)的原因是模式不是XPath表达式,即使它们的外观和行为非常相似.特别是,只有"向下"轴(child::,descendant::,和attribute::)直接在图案允许的.(规范允许的唯一显式轴是child::attribute::.descendant::通过模式//之间的步骤隐式允许.Saxon似乎在这里稍微弯曲规则,允许显式descendant::轴,甚至descendant-or-self::!)

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

但模式中的谓词使用与XPath表达式相同的语法规则定义(在XSLT 1.0中有一些限制,比如不允许变量引用或者).所以你可以使用其他轴,比如缩写.current()parent::..