如何在XPathforXSLT中找到祖父母的第一个孩子?
我不知道如何选择祖父母的第一个孩子 结构简单:如何在XPathforXSLT中找到祖父母的第一个孩子?,xslt,xpath,Xslt,Xpath,我不知道如何选择祖父母的第一个孩子 结构简单: <root> <front> <div> <head>a</head> <head>1</head> </div> <div> <head>b</head> <h
<root>
<front>
<div>
<head>a</head>
<head>1</head>
</div>
<div>
<head>b</head>
<head>2</head>
</div>
</front>
<body>
<div>
<head>c</head>
<head>3</head>
</div>
<div>
<head>d</head>
<head>4</head>
</div>
</body>
<back>
<div>
<head>e</head>
<head>5</head>
</div>
<div>
<head>f</head>
<head>6</head>
</div>
</back>
</root>
A.
1.
B
2.
C
3.
D
4.
E
5.
F
6.
如何借助轴选择头部e?我需要在XSLT样式表中进行测试,因此重点放在轴上
选择
//head[parent::*[self::div][1][祖先::back]
不起作用,它仍然同时选择e和f从root
的上下文中,下面的XPath 2.0表达式将选择back
的第一个head
孙子:
back/(div/head)[1]
要在XPath 1.0中执行相同操作,请尝试:
back/div[head][1]/head[1]
编辑: 我已经通过样式表选择了头部,现在我需要测试 这是后区第一个分区的第一个头 这是一个完全不同的问题。从任何
head
的上下文中,您可以通过以下方式选择当前祖父母的第一个div
的第一个head
:
../../div[1]/head[1]
请注意,这假设(与您的问题一样)第一个div
确实有一个子头
要将范围仅限于back
祖父母,您可以使用:
ancestor::back/div[1]/head[1]
假设上下文元素是f
,则以下操作应该有效:
如果你正在寻找祖父母的第一个孩子
../../div[1]
../../*[1]
如果你想找祖父母的孩子
../../div[1]
../../*[1]
工作解决方案有点棘手(XPath 2.0):
更新
如注释所示,还有另一种更适合XSLT的解决方案:
test=". is ancestor::back/div[1]/head[1]"
当你说“路径……它仍然同时选择e和f”时,上下文元素是什么?@HonzaHejzl没有意义:哪个头?XPath的哪个版本?头e是上下文节点。(至于XPath版本,我不知道,我只是在使用最新的稳定版本[在XML和eXist db中]。@HonzaHejzl请看这里如何找到:请养成一种习惯,在询问XSLT或XPath时声明您的版本。很抱歉,对于使用XSLT模板选择的head
元素的迭代,我需要它。这意味着,我需要使用轴,而不是直接向下选择。我恐怕不知道这意味着什么。每个选择都使用轴。如果你在根元素的上下文中,那么轴只能是子元素或子元素。很简单,试着从head元素开始向上做同样的事情。从上到下,这是非常简单的,但在另一个方向上有一些小故障。我已经通过样式表选择了头,现在我需要测试它是否是后面部分第一个div的第一个头。(我想你知道。)对不起,误会了。上下文节点(在我的样式表中是头e,我在问题中提到了它。@HonzaHejzl我已经为您的(新的)添加了一个答案但是,我怀疑这是一个.1。它不能在XSLT中工作,因为您有一个未经scaped的1。好的,在XSLT中更改为
。2.在Oxygen Author 17中测试,以及从TEI XML生成期刊文章的项目的XSLT样式表仍然有效()。我不确定你的截图应该证明什么。我建议你与@michael.hor257k进行比较,谢谢你的好例子(我不知道这个应用程序)。我有两件事想提一下:1.我帮不上忙,不管我怎么努力,我的棘手解决方案仍然有效。你的解决方案更好,适用于XSLT(但我无法在氧气中重现这一点,这就是为什么一开始我没有采用相同的方法)。谢谢你,我会更新答案并打分。2.你看起来很有技巧,但太严格了。我不想赢得什么,我只是比较新,需要一些时间来学习如何参与。请记住这一点。1.请不要发表个人评论。2.我正在尽我所能帮助你。这非常重要当我不知道你的目的时更难做到。3.试着理解我在这里的时间是有限的。我不想赢得任何东西,但我可能很简洁。