2012-10-22 8 views
6

Z XPath, wiem, że można użyć operatora Unię w następujący sposób:W XPath można używać operatora OR z nazwami węzłów?

//*[@id="Catalog"]/thead | //*[@id="Catalog"]/tbody 

To wydaje się być nieco niewygodne do mnie chociaż. Czy istnieje sposób, aby zamiast tego zrobić coś podobnego do jednego z nich?

//*[@id="Catalog"]/(thead|tbody) 
//*[@id="Catalog"]/(thead or tbody) 
//*[@id="Catalog"]/*[nodename="thead" or nodename="tbody"] 

To wydaje się o wiele bardziej czytelny i intuicyjny do mnie ...

Odpowiedz

5

Choć wyrażenie:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"] 

jest poprawna

To wyrażenie jest bardziej wydajny:

//*[@id="Catalog"]/*[self::thead or self::tbody] 

Jest jeszcze trzeci sposób, aby sprawdzić, czy Nazwa element jest jednym z określonej sekwencji łańcuchów:

//*[@id="Catalog"]/*[contains(''|thead|tbody|',concat('|',name(),'|'))] 

Stosując tę ​​ostatnią technikę może być szczególnie praktyczne w przypadku mumber możliwych nazw jest bardzo długa (nieograniczonej długości i nieznanym). Wyznaczony przez potoki łańcuch możliwych nazw można nawet przekazać jako parametr zewnętrzny transformacji, co znacznie zwiększa ogólność, możliwość ponownego wykorzystania i "SUCHOŚĆ".

0

Tak można użyć:

//*[@id="Catalog"]/[nodename='thead' or nodename='tbody'] 

EDIT:

Wystarczy ponownie przeczytać oryginalny post i zrozumiałeś, o co prosisz. Powyższa składnia nie byłaby poprawna w tej sytuacji. Nie wiesz, jak uzyskać nazwę węzła nodename do wykorzystania, ale nie jest dobrze ...

+0

Zapominasz o gwiazdce przed "[". (Po prostu edytowałbym post, ale StackOverflow nie pozwala mi wprowadzać zmian krótszych niż 6 znaków.) – Ajedi32

+0

Czy mógłbyś wiedzieć, gdzie to jest udokumentowane? =) – Ajedi32

+0

Przepraszam, tak, to był błąd. Będziesz potrzebować gwiazdy (lub innej nazwy elementu). –

4

Szukasz w name() funkcję:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"] 
2

Należy zauważyć, że z XPath 2.0 Twoja próba //*[@id="Catalog"]/(thead|tbody) jest poprawna . Takie podejście nie działa jednak z XPath 1.0.

Powiązane problemy