8
Actualmente estoy tratando el siguiente XPathcómo hacer funcionar la función xpath de normalize-space()?
//tr[normalize-space(td/text())='User Name']
para obtener toda la tr que contiene un TD que contiene 'User Name'
o 'User Name'
o ' User Name '
pero no su trabajo y no sé lo que está mal con la consulta :(
los datos que quiero encontrar es el siguiente formato
<tr><td>User Name</td></tr>
<tr><td>User Name</td></tr>
<tr><td> User Name </td></tr>
Entonces, ¿cuál es el formato adecuado para escribir esta consulta XPath?
Editar: que no parezca funcionar si los datos están en el formato siguiente
<tr><td>x</td><td>User Name</td></tr>
<tr><td>x</td><td>y</td><td>User Name</td></tr>
<tr><td>x</td><td>y</td><td>z</td><td> User Name </td></tr>
por lo que ahora ¿Cómo puedo escribir la consulta XPath?
nota: "// tr [normalize-space (td/text()) = 'Nombre de usuario']" no funcionará
pero "// tr/td [normalize-space (text()) = 'Nombre de usuario ']" funcionará (pero quiero conseguir el TR y no el elemento td)
Por favor, muestre una muestra de sus datos de entrada, comenzando con '
@Pavel Minaev: Hecho :) – Karim
Todo se ve bien a primera vista. Sospecho que el problema no está en la consulta, sino en cómo usar los resultados. ¿Puede mostrar la consulta en contexto? Si es XSLT, el código XSLT que lo llama y usa los resultados, si es código C# directamente, entonces ese código. –
Respuesta
Ahora que ha editado la pregunta, tiene sentido. Vamos a considerar esta entrada:
y la consulta que no trabaja:
Ahora,
td/text()
significa "seleccionar todos los nodos de texto niño de todos los niñostd
nodos del nodo actual". En este caso, esto producirá un conjunto de nodos que consta de dos nodos de texto,x
yUser Name
.Ahora llama al
normalize-space()
en ese conjunto de nodos. El tipo del único argumento denormalize-space()
esstring?
. Desde un conjunto de nodos no es una cadena, las conversiones patada en, por section 3.2 de XPath 1.0 recomendación:Ahora vamos a ver el definition de cadena() en la sección 4.2:
En nuestro ejemplo, el primer nodo "en el orden del documento" es el nodo de texto
x
, por lo que es el que se utilizará; el segundo nodo es ignorado Por lo tanto, terminas llamando alnormalize-space('x')
. Naturalmente, esto no se comparará con 'Nombre de usuario'.Para realizar este trabajo, el uso:Esto puede ser transcrito como "seleccionar todos
tr
nodos que tienen niñostd
nodos, el primer nodo hijotext()
de los cuales tiene un valor de cadena normalizada deUser Name
" - que es lo que querer. Por otra parte, se puede simplificar esto a:Desde un no-argumento
normalize-space()
se aplicará al nodo actual (que serátd
), y procesar todos los nodos de texto dentro.Fuente
2009-12-01 22:35:33
Esto funciona bien aquí:
¿puede usted por favor, actualice su pregunta con una muestra XML real?
Fuente
2009-12-01 22:07:34
el archivo actual es grande, por lo que no es posible subirlo. pero la muestra es como la que tienes, pero no funciona para mí – Karim
no necesitas cargar todo el archivo, solo una pequeña pieza donde tienes problemas –
, así que descubrí cuál era el problema y actualicé mi muestra – Karim
Cuestiones relacionadas