contains
- это строковая функция, которая проверяет, содержит ли первая строка вторую строку (или, если хотите, если вторая строка является подстрокой первой).Если аргументом строковой функции является узел (например, Name
), он получит строковое значение этого узла для использования.Он не используется для проверки, содержит ли узел определенный дочерний узел.
Итак, Name[contains(.,abc)]
говорит: «Содержит ли строковое значение элемента Name
строковое значение дочернего элемента abc
? "
Это странная вещь, потому что она всегда будет верна для всех Name
элементов.Строковое значение узла включает в себя текст всех потомков.И если бы не было дочернего элемента abc
, строковое значение было бы пустой строкой, и поэтому выражение все равно было бы истинным.
Например, если узел был <Name>1<abc>2</abc></Name>
строковое значение Name
будет "12", что, очевидно, содержит строковое значение abc
, которое равно "2".
С другой стороны, Name[abc]
получает элемент Name
, если дочерний элемент abc
существует независимо от значения строки.Таким образом, оно будет соответствовать <Name><abc /></Name>
, но не <Name/>
.
(возможно, первое выражение должно быть Name[contains(.,'abc')]
, в этом случае оно будет соответствовать Name
элементам, содержащим строку «abc».Таким образом, это будет соответствовать <Name>abcdef</Name>
, но не <Name>cdefgh</Name>
)