Как сделать выражения XPath более общими? - PullRequest
1 голос
/ 05 апреля 2011

У меня есть выражения xpath для дерева навигации, которое содержит несколько дочерних веток, которые можно добавить:

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[1]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-17']/a

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[2]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-58']/a

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[3]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-83']/a

Мне нужно сделать это общее утверждение, подобное приведенному ниже, но не в состоянии это сделать

//div[@role='treeitem']/a[text()='Situation']/ancestor::table//div[1]//a

Может ли кто-нибудь пролить свет?

Обновление по комментариям

Я вижу 3 дочерних узла [div [1] в первомвыражение, div [2] во втором выражении и div [3] в третьем выражении], поэтому вместо записи до div [100] я хочу указать его как div [% d], но я не могу это сделать

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Если значения атрибутов id однозначно идентифицируют элементы , то короткое выражение, которое точно выбирает все эти три элемента a:

//div[@id='gwt-uid-17' or @id='gwt-uid-58' or @id='gwt-uid-83']/a

Однако оценка сокращения // может быть очень неэффективной и не рекомендуется.

Единственное выражение XPath, которое выбирает эти три a элемента и будет более эффективным: :

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]
   /div/div[2]/div/div/div/div[3]/div/div[not(position() >3)]/div[1]
    /table/tbody/tr/td[2]
     /div[@id='gwt-uid-17' or @id='gwt-uid-58' or @id='gwt-uid-83']/a
0 голосов
/ 05 апреля 2011

Предполагая, что это действительный XHTML, и что id на самом деле является уникальным идентификатором, вам не нужна какая-либо иерархия выше указанных div s, и вы можете использовать выражения XPath, подобные этому:

//div[@id='gwt-uid-17']/a

В зависимости от языковой привязки вы также можете использовать переменные в выражениях XPath, поэтому можете использовать обобщенное выражение, например:

//div[@id='$theDivIWant']/a
0 голосов
/ 05 апреля 2011

Все, что вам нужно, - это кратчайшее выражение, однозначно определяющее нужные вам узлы.Например, выражение

//div[@id='gwt-uid-17']/a

эквивалентно первой строке выше, поскольку идентификаторы уникальны (предположительно).

Если вы хотите настроить таргетинг ссылок по ссылке «Ситуация», выможно попробовать

//a[text()='Situation']//table//a[1]

, но мне нужно посмотреть XML, чтобы узнать, правильно ли это.

...