xpath
  • predicate
  • 2011-02-10 17 views 6 likes 
    6

    Ho una raccolta di elementi div che hanno la classe media-gallery-item.
    Vorrei selezionare il numero di elemento x.Combina predicato XPATH con posizione

    quando appena selezionando tutte le voci, ottengo 5 risultati

    $x("//div[@id='content-area']//div[@class='media-gallery-item']") 
    

    ora voglio essere in grado di selezionare la voce numero 2, ma io non riesco a capire come combinare i due correttamente:

    $x("//div[@id='content-area']//div[@class='media-gallery-item'][2]") 
    
    $x("//div[@id='content-area']//div[@class='media-gallery-item' 
                and position() = 2]") 
    

    So che questi non hanno molto senso poiché non è un vero AND, ma più simile: "filtra in base a questo prima, quindi seleziona la seconda corrispondenza". L'obiettivo di questo è quello di continuare a selezionare le cose (per esempio nel secondo elemento, mi ottenere l'attributo href dell'elemento a)

    +0

    solo il primo duplicato trovato [Come faccio a selezionare gli ultimi N elementi con XPath?] (Http://stackoverflow.com/questions/458596/how-do-i-select-the- last-n-elements-with-xpath) –

    +0

    Questo non è un duplicato. Voglio una posizione specifica e combinarla con un altro predicato. L'altro post vuole gli ultimi n elementi (nessun altro predicato, non la posizione esatta) –

    risposta

    10

    risposta Step-by-step.

    Per selezionare elementi con div[@id='content-area'] antenato, che sono le seconde bambino dei rispettivi genitori usano:

    //div[@id='content-area']//div[2] 
    

    Per selezionare secondo (nell'ordine del documento) div elemento con uso div[@id='content-area'] antenato:

    (//div[@id='content-area']//div)[2] 
    

    Annotare la differenza.

    Quindi, per selezionare gli elementi, che sono seconde bambino dei rispettivi genitori, a condizione che hanno una classe 'media-gallery-item' uso:

    //div[@id='content-area']//div[2][@class='media-gallery-item'] 
    

    per selezionare gli elementi, che sono il secondo da tali childs (dei rispettivi genitori) che hanno una classe media-gallery-item:

    //div[@id='content-area']//div[@class='media-gallery-item'][2] 
    

    Per selezionare secondo (nell'ordine del documento) div elemento con un div[@id='content-area'] antenato, purché abbia media-gallery-item classe:

    (//div[@id='content-area']//div)[2][@class='media-gallery-item'] 
    

    Per selezionare secondo (nell'ordine del documento) da tutto div elemento con un div[@id='content-area'] antenato e una classe media-gallery-item:

    (//div[@id='content-area']//div)[@class='media-gallery-item'][2] 
    

    Spec cita come suggerito da @Alejandro:

    Un predicato filtra un set di nodi con rispetto a un asse per produrre un nuovo insieme di nodi.Per ogni nodo nel nodo-set da filtrare, il PredicateExpr viene valutata con quella nodo come nodo di contesto, con il numero di nodi nel nodo-impostato come dimensione contesto , e con la posizione di prossimità del nodo nel set di nodi rispetto all'asse come posizione contesto

    http://w3.org/TR/xpath/#predicates

    la posizione vicinanza di un membro di un set di nodi rispetto ad un asse è definito come la posizione del nodo nel set di nodi ordinato nel documento ordine se l'asse è un asse avanti e ordinato nell'ordine inverso del documento se l'asse è un asse inverso

    http://w3.org/TR/xpath/#dt-proximity-position

    linea di fondo è che il predicato posizione funziona rispetto all'asse. E hai bisogno di una parentesi per dichiarare esplicitamente la priorità. Quindi non l'asse child, ma il set di nodi dopo la risoluzione dell'asse descendant-or-self sarà considerato, quando si calcola la posizione.

    +0

    Buona risposta, +1 –

    +1

    @ Alejandro, citazioni familiari ora :) Le aggiungerò alla risposta. – Flack

    +0

    Ora è una risposta completa! –

    0

    Risulta: la parentesi!

    (//div[@id='content-area']//div[@class='media-gallery-item'])[2] 
    

    funziona

    +0

    Puoi anche controllare la mia risposta per un'analisi completa. – Flack

    0

    Sembra che gli attributi di accesso siano nel modo sbagliato. Prova ad utilizzare

    /div[@id='content-area' and @class='media-gallery-item'][2] 
    
    Problemi correlati