Wieso liefert dieser XPATH-Ausdruck nicht die richtige Anzahl Treffer?

Status
Nicht offen für weitere Antworten.

esmeralda

Mitglied
Hallo Allerseits,

ich hänge gerade an einem XPATH-Ausdruck, der mir einfach nicht die richtige Anzahl an Treffern liefert. Es handelt sich um folgenden Ausdruck:

Code:
//word/ancestor::node[@cat='NP']"

Ich weiß, dass in der zu durchsuchenden Datei 2 Knoten namens "word" mit dieser Eigenschaft vorhanden sind. Wenn ich z.B. einfach jeden Knoten der Datei darauf überprüfe, werden 2 Knoten gefunden. Hier die betreffende Zeile:

Code:
//word["+i+"]/ancestor::node[@cat='NP']

Wieso findet also der erste Ausdruck nicht auch 2 Knoten? Ich hoffe, jemand kann mir hierbei weiterhelfen - ich bin nämlich gerade am Ende meines Lateins angelangt ;(.

Schon mal Danke!
 

musiKk

Top Contributor
Müsste [c]//word//node[@cat='NP'][/c] nicht eigentlich das gleiche Ergebnis liefern? Warum es über die ancestors-Axis nicht geht, kann ich Dir aber leider nicht sagen, aber interessieren würde es mich auch.
 

esmeralda

Mitglied
Es geht doch über die ancestor-Axe - nur leider, wenn ich jeden Knoten einzeln befrage. Mit //word//node[@cat='NP' geht es glaube ich nicht - müsste es aber ausprobieren. Ich möchte ja schauen, ob irgendein Vorfahre diese Eigenschaft hat.
 

musiKk

Top Contributor
Hoppla, da habe ich descendant und ancestor total verwechselt, sorry. Dann funktionierts bei mir aber.
Aus beiden Gründen wäre es vielleicht ganz gut, wenn Du mal ein kleines Beispiel für eine XML-Datei und Java-Quelltext liefern könntest.
 

esmeralda

Mitglied
Okay :)
Hier ein Auszug aus meiner XML-Datei:

[XML]<sentence id="s1" editor="EDITOR26" date="953345502" origin="ORIGIN4" comment="%% &lt;j001ach1_000_BAA_250001&gt;">
<node num="501" cat="VPfin" func="--" parent="0" comment="">
<node num="500" cat="NPper" func="COMP" parent="501" comment="">
<word form="kasahara" pos="NAMEper" morph="--" func="HD" parent="500" comment=""></word>
<word form="arisa" pos="NAMEper" morph="--" func="HD" parent="500" comment=""></word>
</node>
<word form="desu" pos="PVfin" morph="u" func="HD" parent="501" comment=""></word>
</node>
<word form="." pos="." morph="--" func="--" parent="0" comment=""></word>
</sentence>[/XML]

Und hier ein Auszug aus der Java-Datei:

Java:
			...DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			DocumentBuilder builder_literal;
			

				try {
					builder_literal = factory.newDocumentBuilder();
					//lies Testdatei ein und baue Dokument daraus
					org.w3c.dom.Document doc_literal = builder_literal.parse("test_export.xml");
					XPathFactory factoryX = XPathFactory.newInstance();
					XPath xpath = factoryX.newXPath();	
					
					System.out.println(rule_pfad);
					//Ergebnisse zählen
					XPathExpression expr_count = xpath.compile(rule_pfad+"/ancestor::node[@cat='NP']");
					Object result_count = expr_count.evaluate(doc_literal, XPathConstants.NODESET);
					NodeList nodes_count = (NodeList) result_count;
				
					System.out.println(nodes_count.getLength());
					
					for (int b=1; b <= nodes_count.getLength(); b++) {
						
						//greife auf b. Knoten zu
						XPathExpression expr_literal = xpath.compile("("+rule_pfad+"/ancestor::node[@cat='NP'])["+b+"]");
						System.out.println("("+rule_pfad+"/ancestor::node[@cat='NP'])["+b+"]");
						
						Object result_literal = expr_literal.evaluate(doc_literal, XPathConstants.NODESET);
						NodeList nodes_literal = (NodeList) result_literal;
}...

rule_pfad enthält den XPATH-Pfad "//word" - aber auch wenn ich statt der Variable den Pad direkt hinschreibe funktioniert es nicht.

Ich hoffe, dass der Auszug halbwes verständlich ist - stecke halt noch mitten in der Programmierung und es ist erst so langsam alles am fertig werden ^_^.
 

musiKk

Top Contributor
Hm. Also ich habe mal alles bis zur Zeile 19 Deines Programms übernommen. Das funktioniert. Ich bin mir jetzt nicht ganz klar, ob Du möchtest, dass der Ausdruck bei dem XML-Stück oben schon anschlägt, da gibt es natürlich keinen Treffer. Wenn NPper treffen soll, dann muss z. B. eine XPath-Funktion wie [c]begins-with[/c] ran. Wenn ich aber in Zeile 3 der XML-Datei das NPper durch NP ersetze, wird ein Treffer gefunden.
 

esmeralda

Mitglied
Ah, sorry - hätte hier das XML-Code-Stück einfügen sollen. Ich will wirklich nur die Knoten finden, die genau so heißen.

[XML]<sentence id="s4" editor="EDITOR26" date="932835815" origin="ORIGIN4" comment="%% &lt;j001ach1_002_BAA_250001&gt;"><word form="shucchou" pos="VN" morph="--" func="COMP" parent="500" comment=""></word>
<node num="503" cat="S" func="--" parent="0" comment="">
<node num="502" cat="VPfin" func="HD" parent="503" comment="">
<node num="501" cat="NP" func="COMP" parent="502" comment="">
<node num="500" cat="PPgen" func="COMP" parent="501" comment="">
<word form="shucchou" pos="VN" morph="--" func="COMP" parent="500" comment=""></word>
<word form="no" pos="Pgen" morph="--" func="HD" parent="500" comment=""></word>
</node>
<word form="keN" pos="NF" morph="--" func="HD" parent="501" comment=""></word>
</node>
<word form="kimemashou" pos="Vfin" morph="u" func="HD" parent="502" comment=""></word>
</node>
<word form="ka" pos="PSE" morph="--" func="MRK" parent="503" comment=""></word>
</node>
<word form="." pos="." morph="--" func="--" parent="0" comment=""></word>
</sentence>[/XML]

Hier sind 2 word-Knoten ja vorhanden, die als Vorfahre den gesuchten node-Knoten haben.
 

musiKk

Top Contributor
Drei sogar (Zeilen 6, 7 und 9). ;) Der XPath wählt aber das node-Element aus, weil das im Pfad als letztes steht. Wenn Du die word-Elemente willst, musst Du das ancestor-Kriterium in ein Prädikat umwandeln: [c]//word[ancestor::node[@cat='NP']][/c].
 

esmeralda

Mitglied
Dankedankedanke :toll:. Wird sofort eingebaut. Da bin ich die ganze Zeit von dem falschen Ausdruck ausgegangen - *nargs* da muss ich noch einiges in XPATH lernen :oops:.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben