in

dom4j: XPath contiene (texto (), ‘alguna cadena’) no funciona cuando se usa con un nodo con más de un subnodo de texto

apple touch icon@2

El documento XML:

<Home>
    <Addr>
        <Street>ABC</Street>
        <Number>5</Number>
        <Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
    </Addr>
</Home>

La expresión XPath:

//*[contains(text(), 'ABC')]

//* coincide con cualquiera elemento descendiente de El nodo raíz. Es decir, cualquier elemento menos el nodo raíz.

[...] es un predicado, filtra el conjunto de nodos. Devuelve nodos para los que ... es true:

Un predicado filtra un conjunto de nodos […] para producir un nuevo conjunto de nodos. Para cada nodo del conjunto de nodos que se va a filtrar, se evalúa PredicateExpr […]; si PredicateExpr se evalúa como verdadero para ese nodo, el nodo se incluye en el nuevo conjunto de nodos; de lo contrario, no está incluido.

contains('haystack', 'needle') devoluciones true si haystack contiene needle:

Función: boolean contiene (cadena, cadena)

La función contiene devuelve verdadero si la primera cadena de argumento contiene la segunda cadena de argumento y, de lo contrario, devuelve falso.

Pero contains() toma una cadena como primer parámetro. Y ha pasado nodos. Para lidiar con eso, cada nodo o conjunto de nodos pasado como primer parámetro es convertido a una cuerda por el string() función:

Un argumento se convierte a tipo cadena como si llamara a la función cadena.

string() devuelve la función string-value de el primer nodo:

Un conjunto de nodos se convierte en una cadena devolviendo el valor de cadena del nodo en el conjunto de nodos que está primero en el orden del documento. Si el conjunto de nodos está vacío, se devuelve una cadena vacía.

string-value de un nodo de elemento:

El valor de cadena de un nodo de elemento es la concatenación de los valores de cadena de todos los nodos de texto descendientes del nodo de elemento en el orden del documento.

string-value de un nodo de texto:

El valor de cadena de un nodo de texto son los datos de carácter.

Así que básicamente string-value es todo el texto contenido en un nodo (concatenación de todos los nodos de texto descendientes).

text() es una prueba de nodo que coincide con cualquier nodo de texto:

El texto de prueba del nodo () es verdadero para cualquier nodo de texto. Por ejemplo, child :: text () seleccionará los hijos del nodo de texto del nodo de contexto.

Habiendo dicho eso, //*[contains(text(), 'ABC')] coincide con cualquier elemento (excepto el nodo raíz), cuyo primer nodo de texto contiene ABC. Ya que text() devuelve un conjunto de nodos que contiene todos los nodos de texto hijo del nodo de contexto (en relación con el cual se evalúa una expresión). Pero contains() toma solo el primero. Entonces, para el documento de arriba, la ruta coincide con el Street elemento.

La siguiente expresión //*[text()[contains(., 'ABC')]] coincide con cualquier elemento (excepto el nodo raíz), que tiene al menos un nodo de texto hijo, que contiene ABC. . representa el nodo de contexto. En este caso, es un nodo de texto hijo de cualquier elemento excepto el nodo raíz. Entonces, para el documento de arriba, la ruta coincide con el Street, y el Comment elementos.

Ahora entonces //*[contains(., 'ABC')] coincide con cualquier elemento (excepto el nodo raíz) que contiene ABC (en la concatenación de los nodos de texto descendientes). Para el documento de arriba, coincide con el Home, los Addr, los Street, y el Comment elementos. Como tal, //*[contains(., 'BLAH ABC')] coincide con el Home, los Addr, y el Comment elementos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

stability

Sistemas de control: estabilidad

gfg 200x200 min

comando passwd en Linux con ejemplos