如何在XPath for XSLT中找到祖父母的第一个孩子?

时间:2016-02-24 12:07:56

标签: xslt xpath

我无法弄清楚如何选择祖父母的第一个孩子。

结构简单:

<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>

如何在的帮助下选择头 e ?我需要在XSLT样式表中进行测试,因此强调轴。

选择//head[parent::*[self::div]][1][ancestor::back]不起作用,它仍会同时选择 e f

3 个答案:

答案 0 :(得分:0)

root的上下文中,以下XPath 2.0表达式将选择head的第一个back孙子:

back/(div/head)[1]

要在XPath 1.0中执行相同操作,请尝试:

back/div[head][1]/head[1]

编辑:

  

我有一个样式表选择的头,现在我需要测试是否   它是后面第一个div的第一个头。

这是一个完全不同的问题。从任何head的上下文中,您可以选择当前祖父母的第一个head的第一个div

../../div[1]/head[1]

请注意,这假设(与您的问题一样)第一个div确实有一个head孩子。

要将范围限制为仅back祖父母,您可以使用:

ancestor::back/div[1]/head[1]

答案 1 :(得分:0)

假设上下文元素为<head>f</head>,则以下内容应该有效:

如果您正在寻找祖父母的第一个孩子

../../div[1]

如果您正在寻找祖父母的孩子

../../*[1]

答案 2 :(得分:0)

工作解决方案有点棘手(XPath 2.0):

//head[count(parent::div[preceding-sibling::div]) < 1 and ancestor::back][1]

在XSLT样式表中适用于我(XSLT 1.0):

test=".[count(parent::div[preceding-sibling::div]) &lt; 1 and ancestor::back][1]"

<强>更新

如评论中所示,还有另一种解决方案,更适合XSLT:

test=". is ancestor::back/div[1]/head[1]"