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 49 50 51 52 53 54 55 56
|
package com.jclark.xsl.tr;
import com.jclark.xsl.om.*;
import com.jclark.xsl.expr.VariantExpr;
import com.jclark.xsl.expr.Variant;
class CopyOfAction implements Action {
private final VariantExpr expr;
CopyOfAction(VariantExpr expr) {
this.expr = expr;
}
public void invoke(ProcessContext context, Node sourceNode, Result result) throws XSLException {
Variant value = expr.eval(sourceNode, context);
if (value instanceof ResultFragmentVariant)
((ResultFragmentVariant)value).append(result);
else if (value.isNodeSet())
copyNodes(context, value.convertToNodeSet(), result);
else
result.characters(value.convertToString());
}
private static void copyNodes(ProcessContext context, NodeIterator iter, Result result) throws XSLException {
for (;;) {
Node node = iter.next();
if (node == null)
break;
switch (node.getType()) {
case Node.ROOT:
copyNodes(context, node.getChildren(), result);
break;
case Node.TEXT:
result.characters(node.getData());
break;
case Node.ATTRIBUTE:
result.attribute(node.getName(), node.getData());
break;
case Node.PROCESSING_INSTRUCTION:
result.processingInstruction(node.getName().toString(),
node.getData());
break;
case Node.COMMENT:
result.comment(node.getData());
break;
case Node.ELEMENT:
result.startElement(node.getName(),
node.getNamespacePrefixMap());
copyNodes(context, node.getAttributes(), result);
copyNodes(context, node.getChildren(), result);
result.endElement(node.getName());
break;
}
}
}
}
|