Xpath Query для сопоставления ближайших узлов в последовательности - PullRequest
2 голосов
/ 22 апреля 2010

Я новичок в XPATH, и я хотел бы знать, есть ли хороший способ сделать это, используя запросы XPATH.

Я хочу сопоставить последовательные одноуровневые узлы в дереве XML с определенными предопределенными правилами, например, если есть три одноуровневых узла, встречающихся непосредственно один за другим, и они имеют атрибуты value = "A", value = "B"and value =" C ", я хочу, чтобы запрос XPATH соответствовал первому узлу / последнему узлу в такой последовательности, и я хочу извлечь всю такую ​​последовательную последовательность узлов из дерева XML, чтобы я мог обработать их позже.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Вот одно из возможных решений :

Во-первых:

Я хочу соответствовать последовательному брату узлы в дереве XML для определенных предопределенные правила, например, если есть три родственных узла встречаются сразу один за другим и у них есть атрибуты value = "A", значение = "B" и значение = "C",

//*[@value='A' 
  and 
   following-sibling::*[1]/@value='B' 
  and 
   following-sibling::*[2]/@value='C']

Тогда:

Я хочу извлечь все такие последовательные последовательность узлов из дерева XML ...

    //*[@value='A' 
      and 
       following-sibling::*[1]/@value='B' 
      and 
       following-sibling::*[2]/@value='C']
   |
    //*[@value='A' 
      and 
       following-sibling::*[1]/@value='B' 
      and 
       following-sibling::*[2]/@value='C']

      /following-sibling::*[position() = 1 or position()=2]

Вот как выглядит выбор в истинном XPathVisualizer (_ http://www.topxml.com/xpathvisualizer/ - эта ссылка имеет троянец - нажмите, только если у вас есть хорошая защита от вредоносных программ. Или свяжитесь со мной для приложения.):

альтернативный текст http://i42.tinypic.com/dxbtso.jpg

Наконец:

Я хочу, чтобы запрос XPATH соответствовал первый узел / последний узел в таком последовательность

    //*[@value='A' 
      and 
       following-sibling::*[1]/@value='B' 
      and 
       following-sibling::*[2]/@value='C']
   |
    //*[@value='A' 
      and 
       following-sibling::*[1]/@value='B' 
      and 
       following-sibling::*[2]/@value='C']

      /following-sibling::*[position()=2]
1 голос
/ 22 апреля 2010

Примечание: это не отвечает на вопрос. Я неправильно понял, когда писал это.

Чтобы запросить их, используйте position()=1 or position()=last() в качестве предиката, возможно, вместе с другими предикатами, которые вы используете для выбора узлов.

Вот как это выглядит в XpathVisualizer :

альтернативный текст http://i40.tinypic.com/2ir15j4.jpg

«Извлечение их» не имеет значения для xpath. Для этого вы можете перечислить выбранные элементы, а затем делать все, что вам нравится, решать только вам.

...