Angesichts dieser XML:
<DocText>
<WithQuads>
<Page pageNumber="3">
<Word>
July
<Quad>
<P1 X="84" Y="711.25" />
<P2 X="102.062" Y="711.25" />
<P3 X="102.062" Y="723.658" />
<P4 X="84.0" Y="723.658" />
</Quad>
</Word>
<Word>
</Word>
<Word>
30,
<Quad>
<P1 X="104.812" Y="711.25" />
<P2 X="118.562" Y="711.25" />
<P3 X="118.562" Y="723.658" />
<P4 X="104.812" Y="723.658" />
</Quad>
</Word>
</Page>
</WithQuads>
Ich möchte die Knoten finden, die den Text 'Juli' und ein Quad / P1 / X-Attribut größer als 90 haben. In diesem Fall sollten daher keine Übereinstimmungen zurückgegeben werden. Wenn ich jedoch GT (>) oder LT (<) verwende, erhalte ich eine Übereinstimmung für das erste Word-Element. Wenn ich eq (=) verwende, bekomme ich keine Übereinstimmung.
Damit:
//Word[text()='July' and //P1[@X < 90]]
wird wahr zurückgeben, wie wird
//Word[text()='July' and //P1[@X > 90]]
Wie kann ich dies für das P1 @ X-Attribut richtig einschränken?
Stellen Sie sich außerdem vor, ich habe mehrere Seitenelemente für unterschiedliche Seitenzahlen. Wie würde ich die obige Suche zusätzlich einschränken, um Knoten mit text()='July', P1@X < 90
und Seite zu finden @pageNumber=3
?
Antworten:
Im Allgemeinen würde ich die Verwendung eines nicht vorfixierten // als schlechten Geruch in einem XPath betrachten.
Versuche dies:-
Ihr Problem ist, dass Sie das verwenden, das
//P1[@X < 90]
am Anfang des Dokuments beginnt und mit der Jagd beginnt,P1
daher wird es immer wahr sein. Ähnliches//P1[@X > 90]
gilt immer.quelle
.//P1
Jagd auf dem aktuellen Level starten, anstatt einen festen Pfad anzugebenAbgesehen vom "//" Problem ist dieses XML eine sehr seltsame Verwendung von gemischtem Inhalt. Das Prädikat
text()='July'
stimmt mit dem Element überein, wenn ein untergeordneter Textknoten genau gleich Juli ist, was in Ihrem Beispiel aufgrund des umgebenden Leerzeichens nicht zutrifft. Abhängig von der genauen Definition des Quell-XML würde ich mich entscheiden[text()[normalize-space(.)='July'] and Quad/P1/@X > 90]
quelle