2010-05-08 18 views
6

Il mio codice HTML è:XPATH Query: come ottenere due elementi?

<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> 

La mia domanda è:

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

Il risultato è:

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

Il risultato è corretta! ma, se voglio ottenere esempio:

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

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

Così

[3]/p e [4]/p

Come ottenere questi due elementi ciascuna <tr>?

Grazie mille!

+0

qualcosa lungo le linee di [position()] potrebbe essere utile –

+0

buona domanda (+1) . Vedi la mia risposta che corregge il tuo XML e discute due soluzioni corrette e perché una terza espressione XPath proposta è sbagliata. –

risposta

6

Penso che quello che si potrebbe essere alla ricerca di qualcosa sulla falsariga di

[position() > 2] 

che recupera tutti gli elementi dopo i primi due.

+0

Perfetto! Grazie. Posso usare? [posizione() = 1] [posizione() = 4] se voglio ottenere solo il primo e l'elemento fouth? – Damiano

+2

@Damiano - Se si valutano separatamente questi due filtri di predicato, si otterranno le informazioni desiderate. Se vuoi valutarli in una singola espressione XPATH, dovrai combinarli in un singolo filtro del predicato e usare l'operatore 'or':' [position() = 1 o position() = 4] 'Altrimenti, valuterà per vedere se entrambi i filtri dei predicati sono veri (e nessun elemento sarà sia il 1 ° che il 4 °). –

4

Prima nota che l'XML fornito non è ben formato!

Suppongo che destinato XML wellformed più o meno simile a questo:

<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> 

Per questo documento XML qui sono le mie risposte.

Uso:

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

In alternativa, è possibile utilizzare l'operatore XPath unione:

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

Quello che segue è sbagliato:

0.123.

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

Questa specifica la selezione del 4 nodo /*/*/td[3] e selezionerà nulla perché /*/*/td[3] seleziona solo due nodi.

Infine, qui è una trasformazione che, quando corsa dimostra il risultato di tutte le espressioni XPath sopra:

<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> 
Problemi correlati