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



## esmeralda (9. Okt 2009)

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:


```
//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:


```
//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 (10. Okt 2009)

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 (10. Okt 2009)

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 (10. Okt 2009)

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 (10. Okt 2009)

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:


```
...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 (10. Okt 2009)

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 (10. Okt 2009)

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 (10. Okt 2009)

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 (10. Okt 2009)

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 .


----------

