¿Cómo encontraría todos los nodos entre dos H3 usando XPATH?¿Cómo encontraría todos los nodos entre dos H3 usando XPATH?
Respuesta
En XPath 1.0 Una forma de hacer esto es mediante el uso del método Kayessian para intersección conjunto de nodos:
$ns1[count(.|$ns2) = count($ns2)]
La expresión anterior selecciona exactamente los nodos que son parte tanto del conjunto de nodos $ns1
y el conjunto de nodos $ns2
.
Para aplicar esto a la pregunta específica - digamos que tenemos que seleccionar todos los nodos entre el 2 y 3 h3
elemento en el siguiente documento XML:
<html>
<h3>Title T31</h3>
<a31/>
<b31/>
<h3>Title T32</h3>
<a32/>
<b32/>
<h3>Title T33</h3>
<a33/>
<b33/>
<h3>Title T34</h3>
<a34/>
<b34/>
<h3>Title T35</h3>
</html>
Tenemos que sustituir $ns1
con:
/*/h3[2]/following-sibling::node()
y sustituir con $ns2
:
/*/h3[3]/preceding-sibling::node()
Por lo tanto, la expresión XPath completa es:
/*/h3[2]/following-sibling::node()
[count(.|/*/h3[3]/preceding-sibling::node())
=
count(/*/h3[3]/preceding-sibling::node())
]
Podemos comprobar que se trata de la expresión XPath correcta:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/h3[2]/following-sibling::node()
[count(.|/*/h3[3]/preceding-sibling::node())
=
count(/*/h3[3]/preceding-sibling::node())
]
"/>
</xsl:template>
</xsl:stylesheet>
Cuando esta transformación se aplica en el documento XML presentado anteriormente, el wante d, resultado correcto se produce:
<a32/>
<b32/>
II. XPath solución 2,0:
Utilice el intersect
operador:
/*/h3[2]/following-sibling::node()
intersect
/*/h3[3]/preceding-sibling::node()
Una solución más general - en XPath 2.0 - asumiendo que usted quiere nodos en todas las profundidades de árboles entre los dos elementos h3, que no necesariamente ser hermanos.
/path/to/first/h3/following::node()[. << /path/to/second/h3]
otra solución XPath 1.0 cuando se sabe ambas marcas son el mismo elemento (este caso h3
):
/html/body/h3[2]/following-sibling::node()
[not(self::h3)]
[count(preceding-sibling::h3)=2]
@ user3457812 ¡Gracias! ¡Esto funciona para mí! –
Basado en dimitre-novatchev excelente respuesta que puede hasta con la solución de seguimiento que en lugar de codificar [ 2] y [3] para los diferentes H3s solo le doy el contenido del encabezado del primer elemento.
//h3[text()="Main Page Section Heading"]/following-sibling::node()
[ count(.|//h3[text()="Main Page Section Heading"]/following-sibling::h3[1]/preceding-sibling::node()) =
count(//h3[text()="Main Page Section Heading"]/following-sibling::h3[1]/preceding-sibling::node()) ]
donde me quiero ir más lejos sin embargo es ser capaz de hacer frente a la situación cuando estoy buscando en el último H3, y tener todo después de que, en el caso anterior no puedo conseguir lo que sigue al último H3.
Hay otra gran solución genérica utilizando llaves, suponiendo que sus <h3>
etiquetas tienen una propiedad única (por ejemplo, su texto o un atributo id
):
<xsl:key name="siblings_of_h3" match="*[not(self::h3)]" use="preceding-sibling::h3[1]/text()"/>
<xsl:template match="h3">
<!-- now select all tags belonging to the current h3 -->
<xsl:apply-templates select="key('siblings_of_h3', text())"/>
</xsl:template>
Agrupa todos los tags por su anterior <h3>
- 1. Seleccionar hermanos entre dos nodos usando XPath
- 2. XPath seleccionar todos los elementos entre dos elementos específicos
- 3. Ruta entre dos nodos
- 4. Selección de todos los demás nodos XPath uing
- 5. XPATH: seleccione todos los nodos secundarios con un atributo específico
- 6. ¿Cómo seleccionar todos los nodos de hoja usando la expresión XPath?
- 7. Usando XPath con sencillo en el nodo devuelve elementos en todos los nodos
- 8. ¿Cómo puedo encontrar todos los nodos de texto entre los nodos de elementos con Javascript/JQuery?
- 9. Sum String-Length de dos nodos diferentes con Xpath - Suma dos nodos string-length
- 10. Cómo seleccionar nodos que tiene X como descendiente usando XPath
- 11. ¿Cómo expandir automáticamente todos los nodos TTreeView?
- 12. Dos condiciones usando OR en XPATH
- 13. Uso BeautifulSoup para extraer nodos hermanos entre dos nodos
- 14. ¿Es posible aplicar normalize-space a todos los nodos que encuentra la expresión XPath?
- 15. ¿Cómo puedo eliminar todos los elementos que coincidan con xpath en python usando lxml?
- 16. cómo obtener todos los productos entre dos fechas?
- 17. Seleccionar nodos con casos ignorantes de XPath
- 18. XPath: obtener los nodos que no tienen un antepasado X
- 19. ¿Cómo seleccionar nodos con XPath en C#?
- 20. Cómo hacer coincidir un nodo de texto y luego seguir los nodos principales usando XPath
- 21. Xpath para seleccionar solo los nodos donde existen elementos secundarios?
- 22. Mostrar todos los nodos y las relaciones
- 23. mongo DB - Todos los nodos secundarios
- 24. XPath para obtener todos los nodos secundarios (elementos, comentarios y texto) sin padre
- 25. Expresión de XPath para seleccionar todos los nodos secundarios XML excepto una lista específica?
- 26. ¿Cuál es el XPath correcto para "todos los nodos exactamente uno debajo del nodo base?"
- 27. expresión XPath para seleccionar todos los nodos con un atributo común
- 28. Eliminar todos los nodos en jsTree
- 29. NSOutlineView - Expandir automáticamente todos los nodos
- 30. Ruta no cíclica a todos los nodos
+ 1 puede que el derecho siempre prevalezca. :-) – LarsH
+1 para la solución más general y la invocación de la teoría de conjuntos –
cosas agradables. funcionó línea un encanto – klumsy