Получите только самые верхние узлы с 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>

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

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

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

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

1 ответ

Чтобы получить только самые внешние узлы, вы можете попробовать отфильтровать узлы, имеющие предка с атрибутом, который начинается с "name":

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

Таким образом, все выражение Xpath выглядит так:

//*[
      @*[starts-with(name(), 'some')] 
        and 
      not(ancestor::*[@*[starts-with(name(), 'some')]])
    ]
Другие вопросы по тегам