Получить только самые верхние узлы с помощью xPath, дочерние узлы должны быть исключены

Использование XPath 1.0

<div id="master">
    <div someAttr id="1">
        <div someAttr id="1-1">
            <div someAttr id="1-1-1">
                <div someAttr id="1-1-1-1">innermost child</div>
            </div>
        </div>
    </div>
    <div someAttr id="2">
        <div someAttr id="2-1">
            <div someAttr id="2-1-1">
                <div someAttr id="2-1-1-1">innermost child</div>
            </div>
        </div>
    </div>
</div>

Я использую этот запрос, который выбирает все узлы, имеющие атрибут, начинающийся с «некоторых».

//*[@*[starts-with(name(), 'some')]]

Мне нужны только самые верхние узлы. Например, элементы с идентификаторами 1 и 2. И если я использую тот же запрос для элемента с идентификатором 1, я должен получить элемент с идентификатором 1-1 и т. д.

Как добиться этого с помощью xpath?


person chba    schedule 17.08.2014    source источник
comment
В XPath 3.0 есть функция externalmost(), которая делает именно то, что вам нужно, но вам нужно сообщить нам, какую версию XPath вы используете.   -  person Michael Kay    schedule 17.08.2014
comment
Я ограничен XPath 1.0   -  person chba    schedule 18.08.2014


Ответы (1)


Чтобы получить только самые внешние узлы, вы можете попробовать отфильтровать узлы, у которых предок с атрибутом начинается с «имя»:

//*[.... and not(ancestor::*[@*[starts-with(name(), 'some')]])]

Итак, все выражение Xpath выглядит так:

//*[
      @*[starts-with(name(), 'some')] 
        and 
      not(ancestor::*[@*[starts-with(name(), 'some')]])
    ]
person har07    schedule 17.08.2014
comment
Да, это даст мне элементы с идентификаторами 1 и 2, однако невозможно будет использовать тот же запрос для элемента с идентификатором 1, чтобы получить элемент с идентификатором 1-1. - person chba; 17.08.2014