Используя XPath, можно ли получить имя каждого узла на пути к целевому узлу в виде строки?

Можно ли с помощью XPath получить имя каждого узла в пути к целевому узлу в виде строки?

Пример.xml

<parent>
    <childOne>
        <target>true</target>
    </childOne>

    <childTwo>
        <target>true</target>
    </childTwo>

    <childThree>
        <target>false</target>
    </childThree>
</parent>

Выбирает всех предков, для которых target имеет значение true

//node()[target = "true"]/ancestor-or-self::*

Возможно ли получить этот результат

"parent/childOne/target"

"parent/childTwo/target"


person clD    schedule 12.11.2014    source источник


Ответы (1)


Как насчет этого выражения XPath 2.0:

string-join(for $node in //node()[text() = 'true'] return string-join(for $ancestor in $node/ancestor-or-self::* return concat('/',local-name($ancestor)), ''), '&#10;')

Это вернет строки пути, разделенные символами новой строки. Если вам нужны отдельные узлы результатов для каждого пути, вы можете использовать

for $node in //node()[text() = 'true'] return string-join(for $ancestor in $node/ancestor-or-self::* return concat('/',local-name($ancestor)), '')

вместо.

Обратите внимание, что мне пришлось заменить target = 'true' на text() = 'true', чтобы включить теги на самом низком уровне.

Трюк с объединением строк частичного пути был вдохновлен этим ответом: Объединить значения нескольких узлов в xpath

person Marcus Rickert    schedule 12.11.2014