package client.net.sf.saxon.ce.style; import client.net.sf.saxon.ce.expr.Expression; import client.net.sf.saxon.ce.expr.ExpressionVisitor; import client.net.sf.saxon.ce.expr.RoleLocator; import client.net.sf.saxon.ce.expr.TypeChecker; import client.net.sf.saxon.ce.expr.instruct.CallTemplate; import client.net.sf.saxon.ce.expr.instruct.Executable; import client.net.sf.saxon.ce.expr.instruct.ScheduleExecution; import client.net.sf.saxon.ce.om.AttributeCollection; import client.net.sf.saxon.ce.om.Axis; import client.net.sf.saxon.ce.om.NodeInfo; import client.net.sf.saxon.ce.trans.XPathException; import client.net.sf.saxon.ce.tree.iter.AxisIterator; import client.net.sf.saxon.ce.value.SequenceType; /** * Extension element for Saxon client edition: ixsl:schedule-action. The content of the element * is currently restricted to a single xsl:call-template instruction */ public class IXSLScheduleAction extends StyleElement { Expression wait; XSLCallTemplate instruction; public boolean isInstruction() { return true; } public void prepareAttributes() throws XPathException { String waitAtt=null; AttributeCollection atts = getAttributeList(); for (int a=0; a<atts.getLength(); a++) { int nc = atts.getNameCode(a); String f = getNamePool().getClarkName(nc); if (f.equals("wait")) { waitAtt = atts.getValue(a); } else { checkUnknownAttribute(nc); } } if (waitAtt!=null) { wait = makeExpression(waitAtt); } } public void validate(Declaration decl) throws XPathException { ExpressionVisitor visitor = makeExpressionVisitor(); if (wait != null) { wait = typeCheck(wait); try { RoleLocator role = new RoleLocator(RoleLocator.INSTRUCTION, "ixsl:schedule-action/wait", 0); wait = TypeChecker.staticTypeCheck(wait, SequenceType.SINGLE_INTEGER, false, role, visitor); } catch (XPathException err) { compileError(err); } } boolean found = false; AxisIterator kids = iterateAxis(Axis.CHILD); while(true) { NodeInfo child = (NodeInfo)kids.next(); if (child == null) { break; } else if (child instanceof XSLFallback) { // do nothing; } else if (child instanceof XSLCallTemplate) { if (found) { compileError("ixsl:schedule-action must contain a single xsl:call-template instruction"); } found = true; instruction = (XSLCallTemplate)child; } } if (!found) { compileError("ixsl:schedule-action must contain a single xsl:call-template instruction"); } } @Override public Expression compile(Executable exec, Declaration decl) throws XPathException { CallTemplate call = (CallTemplate)instruction.compile(exec, decl); call.setUseTailRecursion(true); return new ScheduleExecution(call, wait); } } // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.