# XPath - replace function funktioniert nicht



## guni (1. Mrz 2010)

Hallo,

habe ein XML-Dokument, das ca. so aussieht:
[XML]<BLOCK>
   <LINE VALUE="5,50"/>
   <LINE VALUE="5,50"/>
</BLOCK>[/XML]
jetzt will ich eine Funktion schreiben, die die alle Line-Values eines Blocks summiert.
Auch wenn ich in Dom natürlich mit einer einfachen Schleife alle Zeilen durchlaufen könnte, habe ich mich für einen XPath-Ansatz entschieden (gefiel mir irgendwie besser).

meine Funktion sieht jetzt also so aus:

```
public static Double sumAttribute(Element e, String attribute) throws XPathExpressionException 
	{
		System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
		XPathExpression exp = xpath.compile("LINE/sum(*/number(replace(@"+attribute+",',','.')))");
		NodeList result = (NodeList)exp.evaluate(e, XPathConstants.NODESET);
		return (result.getLength() == 0) ? new Double(0) : new Double(result.item(0).getNodeValue());
}
```

da ich immer einen Fehler erhalte, habe ich meinen XPath mal ein bisschen vereinfacht

```
XPathExpression exp = xpath.compile("LINE/@VALUE"); // funktioniert
```


```
XPathExpression exp = xpath.compile("LINE/replace(@VALUE,',','.')"); // funktioniert nicht mehr
```

für zweiteren Ansatz bekomme ich schon folgenden Fehler:

```
Exception in thread "main" net.sf.saxon.trans.XPathException: Extension function required class org.w3c.dom.NodeList; supplied value of class net.sf.saxon.value.StringValue could not be converted
	at net.sf.saxon.dom.DOMObjectModel.convertXPathValueToObject(DOMObjectModel.java:354)
	at net.sf.saxon.dom.DOMObjectModel.access$000(DOMObjectModel.java:39)
	at net.sf.saxon.dom.DOMObjectModel$6.convert(DOMObjectModel.java:163)
	at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:352)
	at com.eurofunk.sag.parsers.test2.XmlLib.sumAttribute(XmlLib.java:192)
	at com.eurofunk.sag.parsers.test3.main.Main.main(Main.java:30)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException
	at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:357)
	at com.eurofunk.sag.parsers.test2.XmlLib.sumAttribute(XmlLib.java:192)
	at com.eurofunk.sag.parsers.test3.main.Main.main(Main.java:30)
Caused by: net.sf.saxon.trans.XPathException: Extension function required class org.w3c.dom.NodeList; supplied value of class net.sf.saxon.value.StringValue could not be converted
	at net.sf.saxon.dom.DOMObjectModel.convertXPathValueToObject(DOMObjectModel.java:354)
	at net.sf.saxon.dom.DOMObjectModel.access$000(DOMObjectModel.java:39)
	at net.sf.saxon.dom.DOMObjectModel$6.convert(DOMObjectModel.java:163)
	at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:352)
	... 2 more
```
Ich verstehe nicht ganz wieso - der XPath ist gültig!
Könnt ihr mir da weiterhelfen?!

mfg, guni


----------



## Atze (3. Mrz 2010)

hm, ich versteh den nicht, sieht so kompliziert aus 

warum nicht so?:


```
XPathExpression expr = xpath.compile("//BLOCK/LINE");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    double sum = 0;
    for (int i = 0; i < nodes.getLength(); i++) {
    	String attValue = nodes.item(i).getAttributes().item(0).getTextContent();
    	attValue = attValue.replaceAll(",", "\\.");
        sum += new Double(attValue); 
    }
```


----------



## guni (4. Mrz 2010)

ja klar. so gehts auch.
theoretisch brauch ich gar keinen XPath weil ich ja sowieso mein DOM-Dokument auch durchlaufen könnte.
Wollte aber trotzdem wissen warum die Summierung über XPath in Java nicht funktionert ...


----------



## Atze (4. Mrz 2010)

funktionieren tuts sicherlich, wurde bestimmt schon irgendwo mehrfach eingesetzt. so weit hab ich mich damit auch nicht befasst


----------

