2009-07-22 13 views
1

finden Kopf tut weh auf diesem einen so kann mir jemand eine Linie werfen?XPath Kopfschmerzen, Knoten mit Attributen zwischen einem Bereich

XML ist wie so (nicht die realen Sachen, aber dies ist ein Beispiel für Klarheit):

<root> 
    <groups name="A"> 
     <entry from="1" to="10" /> 
    </groups> 
    <groups name="A"> 
     <entry from="11" to="20" /> 
     <entry from="21" to="30" /> 
    </groups> 
    <groups name="A"> 
     <entry from="31" to="40" /> 
     <entry from="41" to="50" /> 
     <entry from="51" to="60" /> 
    </groups>  
</root> 

Bei einer Eintragsnummer ich den Eingangsknoten finden möchte, dass diese Zahl zwischen fällt. Es sollte nur einen Knoten geben, der übereinstimmt (falls vorhanden).

Heres die XPath Ich verwende:

/root/Gruppen/Eintrag [@ Von> = 45 und @An < = 45]

Ich habe versucht, die Attribute in Nummer() packen Auch, aber immer noch kein Glück.

Dies ist nicht zurückgeben, was ich erwarten würde, tatsächlich gibt es nichts zurück und ich kann nicht sehen warum! Was vermisse ich?

Edit: Korrigiert meinen Tippfehler der Eröffnungsgruppen Tags ... sorry.

Antwort

3

Dieser bestimmte Ausdruck gibt nichts zurück, da keine entry Elemente die Bedingung erfüllen. Zunächst einmal würde ich vorschlagen, es zu ändern:

/root/groups/entry[@from <= 45 and @to >= 45] 

Plus, wenn das wirklich Ihre Quelle XML ist, wird es nicht funktionieren, weil es ungültig ist. Sie haben <group> offene Tags, aber </groups> schließende Tags. Sie stimmen nicht überein. Sie sollten sie alle entweder in group oder groups ändern, und Ihr XPath-Ausdruck sollte dies widerspiegeln.

Getestet habe ich diesen Ausdruck gegen eine modifizierte Version des XML (mit group-groups geändert), und es ergab ein Ergebnis wie erwartet:

<entry from="41" to="50" /> 
+0

DOH! Natürlich falsche Vergleiche! Vielen Dank, das macht mich eine Stunde lang fertig. Oh die Schande ... –

+0

Was ist mit: '/ root/groups/entry [@from <= 45 und 45 <= @ to]'? Viel klarer, IMHO. – Tomalak