Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何匹配xslt/xpath中具有特定同级元素的元素_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

如何匹配xslt/xpath中具有特定同级元素的元素

如何匹配xslt/xpath中具有特定同级元素的元素,xslt,xpath,xslt-2.0,Xslt,Xpath,Xslt 2.0,我正在尝试匹配所有具有b同级的a/c元素。我试过: <xsl:template match="a/b/../c"> 但是我从Saxon得到“无法将表达式{..}转换为模式” 我的XSLT/XPath技能充其量是基本的…这个XPath表达式似乎可以完成这项工作(可能不是最佳的): 编辑: 如果拉尔斯是对的,它应该是//a/c,而不是//a |//c <xsl:template match="a[b]/c"> 这和你的尝试很相似 不能在匹配模式中直接使用。的原因是模式

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

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

但是我从Saxon得到“无法将表达式{..}转换为模式”


我的XSLT/XPath技能充其量是基本的…

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

编辑:

如果拉尔斯是对的,它应该是
//a/c
,而不是
//a |//c

<xsl:template match="a[b]/c">
这和你的尝试很相似

不能在匹配模式中直接使用
的原因是模式不是XPath表达式,即使它们的外观和行为非常相似。特别是,模式中只允许直接使用“向下”轴(
子:
子:
、和
属性::
)。(规范所允许的唯一显式轴是
子::
属性::
子体::通过
/
之间的
/
被隐式允许。撒克逊似乎有点扭曲规则,允许显式
子体::
轴,甚至
子体或自身:
!)

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


但是模式中的谓词是用XPath表达式中的as定义的(XSLT1.0中有一些限制,比如不允许变量引用或
current()
)。因此,您可以使用其他轴,例如
parent::
,或缩写

我相信当OP说
a/c
时,他的意思是“
c
元素是
a
”的子元素,而不是“
a
c
”。此外,您可以在匹配模式开始时省略
//code>。@LarsH您是正确的。Lev抱歉,如果我不清楚-请说我是否应该用不同的方式表达我的问题,因为这将帮助我学习@杰克:不,我想这是我的错:)LarsH,
/
是我测试它的工具所需要的。谢谢-这非常有用。我最终发现,
可以用在谓词中(在发现谓词是什么之后不久),但我对解释一无所知,这个答案正是我所希望的,而且它帮助我理解。另外,
a[b]/c
比我想到的更简洁:-)
<xsl:template match="a[b]/c">
<xsl:template match="a/c[../b]">