xmllint выбирает узел, несмотря на то, что содержит () не должно совпадать - PullRequest
0 голосов
/ 30 октября 2019

У меня есть этот ввод CML:

<prova>
    <parent>
        <groupId>error</groupId>
    </parent>
    <groupId>ok</groupId>
</prova>

и этот XPath:

xmllint --xpath '/prova/parent/groupId/text()[contains(.,'ok')]'

, который не должен совпадать ни с чем, но соответствует error. Почему?

1 Ответ

1 голос
/ 30 октября 2019

Не используйте вложенные одинарные кавычки:

xmllint --xpath '/prova/parent/groupId/text()[contains(.,"ok")]' test.xml

результат

XPath set is empty

Объяснение:

Оболочка видит '/prova/parent/groupId/text()[contains(.,'ok')]'as

/prova/parent/groupId/text()[contains(.,ok)]

В этом XPath ok интерпретируется как имя элемента. Элемент <ok> не существует, поэтому он выбирает пустой набор узлов.

Ради contains() пустой набор узлов преобразуется в пустую строку. И любая строка содержит пустую строку, поэтому условие всегда выполняется.

...