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

    Mam kolekcję elementów div, które mają klasę media-gallery-item.
    Chciałbym wybrać numer elementu x.Połącz predykat XPATH z pozycją

    Po prostu wybierając wszystkie elementy, mam 5 wyników

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

    Teraz chcę móc wybrać numer pozycji 2, ale nie mogę dowiedzieć się, jak połączyć dwa odpowiednio:

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

    Wiem, że to nie ma większego sensu, ponieważ nie jest to rzeczywiste AND, ale bardziej przypomina: "filtruj według tego pierwszego, a następnie wybierz drugie dopasowanie". Celem jest to, aby utrzymać się na wyborze rzeczy (na przykład w drugim elemencie, daj mi atrybut elementu ahref)

    +0

    tylko pierwszy duplikat znaleźć [Jak wybrać ostatnich N elementów z XPath?] (Http://stackoverflow.com/questions/458596/how-do-i-select-the- last-n-elements-with-xpath) –

    +0

    To nie jest duplikat. Chcę określonej pozycji i połączyć ją z innym predykatem. Drugi post chce ostatnich n pozycji (nie ma innego predykatu, nie jest to dokładna pozycja). –

    Odpowiedz

    10

    Krok po kroku odpowiedź.

    Aby wybrać elementy z div[@id='content-area'] przodka, które są drugim Childs z ich rodzicami użyć:

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

    Aby wybrać drugi (w kolejności dokumentu) div element z użytku div[@id='content-area'] przodka:

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

    Zanotuj różnicę.

    Następnie, aby wybrać elementy, które stanowią drugi Childs z ich rodzicami, pod warunkiem, że posiadają klasę „media-galeria-pozycji” zastosowanie:

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

    Aby wybrać elementy, które są drugim z te dzieciaki (z ich rodzicami), które mają klasę media-gallery-item:

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

    Aby wybrać drugi (w kolejności dokumentu) div element z div[@id='content-area'] przodka, pod warunkiem że ma media-gallery-item klasa:

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

    Aby wybrać drugi (w kolejności dokumentu) ze wszystkich div elementu z div[@id='content-area'] przodka i klasy media-gallery-item:

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

    Spec cytuje jak sugeruje @Alejandro:

    Predykat filtruje zestaw węzłów o wartości względem osi w celu wygenerowania nowego Zestaw węzłów.Dla każdego węzła w zestaw węzłów być filtrowany, PredicateExpr ocenia się tym węzła jako węzła kontekstowego numerem z węzłów w zestaw jako wielkości kontekstu, w położeniu zbliżeniowy węzła w węźle ustawiony w stosunku do osi, w położeniu kontekstowego

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

    stanowisko bliskość członek zestaw węzłów w odniesieniu do osi jest zdefiniowany jako pozycja węzła w zamówieniu kolejności węzła uporządkowanym w dokumencie , jeśli oś jest osią przednią i jest zamawiana w odwrotnej kolejności dokumentów , jeśli oś jest odwrotna osi

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

    Najważniejsze jest to, że działa orzeczenie położenie w stosunku do osi. I potrzebujesz nawiasów, aby jawnie zadeklarować priorytet. Zatem nie będzie osią child, ale zestaw węzłów po rozwiązaniu osi descendant-or-self będzie brany pod uwagę przy obliczaniu pozycji.

    +0

    Dobra odpowiedź, +1 –

    +1

    @Alejandro, znane cytaty teraz :) Dodam je do odpowiedzi. – Flack

    +0

    Teraz jest kompletna odpowiedź! –

    0

    Okazuje się: nawias!

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

    działa

    +0

    Możesz również sprawdzić moją odpowiedź na kompletną analizę. – Flack

    0

    Wygląda na to, że masz dostęp do atrybutów w niewłaściwy sposób. Spróbuj użyć

    /div[@id='content-area' and @class='media-gallery-item'][2] 
    
    Powiązane problemy