First version for Xalan3 branch!
git-svn-id: https://svn.apache.org/repos/asf/xalan/java/branches/Xalan3@336430 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/xalan/processor/ProcessorFuncResult.java b/src/org/apache/xalan/processor/ProcessorFuncResult.java
new file mode 100644
index 0000000..fed6558
--- /dev/null
+++ b/src/org/apache/xalan/processor/ProcessorFuncResult.java
@@ -0,0 +1,103 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xalan.processor;
+
+import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.templates.ElemFunction;
+import org.apache.xalan.templates.ElemFuncResult;
+import org.apache.xalan.templates.ElemVariable;
+import org.apache.xalan.templates.ElemParam;
+import org.apache.xalan.templates.ElemFallback;
+import org.apache.xalan.res.XSLTErrorResources;
+
+import javax.xml.transform.TransformerException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.NoSuchMethodException;
+import java.lang.InstantiationException;
+import java.lang.IllegalAccessException;
+
+import java.util.Vector;
+
+/**
+ * <meta name="usage" content="internal"/>
+ * This class processes parse events for an exslt func:result element.
+ */
+public class ProcessorFuncResult extends ProcessorTemplateElem
+{
+
+ /**
+ * Verify that the parent of xsl:result is an xsl:function element.
+ */
+ public void startElement(
+ StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)
+ throws SAXException
+ {
+ String msg = "";
+
+ super.startElement(handler, uri, localName, rawName, attributes);
+ ElemTemplateElement parent = handler.getElemTemplateElement().getParentElem();
+ if (!(parent instanceof ElemFunction))
+ {
+ msg = "xsl:result must be the last child of an xsl:function element";
+ handler.error(msg, new SAXException(msg));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/org/apache/xalan/processor/ProcessorFunction.java b/src/org/apache/xalan/processor/ProcessorFunction.java
new file mode 100644
index 0000000..6f4bf08
--- /dev/null
+++ b/src/org/apache/xalan/processor/ProcessorFunction.java
@@ -0,0 +1,213 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xalan.processor;
+
+import org.apache.xalan.templates.ElemLiteralResult;
+import org.apache.xalan.templates.ElemElement;
+import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.templates.Stylesheet;
+import org.apache.xalan.templates.ElemExtensionCall;
+import org.apache.xalan.templates.ElemTemplate;
+import org.apache.xalan.templates.ElemFunction;
+import org.apache.xalan.templates.ElemFuncResult;
+import org.apache.xalan.templates.ElemFallback;
+import org.apache.xalan.templates.ElemVariable;
+import org.apache.xalan.templates.ElemParam;
+import org.apache.xalan.templates.ElemValueOf;
+import org.apache.xalan.templates.ElemMessage;
+import org.apache.xalan.templates.ElemComment;
+import org.apache.xalan.templates.Constants;
+import org.apache.xpath.XPath;
+import org.apache.xalan.templates.StylesheetRoot;
+
+import javax.xml.transform.SourceLocator;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerConfigurationException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.xalan.res.XSLTErrorResources;
+
+
+/**
+ * <meta name="usage" content="internal"/>
+ * This class processes parse events for an exslt func:function element.
+ */
+public class ProcessorFunction extends ProcessorTemplateElem
+{
+
+ /**
+ * Start an ElemFunction. Verify that it is top level and that it has a name attribute with a
+ * namespace.
+ */
+ public void startElement(
+ StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)
+ throws SAXException
+ {
+ //System.out.println("ProcessorFunction.startElement()");
+ String msg = "";
+ if (!(handler.getElemTemplateElement() instanceof StylesheetRoot))
+ {
+ msg = "func:function element must be top level.";
+ handler.error(msg, new SAXException(msg));
+ }
+ super.startElement(handler, uri, localName, rawName, attributes);
+
+ String val = attributes.getValue("name");
+ int indexOfColon = val.indexOf(":");
+ if (indexOfColon > 0)
+ {
+ String prefix = val.substring(0, indexOfColon);
+ String localVal = val.substring(indexOfColon + 1);
+ String ns = handler.getNamespaceSupport().getURI(prefix);
+ //if (ns.length() > 0)
+ // System.out.println("fullfuncname " + ns + localVal);
+ }
+ else
+ {
+ msg = "xsl:function name must have namespace";
+ handler.error(msg, new SAXException(msg));
+ }
+ }
+
+ /**
+ * Must include; super doesn't suffice!
+ */
+ protected void appendAndPush(
+ StylesheetHandler handler, ElemTemplateElement elem)
+ throws SAXException
+ {
+ //System.out.println("ProcessorFunction appendAndPush()" + elem);
+ super.appendAndPush(handler, elem);
+ //System.out.println("originating node " + handler.getOriginatingNode());
+ elem.setDOMBackPointer(handler.getOriginatingNode());
+ handler.getStyleshe%t().setTemplate((ElemTemplate) elem);
+ }
+
+ /**
+ * End an ElemFunction, and verify its validity.
+ */
+ public void endElement(
+ StylesheetHandler handler, String uri, String localName, String rawName)
+ throws SAXException
+ {
+ ElemTemplateElement function = handler.getElemTemplateElement();
+ SourceLocator locator = handler.getLocator();
+
+ // Validate
+ validate(function, handler);// may throw exception
+
+ super.endElement(handler, uri, localName, rawName);
+ }
+
+ /**
+ * Validate that the xsl:function contains children in the following order:
+ * xsl:param*, xsl:variable* | xsl:message*, xsl:result. The only required
+ * element is xsl:result, which must be the last child.
+ * Note: I assume xsl:comment is allowed anywhere.
+ */
+ public void validate(ElemTemplateElement elem, StylesheetHandler handler)
+ throws SAXException
+ {
+ String msg = "";
+ int result = 0; // Number of xsl:result elements.
+ int elemOrder = 0;
+ int lastElemOrder = 0;
+ boolean invalid = false;
+ elem = elem.getFirstChildElem();
+ while (elem != null)
+ {
+ if (elem.getXSLToken() == Constants.ELEMNAME_PARAMVARIABLE)
+ elemOrder = 0;
+ else if (elem.getXSLToken() == Constants.ELEMNAME_VARIABLE ||
+ elem.getXSLToken() == Constants.ELEMNAME_MESSAGE)
+ elemOrder = 1;
+ else if (elem.getXSLToken() == Constants.ELEMNAME_FUNCRESULT)
+ {
+ elemOrder = 2;
+ if (++result > 1)
+ {
+ msg = "xsl:function cannot contain more than one xsl:result element.";
+ invalid = true;
+ }
+ }
+ else if (elem.getXSLToken() != Constants.ELEMNAME_COMMENT)
+ {
+ msg = "xsl:function contains invalid content.";
+ invalid = true;
+ }
+ if (elemOrder < lastElemOrder)
+ {
+ msg = "xsl:function elements do not appear in the proper order.";
+ invalid = true;
+ }
+ elem = elem.getNextSiblingElem();
+ lastElemOrder = elemOrder;
+ }
+ if (result != 1)
+ {
+ msg = "The last element in an xsl:function must be an xsl:result.";
+ invalid = true;
+ }
+ if (invalid)
+ handler.error(msg, new SAXException(msg));
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/xalan/processor/ProcessorOutputElem.java b/src/org/apache/xalan/processor/ProcessorOutputElem.java
index 66599bb..30a936d 100644
--- a/src/org/apache/xalan/processor/ProcessorOutputElem.java
+++ b/src/org/apache/xalan/processor/ProcessorOutputElem.java
@@ -72,6 +72,7 @@
import org.xml.sax.Attributes;
+
/**
* TransformerFactory for xsl:output markup.
* @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a>
@@ -79,7 +80,7 @@
*/
class ProcessorOutputElem extends XSLTElementProcessor
{
-
+
/** The output properties, set temporarily while the properties are
* being set from the attributes, and then nulled after that operation
* is completed. */
@@ -90,7 +91,7 @@
* @see javax.xml.transform.OutputKeys#CDATA_SECTION_ELEMENTS
* @param newValue non-null reference to processed attribute value.
*/
- public void setCdataSectionElements(java.util.Vector newValue)
+ public void setCdataSectionElements(java.util.Vector newValue, QName qname)
{
m_outputProperties.setQNameProperties(OutputKeys.CDATA_SECTION_ELEMENTS, newValue);
}
@@ -204,6 +205,18 @@
QName key = new QName(attrUri, attrLocalName);
m_outputProperties.setProperty(key, attrValue);
}
+
+ //XSLT 2.0
+
+ public void setName(QName v)
+ {
+ m_outputProperties.setQNameProperty("name", v);
+ }
+
+ public QName getName()
+ {
+ return m_outputProperties.getQNameProperty("name");
+ }
/**
* Receive notification of the start of an xsl:output element.
@@ -234,7 +247,7 @@
m_outputProperties.setLocaterInfo(handler.getLocator());
m_outputProperties.setUid(handler.nextUid());
setPropertiesFromAttributes(handler, rawName, attributes, this);
-
+
// Access this only from the Hashtable level... we don't want to
// get default properties.
String entitiesFileName =
@@ -254,7 +267,8 @@
}
}
- handler.getStylesheet().setOutput(m_outputProperties);
+ // for 2.0, can have multiple output properties, identified by name.
+ handler.getStylesheet().setOutput(m_outputProperties);
ElemTemplateElement parent = handler.getElemTemplateElement();
parent.appendChild(m_outputProperties);
diff --git a/src/org/apache/xalan/processor/ProcessorResultDocument.java b/src/org/apache/xalan/processor/ProcessorResultDocument.java
new file mode 100644
index 0000000..7d78fda
--- /dev/null
+++ b/src/org/apache/xalan/processor/ProcessorResultDocument.java
@@ -0,0 +1,117 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xalan.processor;
+
+import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.res.XSLTErrorResources;
+
+import javax.xml.transform.TransformerException;
+import org.xml.sax.Attributes;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.NoSuchMethodException;
+import java.lang.InstantiationException;
+import java.lang.IllegalAccessException;
+
+import java.util.Vector;
+
+import org.apache.xml.utils.QName;
+import org.apache.xalan.templates.Constants;
+import org.apache.xalan.templates.*;
+
+/**
+ * This class processes parse events for an XSLT template element.
+ * @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a>
+ * @see <a href="http://www.w3.org/TR/xslt#section-Creating-the-Result-Tree">section-Creating-the-Result-Tree in XSLT Specification</a>
+ */
+public class ProcessorResultDocument extends ProcessorTemplateElem
+{
+ public void startElement(
+ StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)
+ throws org.xml.sax.SAXException
+ {
+ super.startElement(handler, uri, localName, rawName, attributes);
+ // validate? Cannot be owned by variable, parameter, message, what else?
+ if (localName.equals(Constants.ELEMNAME_PRINCIPALRESULTDOCUMENT_STRING))
+ validatePrincipal(handler);
+ }
+
+ public void endElement(
+ StylesheetHandler handler, String uri, String localName, String rawName)
+ throws org.xml.sax.SAXException
+ {
+ super.endElement(handler, uri, localName, rawName);
+ // validate??
+ }
+
+ /**
+ * This element must be a child of the Stylesheet.
+ */
+ private void validatePrincipal(StylesheetHandler handler)
+ throws org.xml.sax.SAXException
+ {
+ ElemTemplateElement parent = handler.getElemTemplateElement().getParentElem();
+ //System.out.println("validatePrincipal parent " + parent);
+ if (!(parent instanceof StylesheetRoot))
+ {
+ String msg = "xsl:principal-result-document must be a top-level element.";
+ handler.error(msg, new org.xml.sax.SAXException(msg));
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/xalan/processor/XSLTSchema.java b/src/org/apache/xalan/processor/XSLTSchema.java
index b0fc4f9..5165864 100644
--- a/src/org/apache/xalan/processor/XSLTSchema.java
+++ b/src/org/apache/xalan/processor/XSLTSchema.java
@@ -86,6 +86,9 @@
XSLTAttributeDef hrefAttr = new XSLTAttributeDef(null, "href",
XSLTAttributeDef.T_URL, true);
+ XSLTAttributeDef hrefAttrOpt = new XSLTAttributeDef(null, "href",
+ XSLTAttributeDef.T_URL, false);
+
XSLTAttributeDef elementsAttr = new XSLTAttributeDef(null, "elements",
XSLTAttributeDef.T_SIMPLEPATTERNLIST,
true);
@@ -247,6 +250,20 @@
XSLTAttributeDef xslVersionAttr =
new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "version",
XSLTAttributeDef.T_NMTOKEN, false);
+ //dml for result-document
+ XSLTAttributeDef resultDocFormatAttr =
+ new XSLTAttributeDef(null, "format",
+ XSLTAttributeDef.T_QNAME, false);
+ // dml for output
+ XSLTAttributeDef includeContentTypeAttr = new XSLTAttributeDef(null,
+ "include-content-type",
+ XSLTAttributeDef.T_YESNO,
+ false);
+ XSLTAttributeDef escapeUriAttributesAttr = new XSLTAttributeDef(null,
+ "excape-uri-asttributes",
+ XSLTAttributeDef.T_YESNO,
+ false);
+
XSLTElementDef charData = new XSLTElementDef(this, null, "text()",
null /*alias */, null /* elements */, null, /* attributes */
new ProcessorCharacters(),
@@ -267,9 +284,12 @@
XSLTAttributeDef xslResultAttr =
new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "*",
XSLTAttributeDef.T_CDATA, false);
- XSLTElementDef[] templateElements = new XSLTElementDef[21];
- XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[22];
- XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[22];
+ XSLTElementDef[] templateElements = new XSLTElementDef[24];
+ XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[25];
+ XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[25];
+ //exslt
+ XSLTElementDef[] exsltFunctionElements = new XSLTElementDef[25];// although should exclude some template elements.
+
XSLTElementDef[] charTemplateElements = new XSLTElementDef[15];
XSLTElementDef resultElement = new XSLTElementDef(this, null, "*",
null /*alias */,
@@ -282,7 +302,7 @@
xslVersionAttr,
xslResultAttr,
resultAttr },
- new ProcessorLRE(),
+ new ProcessorLRE(),
ElemLiteralResult.class /* class object */, 20, true);
XSLTElementDef unknownElement =
new XSLTElementDef(this, "*", "unknown", null /*alias */,
@@ -293,14 +313,14 @@
xslVersionAttr,
xslResultAttr,
resultAttr },
- new ProcessorUnknown(),
- ElemUnknown.class /* class object */, 20, true);
+ new ProcessorUnknown(),
+ ElemUnknown.class /* class object */, 20, true);
XSLTElementDef xslValueOf = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "value-of",
null /*alias */, null /* elements */,
new XSLTAttributeDef[]{ selectAttrRequired,
disableOutputEscapingAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemValueOf.class /* class object */, 20, true);
XSLTElementDef xslCopyOf = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "copy-of",
@@ -320,7 +340,7 @@
letterValueAttr,
groupingSeparatorAVT,
groupingSizeAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemNumber.class /* class object */, 20, true);
// <!-- xsl:sort cannot occur after any other elements or
@@ -335,7 +355,7 @@
dataTypeAttr,
orderAttr,
caseOrderAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemSort.class/* class object */, 19, true );
XSLTElementDef xslWithParam = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL,
@@ -343,7 +363,7 @@
templateElements /* elements */, // %template;>
new XSLTAttributeDef[]{ nameAttrRequired,
selectAttrOpt }, new ProcessorTemplateElem(),
- ElemWithParam.class /* class object */);
+ ElemWithParam.class /* class object */, 19, true);
XSLTElementDef xslApplyTemplates = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL,
"apply-templates", null /*alias */,
@@ -351,7 +371,7 @@
xslWithParam } /* elements */, new XSLTAttributeDef[]{
selectAttrDefNode,
modeAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemApplyTemplates.class /* class object */, 20, true);
XSLTElementDef xslApplyImports =
new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "apply-imports",
@@ -364,7 +384,7 @@
null /*alias */, templateElementsAndSort, // (#PCDATA %instructions; %result-elements; | xsl:sort)*
new XSLTAttributeDef[]{ selectAttrRequired,
spaceAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemForEach.class /* class object */, true, false, true, 20, true);
XSLTElementDef xslIf = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL,
@@ -381,7 +401,7 @@
testAttrRequired,
spaceAttr }, new ProcessorTemplateElem(),
ElemWhen.class /* class object */,
- false, true, 1, true);
+ false, true, 1, true);
XSLTElementDef xslOtherwise = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "otherwise",
null /*alias */,
@@ -389,13 +409,13 @@
new XSLTAttributeDef[]{ spaceAttr },
new ProcessorTemplateElem(),
ElemOtherwise.class /* class object */,
- false, false, 2, false);
+ false, false, 2, false);
XSLTElementDef xslChoose = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "choose",
null /*alias */,
new XSLTElementDef[]{ xslWhen,
xslOtherwise } /* elements */,
- new XSLTAttributeDef[]{ spaceAttr },
+ new XSLTAttributeDef[]{ spaceAttr },
new ProcessorTemplateElem(),
ElemChoose.class /* class object */, true, false, true, 20, true);
XSLTElementDef xslAttribute = new XSLTElementDef(this,
@@ -405,7 +425,7 @@
new XSLTAttributeDef[]{ nameAVTRequired,
namespaceAVTOpt,
spaceAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemAttribute.class /* class object */, 20, true);
XSLTElementDef xslCallTemplate =
new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "call-template",
@@ -420,7 +440,7 @@
templateElements /* elements */, // %template;>
new XSLTAttributeDef[]{ nameAttrRequired,
selectAttrOpt },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemVariable.class /* class object */, 20, true);
XSLTElementDef xslParam = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "param",
@@ -428,7 +448,7 @@
templateElements /* elements */, // %template;>
new XSLTAttributeDef[]{ nameAttrRequired,
selectAttrOpt },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemParam.class /* class object */, 19, true);
XSLTElementDef xslText =
new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "text",
@@ -444,7 +464,7 @@
new XSLTAttributeDef[]{
nameAVTRequired,
spaceAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemPI.class /* class object */, 20, true);
XSLTElementDef xslElement = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "element",
@@ -454,7 +474,7 @@
namespaceAVTOpt,
useAttributeSetsAttr,
spaceAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemElement.class /* class object */, 20, true);
XSLTElementDef xslComment = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "comment",
@@ -469,7 +489,7 @@
new XSLTAttributeDef[]{
spaceAttr,
useAttributeSetsAttr },
- new ProcessorTemplateElem(),
+ new ProcessorTemplateElem(),
ElemCopy.class /* class object */, 20, true);
XSLTElementDef xslMessage = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "message",
@@ -485,8 +505,67 @@
new XSLTAttributeDef[]{ spaceAttr },
new ProcessorTemplateElem(),
ElemFallback.class /* class object */, 20, true);
- int i = 0;
+ //exslt
+ XSLTElementDef exsltFunction =
+ new XSLTElementDef(this,
+ Constants.S_EXSLT_FUNCTIONS_URL,
+ "function",
+ null /*alias */,
+ exsltFunctionElements /* elements */,
+ new XSLTAttributeDef[]{ nameAttrRequired },
+ new ProcessorExsltFunction(),
+ ElemExsltFunction.class /* class object */);
+ XSLTElementDef exsltResult =
+ new XSLTElementDef(this,
+ Constants.S_EXSLT_FUNCTIONS_URL,
+ "result",
+ null /*alias */,
+ templateElements /* elements */,
+ new XSLTAttributeDef[]{ selectAttrOpt },
+ new ProcessorExsltFuncResult(),
+ ElemExsltFuncResult.class /* class object */);
+
+ //XSLT 2.0
+ XSLTElementDef xslResult = new XSLTElementDef(this,
+ Constants.S_XSLNAMESPACEURL,
+ "result",
+ null /*alias */,
+ templateElements /* elements */,
+ new XSLTAttributeDef[]{ selectAttrOpt },
+ new ProcessorFuncResult(),
+ ElemFuncResult.class /* class object */);
+ XSLTElementDef[] xslFunctionElements = new XSLTElementDef[]
+ {xslParam, xslVariable,
+ xslMessage, xslComment,
+ xslResult};
+ XSLTElementDef xslFunction = new XSLTElementDef(this,
+ Constants.S_XSLNAMESPACEURL,
+ "function",
+ null,
+ xslFunctionElements,
+ new XSLTAttributeDef[]{ nameAttrRequired },
+ new ProcessorFunction(),
+ ElemFunction.class /* class object */);
+
+ XSLTElementDef xslPrincipalResultDocument =
+ new XSLTElementDef(this,
+ Constants.S_XSLNAMESPACEURL, "principal-result-document",
+ null /*alias */,
+ templateElements,
+ new XSLTAttributeDef[]{resultDocFormatAttr, hrefAttrOpt},
+ new ProcessorResultDocument(),
+ ElemPrincipalResultDocument.class);
+ XSLTElementDef xslResultDocument =
+ new XSLTElementDef(this,
+ Constants.S_XSLNAMESPACEURL, "result-document",
+ null /*alias */,
+ templateElements,
+ new XSLTAttributeDef[]{resultDocFormatAttr, hrefAttr},
+ new ProcessorResultDocument(),
+ ElemResultDocument.class);
+
+ int i = 0;
templateElements[i++] = charData; // #PCDATA
// char-instructions
@@ -512,22 +591,22 @@
templateElements[i++] = xslAttribute;
templateElements[i++] = resultElement;
templateElements[i++] = unknownElement;
+ templateElements[i++] = xslResult;
+ templateElements[i++] = exsltResult;
+ templateElements[i++] = xslResultDocument; // May NOT appear in xslFunction or exsltFunction.
int k;
for (k = 0; k < i; k++)
{
templateElementsAndParams[k] = templateElements[k];
- }
-
- templateElementsAndParams[k] = xslParam;
-
- for (k = 0; k < i; k++)
- {
templateElementsAndSort[k] = templateElements[k];
+ exsltFunctionElements[k] = templateElements[k];
}
-
+ templateElementsAndParams[k] = xslParam;
templateElementsAndSort[k] = xslSort;
+ exsltFunctionElements[k] = xslParam;
+
i = 0;
charTemplateElements[i++] = charData; // #PCDATA
@@ -553,164 +632,184 @@
new XSLTAttributeDef[]{ hrefAttr }, // EMPTY
new ProcessorImport(),
null /* class object */,
- 1, true);
+ 1, true);
XSLTElementDef includeDef = new XSLTElementDef(this,
Constants.S_XSLNAMESPACEURL, "include",
null /*alias */, null /* elements */, // EMPTY
new XSLTAttributeDef[]{ hrefAttr },
new ProcessorInclude(),
null /* class object */,
- 20, true);
- XSLTElementDef[] topLevelElements = new XSLTElementDef[]{ includeDef,
- importDef,
- // resultElement,
- whiteSpaceOnly,
- unknownElement,
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "strip-space",
- null /*alias */,
- null /* elements */,
- new XSLTAttributeDef[]{
- elementsAttr },
- new ProcessorStripSpace(),
- null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "preserve-space",
- null /*alias */,
- null /* elements */,
- new XSLTAttributeDef[]{
- elementsAttr },
- new ProcessorPreserveSpace(),
- null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "output",
- null /*alias */,
- null /* elements */,
- new XSLTAttributeDef[]{
- methodAttr,
- versionAttr,
- encodingAttr,
- omitXmlDeclarationAttr,
- standaloneAttr,
- doctypePublicAttr,
- doctypeSystemAttr,
- cdataSectionElementsAttr,
- indentAttr,
- mediaTypeAttr,
- XSLTAttributeDef.m_foreignAttr },
- new ProcessorOutputElem(), null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "key",
- null /*alias */,
- null /* elements */, // EMPTY
- new XSLTAttributeDef[]{ nameAttrRequired,
- matchAttrRequired,
- useAttr },
- new ProcessorKey(), null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "decimal-format",
- null /*alias */,
- null /* elements */, // EMPTY
- new XSLTAttributeDef[]{
- nameAttrOpt,
- decimalSeparatorAttr,
- groupingSeparatorAttr,
- infinityAttr,
- minusSignAttr,
- NaNAttr,
- percentAttr,
- perMilleAttr,
- zeroDigitAttr,
- digitAttr,
- patternSeparatorAttr },
- new ProcessorDecimalFormat(),
- null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "attribute-set",
- null /*alias */,
- new XSLTElementDef[]{
- xslAttribute } /* elements */,
- new XSLTAttributeDef[]{
- nameAttrRequired,
- useAttributeSetsAttr }, new ProcessorAttributeSet(),
- null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "variable",
- null /*alias */,
- templateElements /* elements */,
- new XSLTAttributeDef[]{
- nameAttrRequired,
- selectAttrOpt }, new ProcessorGlobalVariableDecl(),
- ElemVariable.class /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "param",
- null /*alias */,
- templateElements /* elements */,
- new XSLTAttributeDef[]{
- nameAttrRequired,
- selectAttrOpt }, new ProcessorGlobalParamDecl(),
- ElemParam.class /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "template",
- null /*alias */,
- templateElementsAndParams /* elements */,
- new XSLTAttributeDef[]{
- matchAttrOpt,
- nameAttrOpt,
- priorityAttr,
- modeAttr,
- spaceAttr }, new ProcessorTemplate(), ElemTemplate.class /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_XSLNAMESPACEURL,
- "namespace-alias",
- null /*alias */,
- null /* elements */, // EMPTY
- new XSLTAttributeDef[]{ stylesheetPrefixAttr,
- resultPrefixAttr },
- new ProcessorNamespaceAlias(), null /* class object */, 20, true),
- new XSLTElementDef(
- this,
- Constants.S_BUILTIN_EXTENSIONS_URL,
- "component",
- null /*alias */,
- new XSLTElementDef[]{
- new XSLTElementDef(
- this,
- Constants.S_BUILTIN_EXTENSIONS_URL,
- "script",
- null /*alias */,
- new XSLTElementDef[]{ charData } /* elements */,
- new XSLTAttributeDef[]{
- new XSLTAttributeDef(
- null,
- "lang",
- XSLTAttributeDef.T_NMTOKEN,
- true),
- new XSLTAttributeDef(null, "src", XSLTAttributeDef.T_URL, false) },
- new ProcessorLRE(),
- ElemExtensionScript.class /* class object */, 20, true) }, // EMPTY
- new XSLTAttributeDef[]{ new XSLTAttributeDef(null, "prefix", XSLTAttributeDef.T_NMTOKEN, true),
- new XSLTAttributeDef(null, "elements", XSLTAttributeDef.T_STRINGLIST, false),
- new XSLTAttributeDef(null, "functions", XSLTAttributeDef.T_STRINGLIST, false) }, new ProcessorLRE(), ElemExtensionDecl.class /* class object */) };
+ 20, true);
+
+ XSLTElementDef[] topLevelElements = new XSLTElementDef[]
+ {includeDef,
+ importDef,
+ // resultElement,
+ whiteSpaceOnly,
+ unknownElement,
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "strip-space",
+ null /*alias */,
+ null /* elements */,
+ new XSLTAttributeDef[]{
+ elementsAttr },
+ new ProcessorStripSpace(),
+ null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "preserve-space",
+ null /*alias */,
+ null /* elements */,
+ new XSLTAttributeDef[]{
+ elementsAttr },
+ new ProcessorPreserveSpace(),
+ null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "output",
+ null /*alias */,
+ null /* elements */,
+ new XSLTAttributeDef[]{
+ nameAttrOpt /*2.0-dml */,
+ methodAttr,
+ versionAttr,
+ encodingAttr,
+ omitXmlDeclarationAttr,
+ standaloneAttr,
+ doctypePublicAttr,
+ doctypeSystemAttr,
+ cdataSectionElementsAttr,
+ indentAttr,
+ mediaTypeAttr,
+ includeContentTypeAttr,
+ escapeUriAttributesAttr,
+ XSLTAttributeDef.m_foreignAttr },
+ new ProcessorOutputElem(), null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "key",
+ null /*alias */,
+ null /* elements */, // EMPTY
+ new XSLTAttributeDef[]{ nameAttrRequired,
+ matchAttrRequired,
+ useAttr },
+ new ProcessorKey(), null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "decimal-format",
+ null /*alias */,
+ null /* elements */, // EMPTY
+ new XSLTAttributeDef[]{
+ nameAttrOpt,
+ decimalSeparatorAttr,
+ groupingSeparatorAttr,
+ infinityAttr,
+ minusSignAttr,
+ NaNAttr,
+ percentAttr,
+ perMilleAttr,
+ zeroDigitAttr,
+ digitAttr,
+ patternSeparatorAttr },
+ new ProcessorDecimalFormat(),
+ null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "attribute-set",
+ null /*alias */,
+ new XSLTElementDef[]{
+ xslAttribute } /* elements */,
+ new XSLTAttributeDef[]{
+ nameAttrRequired,
+ useAttributeSetsAttr },
+ new ProcessorAttributeSet(),
+ null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "variable",
+ null /*alias */,
+ templateElements /* elements */,
+ new XSLTAttributeDef[]{
+ nameAttrRequired,
+ selectAttrOpt },
+ new ProcessorGlobalVariableDecl(),
+ ElemVariable.class /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "param",
+ null /*alias */,
+ templateElements /* elements */,
+ new XSLTAttributeDef[]{
+ nameAttrRequired,
+ selectAttrOpt },
+ new ProcessorGlobalParamDecl(),
+ ElemParam.class /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "template",
+ null /*alias */,
+ templateElementsAndParams /* elements */,
+ new XSLTAttributeDef[]{
+ matchAttrOpt,
+ nameAttrOpt,
+ priorityAttr,
+ modeAttr,
+ spaceAttr },
+ new ProcessorTemplate(), ElemTemplate.class /* class object */, true, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_XSLNAMESPACEURL,
+ "namespace-alias",
+ null /*alias */,
+ null /* elements */, // EMPTY
+ new XSLTAttributeDef[]{
+ stylesheetPrefixAttr,
+ resultPrefixAttr },
+ new ProcessorNamespaceAlias(), null /* class object */, 20, true),
+ new XSLTElementDef(
+ this,
+ Constants.S_BUILTIN_EXTENSIONS_URL,
+ "component",
+ null /*alias */,
+ new XSLTElementDef[]{
+ new XSLTElementDef(
+ this,
+ Constants.S_BUILTIN_EXTENSIONS_URL,
+ "script",
+ null /*alias */,
+ new XSLTElementDef[]{
+ charData } /* elements */,
+ new XSLTAttributeDef[]{
+ new XSLTAttributeDef(
+ null,
+ "lang",
+ XSLTAttributeDef.T_NMTOKEN,
+ true),
+ new XSLTAttributeDef(
+ null, "src", XSLTAttributeDef.T_URL, false) },
+ new ProcessorLRE(),
+ ElemExtensionScript.class /* class object */, 20, true) }, // EMPTY
+ new XSLTAttributeDef[]{
+ new XSLTAttributeDef(
+ null, "prefix", XSLTAttributeDef.T_NMTOKEN, true),
+ new XSLTAttributeDef(
+ null, "elements", XSLTAttributeDef.T_STRINGLIST, false),
+ new XSLTAttributeDef(
+ null, "functions", XSLTAttributeDef.T_STRINGLIST, false) },
+ new ProcessorLRE(), ElemExtensionDecl.class /* class object */),
+ exsltFunction, xslFunction/* exslt, stylesheet function*/,
+ xslPrincipalResultDocument}; //end of topevelElements
+
XSLTAttributeDef excludeResultPrefixesAttr =
new XSLTAttributeDef(null, "exclude-result-prefixes",
XSLTAttributeDef.T_STRINGLIST, false);
diff --git a/src/org/apache/xalan/templates/ElemFuncResult.java b/src/org/apache/xalan/templates/ElemFuncResult.java
new file mode 100644
index 0000000..1ff34e2
--- /dev/null
+++ b/src/org/apache/xalan/templates/ElemFuncResult.java
@@ -0,0 +1,74 @@
+package org.apache.xalan.templates;
+
+//import org.w3c.dom.*;
+import org.apache.xml.dtm.DTM;
+
+import org.xml.sax.*;
+
+import org.apache.xpath.*;
+import org.apache.xpath.Expression;
+import org.apache.xpath.objects.XObjectFactory;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XRTreeFrag;
+import org.apache.xpath.objects.XRTreeFragSelectWrapper;
+import org.apache.xml.utils.QName;
+import org.apache.xalan.trace.SelectionEvent;
+import org.apache.xalan.res.XSLTErrorResources;
+import org.apache.xalan.transformer.TransformerImpl;
+
+import javax.xml.transform.TransformerException;
+
+/**
+ * Handles the xsl:result element within an xsl:function element.
+ */
+public class ElemFuncResult extends ElemVariable
+{
+
+ /**
+ * Generate the xsl:function return value, and assign it to the variable
+ * index slot assigned for it in ElemFunction compose().
+ *
+ */
+ public void execute(TransformerImpl transformer) throws TransformerException
+ {
+ XPathContext context = transformer.getXPathContext();
+ VariableStack varStack = context.getVarStack();
+ // ElemFunc result should always be the last child of an ElemFunction.
+ ElemFunction owner = this.getParentElem() instanceof ElemFunction ?
+ (ElemFunction)this.getParentElem() : null;
+ if (owner != null)
+ {
+ int resultIndex = owner.getResultIndex();
+ int sourceNode = context.getCurrentNode();
+ // Set the return value;
+ XObject var = getValue(transformer, sourceNode);
+ varStack.setLocalVariable(resultIndex, var);
+ }
+ }
+
+ /**
+ * Get an integer representation of the element type.
+ *
+ * @return An integer representation of the element, defined in the
+ * Constants class.
+ * @see org.apache.xalan.templates.Constants
+ */
+ public int getXSLToken()
+ {
+ return Constants.ELEMNAME_FUNCRESULT;
+ }
+
+ /**
+ * Return the node name, defined in the
+ * Constants class.
+ * @see org.apache.xalan.templates.Constants.
+ * @return The node name
+ *
+ */
+ public String getNodeName()
+ {
+ return Constants.ELEMNAME_FUNCRESULT_STRING;
+ }
+
+}
diff --git a/src/org/apache/xalan/templates/ElemFunction.java b/src/org/apache/xalan/templates/ElemFunction.java
new file mode 100644
index 0000000..f35a342
--- /dev/null
+++ b/src/org/apache/xalan/templates/ElemFunction.java
@@ -0,0 +1,234 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xalan.templates;
+
+//import org.w3c.dom.*;
+import org.apache.xml.dtm.DTM;
+
+import org.xml.sax.*;
+
+import org.apache.xpath.*;
+import org.apache.xpath.Expression;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XNumber;
+import org.apache.xpath.objects.XRTreeFrag;
+import org.apache.xpath.objects.XRTreeFragSelectWrapper;
+import org.apache.xml.utils.QName;
+import org.apache.xalan.trace.SelectionEvent;
+import org.apache.xalan.res.XSLTErrorResources;
+import org.apache.xalan.transformer.TransformerImpl;
+
+import org.apache.xalan.extensions.ExtensionsTable;
+
+import javax.xml.transform.TransformerException;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.xalan.extensions.ExtensionNamespaceSupport;
+import org.apache.xalan.extensions.ExtensionHandlerExsltFunction;
+
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Implement func:function.
+ */
+public class ElemFunction extends ElemTemplate
+{
+
+ /**
+ * Get an integer representation of the element type.
+ *
+ * @return An integer representation of the element, defined in the
+ * Constants class.
+ * @see org.apache.xalan.templates.Constants
+ */
+ public int getXSLToken()
+ {
+ return Constants.ELEMNAME_FUNCTION;
+ }
+
+ /**
+ * Return the node name, defined in the
+ * Constants class.
+ * @see org.apache.xalan.templates.Constants.
+ * @return The node name
+ *
+ */
+ public String getNodeName()
+ {
+ return Constants.ELEMNAME_FUNCTION_STRING;
+ }
+
+ public void execute(TransformerImpl transformer, XObject[] args)
+ throws TransformerException
+ {
+ XPathContext xctxt = transformer.getXPathContext();
+ VariableStack vars = xctxt.getVarStack();
+
+ // Set parameters.
+ NodeList children = this.getChildNodes();
+ int numparams =0;
+ for (int i = 0; i < args.length; i ++)
+ {
+ Node child = children.item(i);
+ if (children.item(i) instanceof ElemParam)
+ {
+ numparams++;
+ ElemParam param = (ElemParam)children.item(i);
+ vars.setLocalVariable (param.m_index, args[i]);
+ }
+ }
+ if (numparams < args.length)
+ throw new TransformerException ("function called with too many args");
+
+ // Removed ElemTemplate 'push' and 'pop' of RTFContext, in order to avoid losing the RTF context
+ // before a value can be returned. ElemFunction operates in the scope of the template that called
+ // the function.
+ // xctxt.pushRTFContext();
+
+ if (TransformerImpl.S_DEBUG)
+ transformer.getTraceManager().fireTraceEvent(this);
+
+ // Be sure the return value is not set (so can verify that only one result
+ // is generated per ElemFunction execute).
+ vars.setLocalVariable(_resultIndex, null);
+ transformer.executeChildTemplates(this, true);
+
+ if (TransformerImpl.S_DEBUG)
+ transformer.getTraceManager().fireTraceEndEvent(this);
+
+ // Following ElemTemplate 'pop' removed -- see above.
+ // xctxt.popRTFContext();
+
+ }
+ //int m_inArgsSize;
+ //public int m_frameSize;
+
+ /**
+ * Called after everything else has been
+ * recomposed, and allows the function to set remaining
+ * values that may be based on some other property that
+ * depends on recomposition. Also adds a slot to the variable
+ * stack for the return value. The result element will place
+ * its value in this slot.
+ */
+ public void compose(StylesheetRoot sroot) throws TransformerException
+ {
+ super.compose(sroot);
+ StylesheetRoot.ComposeState cstate = sroot.getComposeState();
+ // Add a position on the variable stack for the return value.
+ setResultIndex(cstate.addVariableName
+ (new QName(Constants.S_XSLNAMESPACEURL, "result")));
+
+ // Register the function namespace (if not already registered).
+ // Note: if regsitered for EXSLT, override; cannot be overriden by EXSLT.
+ String namespace = getName().getNamespace();
+ String handlerClass = "org.apache.xalan.extensions.ExtensionHandlerStylesheetFunction";
+ Object[] args ={namespace, sroot};
+ ExtensionNamespaceSupport extNsSpt =
+ new ExtensionNamespaceSupport(namespace, handlerClass, args);
+ sroot.getExtensionNamespacesManager().registerExtension(extNsSpt);
+ }
+
+ /**
+ * Add the namespace to the StylesheetRoot vector of extension namespaces. Be sure the
+ * exslt:function namespace is also added.
+ */
+/* public void runtimeInit(TransformerImpl transformer) throws TransformerException
+ {
+ //System.out.println("elemFunction.runtimeInit()");
+ String namespace = getName().getNamespace();
+ ExtensionsTable etable = transformer.getExtensionsTable();
+ StylesheetRoot sroot = transformer.getStylesheet();
+ ExtensionHandlerExsltFunction exsltHandler =
+ new ExtensionHandlerExsltFunction(namespace, sroot);
+ //etable.addExtensionNamespace(namespace, exsltHandler);
+ // Make sure there is a handler for the EXSLT functions namespace
+ // -- for isElementAvailable().
+ if (!(namespace.equals(Constants.S_EXSLT_FUNCTIONS_URL)))
+ {
+ exsltHandler = new ExtensionHandlerExsltFunction(
+ Constants.S_EXSLT_FUNCTIONS_URL,
+ sroot);
+ // etable.addExtensionNamespace(Constants.S_EXSLT_FUNCTIONS_URL,
+ // exsltHandler);
+ }
+ }
+*/
+
+ private int _resultIndex;
+
+ /**
+ * Sets aside a position on the local variable stack index
+ * to refer to the result element return value.
+ */
+ void setResultIndex(int stackIndex)
+ {
+ _resultIndex = stackIndex;
+ }
+
+ /**
+ * Provides the EXSLT extension handler access to the return value.
+ */
+ public int getResultIndex()
+ {
+ return _resultIndex;
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/xalan/templates/ElemPrincipalResultDocument.java b/src/org/apache/xalan/templates/ElemPrincipalResultDocument.java
new file mode 100644
index 0000000..768dd3e
--- /dev/null
+++ b/src/org/apache/xalan/templates/ElemPrincipalResultDocument.java
@@ -0,0 +1,273 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xalan.templates;
+
+import java.lang.InstantiationException;
+
+import java.io.Serializable;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+// Xalan imports
+import org.apache.xml.utils.UnImplNode;
+import org.apache.xml.utils.NameSpace;
+import org.apache.xml.utils.PrefixResolver;
+import org.apache.xml.utils.QName;
+import org.apache.xml.utils.StringToStringTable;
+import org.apache.xalan.res.XSLTErrorResources;
+import org.apache.xalan.res.XSLMessages;
+import org.apache.xalan.transformer.TransformerImpl;
+import org.apache.xalan.transformer.ResultNameSpace;
+import org.apache.xalan.transformer.ResultTreeHandler;
+import org.apache.xpath.VariableStack;
+import org.apache.xpath.WhitespaceStrippingElementMatcher;
+import org.apache.xpath.ExpressionNode;
+
+// TRaX imports
+import javax.xml.transform.Templates;
+import javax.xml.transform.SourceLocator;
+
+// DOM Imports
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.apache.xml.dtm.DTM;
+
+// SAX Imports
+import org.xml.sax.Locator;
+import javax.xml.transform.TransformerException;
+
+import org.xml.sax.helpers.NamespaceSupport;
+import org.apache.xml.utils.NamespaceSupport2;
+import org.xml.sax.ContentHandler;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import javax.xml.transform.Result;
+import javax.xml.transform.stream.StreamResult;
+
+import java.util.Properties;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * An instance of this class represents an element inside
+ * an xsl:template class. It has a single "execute" method
+ * which is expected to perform the given action on the
+ * result tree.
+ * This class acts like a Element node, and implements the
+ * Element interface, but is not a full implementation
+ * of that interface... it only implements enough for
+ * basic traversal of the tree.
+ *
+ * @see Stylesheet
+ */
+public class ElemPrincipalResultDocument extends ElemTemplateElement
+{
+
+ /**
+ * The value of the "format" attribute.
+ * @serial
+ */
+ protected QName m_qname;
+
+ protected String m_href;
+
+ /**
+ * Set the "name" attribute.
+ * Both xsl:variable and xsl:param have a required name
+ * attribute, which specifies the name of the variable. The
+ * value of the name attribute is a QName, which is expanded
+ * as described in [2.4 Qualified Names].
+ * @see <a href="http://www.w3.org/TR/xslt#qname">qname in XSLT Specification</a>
+ *
+ * @param v Value to set for the "format" attribute.
+ */
+ public void setFormat(QName v)
+ {
+ m_qname = v;
+ }
+
+ /**
+ * Get the "name" attribute.
+ * Both xsl:variable and xsl:param have a required name
+ * attribute, which specifies the name of the variable. The
+ * value of the name attribute is a QName, which is expanded
+ * as described in [2.4 Qualified Names].
+ * @see <a href="http://www.w3.org/TR/xslt#qname">qname in XSLT Specification</a>
+ *
+ * @return Value of the "format" attribute.
+ */
+ public QName getFormat()
+ {
+ return m_qname;
+ }
+
+ public void setHref(String v)
+ {
+ m_href = v;
+ }
+
+ public String getHref()
+ {
+ return m_href;
+ }
+
+ private OutputProperties m_outputProperties;
+
+ public void compose(StylesheetRoot sroot) throws TransformerException
+ {
+ //System.out.println("ElemPrincipalResultDocument.compose()-- format " + getFormat());
+ super.compose(sroot);
+ m_outputProperties = sroot.getOutputComposed(getFormat());
+ // set primary output properties for the stylesheet.
+ sroot.setOutputProperties(m_outputProperties);
+ }
+
+ // runtimeInit() is called; execute() is not. Seems like a little overkill setting output props
+ // and content handler, but anything less doesn't seem to work.
+ public void runtimeInit(TransformerImpl transformer) throws TransformerException
+ {
+ //System.out.println("ElemPrincipalResultDocument.runtimeInit()");
+ transformer.setOutputFormat(m_outputProperties);
+ String fileName = "primary.out";
+ try
+ {
+ if (null != getHref())
+ {
+ fileName = urlToFileName(getHref());
+ }
+ File file = new File(fileName);
+ if (!(file.isAbsolute()))
+ {
+ fileName = makeAbsolute(fileName, transformer);
+ file = new File(fileName);
+ }
+ if (transformer.OutputFileAlreadyUsed(fileName)) // should never be true.
+ throw new TransformerException("Output file already used -- " + fileName);
+
+ String dirStr = file.getParent();
+ if((null != dirStr) && (dirStr.length() > 0))
+ {
+ File dir = new File(dirStr);
+ dir.mkdirs();
+ }
+
+ Result primaryResult = new StreamResult(new FileOutputStream(file));
+ // Be sure to set system ID; used for setting base for secondary
+ // output documents.
+ primaryResult.setSystemId(getHref());
+ transformer.setOutputTarget(primaryResult);
+ ContentHandler primaryHandler = transformer.createResultContentHandler
+ (primaryResult, m_outputProperties);
+ transformer.setContentHandler(primaryHandler);
+ }
+ catch (FileNotFoundException fe)
+ {
+ throw new TransformerException(fe);
+ }
+ }
+
+ /**
+ * Based on Redirect, which questions its use!
+ * In addition to purging "file" scheme (as in
+ * Redirect), also adjusts the file separator.
+ * Static so can be called from ElemResultDocument for
+ * managing secondary output documents.
+ */
+ protected static String urlToFileName(String url)
+ {
+ String fileName = url;
+ if(null != url)
+ {
+ if(url.startsWith("file:////"))
+ fileName = url.substring(7);
+ else if(url.startsWith("file:///"))
+ fileName = url.substring(6);
+ else if(url.startsWith("file://"))
+ fileName = url.substring(5);
+ else if(url.startsWith("file:/"))
+ fileName = url.substring(5);
+ else if(url.startsWith("file:"))
+ fileName = url.substring(4);
+
+ if (File.separatorChar != '/')
+ fileName = fileName.replace(File.separatorChar, '/');
+ }
+ return fileName;
+ }
+
+ protected static String makeAbsolute(String fileName, TransformerImpl transformer)
+ {
+ String base = "";
+ Result outputTarget = transformer.getOutputTarget();
+ if ( (null != outputTarget) && ((base = outputTarget.getSystemId()) != null) )
+ {
+ base = ElemPrincipalResultDocument.urlToFileName(base);
+ }
+ else
+ {
+ base = ElemPrincipalResultDocument.urlToFileName(transformer.getBaseURLOfSource());
+ }
+ File file = new File(base).getAbsoluteFile();
+ String baseDir = file.getParent();
+ return baseDir + File.separator + fileName;
+ }
+
+}
diff --git a/src/org/apache/xalan/templates/ElemResultDocument.java b/src/org/apache/xalan/templates/ElemResultDocument.java
new file mode 100644
index 0000000..d766137
--- /dev/null
+++ b/src/org/apache/xalan/templates/ElemResultDocument.java
@@ -0,0 +1,256 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xalan.templates;
+
+import java.lang.InstantiationException;
+
+import java.io.Serializable;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+// Xalan imports
+import org.apache.xml.utils.UnImplNode;
+import org.apache.xml.utils.NameSpace;
+import org.apache.xml.utils.PrefixResolver;
+import org.apache.xml.utils.QName;
+import org.apache.xml.utils.StringToStringTable;
+import org.apache.xalan.res.XSLTErrorResources;
+import org.apache.xalan.res.XSLMessages;
+import org.apache.xalan.transformer.TransformerImpl;
+import org.apache.xalan.transformer.ResultNameSpace;
+import org.apache.xalan.transformer.ResultTreeHandler;
+import org.apache.xpath.VariableStack;
+import org.apache.xpath.WhitespaceStrippingElementMatcher;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.XPathContext;
+
+// TRaX imports
+import javax.xml.transform.Templates;
+import javax.xml.transform.SourceLocator;
+
+// DOM Imports
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.apache.xml.dtm.DTM;
+
+// SAX Imports
+import org.xml.sax.Locator;
+import javax.xml.transform.TransformerException;
+import org.xml.sax.ContentHandler;
+
+import org.xml.sax.helpers.NamespaceSupport;
+import org.apache.xml.utils.NamespaceSupport2;
+
+import java.util.Properties;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import javax.xml.transform.Result;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.xalan.templates.*;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * An instance of this class represents an element inside
+ * an xsl:template class. It has a single "execute" method
+ * which is expected to perform the given action on the
+ * result tree.
+ * This class acts like a Element node, and implements the
+ * Element interface, but is not a full implementation
+ * of that interface... it only implements enough for
+ * basic traversal of the tree.
+ *
+ * @see Stylesheet
+ */
+public class ElemResultDocument extends ElemTemplateElement
+{
+
+ /**
+ * The value of the "format" attribute.
+ * @serial
+ */
+ protected QName m_qname;
+
+ protected String m_href;
+
+ /**
+ * Set the "name" attribute.
+ * Both xsl:variable and xsl:param have a required name
+ * attribute, which specifies the name of the variable. The
+ * value of the name attribute is a QName, which is expanded
+ * as described in [2.4 Qualified Names].
+ * @see <a href="http://www.w3.org/TR/xslt#qname">qname in XSLT Specification</a>
+ *
+ * @param v Value to set for the "format" attribute.
+ */
+ public void setFormat(QName v)
+ {
+ m_qname = v;
+ }
+
+ /**
+ * Get the "name" attribute.
+ * Both xsl:variable and xsl:param have a required name
+ * attribute, which specifies the name of the variable. The
+ * value of the name attribute is a QName, which is expanded
+ * as described in [2.4 Qualified Names].
+ * @see <a href="http://www.w3.org/TR/xslt#qname">qname in XSLT Specification</a>
+ *
+ * @return Value of the "format" attribute.
+ */
+ public QName getFormat()
+ {
+ return m_qname;
+ }
+
+ public void setHref(String v)
+ {
+ m_href = v;
+ }
+
+ public String getHref()
+ {
+ return m_href;
+ }
+
+ private OutputProperties m_outputProperties;
+
+ public void compose(StylesheetRoot sroot) throws TransformerException
+ {
+ //System.out.println("ElemResultDocument.compose()-- format " + getFormat());
+ super.compose(sroot);
+ m_outputProperties = sroot.getOutputComposed(getFormat());
+ //System.out.println("ElemResultDocument.compose()-- m_outputProperties " +m_outputProperties);
+ }
+
+ public void execute(
+ TransformerImpl transformer)
+ throws TransformerException
+ {
+ //System.out.println("ElemResultDocument.execute()");
+ validate(this.getParentElem());
+
+ OutputProperties primaryOutProps = transformer.getOutputFormat();
+ transformer.setOutputFormat(m_outputProperties);
+ String fileName = ElemPrincipalResultDocument.urlToFileName(getHref());
+ try
+ {
+ File file = new File(fileName);
+ if (!(file.isAbsolute()))
+ {
+ fileName = ElemPrincipalResultDocument.makeAbsolute(fileName, transformer);
+ file = new File(fileName);
+ }
+ if (transformer.OutputFileAlreadyUsed(fileName))
+ throw new TransformerException("Output file already used -- " + fileName);
+
+ String dirStr = file.getParent();
+ if((null != dirStr) && (dirStr.length() > 0))
+ {
+ File dir = new File(dirStr);
+ dir.mkdirs();
+ }
+
+ Result secondaryResult = new StreamResult(new FileOutputStream(file));
+ ContentHandler primaryHandler = transformer.getContentHandler();
+ ContentHandler secondaryHandler = transformer.createResultContentHandler(secondaryResult);
+ secondaryHandler.startDocument();
+ transformer.executeChildTemplates(this, secondaryHandler);
+ secondaryHandler.endDocument();
+ transformer.setContentHandler(primaryHandler);
+ }
+ catch (Exception e)//FileNotFoundException, SAXException
+ {
+ throw new TransformerException(e);
+ }
+ finally
+ {
+ transformer.setOutputFormat (primaryOutProps);
+ }
+ }
+
+ /**
+ * Not sure at this point how to fully verify that the current result
+ * tree is not a "temporary result tree." In any case, placed the test here,
+ * rather than in ProcessorResultDocument.startElement() because checking for
+ * what the spec identifies as a "dynamic" error.
+ */
+ private void validate(ElemTemplateElement ancestor)
+ throws TransformerException
+ {
+ while (ancestor != null && !(ancestor instanceof ElemTemplate))
+ {System.out.println("validate " + ancestor);
+ if (ancestor instanceof ElemVariable
+ || ancestor instanceof ElemParam
+ || ancestor instanceof ElemMessage
+ || ancestor instanceof ElemAttribute
+ || ancestor instanceof ElemAttributeSet
+ || ancestor instanceof ElemFunction
+ || ancestor instanceof ElemExsltFunction)
+ {
+ String msg = "xsl:result-document cannot be used in this context.";
+ throw new TransformerException(msg);
+ }
+ ancestor = ancestor.getParentElem();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apache/xalan/templates/StylesheetRoot.java b/src/org/apache/xalan/templates/StylesheetRoot.java
index db43f1b..5e71b59 100644
--- a/src/org/apache/xalan/templates/StylesheetRoot.java
+++ b/src/org/apache/xalan/templates/StylesheetRoot.java
@@ -89,6 +89,11 @@
import javax.xml.transform.ErrorListener;
import org.apache.xml.dtm.ref.ExpandedNameTable;
+//dml
+import org.apache.xml.utils.StringVector;
+import org.apache.xalan.extensions.ExtensionNamespaceSupport;
+import org.apache.xalan.extensions.ExtensionHandler;
+import org.apache.xalan.extensions.ExtensionNamespacesManager;
/**
* <meta name="usage" content="general"/>
@@ -126,7 +131,7 @@
* @serial
*/
private Hashtable m_availElems;
-
+
/**
* Creates a StylesheetRoot and retains a pointer to the schema used to create this
* StylesheetRoot. The schema may be needed later for an element-available() function call.
@@ -139,7 +144,6 @@
this(listener);
m_availElems = schema.getElemsAvailable();
-
}
/**
@@ -162,6 +166,39 @@
{
return m_availElems;
}
+
+ private ExtensionNamespacesManager m_extNsMgr = null;
+
+ /**
+ * Only instantiate an ExtensionNamespacesManager if one is called for
+ * (i.e., if the stylesheet contains extension functions and/or elements).
+ */
+ public ExtensionNamespacesManager getExtensionNamespacesManager()
+ {
+ if (m_extNsMgr == null)
+ m_extNsMgr = new ExtensionNamespacesManager();
+ return m_extNsMgr;
+ }
+
+ /**
+ * Get the vector of extension namespaces. Used to provide
+ * the extensions table access to a list of extension
+ * namespaces encountered during composition of a stylesheet.
+ */
+ public Vector getExtensions()
+ {
+ return m_extNsMgr != null ? m_extNsMgr.getExtensions() : null;
+ }
+
+/*
+ public void runtimeInit(TransformerImpl transformer) throws TransformerException
+ {
+ System.out.println("StylesheetRoot.runtimeInit()");
+
+ // try{throw new Exception("StylesheetRoot.runtimeInit()");} catch(Exception e){e.printStackTrace();}
+
+ }
+*/
//============== Templates Interface ================
@@ -243,12 +280,8 @@
// Calculate the number of this import.
m_globalImportList[j--].recomposeImports();
}
- }
-
-
-
+ }
// Next, we walk the import tree and add all of the recomposable elements to the vector.
-
int n = getGlobalImportCount();
for (int i = 0; i < n; i++)
@@ -303,7 +336,10 @@
composeTemplates(included);
}
}
-
+ // Attempt to register any remaining unregistered extension namespaces.
+ if (m_extNsMgr != null)
+ m_extNsMgr.registerUnregisteredNamespaces();
+
clearComposeState();
}
@@ -447,7 +483,14 @@
* will be set as stylesheets are encountered.
* @serial
*/
- private OutputProperties m_outputProperties;
+ private OutputProperties m_outputProperties; // Keep for time being??
+ // Can set from ElemPrincipalResultDocument.
+ protected void setOutputProperties(OutputProperties primaryProps)
+ {
+ m_outputProperties = primaryProps;
+ }
+
+ private Hashtable m_outputPropertiesTable = new Hashtable();
/**
* Recompose the output format object from the included elements.
@@ -457,8 +500,25 @@
void recomposeOutput(OutputProperties oprops)
throws TransformerException
{
+ //System.out.println("StylesheetRoot.recomposeOutput() " + oprops.getName());
+ // put into m_outputPropertiesTable
- m_outputProperties.copyFrom(oprops);
+ Object key = (oprops.getName() != null)
+ ? (Object)oprops.getName(): (Object)new String("") ;
+
+ if (m_outputPropertiesTable.containsKey(key))
+ {
+ //System.out.println("has key " + key);
+ ((OutputProperties)m_outputPropertiesTable.get(key)).copyFrom(oprops);
+ }
+ else
+ {
+ //System.out.println("new key " + key);
+ OutputProperties outputProps = new OutputProperties(Method.XML);
+ outputProps.copyFrom(oprops);
+ m_outputPropertiesTable.put(key, outputProps);
+ }
+ //m_outputProperties.copyFrom(oprops);
}
/**
@@ -479,7 +539,19 @@
// System.out.println("getOutputComposed.getIndenting: "+m_outputProperties.getIndenting());
return m_outputProperties;
}
+
+ //dml
+ public OutputProperties getOutputComposed(QName qname)
+ {
+ Object key = (qname != null)
+ ? (Object)qname : (Object)new String("") ;
+ OutputProperties oprops = (OutputProperties)m_outputPropertiesTable.get(key);
+
+ return oprops;
+ }
+ // following flag must be changed to include QName param.
+
/** Flag indicating whether an output method has been set by the user.
* @serial */
private boolean m_outputMethodSet = false;