Index: c/src/xalanc/XPath/XPathExecutionContextDefault.cpp
===================================================================
--- c/src/xalanc/XPath/XPathExecutionContextDefault.cpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XPath/XPathExecutionContextDefault.cpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -393,8 +393,8 @@
     return m_stringCache.release(theString);
 }
 
+ 
 
-
 void
 XPathExecutionContextDefault::getNodeSetByKey(
             XalanDocument*          /* doc */,
@@ -666,7 +666,23 @@
 }
 
 
+XalanDocumentBuilder*
+XPathExecutionContextDefault::createDocumentBuilder(
+	const XalanDOMString&     theURI)
+{
+	return m_xpathEnvSupport->createDocumentBuilder(theURI);
+}
 
+
+void
+XPathExecutionContextDefault::destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder)
+
+{
+	m_xpathEnvSupport->destroyDocumentBuilder(theDocumentBuilder);
+}
+
+
+
 void XPathExecutionContextDefault::formatNumber(
         double                              number,
         const XalanDOMString&               pattern,
Index: c/src/xalanc/XPath/XPathExecutionContextDefault.hpp
===================================================================
--- c/src/xalanc/XPath/XPathExecutionContextDefault.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XPath/XPathExecutionContextDefault.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -308,6 +308,12 @@
 			const XalanDOMString&	theURI,
 			XalanDocument*			theDocument);
 
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr()));
+
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder);
+
 	// These interfaces are inherited from ExecutionContext...
 
 	virtual void formatNumber(
@@ -344,6 +350,8 @@
 			const XalanNode* 		sourceNode = 0,
 			const LocatorType* 		locator = 0) const;
 
+	XPathEnvSupport	*getXPathEnvSupport() { return m_xpathEnvSupport; }
+
 protected:
 
 	typedef XalanObjectCache<MutableNodeRefList, DefaultCacheCreateFunctorMemMgr<MutableNodeRefList>, DeleteFunctor<MutableNodeRefList>, ClearCacheResetFunctor<MutableNodeRefList> >	NodeListCacheType;
Index: c/src/xalanc/XPath/XPathEnvSupportDefault.cpp
===================================================================
--- c/src/xalanc/XPath/XPathEnvSupportDefault.cpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XPath/XPathEnvSupportDefault.cpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -45,7 +45,10 @@
 #include <xalanc/DOMSupport/DOMServices.hpp>
 
 
+#include <xalanc/XalanTransformer/XalanParsedSource.hpp>
+#include <xalanc/XalanTransformer/XalanDefaultDocumentBuilder.hpp>
 
+
 #include "XObject.hpp"
 #include "XObjectFactory.hpp"
 #include "XPath.hpp"
@@ -95,6 +98,7 @@
 XPathEnvSupportDefault::XPathEnvSupportDefault(MemoryManagerType&  theManager) :
 	XPathEnvSupport(),
 	m_sourceDocs(theManager),
+	m_parsedSources(theManager),
 	m_externalFunctions(theManager)
 {
 }
@@ -110,6 +114,11 @@
 			 m_externalFunctions.end(),
 			 NamespaceFunctionTableDeleteFunctor(m_externalFunctions.getMemoryManager()));
 
+    // Clean up all entries in the compliledStylesheets vector.
+    for_each(m_parsedSources.begin(),
+             m_parsedSources.end(),
+             DeleteFunctor<XalanParsedSource>(m_parsedSources.getMemoryManager()));
+
 	NamespaceFunctionTablesType temp(XalanMemMgrs::getDummyMemMgr());
 	temp.swap(m_externalFunctions);
 }
@@ -226,6 +235,13 @@
 XPathEnvSupportDefault::reset()
 {
 	m_sourceDocs.clear();
+
+	// Clean up all entries in the compliledStylesheets vector.
+    for_each(m_parsedSources.begin(),
+             m_parsedSources.end(),
+              DeleteFunctor<XalanParsedSource>(m_parsedSources.getMemoryManager()));
+	m_parsedSources.clear();
+
 }
 
 
@@ -241,6 +257,51 @@
 
 
 
+XalanDocumentBuilder*
+XPathEnvSupportDefault::createDocumentBuilder(const XalanDOMString &theURI)
+{
+    m_parsedSources.reserve(m_parsedSources.size() + 1);
+
+    XalanDocumentBuilder* const     theNewBuilder = 
+		XalanDefaultDocumentBuilder::create( m_parsedSources.getMemoryManager(), theURI);
+
+    m_parsedSources.push_back(theNewBuilder);
+
+    return theNewBuilder;
+}
+
+
+
+void
+XPathEnvSupportDefault::destroyDocumentBuilder(
+			XalanDocumentBuilder* theDocumentBuilder)
+{
+    XALAN_USING_STD(find)
+
+    const ParsedSourcePtrVectorType::iterator   i =
+        find(
+            m_parsedSources.begin(),
+            m_parsedSources.end(),
+            theDocumentBuilder);
+
+    assert(i != m_parsedSources.end());
+	if (i == m_parsedSources.end())
+    {
+		// Hmm, user problem really...
+		return;
+    }
+
+	m_parsedSources.erase(i);
+
+    assert(theDocumentBuilder != 0);
+
+    destroyObjWithMemMgr(
+        theDocumentBuilder,
+        m_parsedSources.getMemoryManager());
+}
+
+
+
 XalanDocument*
 XPathEnvSupportDefault::getSourceDocument(const XalanDOMString&		theURI) const
 {
Index: c/src/xalanc/XPath/XPathEnvSupport.hpp
===================================================================
--- c/src/xalanc/XPath/XPathEnvSupport.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XPath/XPathEnvSupport.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -56,6 +56,7 @@
 class XalanElement;
 class XalanNode;
 class XalanQName;
+class XalanDocumentBuilder;
 
 
 
@@ -105,6 +106,29 @@
 			const XalanDOMString&	theURI,
 			XalanDocument*			theDocument) = 0;
 
+    /**
+     * Create a document builder.  Using the document builder, you
+     * can construct a document using SAX2 interfaces.  The XPathEnvSupport
+     * instance owns the document builder and will delete it when the
+     * XPathEnvSupport instance goes out of scope, or you explicitly call
+     * destroyDocumentBuilder().  You must not delete the instance yourself.
+     *
+     * @param theURI The base URI for the document instance.
+     * @return  a pointer to a XalanDocumentBuilder instance or 0 for failure.
+     */
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr())) = 0;
+
+    /**
+     * Destroy a document builder created by a previous call to createDocumentBuilder().
+     * Passing a pointer that is not created by a call to createDocumentBuilder() can
+     * result in undefined behavior.
+     *
+     * @param theDocumentBuilder The document builder to destroy.
+     */
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder) = 0;
+
 	/**
 	 * Given a DOM Document, tell what URI was used to parse it. Needed for
 	 * relative resolution.
Index: c/src/xalanc/XPath/XPathExecutionContext.hpp
===================================================================
--- c/src/xalanc/XPath/XPathExecutionContext.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XPath/XPathExecutionContext.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -61,9 +61,9 @@
 class XalanElement;
 class XalanNode;
 class XalanText;
+class XalanSourceTreeDocument;
+class XalanDocumentBuilder;
 
-
-
 //
 // An abstract class which provides support for executing XPath functions
 // and extension functions.
@@ -658,6 +658,29 @@
             XalanDocument*          theDocument) = 0;
 
     /**
+     * Create a document builder.  Using the document builder, you
+     * can construct a document using SAX2 interfaces.  The XPathEnvSupport
+     * instance owns the document builder and will delete it when the
+     * XPathEnvSupport instance goes out of scope, or you explicitly call
+     * destroyDocumentBuilder().  You must not delete the instance yourself.
+     *
+     * @param theURI The base URI for the document instance.
+     * @return  a pointer to a XalanDocumentBuilder instance or 0 for failure.
+     */
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr())) = 0;
+
+    /**
+     * Destroy a document builder created by a previous call to createDocumentBuilder().
+     * Passing a pointer that is not created by a call to createDocumentBuilder() can
+     * result in undefined behavior.
+     *
+     * @param theDocumentBuilder The document builder to destroy.
+     */
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder) = 0;
+
+    /**
      * Formats a number according to the specified pattern.
      * 
      * @param number the number to be formatted
Index: c/src/xalanc/XPath/XPathEnvSupportDefault.hpp
===================================================================
--- c/src/xalanc/XPath/XPathEnvSupportDefault.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XPath/XPathEnvSupportDefault.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -34,6 +34,7 @@
 typedef XalanMap<XalanDOMString, const Function*>   FunctionTableTypeDefinition;
 XALAN_USES_MEMORY_MANAGER(FunctionTableTypeDefinition)
 
+class XalanParsedSource;
 
 /**
  * Dummy class in order to make the XPath object happy 
@@ -47,6 +48,7 @@
 	typedef XalanMap<XalanDOMString, XalanDocument*>	SourceDocsTableType;
 	typedef FunctionTableTypeDefinition                         FunctionTableType;
 	typedef XalanMap<XalanDOMString, FunctionTableType>	NamespaceFunctionTablesType;
+	typedef XalanVector<const XalanParsedSource*>	ParsedSourcePtrVectorType;
 
 	/**
 	 * Perform initialization of statics -- must be called before any
@@ -144,6 +146,12 @@
 			const XalanDOMString&	theURI,
 			XalanDocument*			theDocument);
 
+	virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr()));
+
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder*	theBuilder);
+
 	virtual const XalanDOMString&
     findURIFromDoc(const XalanDocument*     owner) const;
 
@@ -264,6 +272,8 @@
 
 	SourceDocsTableType						m_sourceDocs;
 
+	ParsedSourcePtrVectorType               m_parsedSources;
+
 	NamespaceFunctionTablesType				m_externalFunctions;
 
 	static NamespaceFunctionTablesType		s_externalFunctions;
Index: c/src/xalanc/XSLT/XSLTProcessorEnvSupport.hpp
===================================================================
--- c/src/xalanc/XSLT/XSLTProcessorEnvSupport.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XSLT/XSLTProcessorEnvSupport.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -94,6 +94,12 @@
 			const XalanDOMString&	theURI,
 			XalanDocument*			theDocument) = 0;
 
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr())) = 0;
+
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder) = 0;
+
 	virtual const XalanDOMString&
 	findURIFromDoc(const XalanDocument*		owner) const = 0;
 
Index: c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp
===================================================================
--- c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -54,6 +54,7 @@
 
 
 
+
 #include <xalanc/XalanSourceTree/FormatterToSourceTree.hpp>
 #include <xalanc/XalanSourceTree/XalanSourceTreeDocument.hpp>
 #include <xalanc/XalanSourceTree/XalanSourceTreeDocumentFragment.hpp>
@@ -2044,7 +2045,22 @@
 }
 
 
+	
+XalanDocumentBuilder*
+StylesheetExecutionContextDefault::createDocumentBuilder(const XalanDOMString&     theURI)
+{
+	return m_xpathExecutionContextDefault.createDocumentBuilder(theURI);
+}
 
+
+void
+StylesheetExecutionContextDefault::destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder)
+{
+	m_xpathExecutionContextDefault.destroyDocumentBuilder(theDocumentBuilder);
+}
+
+
+
 MutableNodeRefList*
 StylesheetExecutionContextDefault::borrowMutableNodeRefList()
 {
@@ -3086,5 +3102,4 @@
 }
 #endif
 
-
 XALAN_CPP_NAMESPACE_END
Index: c/src/xalanc/XSLT/StylesheetExecutionContext.hpp
===================================================================
--- c/src/xalanc/XSLT/StylesheetExecutionContext.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XSLT/StylesheetExecutionContext.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -2027,6 +2027,12 @@
             const XalanDOMString&   theURI,
             XalanDocument*          theDocument) = 0;
 
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr())) = 0;
+
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder) = 0;
+
     virtual void
     formatNumber(
             double                  number,
Index: c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp
===================================================================
--- c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -81,7 +81,7 @@
 typedef VariablesStack::ParamsVectorType            ParamsVectorTypeDecl;
 XALAN_USES_MEMORY_MANAGER(ParamsVectorTypeDecl)
 //
-// An class which provides support for executing stylesheets.
+// A class which provides support for executing stylesheets.
 //
 class XALAN_XSLT_EXPORT StylesheetExecutionContextDefault : public StylesheetExecutionContext
 {
@@ -929,7 +929,6 @@
     virtual bool
     releaseCachedString(XalanDOMString&     theString);
 
-
     virtual void
     getNodeSetByKey(
             XalanDocument*          doc,
@@ -978,6 +977,12 @@
             const XalanDOMString&   theURI,
             XalanDocument*          theDocument);
 
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr()));
+
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder);
+
     // These interfaces are inherited from ExecutionContext...
 
     virtual void
@@ -1290,7 +1295,6 @@
     static XalanNumberFormatFactory*    s_xalanNumberFormatFactory;
 
     static const DefaultCollationCompareFunctor     s_defaultCollationFunctor;
-
 };
 
 
Index: c/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.hpp
===================================================================
--- c/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.hpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.hpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -142,6 +142,12 @@
 			const XalanDOMString&	theURI,
 			XalanDocument*			theDocument);
 
+    virtual XalanDocumentBuilder*
+    createDocumentBuilder(const XalanDOMString&     theURI = XalanDOMString(XalanMemMgrs::getDummyMemMgr()));
+
+	virtual void
+	destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder);
+
 	virtual const XalanDOMString&
 	findURIFromDoc(const XalanDocument*		owner) const;
 
Index: c/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.cpp
===================================================================
--- c/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.cpp	(.../vendor/xml-xalan/1.10)	(revision 13764)
+++ c/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.cpp	(.../trunk/3rdparty/xml-xalan)	(revision 13764)
@@ -217,6 +238,22 @@
 
 
 
+XalanDocumentBuilder*
+XSLTProcessorEnvSupportDefault::createDocumentBuilder(const XalanDOMString&     theURI)
+{
+	return m_defaultSupport.createDocumentBuilder(theURI);
+}
+
+
+
+void
+XSLTProcessorEnvSupportDefault::destroyDocumentBuilder(XalanDocumentBuilder* theDocumentBuilder)
+{
+	m_defaultSupport.destroyDocumentBuilder(theDocumentBuilder);
+}
+
+
+
 const XalanDOMString&
 XSLTProcessorEnvSupportDefault::findURIFromDoc(const XalanDocument*		owner) const
 {
