XPath: выберите родительский элемент, только если дочерний элемент не содержит определенного значения
Учитывая это:
<element_1>
<element_2>Text</element_2>
<element_3>
<element_4>
<element_5>Text with @ in Value</element_5>
</element_4>
<element_4>
<element_5>Test Text</element_5>
</element_4>
</element_3>
<element_6>
<element_7>
<element_8>0</element_8>
...
Как выбрать все экземпляры element_1, которые не содержат "@" в элементе_5?
Ответы
Ответ 1
element_1[not(contains(element_3/element_4/element_5,'@'))]
Это интерпретируется как
element_1[ #select elements named "element_1"
not(contains( #that do not contain
element_3/element_4/element_5, #children in this hierarchy
'@' #the character @
))
]
Ответ 2
Мой XPath немного ржавый, но что-то вроде этого:
//element_1[.//element_5[not(contains(., "@"))]]
Ответ 3
Как выбрать все экземпляры element_1, которые не содержат '@' в элементе_5?
Использование
//element_1[not(.//element_5[contains(.,'@')])]
На английском языке это означает: выберите все "element_1"
элементы в документе, у которых нет потомка "element_5"
, строковое значение которого содержит строку '@'
.
Я использую аббревиатуру //
только потому, что структура XML файла не ясна.
Я всегда рекомендую избегать использования аббревиатуры //
всегда, когда это возможно, потому что иначе это может привести к очень неэффективной оценке XPath.
Ответ 4
element1[not(contains(.//element_5, '@'))]