Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
如何在XPathforXSLT中找到祖父母的第一个孩子?_Xslt_Xpath - Fatal编程技术网

如何在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]
不起作用,它仍然同时选择ef

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.试着理解我在这里的时间是有限的。我不想赢得任何东西,但我可能很简洁。