XPath 2.0: ссылка на более ранний контекст в другой части выражения XPath

в XPath я хотел бы сосредоточиться на определенных элементах и ​​проанализировать их:

...
<field>aaa</field>
...
<field>bbb</field>
...
<field>aaa (1)</field>
...
<field>aaa (2)</field>
...
<field>ccc</field>
...
<field>ddd (7)</field>

Я хочу найти элементы, текстовое содержимое которых (помимо возможного перечисления, является уникальным. В приведенном выше примере это будут bbb, ccc и ddd.

Следующий XPath дает мне уникальные значения:

distinct-values(//field[matches(normalize-space(.), ' \([0-9]\)$')]/substring-before(., '(')))

Теперь я хотел бы расширить это и выполнить еще один XPath для всех отдельных значений, то есть подсчитать, сколько полей начинается с любого из них, и получить те, у которых счетчик больше 1.

Это может быть содержимое поля, равное этому конкретному значению, или оно начинается с этого значения и сопровождается знаком "(". Проблема в том, что во второй части этого XPath я бы сослался на контекст самой этой части и в то же время к первому контексту.

В следующем XPath я буду использовать вместо "." в качестве контекста используйте c_outer и c_inner:

distinct-values(//field[matches(normalize-space(.), ' \([0-9]\)$')]/substring-before(., '(')))[count(//field[(c_inner = c_outer) or starts-with(c_inner, concat(c_outer, ' ('))]) > 1]

Я не могу использовать "." для обоих по очевидным причинам. Но как я могу ссылаться на конкретное или текущее отличное значение из внешнего выражения во внутреннем выражении?

Возможно ли такое?


person Christian Kirchhoff    schedule 24.11.2011    source источник


Ответы (1)


XQuery может это сделать, например.

  for $s 
  in distinct-values(
    //field[matches(normalize-space(.), ' \([0-9]\)$')]/substring-before(., '(')))
  where count(//field[(. = $s) or starts-with(., concat($s, ' ('))]) > 1
  return $s
person Martin Honnen    schedule 24.11.2011
comment
Я не смотрел, как это тщательно пробовать, но я считаю, что вы можете сделать это с помощью XPath 2.0 с двумя последовательными циклами for, например: for $ s в различных значениях (// field [соответствует (normalize-space (.), ') \ ([0-9] \) $ ')] / substring-before (.,' (')), $ Y в // поле [(. = $ S) или начинается с (., Concat ($ s , '('))] return $ s [count ($ y) ›1] - person Vincent Biragnet; 27.11.2011