我正在尝试匹配具有a/c
兄弟的所有b
元素。我试过了:
<xsl:template match="a/b/../c">
但我得到“无法将表达式{..}转换为撒克逊的模式”。
我的XSLT / XPath技能最基本......
答案 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
。