tags:

views:

1349

answers:

1

Hi all.

Here is my code :

public static void main(String[] args) {

 // System.setProperty(
 // "javax.xml.xpath.XPathFactory", 
 // "net.sf.saxon.xpath.XPathFactoryImpl");

 String xml="<root><a>#BBB#</a><a>#CCC#</a><b><a>#DDD#</a></b></root>";
 try{
  JDocument dom = new JDocument(xml);

  XPathFactory factory = net.sf.saxon.xpath.XPathFactoryImpl.newInstance();
     XPath xpath = factory.newXPath();
     XPathExpression expr = xpath.compile("//a[matches(.,'#...#')]");

     Object result = expr.evaluate(dom, XPathConstants.NODESET);
     NodeList nodes = (NodeList) result;
  Nodes sharped = new Nodes(nodes);

  for (Node n:sharped){
   System.out.println(n.toString());
  }
 }
 catch(Exception e){
  e.printStackTrace();
 }

}

And I get this :

javax.xml.transform.TransformerException: Impossible to find the function : matches
at org.apache.xpath.compiler.XPathParser.error(XPathParser.java:608)
at org.apache.xpath.compiler.XPathParser.FunctionCall(XPathParser.java:1505)
at org.apache.xpath.compiler.XPathParser.PrimaryExpr(XPathParser.java:1444)
at org.apache.xpath.compiler.XPathParser.FilterExpr(XPathParser.java:1343)
at org.apache.xpath.compiler.XPathParser.PathExpr(XPathParser.java:1276)

Which means Java is using org.apache.xpath.compiler.XPathParser class when I clearly created my factory through net.sf.saxon.xpath.XPathFactoryImpl.

(I actually only need to put some 'matches' in my xpaths... so if any solution not involving Saxon is known, consider my need reached).

What am I doing wrong ?

+3  A: 

From Saxon examples :

System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl");
XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);

Works fine.

g andrieu