XPath Query using содержит несколько значений - PullRequest
1 голос
/ 04 февраля 2010

Мне нужен XPath, который выберет все родительские узлы дочерним элементом с атрибутом, который содержит хотя бы одно из списка значений.

Пример XML

<mynodes>
  <theParentNode>
    <theChildNode name="one two" />
  </theParentNode>
    <theParentNode>
    <theChildNode name="one all" />
  </theParentNode>
    <theParentNode>
    <theChildNode name="two" />
  </theParentNode>
    <theParentNode>
    <theChildNode name="all" />
  </theParentNode>
</mynodes>

Я хочу выбрать всеузлы, где имя содержит «один» ИЛИ «все» (или любую другую комбинацию в этом отношении).Таким образом, возвращаемый nodeList:

<theParentNode>
  <theChildNode name="one two" />
</theParentNode>
<theParentNode>
  <theChildNode name="one all" />
</theParentNode>
<theParentNode>
  <theChildNode name="all" />
</theParentNode>

Пока мой запрос выглядит следующим образом (обратите внимание, я не использую схему):

//theChildNode[contains(tokenize(@name, '\s'), "one")]

Что получитмне все элементы вендора, содержащие "один" в их атрибуте имени.Но я не уверен, как лучше указать несколько значений вместо «одного», а затем лучший способ вернуться к theParentNode.Я всегда мог бы сделать все это в php, но id, если это возможно, просто сделать это с XPath.

Ответы [ 3 ]

4 голосов
/ 04 февраля 2010

Немного избыточно, но для этого следует:

//theChildNode[contains(tokenize(@name, '\s'), "one") or contains(tokenize(@name, '\s'), "all")]
1 голос
/ 04 февраля 2010

В настоящее время у меня нет доступной среды тестирования XML, но вы можете воспользоваться этой возможностью:

//theChildNode[intersect(tokenize(@name, '\s+'),('one','all'))]
1 голос
/ 04 февраля 2010

Не уверен в получении нескольких значений атрибута, но измените ваш селектор на

// theParentNode [theChildNode]

, чтобы получить всех родителей с дочерним узлом.

//theParentNode[theChildNode[contains....]]

Не нужно повышать уровень, выбирайте только родителей, у которых есть ребенок.

...