Как сделать один RxPath из двух - PullRequest
1 голос
/ 05 февраля 2011

У меня есть те два RxPath, которые мне нужно записать в одном выражении:

/td[2]/a[1]/tag[1]

и

/td[2]/a[1]

Так что в основном мне нужно выбрать путь с элементом 'tag', еслисуществует, если нет, то, чтобы выбрать элемент «а».что-то вроде:

if exist /td[2]/a[1]/tag[1] select /td[2]/a[1]/tag[1]
else select /td[2]/a[1]

Эти элементы должны иметь атрибут innertext с некоторым значением в них, поэтому я попытался:

/td[2]/descendant::node()[@innertext!='']

, но это не сработает ...

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

Мне удалось решить это с помощью регулярного выражения в конце моего выражения Xpath.

/dom/body/div[@id='isc_0']/div/div[@id='isc_B']/div[@id='isc_C']/div[@id='isc_10']/div/div/iframe/body/table/tbody/tr/td[1]/a[@innertext='any uri item']/../../td[2]/*[@innertext~'[^ ]+']

Извините за недопонимание с проблемой ...

С уважением,

Вайда Владимир

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

Помимо всех этих хороших советов от @Dimitre, я хочу добавить, что родитель всегда будет предшествовать (в порядке документа), чем ребенок, поэтому вы можете использовать это выражение XPath:

(/real-path-from-root/td[2]/a[1] 
 | 
 /real-path-from-root/td[2]/a[1]/tag[1])[last()]

Вы могли бы сделать это без | оператора объединения в XPath 1.0, но в итоге это будет очень нечитаемо ... Конечно, в XPath 2.0 вы могли бы просто сделать:

(/real-path-from-root/td[2]/a[1]/(.|tag[1]))[last()]
0 голосов
/ 05 февраля 2011

Таким образом, в основном мне нужно выбрать путь с элементом 'tag', если существует, если нет, чтобы выбрать элемент 'a'.что-то вроде:

если существует

  /td[2]/a[1]/tag[1] 

выберите

 /td[2]/a[1]/tag[1] 

еще выберите

  /td[2]/a[1] 

Я очень сомневаюсь, что верхним элементом документа является td. Не используйте /td - это означает, что вы хотите выбрать верхний элемент документа, и этот верхний элемент должен быть td.

Кроме того, /td[2] никогда ничего не выбирает, потому что (хорошо сформированный) документ XML содержит ровно один верхний элемент.

Использование :

  someParentElement/td[2]/a[1]/tag[1] 
| 
  someParentElement/td[2]/a[1][not(someParentElement/td[2]/a[1]/tag[1])]

Эти элементы должны иметь атрибут innertext с некоторым значением в них

Использовать :

  someParentElement/td[2][.//@innertext[normalize-space()]]/a[1]/tag[1] 
| 
  someParentElement/td[2]
              [.//@innertext[normalize-space()]]/a[1]
                  [not(someParentElement/td[2]
                       [.//@innertext[normalize-space()]]/a[1]/tag[1])]

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

Это не ясно.Пожалуйста, уточните.

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

//*[not(*)]

Выбранные элементы не имеют дочерних элементов, но могут иметь другие дочерние элементы (например, текстовые узлы, PI, комментарии) и атрибуты.

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