Как выбрать узел, который содержит определенную подстроку в дочерних узлах? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть XML аналогичной структуры, содержащей много элементов:

<Items>
  <Item>
    <Name>Item name 1</Name>
    <Details>
      <Detail>ABC DEF</Detail>
      <Detail>GHI JKL</Detail>
    </Details>
  </Item>
  <Item>
    <Name>Item name 2</Name>
    <Details>
      <Detail>ABC DEF</Detail>
      <Detail>GHI MNO</Detail>
    </Details>
  </Item>
</Items>

Как получить список всех узлов Item, которые содержат подстроку "MNO" хотя бы в одном из их подузлов Detail?

Это выражение не возвращает ожидаемый элемент с описанием «Имя элемента 2»:

/Items/Item[contains(Details/Detail, 'MNO')]

Пожалуйста, сообщите. Спасибо заранее! Войтех

1 Ответ

4 голосов
/ 09 декабря 2011

Вот рабочий вариант:

/Items/Item[Details/Detail[contains(.,"MNO")]]

По сути, то, что произошло в вашем примере: Строка "MNO" была найдена для локализации только в первом Detail узле.Итак, если вы измените XML на:

<Items>
  <Item>
    <Name>Item name 1</Name>
    <Details>
      <Detail>ABC DEF</Detail>
      <Detail>GHI JKL</Detail>
    </Details>
  </Item>
  <Item>
    <Name>Item name 2</Name>
    <Details>
      <!-- Nodes order was changed -->
      <Detail>GHI MNO</Detail>
      <Detail>ABC DEF</Detail>
    </Details>
  </Item>
</Items>

, ваш XPath будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...