vistas transitorio tipos modelo estructura crear campos calculados python xpath

python - transitorio - tipos de campos odoo



Xpath para seleccionar solo hermanos directos con atributos coincidentes (3)

Tengo el siguiente documento de ejemplo:

<root> <p class="b">A</p> <p class="b">B</p> <p class="a">C</p> <p class="a">D</p> <p class="b">E</p> <x> <p class="b">F</p> </x> </root>

Estoy buscando una expresión xpath que seleccione todos los hermanos directos de un nodo dado con atributos de clase coincidentes, no cualquier hermano. En el ejemplo anterior, se deben seleccionar los primeros dos <p class="b"> AB; asimismo, los dos <p class="a"> CD, así como el quinto single <p class="b"> E ya que no tiene hermanos directos ; del mismo modo, el único <p class="b"> F dentro de <x> . Tenga en cuenta que en este contexto, B y C no son hermanos directos porque tienen un atributo de clase diferente valorado.

Lo que tengo es esto:

xml.xpath("//p") # This selects all six <p> elements. xml.xpath("//p[@class=''b'']") # This selects all four <p class="b"> elements. xml.xpath("//p/following-sibling::p[@class=''b'']") # This selects all <p class="b"> sibling elements, even though not direct siblings.

La última expresión también selecciona al quinto hermano, aunque hay hermanos que no coinciden entre ellos.

¿Cómo selecciono solo hermanos directos con el mismo valor de class ?

Editar Para aclarar: observe cómo los dos últimos son selecciones individuales, ¡no hermanos!

Editar He guardado un ejemplo aquí . Se supone que la expresión Xpath basada en /root/p[1] selecciona A, B, C, D


En lugar de following-sibling use lo following :

//p/following::p[@class=''b'']


Para obtener el siguiente hermano, puede agregar la posición - 1 significado al lado.

following-sibling::*[1]

Para garantizar que el próximo hermano sea de un tipo de nodo específico, puede agregar el siguiente filtro, donde p es el tipo de nodo que queremos emparejar.

[self::p]

Si solo desea los que tienen el mismo atributo, también deberá especificar el atributo en el primer elemento p.

Entonces, si solo desea elementos de clase bp inmediatamente después de un elemento de clase bp, puede hacer lo siguiente. Esto solo le daría el segundo elemento p.

//p[@class=''b'']/following-sibling::*[1][@class=''b''][self:p]

Parece que en realidad podría querer cualquier elemento clase b que sea adyacente a otro elemento clase b. En ese caso, puede verificar el siguiente y anterior hermano. Lo siguiente le daría los primeros 2 elementos p.

//p[@class=''b''][following-sibling::*[1][@class=''b''][self::p] or preceding-sibling::*[1][@class=''b''][self::p]]


Qué tal algo como esto:

//p[@class=''b'']/following-sibling::p[following-sibling::p[@class=''a''] and @class=''b'']

Devuelve todos los hermanos siguientes que son @class=''b'' y ellos mismos tienen hermanos siguientes con @class=''a'' . Aunque no funcionaría para el último <p> ya que no tiene hermanos siguientes.