Как узнать, есть ли подстрока с XPath 1.0

У меня возникли проблемы с поиском вхождения определенной подстроки в XPATH 1.0. Это выражение будет использоваться в инструменте проверки кода SonarQube для установки ограничений.

Это выражение, которое у меня есть в настоящее время в XPATH 3.0, и я провел некоторое исследование, чтобы найти преобразование, но кажется, что синтаксис этого выражения правильный в XPATH 3.0, как и в 1.0. Я что-то упускаю из виду или просто дезинформировал

//*[contains(.,'@example.com')]

Насколько я понимаю, здесь используется функция contains(), встроенная в XPATH 1.0, для поиска любого пути /descendant-or-self::node()/ до того, как он содержит атрибут example.com.


person Nickadiemus    schedule 09.07.2018    source источник
comment
Можете ли вы поделиться образцом HTML вместе с текущими и желаемыми результатами?   -  person Andersson    schedule 09.07.2018
comment
@Andersson Andersson, поэтому я пытаюсь на самом деле проанализировать XML-файл, но вот какой гипотетический XML-файл нужно проанализировать, и желаемый результат должен возвращать true, если найдена подстрока <root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org"> <employees> <employee id="1"> <name>Johnny Dape</name> <email email = "[email protected]" /></employee> </employees></root> Я хочу, чтобы он поймал это жестко закодированное электронное письмо.   -  person Nickadiemus    schedule 09.07.2018


Ответы (1)


//*[contains(.,'@example.com')] означает "найти узел любого типа с текстовым содержимым, который содержит подстроку '@example.com'". Если вы хотите "найти узел с атрибутом, который содержит '@example.com' в своем значении", вам нужно:

  • в любом атрибуте:

    //*[contains(@*, "@example.com")]
    
  • в атрибуте специфический:

    //*[contains(@email, "@example.com")]
    

Если вы хотите получить значение требуемого @attribute:

//*[contains(@email, "@example.com")]/@email
person Andersson    schedule 09.07.2018
comment
Спасибо! Это сработало отлично. Очень информативный ответ! - person Nickadiemus; 09.07.2018