2016-03-24 14 views
4

Ich habe den nächsten Ausdruck:Wenn dann sonst in XPath 1.0

population = tree.xpath('(//tr/td/b/a[contains(text(), "Population")]/../../following-sibling::td/span/following-sibling::text())[1] or' 
          '//tr/td/b/a[contains(text(), "Population")]/../../following-sibling::td/span/text()) 

die 'True' zurück.

Wenn ich "|" verwende anstelle von 'oder' kombiniert es Werte der 1. und 2. Pfade, wie diese ['11 061 886', '▼'].

Wie die Logik machen wie:

If the 1st path exists: 
    get the 1st value 
elif the 2nd path exists: 
    get the 2nd value 
else: 
    pass 

?

Ich verstehe, dass dies einfach ist, kann aber nicht die Antwort finden.

Antwort

5

Wenn Sie wirklich keinen XPath 2.0-Prozessor finden können, gibt es einige Problemumgehungen in XPath 1.0, die möglicherweise für Sie arbeiten.

Wenn Sie Knoten-Sets auswählen möchten, dann anstelle von

if (A) then B else C 

können Sie

B[A] | C[not(A)] 

schreiben, während die Erinnerung, dass die Bedingung A muss geändert werden, weil der Kontextknoten ist anders.

Wenn Sie Strings zurückgeben möchten, dann anstelle von

if (A) then B else C 

können Sie die abscheulichen Abhilfe verwenden

concat(substring(B, 1, boolean(A) div 0), substring(C, 1, not(A) div 0)) 

die auf der Tatsache beruht, dass (true div 0) positiv unendlich, while (false div 0) ist NaN.

(ich glaube ich das Recht habe. Es Jahren ist, da ich XPath verwendet haben 1,0. Aber es gibt einige solcher Ausdruck, die funktioniert.)

Bei Zahlen können Sie

verwenden
B * boolean(A) + C * not(A) 

Antwort auf falsch = 0, wahr = 1.

Für eine Mehrfach bedingten wie

if (A) then X else if (B) then Y else Z 

Sie ähnliche Logik, zum Beispiel mit Knoten-Sets wird es

X[A] | Y[not(A) and B] | Z[not(A or B)] 
+0

Michael, danke für die Antwort verwenden können. Ich habe eine kleine Frage. Wenn ich meinen Ausdruck entsprechend Ihrer Problemumgehung ändere, wird der Ausdruck zu lang (in Ihrem Beispiel 'A' dreimal wiederholt und 'B' zweimal) und ich habe einige Ausdrücke mit bis zu 5 Knoten \ Pfaden. Wäre es kürzer, wenn ich XPath 2.0 Prozessor finde? Wenn ja, könnten Sie die v2.0-Implementierung bereitstellen? Danke nochmal. – TitanFighter

+0

Ja, das ist in XPath 2.0 viel einfacher. Es gibt eine ganze Reihe von XPath 2.0-Implementierungen (vor allem, wenn Sie XQuery 1.0 verwenden, das eine Obermenge von XPath 2.0 ist), aber es gibt einige Umgebungen (z. B. PHP oder Python), die nicht gut bedient werden Plattform. –

+0

meine Plattform ist Python – TitanFighter