1 package com.icl.saxon.functions; 2 import com.icl.saxon.Context; 3 import com.icl.saxon.om.NodeEnumeration; 4 import com.icl.saxon.expr.*; 5 6 public class Count extends Function { 7 8 11 12 public String getName() { 13 return "count"; 14 }; 15 16 20 21 public int getDataType() { 22 return Value.NUMBER; 23 } 24 25 28 29 public Expression simplify() throws XPathException { 30 checkArgumentCount(1, 1); 31 argument[0] = argument[0].simplify(); 32 33 if (argument[0] instanceof Value) { 34 return evaluate(null); 35 } 36 return this; 37 } 38 39 42 43 public double evaluateAsNumber(Context c) throws XPathException { 44 int n = 0; 45 NodeEnumeration enum = argument[0].enumerate(c, true); 46 while (enum.hasMoreElements()) { 47 enum.nextElement(); 48 n++; 49 } 50 return (double)n; 51 } 52 53 56 57 public Value evaluate(Context c) throws XPathException { 58 return new NumericValue(evaluateAsNumber(c)); 59 } 60 61 64 65 public int getDependencies() { 66 return argument[0].getDependencies(); 67 } 68 69 72 73 public Expression reduce(int dep, Context c) throws XPathException { 74 Count f = new Count(); 75 f.addArgument(argument[0].reduce(dep, c)); 76 f.setStaticContext(getStaticContext()); 77 return f.simplify(); 78 } 79 80 } 81 82 83 84 | Popular Tags |