node example attribute and xml xslt xpath

xml - example - encontrar padre común usando Xpath



xpath xml (2)

Use la siguiente expresión XPath 1.0 :

$v1/ancestor::* [count(. | $v2/ancestor::*) = count($v2/ancestor::*) ] [1]

donde $ v1 y $ v2 contienen los dos nodos de texto (en caso de que use XPath no dentro de XSLT, deberá reemplazar $ v1 y $ v2 en la expresión anterior con las expresiones XPath que seleccionan cada uno de estos dos nodos de texto).

Explicación

La expresión XPath 1.0 anterior encuentra la intersección de dos conjuntos de nodos : el conjunto de nodos de todos los antecesores de elemento de $ v1 y el conjunto de nodos de todos los antecesores de elemento de $ v2. Esto se hace con el llamado método Kaysian para la intersección (después de Michael Kay, quien descubrió esto en 2000). Usando el método Kaysian para la intersección, la intersección de dos conjuntos de nodos, $ ns1 y $ ns2 se selecciona mediante la siguiente expresión XPath :

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

Luego, desde la intersección de los antepasados, debemos seleccionar el último elemento . Sin embargo, como estamos utilizando un eje inverso (ancestro), la posición del nodo requerida debe denotarse como 1 .

Uno puede verificar rápidamente que la expresión XPath anterior realmente selecciona el antecesor común más bajo , aplicando la siguiente transformación:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:variable name="v1" select="/*/*/a/b/text()"/> <xsl:variable name="v2" select="/*/*/c/d/text()"/> <xsl:variable name="vCommonAncestor" select= "$v1/ancestor::* [count(. | $v2/ancestor::*) = count($v2/ancestor::*) ] [1]" /> <xsl:template match="/"> <xsl:value-of select="name($vCommonAncestor)"/> </xsl:template> </xsl:stylesheet>

cuando se aplica en el documento XML proporcionado originalmente (corregido a XML bien formado):

<outer> <main> <a> <b>sometext</b> </a> <c> <d>sometext2</d> </c> </main> </outer>

el resultado deseado (el nombre del elemento que es el ancestro común más bajo de los dos nodos de texto) se produce :

principal

La expresión XPath 2.0 que selecciona el ancestro común más bajo de los dos nodos es más simple , porque utiliza el operador estándar XPath 2.0 "intersectar":

($v1/ancestor::* intersect $v2/ancestor::*) [last()]

Me preguntaba si había alguna forma de acceder al nodo padre común usando Xpath.

<outer> <main> <a><b> sometext </b></a> <c><d> sometext2 </d></c> </main> </outer>

Tengo los nodos de texto sometext y sometext2. ¿Hay alguna manera de acceder al principal (padre común) de estos dos nodos? No sé el diseño del xml que contiene estos nodos.

Cualquier ayuda es apreciada ..

Gracias RP


Esto parece complicado. Sólo inténtalo:

xquery version "3.0"; let $test := <outer> <main> <a><b> sometext </b></a> <c><d> sometext2 </d></c> </main> </outer> return ($test//*[.//b][.//d])[last()]

para obtener, es decir, el ancestro común más cercano