1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
package com.jclark.xsl.expr;
import com.jclark.xsl.om.*;
class IdFunction extends Function1 {
ConvertibleExpr makeCallExpr(ConvertibleExpr e) throws ParseException {
if (e instanceof NodeSetExpr) {
final NodeSetExpr nse = (NodeSetExpr)e;
return new ConvertibleNodeSetExpr() {
public NodeIterator eval(Node node, ExprContext context) throws XSLException {
return id(node, nse.eval(node, context));
}
};
}
else if (e instanceof VariantExpr) {
final VariantExpr ve = (VariantExpr)e;
return new ConvertibleNodeSetExpr() {
public NodeIterator eval(Node node, ExprContext context) throws XSLException {
Variant v = ve.eval(node, context);
if (v.isNodeSet())
return id(node, v.convertToNodeSet());
else
return id(node, v.convertToString());
}
};
}
else {
final StringExpr se = e.makeStringExpr();
return new ConvertibleNodeSetExpr() {
public NodeIterator eval(Node node, ExprContext context)
throws XSLException {
return id(node, se.eval(node, context));
}
};
}
}
static private final NodeIterator id(Node node, NodeIterator iter) throws XSLException {
return new UniqueNodeIterator(NodeListSorter.sort(new ValueIdIterator(node, iter),
new DocumentOrderComparator()));
}
static private final NodeIterator id(Node node, String str) throws XSLException {
return new UniqueNodeIterator(NodeListSorter.sort(new ValueIdIterator.Iterator(node, str),
new DocumentOrderComparator()));
}
}
|