Вземете само най-горните възли с 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 има функция outermost(), която прави точно това, което искате, но трябва да ни кажете коя версия на 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