xPath: выберите родительский элемент, только если дочерний элемент не содержит определенного значения - PullRequest
12 голосов
/ 02 октября 2010

Учитывая это:

<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, которые не содержат '@' в element_5?

Ответы [ 4 ]

15 голосов
/ 02 октября 2010
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 @
  ))
]
7 голосов
/ 02 октября 2010

Мой XPath немного ржавый, но что-то вроде этого:

//element_1[.//element_5[not(contains(., "@"))]]
4 голосов
/ 02 октября 2010

Как выбрать все экземпляры element_1, которые не содержат '@' в element_5?

Используйте

//element_1[not(.//element_5[contains(.,'@')])]

На английском языке это означает : выбрать все элементы "element_1" в документе, у которых нет потомка "element_5", строковое значение которого содержит строку '@'.

Я использую сокращение // только потому, что структура файла XML не ясна.

Я всегда рекомендую избегать использования сокращения // всегда, когда это возможно, потому что в противном случае это может привести к очень неэффективной оценке XPath.

0 голосов
/ 02 октября 2010
element1[not(contains(.//element_5, '@'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...