XPath selecciona todos los elementos entre dos elementos específicos

Tengo un siguiente xml:

  

text

text

text

text

text

text

text

text

Quiero seleccionar todos los p nodos después del primer elemento divisor hasta la siguiente aparición del elemento divisor. Intenté con seguir xpath:

 //divider[1]/following-sibling::p[following::divider] 

pero el problema es que selecciona todos los elementos p antes del último elemento divisor. No estoy seguro de cómo hacerlo usando xpath 1.

El mismo concepto que bytebuster, pero un xpath diferente:

 /*/p[count(preceding-sibling::divider)=1] 

Aquí hay una expresión general de XPath :

 /*/divider[$k] /following-sibling::p [count(.|/*/divider[$k+1]/preceding-sibling::p) = count(/*/divider[$k+1]/preceding-sibling::p) ] 

Si sustituye $k por 1 entonces se seleccionan exactamente los p nodos deseados.

si sustituyes $k por 2 entonces todos los elementos p entre el 2 ° y 3 ° divider , …, etc.

Explicación

Esta es una aplicación simple de la fórmula Kayessian XPath 1.0 para la intersección de conjuntos de nodos:

 $ns1[count(.|$ns2) = count($ns2)] 

selecciona todos los nodos que pertenecen a los conjuntos de nodos $ns1 y $ns2 .

En este caso específico, sustituimos $ns1 por:

 /*/divider[$k]/following-sibling::p 

y sustituimos $ns2 con:

 /*/divider[$k+1]/preceding-sibling::p 

¿Qué hay de seleccionar todo p teniendo exactamente un divider elementos como preceding-sibling ?

 //doc/p[preceding-sibling::divider[1] and not (preceding-sibling::divider[2])] 

Creo que hay una solución mucho más simple y probablemente más rápida: quieres que todos los hermanos precedentes del segundo divisor que tienen al menos un divisor hermano anterior:

 /doc/divider[2]/preceding-sibling::p[preceding-sibling::divider] 

Se vuelve un poco más complejo, por supuesto, si quieres encontrar los parámetros entre el segundo y el tercer divisor: entonces quieres algo más parecido a la solución de Daniel Haley.