2012-10-22 6 views
6

Con XPath, so che è possibile utilizzare l'operatore unione nel seguente modo:In XPath è possibile utilizzare l'operatore OR con i nomi dei nodi?

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

Questo sembra essere un po 'imbarazzante per me però. C'è un modo per fare qualcosa di simile a uno di questi invece?

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

Questo sembra molto più leggibile e intuitivo per me ...

risposta

5

Mentre l'espressione:

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

è corretto

Questa espressione è più efficiente:

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

Eppure c'è un terzo modo per verificare se il nome di un elemento fa parte di una sequenza specificata di stringhe:

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

Utilizzando questa ultima tecnica può essere particolarmente pratico nel caso in cui il mumber di possibili nomi è molto lunga (di lunghezza illimitata e sconosciuto). La stringa delimitata da pipe di nomi possibili può anche essere passata come parametro esterno alla trasformazione, il che aumenta notevolmente la sua genericità, riusabilità e "umidità".

0

Sì, è possibile utilizzare:

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

EDIT:

appena riletto il tuo post originale e capito cosa stavi chiedendo. La sintassi precedente non sarebbe corretta per questa situazione. Non sei sicuro di come ottenere il nome del nodo nome nodo da usare, ma non è giusto ...

+0

Si dimentica la stella prima '['. (Vorrei solo modificare il post, ma StackOverflow non mi consente di apportare modifiche di lunghezza inferiore a 6 caratteri.) – Ajedi32

+0

Inoltre, sapresti dove è documentato? =) – Ajedi32

+0

Siamo spiacenti, sì che era un errore di battitura. Avrai bisogno di una stella (o di un altro nome di elemento) lì. –

4

Siete alla ricerca per la funzione name():

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

Si noti che con XPath 2.0 il tentativo di //*[@id="Catalog"]/(thead|tbody) è corretto . Questo approccio non funziona tuttavia con XPath 1.0.

Problemi correlati