我正在尝试匹配所有a/c
具有b
兄弟姐妹的元素。我试过了:
<xsl:template match="a/b/../c">
但我从撒克逊人那里得到“无法将表达式 {..} 转换为模式”。
我的 XSLT/XPath 技能充其量是基本的......
<xsl:template match="a[b]/c">
说明:匹配作为具有子元素的子元素的任何c
元素。a
b
您还应该能够..
在谓词中使用:
<xsl:template match="a/c[../b]">
这与您尝试的类似。
您不能..
直接在匹配模式中使用(即在谓词之外)的原因是模式不是 XPath 表达式,即使它们看起来和行为非常相似。特别是,模式中只允许直接使用“向下”轴( child::
、descendant::
和)。attribute::
(规范允许的唯一显式轴是child::
and attribute::
.是通过模式步骤之间descendant::
隐式允许的。撒克逊人似乎在这里稍微改变了规则,允许显式轴,甚至!)//
descendant::
descendant-or-self::
对轴进行限制的原因是 (a) 模式中很少需要其他轴,并且 (b) 这允许 XSLT 处理器在测试匹配时更加高效。
But predicates in patterns are defined with the same syntax rules as in XPath expressions (with some restrictions in XSLT 1.0, like not allowing variable references or current()
). So you can use other axes, like parent::
, or the abbreviation ..
.
这个 XPath 表达式似乎可以完成这项工作(可能不是最佳的):
//a|//c[following-sibling::b or preceding-sibling::b]
编辑:
如果 LarsH 是正确的,它应该//a/c
代替//a|//c
.