2009-12-28 23 views
7
<html> 
    <body> 
     <table> 
      <tr> 
       <th>HeaderA</th> 
       <th>HeaderB</th> 
       <th>HeaderC</th> 
       <th>HeaderD</th> 
      </tr> 
      <tr> 
       <td>ContentA</td> 
       <td>ContentB</td> 
       <td>ContentC</td> 
       <td>ContentD</td> 
      </tr> 
     </table> 
    </body> 
</html> 

Busco la forma más eficiente para seleccionar el contenido ' td' nodo basado en el epígrafe de las fichas ' XX' nodo ..xRuta/HTML: Elija un nodo basado en el nodo relacionado

Mi expresión xPath actual ..

/html/body/table/tr/td[count(/html/body/table/tr/th[text() = 'HeaderA']/preceding-sibling::*)+1] 

Algunas preguntas ..

  • Se puede utilizar rutas relativas (../..) dentro count()?
  • ¿Qué otras opciones, para encontrar el número de nodo actual es td[?] o count(/preceding-sibling::*)+1 el más eficiente?

Respuesta

3
  • Es posible utilizar rutas relativas en el interior count()
  • nunca he oído hablar de otra forma de encontrar el número de nodo ...

Este es el código con relación a XPath código dentro de recuento()

/html/body/table/tr/td[count(../../tr/th[text()='HeaderC']/preceding-sibling::*)+1] 

Pero bueno, no es mucho más corto ... no va a ser más corto que esto en mi opinión:

//td[count(../..//th[text()='HeaderC']/preceding-sibling::*)+1] 
+0

No estoy tanto buscando la forma más corta de escribir la expresión ... pero la más eficiente, para minimizar las búsquedas internas ... – chameleon95

1

Hubiera dejado a Xpath a un lado ... ya que supongo que fue DOM analizado, utilizaría una estructura de datos de mapa y uniría los nodos en el lado del cliente o del servidor (JavaScript/Java) manualmente.

Me parece que está siendo XPath streatched más allá de su límite aquí.

+0

Todavía pienso que XPath no es la mejor solución aquí, la votación no cambiará mi opinión ... o los hechos ... –

+0

Entiendo y aprecio su comentario ... Lo que estoy buscando es el método más eficiente utilizando xRuta .. a continuación, puedo realizar los puntos de referencia del mundo real en mi entorno utilizando todas las opciones disponibles (xRuta, java, JavaScript, etc ..) para establecerse en una solución final .. Gracias por su comentario .. Excelente .. – chameleon95

0

Tal vez usted quiere posición() y ejes de XPath?

2

respuesta de Harmen es exactamente lo que necesita para una solución XPATH puro.

Si usted es realmente preocupados con el rendimiento, entonces se podría definir un XSLT key:

<xsl:key name="columns" match="/html/body/table/tr/th" use="text()"/> 

y luego utiliza la clave en el filtro de predicado:

/html/body/table/tr/td[count(key('columns', 'HeaderC')/preceding-sibling::th)+1] 

Sin embargo , Sospecho que probablemente no podrá ver una diferencia medible en el rendimiento a menos que necesite filt er en columnas mucho (p. for-each bucles con verificaciones para cada fila para un documento realmente grande).

Cuestiones relacionadas