XPath?

flashray

Erfahrenes Mitglied
Hallo,

bräuchte einen etwas komplizierteren XPath Ausdruck. Habs leider nicht selbst lösen können:

Code:
<?xml version="1.0" encoding="iso-8859"?>
<rss version="0.91">
<channel>
   <channelTitle>SPIEGEL ONLINE</channelTitle>
   <description>Schneller wissen, was wichtig ist</description>
   <language>de</language>

   <item>
      <title>Kriegsverbrechertribunal Den Haag</title>
      <link>http://www.spiegel.de/politik/ausland/0,1519.html</link>
   </item>
   <item>
      <title>Wir sind krank durch Konsolen: Nintendo gegen Wii</title>
      <link>http://www.spiegel.de/netzwelt/web/0,1520.html</link>
   </item>
   <item significant="true">
      <title>Einzelhandel: Ladendiebe stehlen sechs Millionen Euro</title>
      <link>http://www.spiegel.de/wirtschaft/0,1521.html</link>
   </item>
   <item>
      <title>Piloten-Ansage: "Keine Sorge - wir fallen"</title>
      <link>http://www.spiegel.de/reise/aktuell/0,1522.html</link>
   </item>
   <item>
      <title>Palaestinenserkaempfe: Hamas greift durch</title>
      <link>http://www.spiegel.de/politik/ausland/0,1523.html</link>
   </item>
   <item significant="true">
      <title>Markenrechtsstreit: Budweiser erleidet Niederlage</title>
      <link>http://www.spiegel.de/wirtschaft/0,1524.html</link>
   </item>
   <item>
      <title>Machtuebergabe in Bayern: Beckstein an Stoiber ab</title>
      <link>http://www.spiegel.de/politik/deutschland/0,1525.html</link>
   </item>
</channel>
</rss>

Die Aufgabenstellung heißt:
Geben Sie alle title-Knoten aus, die das Wort "wir" enthalten und zusätzlich alle link-Knoten, die aus dem Ressort "politik" stammen.

Mein Ansatz bislang ist dieser, er tut aber nicht was ich möchte:
Code:
/rss/channel/item/*[(contains(text(),"politik") & node-name()="link") | (contains(text(),"wir") & node-name()="title")]

http://www.futurelab.ch/xmlkurs/xpath.de.html
Hab hier vergeblich alles mögliche ausprobiert. Vielleicht hätte hier jemand einen Tip für mich. :)

Vg Erdal
 
Hi.
Mein Ansatz bislang ist dieser, er tut aber nicht was ich möchte:
Code:
/rss/channel/item/*[(contains(text(),"politik") & node-name()="link") | (contains(text(),"wir") & node-name()="title")]

http://www.futurelab.ch/xmlkurs/xpath.de.html
Hab hier vergeblich alles mögliche ausprobiert. Vielleicht hätte hier jemand einen Tip für mich. :)
Du verwendest die falschen Operatoren. Der | Operator vereinigt 2 Knotenmengen, den & Operator gibt es gar nicht. Du solltest die boolschen Operatoren and und or verwenden. Siehe z.B. http://www.w3schools.com/xpath/xpath_operators.asp

Gruß
 
Hallo deepthroat,

ja mit dem Operator or komme ich ein Stückchen weiter. Jetzt nimmt er beide. Wie kann ich aber einschränken, das er einen Filter nur das Tag link, und den anderen Filter für das Tag title mit einbeziehen soll?


Vg Erdal
 
Hallo deepthroat,

ja mit dem Operator or komme ich ein Stückchen weiter. Jetzt nimmt er beide. Wie kann ich aber einschränken, das er einen Filter nur das Tag link, und den anderen Filter für das Tag title mit einbeziehen soll?
Das geschieht in dem Fall automatisch, da das and eine höhere Priorität hat als das or. Ansonsten durch Klammerung der Ausdrücke.

Gruß
 
Das Problem hierbei ist, das die Funktion node-name(...) einen Parameter erwartet, weiss aber nicht wass ich reinschreiben könnte. Habs mit * oder //* ähnlich versucht ..., ohne Erfolg .
 
/rss/channel/item/*[contains(text(),"politik") and name()="link" or contains(text(),"wir") and name()="title"]

Ja nun damit ist die Aufgabenstellung fast gelöst. Ich hatte name() garnicht gesehen, da es in der Liste ganz weit unten gesondert war. ;)

Das letzte was noch fehlt ist, eine case-insensitive Suche. D.h. es sollten auch Vorkommnisse wie "Wir" akzeptiert werden. Ein schachteln mit lower-case() führt aber zu einem Fehler:
contains(lower-case(text()),"wir")
 
/rss/channel/item/*[contains(text(),"politik") and name()="link" or contains(text(),"wir") and name()="title"]

Ja nun damit ist die Aufgabenstellung fast gelöst. Ich hatte name() garnicht gesehen, da es in der Liste ganz weit unten gesondert war. ;)

Das letzte was noch fehlt ist, eine case-insensitive Suche. D.h. es sollten auch Vorkommnisse wie "Wir" akzeptiert werden. Ein schachteln mit lower-case() führt aber zu einem Fehler:
contains(lower-case(text()),"wir")
Die lower-case Funktion gibt es erst seit XPath 2.0. In XPath 1.0 könntest du die translate Funktion benutzen:
Code:
translate(name(), "ABCDE...", "abcde...")
Gruß
 
Vielen Dank für die Unterstützung!

Kennst du vielleicht einen anderen Online Interpreter der auch XPath 2.0 kann? Hab ein Paar ausprobiert, keiner wollte lower-case() akzeptieren.

Oder vielleicht ein Eclipse Plugin das ohne großen Aufwand XPath Ausdrücke auswerten kann?

Vg Erdal
 
Ja damit hat es nun endlich geklappt! :)

Code:
/rss/channel/item/*[contains(text(),"politik") and name()="link" or contains(translate(text(), "WIR", "wir"),"wir") and name()="title"]
 

Neue Beiträge

Zurück