2010-05-08 13 views
6

Mi código HTML es:XPATH Query: ¿Cómo obtener dos elementos?

<table> 
<tr> 
<td class="data1"><p>1</td></td> 
<td class="data1"><p>2</td></td> 
<td class="data1"><p>3</td></td> 
<td class="data1"><p>4</td></td> 
</tr> 
<tr> 
<td class="data1"><p>5</td></td> 
<td class="data1"><p>6</td></td> 
<td class="data1"><p>7</td></td> 
<td class="data1"><p>8</td></td> 
</tr> 
</table> 

Mi consulta es:

xpath='//tr//td[@class="data1"][4]/p' 

El resultado es:

<p>4</p> 
<p>8</p> 

El resultado es correcta! pero, si quiero obtener ejemplo:

<p>3</p> <p>4</p> 

<p>7</p> <p>8</p> 

Así

[3]/p y [4]/p

¿Cómo conseguir estos dos elementos, cada uno <tr>?

¡Muchas gracias!

+0

algo en la línea de [position()] podría ser útil –

+0

buena pregunta (1) . Vea mi respuesta que corrige su XML y analiza dos soluciones correctas y por qué una tercera expresión propuesta de XPath es incorrecta. –

Respuesta

6

Creo que lo que podría estar buscando algo en la línea de

[position() > 2] 

que recupera todos los elementos después de los dos primeros.

+0

¡Perfecto! Gracias. ¿Podría usar? [position() = 1] [position() = 4] si quiero obtener solo el primero y el último elemento? – Damiano

+2

@Damiano: si evalúa esos dos filtros de predicados por separado, obtendrá la información que desea. Si quiere evaluarlos en una sola expresión XPATH, necesitará combinarlos en un único filtro de predicados y usar el operador 'o':' [position() = 1 o position() = 4] 'De lo contrario, evaluará para ver si ambos filtros de predicados son verdaderos (y ningún elemento será tanto el primero como el cuarto). –

4

Primero tenga en cuenta que el XML proporcionado no está bien formado.

Asumo que la intención XML bien formada más o menos el siguiente aspecto:

<table> 
    <tr> 
     <td class="data1"><p>1</p></td> 
     <td class="data1"><p>2</p></td> 
     <td class="data1"><p>3</p></td> 
     <td class="data1"><p>4</p></td> 
    </tr> 
    <tr> 
     <td class="data1"><p>5</p></td> 
     <td class="data1"><p>6</p></td> 
     <td class="data1"><p>7</p></td> 
     <td class="data1"><p>8</p></td> 
    </tr> 
</table> 

Para este documento XML que aquí están mis respuestas.

Uso:

/*/*/td[position() = 3 or position() = 4]/p

O bien, puede utilizar el operador de unión XPath:

/*/*/td[3]/p | /*/*/td[4]/p

El siguiente es incorrecto:

/*/*/td[3] [4]/p

Esto especifica la selección de cuarto nodo de /*/*/td[3] y seleccionará nada porque sólo se selecciona /*/*/td[3] dos nodos.

Por último, aquí hay una transformación que cuando es ejecutado muestra el resultado de todas las expresiones XPath por encima de:

<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=" /*/*/td[position() = 3 or position() = 4]/p"/> 

    ---------------------- 

    <xsl:copy-of select=" /*/*/td[3]/p | /*/*/td[4]/p"/> 

    ---------------------- 

    <xsl:copy-of select=" /*/*/td[3][4]/p"/> 

</xsl:template> 
</xsl:stylesheet> 
Cuestiones relacionadas