2010-10-06 18 views
10

chcę wyodrębnić wartość atrybutu name z następującego tagukwerendy XPath, jak uzyskać wartość jednego atrybutu w oparciu o dwa atrybutu

<application 
    comments="Do not erase this one" 
    executable="run_CIET" 
    icon="default" 
    instances="1" 
    mode="1" 
    name="CIET" 
    order="10" 
    selection="1" 
    tool="y" 
/> 

mogę łatwo uzyskać wartość wartość atrybutu name w oparciu o wartości trybie, jak pokazano poniżej

xpath Applications.xml '//applications/application[@mode='3']'/@name 

Ale jeśli chcę dodać więcej condtion która jest „uzyskać wartość atrybutu name gdy mode = X i atrybut narzędzie nie jest tam w tagu aplikacji”

Jak robimy th jest? Próbowałem coś takiego, ale nie działało, ale nie działało.

Nie używałem XPath wcześniej i uważam, że jest to trudne. Wyszukuję pomoc W3C na XPath, ale nie znalazłem tego, co chciałem. Proszę pomóż.

+0

Dobre pytanie, +1. Zobacz moją odpowiedź na wyjaśnienie Twojego problemu, krótkie i kompletne rozwiązanie oraz kilka zaleceń. :) –

Odpowiedz

16
How do we do this? I tried something like 

    xpath Applications.xml '//applications/application[@mode='3' and [email protected]]'/@name 

but its not working. 



[email protected] 

to nieprawidłowa składnia w XPath. Istnieje operator !=, ale nie ma operatora !.

Zastosowanie:

//applications/application[@mode='3' and not(@tool)]/@name 

Są dwie rzeczy, zawsze należy starać się unikać:

  1. pomocą operatora != - ma dziwną definicję i nie zachowuje się jak not() funkcja - używaj jej, jeśli jeden z operandów jest zbiorem węzłów.

  2. Staraj się unikać w największym możliwym stopniu, używając skrótu // - może to spowodować znaczącą nieskuteczność, a także ma anormalne zachowanie, które nie jest zgodne z większością ludzi.

5

Należy wykonać pracę za pomocą zamiast [email protected]. Jeśli twój silnik XPath się nie zachowuje, możesz sobie wyobrazić count(@tool)=0, ale nie powinno to być konieczne.

Powiązane problemy