This commit was manufactured by cvs2svn to create branch
'LotusXSL4C_1_0_0'.
diff --git a/Projects/Win32/VC6/PlatformSupport/PlatformSupport.dsp b/Projects/Win32/VC6/PlatformSupport/PlatformSupport.dsp
new file mode 100644
index 0000000..f6959f4
--- /dev/null
+++ b/Projects/Win32/VC6/PlatformSupport/PlatformSupport.dsp
@@ -0,0 +1,458 @@
+# Microsoft Developer Studio Project File - Name="PlatformSupport" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=PlatformSupport - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "PlatformSupport.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "PlatformSupport.mak" CFG="PlatformSupport - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "PlatformSupport - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "PlatformSupport - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "PlatformSupport - Win32 Release with symbols" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "PlatformSupport - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\..\..\Build\Win32\VC6\Release"
+# PROP Intermediate_Dir "..\..\..\..\Build\Win32\VC6\Release\PlatformSupport"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XALAN_PLATFORMSUPPORT_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W4 /GR /GX /O2 /Ob2 /I "..\..\..\..\..\..\xml-xerces\c\src" /I "..\..\..\..\src\\" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XALAN_PLATFORMSUPPORT_BUILD_DLL" /FD /I /xml4c/include" /I /xml4c/include" " " " " " " /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 ..\..\..\..\..\..\xml-xerces\c\Build\Win32\VC6\Release\xerces-c_1.lib /nologo /dll /pdb:none /machine:I386
+# SUBTRACT LINK32 /debug
+
+!ELSEIF  "$(CFG)" == "PlatformSupport - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\..\..\..\Build\Win32\VC6\Debug"
+# PROP Intermediate_Dir "..\..\..\..\Build\Win32\VC6\Debug\PlatformSupport"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PlatformSupport_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W4 /Gm /GR /GX /Zi /Od /I "..\..\..\..\..\..\xml-xerces\c\src" /I "..\..\..\..\src\\" /D "_WINDOWS" /D "_USRDLL" /D "XALAN_PLATFORMSUPPORT_BUILD_DLL" /D "WIN32" /D "_DEBUG" /D "_MBCS" /YX /FD /I /xml4c/include" /I /lotusxsl4c/stl" /I /lotusxsl4c/src/include" /I /xml4c/include" /GZ " " " " " " /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\..\..\..\..\xml-xerces\c\Build\Win32\VC6\Debug\xerces-c_1D.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\..\Build\Win32\VC6\Debug/PlatformSupportD.dll" /pdbtype:sept
+
+!ELSEIF  "$(CFG)" == "PlatformSupport - Win32 Release with symbols"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "PlatformSupport___Win32_Release_with_symbols"
+# PROP BASE Intermediate_Dir "PlatformSupport___Win32_Release_with_symbols"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\..\..\Build\Win32\VC6\Release.symbols"
+# PROP Intermediate_Dir "..\..\..\..\Build\Win32\VC6\Release.symbols\PlatformSupport"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W4 /GR /GX /O2 /Ob2 /I "..\..\..\..\..\..\xml-xerces\c\src" /I "..\..\..\..\src\\" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XALAN_PLATFORMSUPPORT_BUILD_DLL" /D "XALAN_XERCES" /FD /I /xml4c/include" /I /xml4c/include" " " " " " " /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /MD /W4 /GR /GX /Zi /O2 /Ob2 /I "..\..\..\..\..\..\xml-xerces\c\src" /I "..\..\..\..\src\\" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XALAN_PLATFORMSUPPORT_BUILD_DLL" /D "XALAN_XERCES" /FD /I /xml4c/include" /I /xml4c/include" " " " " " " /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 ..\..\..\..\..\..\xml-xerces\c\Build\Win32\VC6\Release\xerces-c_1.lib /nologo /dll /pdb:none /machine:I386
+# SUBTRACT BASE LINK32 /debug
+# ADD LINK32 ..\..\..\..\..\..\xml-xerces\c\Build\Win32\VC6\Release\xerces-c_1.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\..\Build\Win32\VC6\Release.symbols/PlatformSupportS.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "PlatformSupport - Win32 Release"
+# Name "PlatformSupport - Win32 Debug"
+# Name "PlatformSupport - Win32 Release with symbols"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\AttributeListImpl.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\AttributesImpl.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DOMStringHelper.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DOMStringPrintWriter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DoubleSupport.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\ExecutionContext.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\FormatterListener.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\NamedNodeMapAttributeList.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\NullPrintWriter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PlatformSupportInit.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PrefixResolver.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PrintWriter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\Resettable.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\StdBinInputStream.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\StringTokenizer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\URISupport.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\Writer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanBitmap.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDecimalFormat.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDecimalFormatSymbols.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDOMStringCache.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDOMStringHashTable.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDOMStringPool.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanFileOutputStream.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanNullOutputStream.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanNumberFormat.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanOutputStream.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanOutputStreamPrintWriter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanReferenceCountedObject.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanStdOutputStream.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanToXercesTranscoderWrapper.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanTranscodingServices.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanUTF16Transcoder.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanXMLChar.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XSLException.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\ArenaAllocator.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\ArenaBlock.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\AttributeListImpl.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\AttributesImpl.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\AttributeVectorEntry.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\AttributeVectorEntryExtended.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DirectoryEnumerator.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DOMStringHelper.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DOMStringPrintWriter.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\DoubleSupport.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\ExecutionContext.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\FormatterListener.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\NamedNodeMapAttributeList.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\NullPrintWriter.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PlatformSupportDefinitions.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PlatformSupportInit.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PrefixResolver.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\PrintWriter.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\Resettable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\ReusableArenaAllocator.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\ReusableArenaBlock.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\StdBinInputStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\StringTokenizer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\URISupport.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\Writer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanAllocator.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanBitmap.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDecimalFormat.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDecimalFormatSymbols.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDOMStringCache.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDOMStringHashTable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanDOMStringPool.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanFileOutputStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanNullOutputStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanNumberFormat.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanOutputStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanOutputStreamPrintWriter.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanReferenceCountedObject.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanStdOutputStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanToXercesTranscoderWrapper.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanTranscodingServices.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanUnicode.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanUTF16Transcoder.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XalanXMLChar.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\PlatformSupport\XSLException.hpp
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/Tests/Compare/compare.dsp b/Tests/Compare/compare.dsp
new file mode 100644
index 0000000..2065f7c
--- /dev/null
+++ b/Tests/Compare/compare.dsp
@@ -0,0 +1,149 @@
+# Microsoft Developer Studio Project File - Name="compare" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=compare - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "compare.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "compare.mak" CFG="compare - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "compare - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "compare - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "compare - Win32 Release with symbols" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "compare - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\Build\Win32\VC6\Release"
+# PROP Intermediate_Dir "..\..\Build\Win32\VC6\Release\compare"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W4 /GR /GX /O2 /Ob2 /I "..\..\..\..\xml-xerces\c\src" /I "..\..\src\\" /I "..\harness\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\..\..\xml-xerces\c\Build\Win32\VC6\Release\xerces-c_1.lib ..\..\Build\Win32\VC6\Release\*.lib /nologo /stack:0x1f4000 /subsystem:console /pdb:none /machine:I386
+
+!ELSEIF  "$(CFG)" == "compare - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\..\Build\Win32\VC6\Debug"
+# PROP Intermediate_Dir "..\..\Build\Win32\VC6\Debug\compare"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W4 /GR /GX /Od /I "..\..\..\..\xml-xerces\c\src" /I "..\..\src\\" /I "..\harness\\" /D "_WINDOWS" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\..\..\xml-xerces\c\Build\Win32\VC6\Debug\xerces-c_1D.lib ..\..\Build\Win32\VC6\Debug\*.lib /nologo /stack:0x1f4000 /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ELSEIF  "$(CFG)" == "compare - Win32 Release with symbols"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "compare___Win32_Release_with_symbols"
+# PROP BASE Intermediate_Dir "compare___Win32_Release_with_symbols"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\Build\Win32\VC6\Release.symbols"
+# PROP Intermediate_Dir "..\..\Build\Win32\VC6\Release.symbols\compare"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\xml-xerces\c\src" /I "..\..\src\\" /I "..\harness\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W4 /GR /GX /Zi /O2 /Ob2 /I "..\..\..\..\xml-xerces\c\src" /I "..\..\src\\" /I "..\harness\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 ..\..\Build\Win32\VC6\Release\Harness.lib ..\..\..\..\xml-xerces\c\Build\Win32\VC6\Release\xerces-c_1.lib ..\..\Build\Win32\VC6\Release\*.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\Build\Win32\VC6\Release/perft.exe"
+# ADD LINK32 ..\..\..\..\xml-xerces\c\Build\Win32\VC6\Release\xerces-c_1.lib ..\..\Build\Win32\VC6\Release.symbols\*.lib /nologo /stack:0x1f4000 /subsystem:console /debug /machine:I386 /fixed:no
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "compare - Win32 Release"
+# Name "compare - Win32 Debug"
+# Name "compare - Win32 Release with symbols"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\compare.cpp
+
+!IF  "$(CFG)" == "compare - Win32 Release"
+
+# ADD CPP /MD /Zi
+
+!ELSEIF  "$(CFG)" == "compare - Win32 Debug"
+
+# PROP Intermediate_Dir "..\..\Build\Win32\VC6\Debug\compare"
+# ADD CPP /MDd /Zi
+
+!ELSEIF  "$(CFG)" == "compare - Win32 Release with symbols"
+
+# ADD BASE CPP /MD /Zi
+# ADD CPP /MD /Zi
+
+!ENDIF 
+
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/Tests/Tests.dsw b/Tests/Tests.dsw
new file mode 100644
index 0000000..4719fc2
--- /dev/null
+++ b/Tests/Tests.dsw
@@ -0,0 +1,170 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Harness"=".\Harness\Harness.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "Memory"=".\Memory\Memory.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "Params"=".\Params\Params.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "PerfT"=".\PerfT\PerfT.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "ThreadTest"=".\Threads\ThreadTest.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "Transformer"=".\Transformer\Transformer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "compare"=".\Compare\compare.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "dom2dom"=".\Dom2Dom\Dom2Dom.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "extensions"=".\Extensions\extensions.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "inputsource"=".\InputSource\inputsource.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "perf"=".\Performance\perf.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name Harness
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/Tests/Threads/ThreadTest.cpp b/Tests/Threads/ThreadTest.cpp
new file mode 100644
index 0000000..e4ad5a3
--- /dev/null
+++ b/Tests/Threads/ThreadTest.cpp
@@ -0,0 +1,402 @@
+// Base header file.  Must be first.
+#include <Include/PlatformDefinitions.hpp>
+
+
+
+#include <cassert>
+#include <ctime>
+
+
+
+#if defined(XALAN_OLD_STREAM_HEADERS)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+
+
+#include <util/PlatformUtils.hpp>
+#include <util/Mutexes.hpp>
+
+
+
+#include <Include/XalanAutoPtr.hpp>
+
+
+
+#include <XalanTransformer/XalanTransformer.hpp>
+
+
+
+#if defined(WIN32)
+//This is here for the threads.
+#include <process.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#elif defined(XALAN_POSIX2_AVAILABLE)
+#include <pthread.h>
+#include <unistd.h>
+#else
+#error Unsupported platform!
+#endif
+
+
+
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::cerr;
+	using std::cout;
+	using std::endl;
+#endif
+
+
+	
+// This is here for memory leak testing.
+#if defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+
+	
+class SynchronizedCounter
+{
+public:
+
+	SynchronizedCounter();
+
+	~SynchronizedCounter();
+
+	void
+	increment();
+
+	void
+	decrement();
+
+	unsigned long
+	getCounter() const;
+
+private:
+
+	mutable XMLMutex	m_mutex;
+
+	unsigned long		m_counter;
+};
+
+
+
+SynchronizedCounter::SynchronizedCounter() :
+	m_mutex(),
+	m_counter(0)
+{
+}
+
+
+
+SynchronizedCounter::~SynchronizedCounter()
+{
+}
+
+
+
+void
+SynchronizedCounter::increment()
+{
+	XMLMutexLock	theLock(&m_mutex);
+
+	if (m_counter < ULONG_MAX)
+	{
+		++m_counter;
+	}
+}
+
+
+
+void
+SynchronizedCounter::decrement()
+{
+	XMLMutexLock	theLock(&m_mutex);
+
+	if (m_counter > 0)
+	{
+		--m_counter;
+	}
+}
+
+
+
+unsigned long
+SynchronizedCounter::getCounter() const
+{
+	return m_counter;
+}
+
+
+
+struct
+ThreadInfo
+{
+	ThreadInfo(
+			unsigned int			theThreadNumber = 0,
+			SynchronizedCounter*	theCounter = 0) :
+		m_threadNumber(theThreadNumber),
+		m_counter(theCounter)
+	{
+	}
+
+	unsigned int			m_threadNumber;
+
+	SynchronizedCounter*	m_counter;
+};
+
+
+
+// Used to hold compiled stylesheet and pre-parsed source...
+const XalanCompiledStylesheet*	glbCompiledStylesheet = 0;
+const XalanParsedSource*		glbParsedSource = 0;
+
+
+
+#if defined(WIN32)
+
+extern "C" void theThreadRoutine(void* param);
+
+void
+#elif defined(XALAN_POSIX2_AVAILABLE)
+
+extern "C" void* theThreadRoutine(void* param);
+
+void*
+#else
+#error Unsupported platform!
+#endif
+theThreadRoutine(void*		param)
+{
+// This routine uses compiled stylesheet (glbStylesheetRoot), which is set using the 
+// theProcessor.setStylesheetRoot method. The transform is done using the theProcessor's
+// process() method.
+
+#if defined(XALAN_OLD_STYLE_CASTS)
+	const ThreadInfo* const		theInfo = (const ThreadInfo*)param;
+#else
+	const ThreadInfo* const		theInfo = reinterpret_cast<const ThreadInfo*>(param);
+#endif
+
+	assert(theInfo != 0);
+
+	theInfo->m_counter->increment();
+
+	try
+	{
+		// Our input file.  The assumption is that the executable will be run
+		// from same directory as the input files.
+
+		// Generate the output file name.
+		const XalanDOMString	theOutputFile(
+				XalanDOMString("birds") +
+				UnsignedLongToDOMString(theInfo->m_threadNumber) +
+				XalanDOMString(".out"));
+
+		// Create a transformer...
+		XalanTransformer	theTransformer;
+
+		// Do the transform...
+		theTransformer.transform(*glbParsedSource, glbCompiledStylesheet, XSLTResultTarget(theOutputFile));
+	}
+	catch(...)
+	{
+		cerr << "Exception caught in thread " << theInfo->m_threadNumber;
+	}
+
+	// Decrement the counter because we're done...
+	theInfo->m_counter->decrement();
+
+#if defined(XALAN_POSIX2_AVAILABLE)
+	return 0;
+#endif
+}
+
+
+
+inline void
+doSleep(unsigned int	theMilliseconds)
+{
+#if defined(WIN32)
+	Sleep(theMilliseconds);
+#elif defined(XALAN_POSIX2_AVAILABLE)
+	usleep(theMilliseconds * 10);
+#else
+#error Unsupported platform!
+#endif
+}
+
+
+
+void
+doThreads(long	theThreadCount)
+{
+	cout << endl << "Starting " << theThreadCount << " threads." << endl;
+
+	XalanArrayAutoPtr<ThreadInfo>	theThreadInfo(new ThreadInfo[theThreadCount]);
+
+	try
+	{
+		cout << endl << "Clock before starting threads: " << clock() << endl;
+
+		SynchronizedCounter		theCounter;
+
+		long	i = 0;
+
+		while (i < theThreadCount)
+		{
+			theThreadInfo[i].m_threadNumber = i;
+			theThreadInfo[i].m_counter = &theCounter;
+
+#if defined(WIN32)
+
+			const unsigned long		theThreadID =
+					_beginthread(theThreadRoutine, 4096, reinterpret_cast<LPVOID>(&theThreadInfo[i]));
+
+			if (theThreadID == unsigned(-1))
+			{
+				cerr << endl << "Unable to create thread number " << i + 1 << "." << endl;
+			}
+
+#elif defined(XALAN_POSIX2_AVAILABLE)
+
+			pthread_t	theThread;
+
+			const int	theResult = pthread_create(&theThread, 0, theThreadRoutine, (void*)&theThreadInfo[i]);
+
+			if (theResult != 0)
+			{
+				cerr << endl << "Unable to create thread number " << i + 1 << "." << endl;
+			}
+			else
+			{
+#if defined(OS390)
+				pthread_detach(&theThread);
+#else
+				pthread_detach(theThread);
+#endif
+			}
+#else
+#error Unsupported platform!
+#endif
+
+			++i;
+		}
+
+		clock_t		theClock = 0;
+
+		if (i == 0)
+		{
+			cerr << endl << "No threads were created!" << endl;
+		}
+		else
+		{
+			unsigned int	theCheckCount = 0;
+
+			do
+			{
+				doSleep(2000);
+
+				// Check a couple of times, just in case, since
+				// getCounter() is not synchronized...
+				if (theCounter.getCounter() == 0)
+				{
+					if (theCheckCount == 0)
+					{
+						theClock = clock();
+					}
+
+					++theCheckCount;
+				}
+			}
+			while(theCheckCount < 2);
+		}
+
+		cout << endl << "Clock after threads: " << theClock << endl;
+	}
+	catch(...)
+	{
+		cerr << "Exception caught!!!"
+			 << endl
+			<< endl;
+	}
+}
+
+
+int
+main(
+			int				argc,
+			const char*		argv[])
+{
+#if !defined(NDEBUG) && defined(_MSC_VER)
+	_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
+
+	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
+	_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+#endif
+
+	if (argc > 2)
+	{
+		cerr << "Usage: ThreadTest"
+			 << endl
+			 << endl;
+	}
+	else
+	{
+		int		threadCount = 60;
+
+		if (argc == 2)
+		{
+			threadCount = atoi(argv[1]);
+		}
+
+		try
+		{
+			// Initialize Xerces...
+			XMLPlatformUtils::Initialize();
+
+			// Initialize Xalan...
+			XalanTransformer::initialize();
+
+			{
+				// Create a XalanTransformer.  We won't actually use this to transform --
+				// it's just acting likely a factory for the compiled stylesheet and
+				// pre-parsed source.
+				XalanTransformer	theXalanTransformer;
+
+				const char* const	theXSLFileName = "birds.xsl";
+
+				theXalanTransformer.compileStylesheet(theXSLFileName, glbCompiledStylesheet);
+				assert(glbCompiledStylesheet != 0);
+
+				// Compile the XML source document as well. All threads will use
+				// this binary representation of the source tree.
+				const char* const	theXMLFileName = "birds.xml";
+
+				theXalanTransformer.parseSource(theXMLFileName, glbParsedSource);
+				assert(glbParsedSource != 0);
+
+				doThreads(threadCount);
+			}
+
+			// Terminate Xalan...
+			XalanTransformer::terminate();
+
+			// Terminate Xerces...
+			XMLPlatformUtils::Terminate();
+		}
+		catch(...)
+		{
+			cerr << "Exception caught!!!"
+				 << endl
+				 << endl;
+		}
+
+	} 
+
+	return 0;
+}
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..fb94606
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,664 @@
+#
+# 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", "Xerces" 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, International
+# Business Machines, Inc., http://www.ibm.com .  For more information
+# on the Apache Software Foundation, please see
+# <http://www.apache.org/>.
+# 
+###################################################################
+#                    IMPORTANT NOTE                               #
+###################################################################
+# Before you try to run the Makefile, make sure you have two      #
+# environment variables set.                                      #
+#                                                                 #
+# export XALANCROOT=<the directory where you installed XALAN-C>   #
+# export XERCESCROOT=<the directory where you installed XERCES-C> #
+#                                                                 #
+###################################################################
+
+DEPFILE=depends
+
+#MACROS defining commands
+MKDIR=mkdir
+
+ifndef XALANCROOT 
+noxalanroot:
+	@echo XALANCROOT must be defined
+endif
+
+ifndef XERCESCROOT 
+noxercesroot:
+	@echo XERCESCROOT must be defined
+endif
+
+ifdef XALAN_USE_ICU
+ifndef ICUROOT
+ICUROOT=/usr/local
+endif
+ifndef ICUI18NROOT
+ICUI18NROOT=${ICUROOT}
+endif
+endif
+
+XALANDOM_DIR = XalanDOM
+DOMSUPPORT_DIR = DOMSupport
+INCLUDE_DIR = Include
+ICUBRIDGE_DIR = ICUBridge
+PLATFORMSUPPORT_DIR = PlatformSupport
+XALANSOURCETREE_DIR = XalanSourceTree
+TESTXPATH_DIR = TestXPath
+TESTXSLT_DIR = TestXSLT
+XMLSUPPORT_DIR = XMLSupport
+XPATH_DIR = XPath
+XSLT_DIR = XSLT
+XALANEXTENSIONS_DIR = XalanExtensions
+XERCESPARSERLIAISON_DIR = XercesParserLiaison
+XALANTRANSFORMER_DIR = XalanTransformer
+ALL_OBJECTS_DIR = ${XALANCROOT}/obj
+LIB_DIR = ${XALANCROOT}/lib
+SAMPLES_DIR = ${XALANCROOT}/samples
+TESTS_DIR = ${XALANCROOT}/Tests
+
+PROJECT_NAME = xalan-c
+LIBNAME = lib${PROJECT_NAME}
+THISLIB = ${LIB_DIR}/${LIBNAME}
+VER = 1_2
+
+PRODUCTNAME=xalan
+PRODUCTVERSION=${VER}
+BINTARGETDIR=${XALANCROOT}/bin
+
+ALL_VPATH_CPP = \
+$(XALANDOM_DIR):$(DOMSUPPORT_DIR):$(PLATFORMSUPPORT_DIR):$(XALANSOURCETREE_DIR):$(TESTXPATH_DIR):$(TESTXSLT_DIR):\
+$(XMLSUPPORT_DIR):$(XPATH_DIR):$(XSLT_DIR):$(XALANEXTENSIONS_DIR):$(XALANTRANSFORMER_DIR):$(XERCESPARSERLIAISON_DIR)
+
+# Using ICUBridge
+ifdef XALAN_USE_ICU
+ALL_VPATH_CPP+=:$(ICUBRIDGE_DIR)
+endif
+
+#all these setting come from the arguments passed in to runConfigure.
+PLATFORM =@platform@
+CC  = @cc@
+CXX = @cxx@
+CXXFLAGS = @cxxflags@
+PREFIX = @prefix@
+
+#=============== LINUX SPECIFIC OPTIONS =========================
+
+ifeq ($(PLATFORM), LINUX)
+
+  SUPPORTED = TRUE
+  PLATFORM_COMPILE_OPTIONS = -fpic -Wall -instances=static -D${PLATFORM} -D_REENTRANT
+  ALLLIBS = ${LIBS} -L/usr/lib
+  SHLIBSUFFIX=.so
+
+  # We need the ICU library if we are using the ICUBridge
+  ifdef XALAN_USE_ICU
+  LD_RPATH_PRE=	-Wl,-rpath,
+  PLATFORM_LIB_LINK_OPTIONS=$(LD_RPATH_PRE)${ICUROOT}/lib 
+  endif
+
+  EXTRA_LINK_OPTIONS=-lc
+  CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+  MAKE_SHARED = ${CXX} $(CXXFLAGS) -D${PLATFORM} -shared -fpic
+  LINK =  g++ -D${PLATFORM} -fpic
+
+endif
+
+#=============== HPUX SPECIFIC OPTIONS =========================
+
+ifeq ($(PLATFORM), HPUX)
+
+  SUPPORTED = TRUE
+  PLATFORM_COMPILE_OPTIONS = +Z -D${PLATFORM} -D_THREAD_SAFE
+  ALLLIBS = ${LIBS}
+  SHLIBSUFFIX=.sl
+  CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+  CC2 = $(CXX) $(PLATFORM_COMPILE_OPTIONS)
+  MAKE_SHARED = $(CXX) -b +Z
+  LINK = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS) -Wl,+s
+
+endif
+
+#=============== SOLARIS SPECIFIC OPTIONS =========================
+
+ifeq ($(PLATFORM), SOLARIS)
+
+  SUPPORTED = TRUE
+
+  ifeq (${CXX}, g++)
+
+	PLATFORM_COMPILE_OPTIONS = -fPIC -instances=static -D${PLATFORM} -D_REENTRANT
+	ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib -lc
+
+	ifdef XALAN_USE_ICU
+	LD_RPATH_PRE=  -Wl,-rpath,
+	endif
+
+	EXTRA_LINK_OPTIONS=-lc
+	CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+	MAKE_SHARED = ${CXX} $(CXXFLAGS) -D${PLATFORM} -shared -fPIC
+	LINK =  g++ -D${PLATFORM} -fPIC
+
+	ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib -lc
+
+    PLATFORM_LIB_LINK_OPTIONS=$(LD_RPATH_PRE)${ICUROOT}/lib $(LD_RPATH_PRE)${ICUI18NROOT}/lib
+
+  else
+
+	PLATFORM_COMPILE_OPTIONS = -KPIC -mt -xs -ptr$(ALL_OBJECTS_DIR) -features=rtti -D${PLATFORM} -D_REENTRANT
+
+	CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS) -I${STLPORTROOT}/stlport
+    MAKE_SHARED = ${CXX} -D${PLATFORM} -G -ptr$(ALL_OBJECTS_DIR) ${LDFLAGS}
+    MAKE_SHARED_C = ${CC} -D${PLATFORM} -G ${LDFLAGS}
+	LINK = ${CXX} -D${PLATFORM} -ptr$(ALL_OBJECTS_DIR) ${LDFLAGS}
+
+    ALLLIBS = -mt ${LIBS} -L/usr/local/SUNWspro/lib -L/usr/ccs/lib \
+                  -lc -lgen
+  endif
+
+  SHLIBSUFFIX=.so
+
+endif
+
+#=============== AIX SPECIFIC OPTIONS =========================
+ifeq ($(PLATFORM), AIX)
+
+  SUPPORTED = TRUE
+
+  ifeq (${CXX}, g++)
+
+	PLATFORM_COMPILE_OPTIONS = -fPIC -instances=static -D${PLATFORM} -D_REENTRANT
+	ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib -lc
+
+	ifdef XALAN_USE_ICU
+	LD_RPATH_PRE=  -Wl,-rpath,
+	PLATFORM_LIB_LINK_OPTIONS=$(LD_RPATH_PRE)${ICUROOT}/lib $(LD_RPATH_PRE)${ICUI18NROOT}/lib
+	endif
+
+	EXTRA_LINK_OPTIONS=-lc
+	CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+	MAKE_SHARED = ${CXX} $(CXXFLAGS) -D${PLATFORM} -shared -fPIC
+	LINK =  g++ -D${PLATFORM} -fPIC
+
+	ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib -lc
+
+  else
+
+	ifndef STLPORTROOT 
+	nostlportroot:
+		@echo STLPORTROOT must be defined
+	endif
+
+	PLATFORM_COMPILE_OPTIONS = -D${PLATFORM} -D_THREAD_SAFE -I${STLPORTROOT}/stlport
+	ALLLIBS = ${LIBS} -L/usr/lib 
+	CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+	CC2 = $(CXX) $(PLATFORM_COMPILE_OPTIONS)
+	MAKE_SHARED = makeC++SharedLib_r -p 5000 
+	LINK = $(CXX) -qnotempinc $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+
+  endif
+
+  SHLIBSUFFIX=.a
+
+endif
+
+#=============== OS390 SPECIFIC OPTIONS =========================
+
+ifeq ($(PLATFORM), OS390)
+
+  ifndef STLPORTROOT
+  nostlportroot:
+	  @echo STLPORTROOT must be defined
+  endif
+
+  SUPPORTED = TRUE
+  PLATFORM_COMPILE_OPTIONS =-Wc,dll -W0,"langlvl(extended),float(ieee)" -D${PLATFORM} -D_OPEN_THREADS -D_XOPEN_SOURCE_EXTENDED -I ${STLPORTROOT}/stlport
+  PLATFORM_COMPILE_OPTIONS2 =-Wc,dll -W0,"langlvl(extended),notempinc,float(ieee)" -D${PLATFORM} -D_OPEN_THREADS -D_XOPEN_SOURCE_EXTENDED -I ${STLPORTROOT}/stlport
+  ALLLIBS =
+  SHLIBSUFFIX=.dll
+  OS390SIDEDECK=.x
+
+  CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+  CC2 = $(CXX) $(PLATFORM_COMPILE_OPTIONS2)
+  CC3 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS2)
+  MAKE_SHARED = ${CXX} $(CXXFLAGS) -D${PLATFORM} -Wl,dll
+  LINK = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+
+endif
+
+#============ TRU64 SPECIFIC OPTIONS ============================
+
+ifeq ($(PLATFORM), TRU64)
+
+  SUPPORTED = TRUE
+  PLATFORM_COMPILE_OPTIONS = -D${PLATFORM} -ptr ${ALL_OBJECTS_DIR}/.cxx_repository -ieee -pthread
+  ALLLIBS = ${LIBS} -L/usr/lib -lc -lrt -lm
+  SHLIBSUFFIX = .so
+  CC1 = ${CXX} ${CXXFLAGS} $(PLATFORM_COMPILE_OPTIONS)
+  MAKE_SHARED = ${CXX} ${CXXFLAGS} -shared -D${PLATFORM} -ptr ${ALL_OBJECTS_DIR}/.cxx_repository -nocxxstd
+  LINK = ${CXX} $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+
+endif
+
+#============ MacOSX SPECIFIC OPTIONS ============================
+
+ifeq ($(PLATFORM), MACOSX)
+
+  SUPPORTED = TRUE
+  PLATFORM_COMPILE_OPTIONS = -Wall -D${PLATFORM} -D_REENTRANT -DXALAN_USE_XERCES_LOCAL_CODEPAGE_TRANSCODERS
+  ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib
+  SHLIBSUFFIX=.dylib
+  CC1 = ${CXX} $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)
+  MAKE_SHARED = ${CXX} $(CXXFLAGS) -D${PLATFORM} -dynamiclib
+  LINK = ${CXX} $(CXXFLAGS) ${PLATFORM_COMPILE_OPTIONS}
+
+endif
+
+ifndef SUPPORTED
+  nogood:
+	  @echo Linux, Solaris, AIX, Compaq Tru64, OS/390, MacOSX, and HP-UX are the only platforms supported.
+endif
+
+# We need the Xerces library
+ifeq ($(PLATFORM), OS390)
+  ALLLIBS += $(XERCESCROOT)/lib/libxerces-c1_5_1.x
+else
+  ALLLIBS += -L$(XERCESCROOT)/lib -lxerces-c1_5
+endif
+
+# We need the ICU library if we are using the ICUBridge
+ifdef XALAN_USE_ICU
+  ifeq ($(PLATFORM), OS390)
+    ALLLIBS += ${ICUROOT}/lib/libicuuc.x ${ICUROOT}/lib/libicui18n.x
+  else
+    ALLLIBS += -L${ICUROOT}/lib -licuuc
+    ALLLIBS += -L${ICUI18NROOT}/lib -licui18n
+  endif
+endif
+
+
+# We have to use the includes from the source distribution, since we use
+# headers that others normally wouldn't
+ifdef XALAN_USE_ICU
+# We need the ICU library if we are using the ICUBridge
+  XSL_INCL = -I${ICUROOT}/include/ -I. -I$(XERCESCROOT)/src/ -I$(XERCESCROOT)/include/ 
+  XSL_BUILD_OPTIONS += -DXALAN_USE_ICU
+else
+  XSL_INCL = -I. -I$(XERCESCROOT)/src/ -I$(XERCESCROOT)/include/ 
+endif
+
+
+vpath %.cpp \
+$(ALL_VPATH_CPP)
+${ALL_OBJECTS_DIR}/%.o:%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+
+${ALL_OBJECTS_DIR}/%.o:%.hpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $(patsubst .hpp,.cpp,$<)
+
+
+ALLSOURCE = \
+	$(wildcard $(XALANDOM_DIR)/*.cpp) \
+	$(wildcard $(DOMSUPPORT_DIR)/*.cpp) \
+	$(wildcard $(PLATFORMSUPPORT_DIR)/*.cpp) \
+	$(wildcard $(XALANSOURCETREE_DIR)/*.cpp) \
+	$(wildcard $(XMLSUPPORT_DIR)/*.cpp) \
+	$(wildcard $(XPATH_DIR)/*.cpp) \
+	$(wildcard $(XSLT_DIR)/*.cpp) \
+	$(wildcard $(XALANEXTENSIONS_DIR)/*.cpp) \
+	$(wildcard $(XERCESINIT_DIR)/*.cpp) \
+	$(wildcard $(XERCESPARSERLIAISON_DIR)/*.cpp) \
+	$(wildcard $(XALANTRANSFORMER_DIR)/*.cpp) \
+
+
+# Using ICUBridge
+ifdef XALAN_USE_ICU
+ALLSOURCE += \
+	$(wildcard $(ICUBRIDGE_DIR)/*.cpp) 
+endif
+
+ALL_OBJECTS = $(addprefix $(ALL_OBJECTS_DIR)/,$(addsuffix .o,$(basename $(notdir $(ALLSOURCE)))))
+
+all:	 lib  testXSLT testXPath
+
+prepare:
+	@echo Preparing the directory structure for a build ...
+	-${MKDIR} -p ${ALL_OBJECTS_DIR}
+	-${MKDIR} -p ${LIB_DIR}
+	-${MKDIR} -p $(BINTARGETDIR)
+
+# Create header dependencies file -- this must be run before any objects are
+# built
+depend:
+	$(MAKE) -f makedepends DEPFILE=$(DEPFILE)
+
+-include $(DEPFILE)	
+
+compile:	 $(ALL_OBJECTS) 
+
+ifeq ($(PLATFORM), AIX)
+templates: ${ALL_OBJECTS_DIR}/XalanTemplate.o
+
+${ALL_OBJECTS_DIR}/XalanTemplate.o:$(XSLT_DIR)/XalanTemplate.cpp
+	$(CC2) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) -o $@ $<
+else
+ifeq ($(PLATFORM), OS390)
+templates: ${ALL_OBJECTS_DIR}/XalanTemplate.o
+${ALL_OBJECTS_DIR}/XalanTemplate.o:$(XSLT_DIR)/XalanTemplate.cpp
+	$(CC2) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) -o $@ $<
+endif
+endif
+
+testXSLT: lib  $(BINTARGETDIR)/testXSLT
+
+ifeq ($(PLATFORM), OS390)                                                       
+$(BINTARGETDIR)/testXSLT: ${ALL_OBJECTS_DIR}/process.o                          
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $^ -o $@	
+${ALL_OBJECTS_DIR}/process.o: $(TESTXSLT_DIR)/process.cpp                       
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else                                                            
+$(BINTARGETDIR)/testXSLT: ${ALL_OBJECTS_DIR}/process.o
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $^ -o $@	
+${ALL_OBJECTS_DIR}/process.o: $(TESTXSLT_DIR)/process.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+testXPath: lib  $(BINTARGETDIR)/testXPath
+
+ifeq ($(PLATFORM), OS390)                                                       
+$(BINTARGETDIR)/testXPath: ${ALL_OBJECTS_DIR}/TestXPath.o ${ALL_OBJECTS_DIR}/NodeNameTreeWalker.o
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/TestXPath.o: $(TESTXPATH_DIR)/TestXPath.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+${ALL_OBJECTS_DIR}/NodeNameTreeWalker.o: $(TESTXPATH_DIR)/NodeNameTreeWalker.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else                                                                 
+$(BINTARGETDIR)/testXPath: ${ALL_OBJECTS_DIR}/TestXPath.o ${ALL_OBJECTS_DIR}/NodeNameTreeWalker.o
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(TESTXPATH_DIR)/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+samples : Samples
+
+tests : ThreadTest
+
+Samples: lib CompileStylesheet DocumentBuilder ExternalFunction SimpleTransform SimpleXPathAPI StreamTransform TraceListen UseStylesheetParam XalanTransform XalanTransformerCallback XPathWrapper
+
+ApacheModuleXSLT: lib ${LIB_DIR}/mod_xslt$(SHLIBSUFFIX) 
+
+${LIB_DIR}/mod_xslt$(SHLIBSUFFIX) : ${ALL_OBJECTS_DIR}/mod_xslt.o
+ifeq ($(PLATFORM), OS390)                                                       
+	$(MAKE_SHARED) $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x  $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/ApacheModuleXSLT/%.c
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) -I/usr/include/apache/ $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	$(MAKE_SHARED) $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/ApacheModuleXSLT/%.c
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) -I/usr/include/apache/ $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+CompileStylesheet: lib $(BINTARGETDIR)/CompileStylesheet
+
+$(BINTARGETDIR)/CompileStylesheet: ${ALL_OBJECTS_DIR}/CompileStylesheet.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/CompileStylesheet/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/CompileStylesheet/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+DocumentBuilder: lib $(BINTARGETDIR)/DocumentBuilder
+
+$(BINTARGETDIR)/DocumentBuilder: ${ALL_OBJECTS_DIR}/DocumentBuilder.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/DocumentBuilder/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/DocumentBuilder/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+ExternalFunction: lib $(BINTARGETDIR)/ExternalFunction
+
+$(BINTARGETDIR)/ExternalFunction: ${ALL_OBJECTS_DIR}/ExternalFunction.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/ExternalFunction/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/ExternalFunction/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+SimpleTransform: lib $(BINTARGETDIR)/SimpleTransform
+
+$(BINTARGETDIR)/SimpleTransform: ${ALL_OBJECTS_DIR}/SimpleTransform.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/SimpleTransform/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/SimpleTransform/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+SimpleXPathAPI: lib $(BINTARGETDIR)/SimpleXPathAPI
+
+$(BINTARGETDIR)/SimpleXPathAPI: ${ALL_OBJECTS_DIR}/SimpleXPathAPI.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/SimpleXPathAPI/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/SimpleXPathAPI/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+StreamTransform: lib $(BINTARGETDIR)/StreamTransform
+
+$(BINTARGETDIR)/StreamTransform: ${ALL_OBJECTS_DIR}/StreamTransform.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/StreamTransform/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<		
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/StreamTransform/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<		
+endif
+
+TraceListen: lib $(BINTARGETDIR)/TraceListen
+
+$(BINTARGETDIR)/TraceListen: ${ALL_OBJECTS_DIR}/TraceListen.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/TraceListen/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<		
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/TraceListen/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<		
+endif
+
+UseStylesheetParam: lib $(BINTARGETDIR)/UseStylesheetParam
+
+$(BINTARGETDIR)/UseStylesheetParam: ${ALL_OBJECTS_DIR}/UseStylesheetParam.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/UseStylesheetParam/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<	
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/UseStylesheetParam/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<	
+endif
+
+XalanTransform: lib $(BINTARGETDIR)/XalanTransform
+
+$(BINTARGETDIR)/XalanTransform: ${ALL_OBJECTS_DIR}/XalanTransform.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/XalanTransform/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/XalanTransform/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+XalanTransformerCallback: lib $(BINTARGETDIR)/XalanTransformerCallback
+
+$(BINTARGETDIR)/XalanTransformerCallback: ${ALL_OBJECTS_DIR}/XalanTransformerCallback.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/XalanTransformerCallback/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/XalanTransformerCallback/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+XPathWrapper: lib $(BINTARGETDIR)/XPathWrapper
+
+$(BINTARGETDIR)/XPathWrapper: ${ALL_OBJECTS_DIR}/XPathWrapper.o ${ALL_OBJECTS_DIR}/TestDriver.o
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/XPathWrapper/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(SAMPLES_DIR)/XPathWrapper/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+Tests: lib  ThreadTest
+
+ThreadTest: lib $(BINTARGETDIR)/ThreadTest
+
+$(BINTARGETDIR)/ThreadTest: ${ALL_OBJECTS_DIR}/ThreadTest.o 
+ifeq ($(PLATFORM), OS390)                                                       
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} $(LIB_DIR)/lib$(PROJECT_NAME)$(VER).x $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(TESTS_DIR)/Threads/%.cpp
+	$(CC3) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+else
+	${LINK} $(XSL_BUILD_OPTIONS) ${PLATFORM_LIB_LINK_OPTIONS} ${LIBRARY_SEARCH_PATHS} \
+	${EXTRA_LINK_OPTIONS} -L$(LIB_DIR) -l$(PROJECT_NAME)$(VER) $(ALLLIBS) $(CXXFLAGS) $^ -o $@	
+${ALL_OBJECTS_DIR}/%.o:$(TESTS_DIR)/Threads/%.cpp
+	$(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o $@ $<
+endif
+
+lib:	prepare compile $(THISLIB)$(VER)$(SHLIBSUFFIX)
+
+$(THISLIB)$(VER)$(SHLIBSUFFIX): $(ALL_OBJECTS)
+	$(MAKE_SHARED) $(PLATFORM_LIBRARIES) $(EXTRA_LINK_OPTIONS) $(ALLLIBS) $^ -o $@ 
+ifeq ($(PLATFORM), OS390)            
+	cp -p *.x  ${LIB_DIR}        
+endif                                
+
+clean:
+	rm -rf $(ALL_OBJECTS_DIR)/*
+ifeq ($(PLATFORM), TRU64)
+	rm -rf $(ALL_OBJECTS_DIR)/.cxx_repository
+endif
+	rm -f $(THISLIB)$(VER)$(SHLIBSUFFIX)
+	rm -f $(BINTARGETDIR)/testXSLT
+	rm -f $(BINTARGETDIR)/testXPath
+	rm -f ${LIB_DIR}/mod_xslt$(SHLIBSUFFIX) 	
+	rm -f $(BINTARGETDIR)/CompileStylesheet
+	rm -f $(BINTARGETDIR)/ExternalFunction
+	rm -f $(BINTARGETDIR)/SimpleTransform
+	rm -f $(BINTARGETDIR)/StreamTransform
+	rm -f $(BINTARGETDIR)/TraceListen
+	rm -f $(BINTARGETDIR)/UseStylesheetParam
+	rm -f $(BINTARGETDIR)/XalanTransform
+	rm -f $(BINTARGETDIR)/XPathWrapper
+
diff --git a/src/TestXSLT/process.cpp b/src/TestXSLT/process.cpp
new file mode 100644
index 0000000..46dde32
--- /dev/null
+++ b/src/TestXSLT/process.cpp
@@ -0,0 +1,1370 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999-2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+#include <Include/PlatformDefinitions.hpp>
+
+
+
+#include <cstdio>
+#include <cstring>
+
+
+
+#if defined(XALAN_OLD_STREAM_HEADERS)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+
+
+#if !defined(NDEBUG) && defined(_MSC_VER)
+#include <crtdbg.h>
+#endif
+
+
+
+#include <util/PlatformUtils.hpp>
+#include <sax/SAXException.hpp>
+
+
+
+#include <XalanDOM/XalanDOMException.hpp>
+
+
+
+#include <PlatformSupport/DOMStringHelper.hpp>
+#include <PlatformSupport/DOMStringPrintWriter.hpp>
+#include <PlatformSupport/XalanOutputStreamPrintWriter.hpp>
+#include <PlatformSupport/XalanFileOutputStream.hpp>
+#include <PlatformSupport/XalanStdOutputStream.hpp>
+
+
+
+#include <Include/XalanAutoPtr.hpp>
+
+
+
+#include <DOMSupport/DOMSupportDefault.hpp>
+
+
+
+#include <XPath/XObjectFactoryDefault.hpp>
+#include <XPath/XPathEnvSupportDefault.hpp>
+#include <XPath/XPath.hpp>
+#include <XPath/XPathExecutionContextDefault.hpp>
+#include <XPath/XPathFactoryBlock.hpp>
+#include <XPath/XPathFactoryDefault.hpp>
+#include <XPath/XPathProcessorImpl.hpp>
+
+
+
+#include <XalanExtensions/XalanExtensions.hpp>
+
+
+
+#include <XercesParserLiaison/XercesParserLiaison.hpp>
+#include <XercesParserLiaison/XercesDOMSupport.hpp>
+
+
+
+#include <XMLSupport/FormatterToDOM.hpp>
+#include <XMLSupport/FormatterToHTML.hpp>
+#include <XMLSupport/FormatterToNull.hpp>
+#include <XMLSupport/FormatterToText.hpp>
+#include <XMLSupport/FormatterToXML.hpp>
+#include <XMLSupport/FormatterTreeWalker.hpp>
+
+
+
+#include <XalanSourceTree/FormatterToSourceTree.hpp>
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
+#include <XalanSourceTree/XalanSourceTreeInit.hpp>
+#include <XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
+
+
+
+#include <XSLT/XSLTEngineImpl.hpp>
+#include <XSLT/XSLTInit.hpp>
+#include <XSLT/XSLTInputSource.hpp>
+#include <XSLT/XSLTResultTarget.hpp>
+#include <XSLT/StylesheetRoot.hpp>
+#include <XSLT/StylesheetConstructionContextDefault.hpp>
+#include <XSLT/StylesheetExecutionContextDefault.hpp>
+#include <XSLT/TraceListenerDefault.hpp>
+#include <XSLT/XSLTProcessorEnvSupportDefault.hpp>
+
+
+
+//#define XALAN_USE_ICU
+#if defined(XALAN_USE_ICU)
+#include <ICUBridge/ICUBridge.hpp>
+#include <ICUBridge/FunctionICUFormatNumber.hpp>
+#include <ICUBridge/ICUBridgeCollationCompareFunctor.hpp>
+#endif
+
+
+
+//#define XALAN_VQ_SPECIAL_TRACE
+#if defined(XALAN_VQ_SPECIAL_TRACE)
+#include "C:/Program Files/Rational/Quantify/pure.h"
+#endif
+
+
+
+#if !defined (XALAN_NO_NAMESPACES)
+using std::cerr;
+using std::cin;
+using std::cout;
+using std::endl;
+using std::hex;
+using std::pair;
+using std::vector;
+#endif
+
+
+
+/**
+ * Print argument options.
+ */ 
+void
+printArgOptions()
+{
+	cerr << endl
+		 << "TestXSLT options: "
+		 << endl
+		 << endl
+		 << "Options are not case-sensitive."
+		 << endl
+		 << endl
+		 << " [-? Shows this message.]"
+		 << endl
+		 << endl
+		 << " [-h Shows this message.]"
+		 << endl
+		 << endl
+		 << " [-IN inputXMLURL (If not specified, stdin is used.)]"
+		 << endl
+		 << endl
+		 << " [-XSL XSLTransformationURL]"
+		 << endl
+		 << " [-OUT outputFileName]"
+		 << endl
+		 << " [-V (Show version information only.)]"
+		 << endl
+		 << " [-QC (Quiet pattern conflicts warnings.)]"
+		 << endl
+		 << " [-Q (Use quiet mode.)]"
+		 << endl
+		 << " [-INDENT n (Controls how many spaces to indent. {default is 0})]"
+		 << endl
+		 << " [-VALIDATE (Controls whether validation occurs. Validation is off by default.)]"
+		 << endl
+		 << endl
+		 << " [-TT (Trace the templates as they are being called.)]"
+		 << endl
+		 << " [-TG (Trace each generation event.)]"
+		 << endl
+		 << " [-TS (Trace each selection event.)]"
+		 << endl
+		 << " [-TTC (Trace the template children as they are being processed.)]"
+		 << endl
+		 << endl
+		 << " [-XML (Use XML formatter and add XML header.)]"
+		 << endl
+		 << " [-TEXT (Use Text formatter.)]"
+		 << endl
+		 << " [-HTML (Use HTML formatter.)]"
+		 << endl
+		 << " [-DOM (Use DOM formatter.  Formats to DOM, then formats XML for output.)]"
+		 << endl
+		 << " [-XST (Use source tree formatter.  Formats to Xalan source tree, then formats XML for output.)]"
+		 << endl
+		 << endl
+		 << " [-PARAM name expression (Sets a stylesheet parameter.)]"
+		 << endl
+		 << endl
+		 << " [-XD (Use Xerces DOM instead of Xalan source tree.)]"
+		 << endl
+		 << endl
+		 << " [-DE (Disable built-in extension functions.)]"
+		 << endl
+		 << " [-EN (Specify the namespace URI for Xalan extension functions.  The default is 'http://xml.apache.org/xalan')]"
+		 << endl
+		 << endl
+		 << "The following options are valid only with -HTML or -XML."
+		 << endl
+		 << endl
+		 << " [-STRIPCDATA (Strip CDATA sections of their brackets, but don't escape.)"
+		 << endl
+		 << " [-ESCAPECDATA (Strip CDATA sections of their brackets, but escape.)"
+		 << endl
+		 << endl
+		 << "The following option is valid only with -HTML."
+		 << endl
+		 << endl
+		 << " [-NOINDENT (Turns off HTML indenting..]"
+		 << endl
+		 << endl
+		 << "The following option is valid only with -XML."
+		 << endl
+		 << endl
+		 << " [-NH (Don't write XML header.)]"
+		 << endl;
+}
+
+
+
+typedef vector<pair<const char*, const char*> >	StringPairVectorType;
+
+
+
+struct CmdLineParams
+{
+	StringPairVectorType params;
+
+	bool		escapeCData;
+	bool		setQuietConflictWarnings;
+	bool		setQuietMode;
+	bool		stripCData;
+	bool		versionOnly;
+	bool		traceTemplates;
+	bool		traceGenerationEvent;
+	bool		traceSelectionEvent;
+	bool		traceTemplateChildren;
+	bool		shouldWriteXMLHeader;
+	bool		doValidation;
+	bool		noIndent;
+	bool		formatToNull;
+	bool		formatToSourceTree;
+	bool		useDOM;
+	bool		disableExtensions;
+
+	int			indentAmount;
+	int			outputType;
+
+	const char*		outFileName;
+	const char*		xslFileName;
+	const char*		inFileName;
+	const char*		extentionsNamespace;
+
+	CmdLineParams() :
+		params(),
+		escapeCData(false),
+		setQuietConflictWarnings(false),
+		setQuietMode(false),
+		stripCData(false),
+		versionOnly(false),
+		traceTemplates(false),
+		traceGenerationEvent(false),
+		traceSelectionEvent(false),
+		traceTemplateChildren(false),
+		shouldWriteXMLHeader(true),
+		doValidation(false),
+		noIndent(false),
+		formatToNull(false),
+		formatToSourceTree(false),
+		useDOM(false),
+		disableExtensions(false),
+		indentAmount(-1),
+		outputType(-1),
+		outFileName(0),
+		xslFileName(0),
+		inFileName(0),
+		extentionsNamespace(0)
+	{
+	}
+};
+
+
+
+void
+warnPreviousOutputMethod(int	outputMethod)
+{
+	cerr << endl << "Warning: Ignoring previous output method switch ";
+
+	switch(outputMethod)
+	{
+	case FormatterListener::OUTPUT_METHOD_XML:
+		cerr << "-XML.";
+		break;
+
+	case FormatterListener::OUTPUT_METHOD_TEXT:
+		cerr << "-TEXT.";
+		break;
+
+	case FormatterListener::OUTPUT_METHOD_HTML:
+		cerr << "-HTML.";
+		break;
+
+	case FormatterListener::OUTPUT_METHOD_DOM:
+		cerr << "-DOM.";
+		break;		
+	}
+
+	cerr << endl << endl;
+}
+
+
+
+#if defined(OS390)
+#include <strings.h>                                             
+                                                                  
+int
+compareNoCase(
+			const char*		str1,
+			const char*		str2)     
+{
+	return strcasecmp(str1, str2);
+}
+
+#else
+
+int
+compareNoCase(
+			const char*		str1,
+			const char*		str2)     
+{
+	return stricmp(str1, str2);
+}
+
+#endif
+
+
+
+bool
+getArgs(
+			int				argc,
+			const char*		argv[],
+			CmdLineParams&	p)
+{
+	bool fSuccess = true;
+
+	for (int i = 1; i < argc && fSuccess == true; ++i)
+	{
+		if (!compareNoCase("-h", argv[i]) || !compareNoCase("-?", argv[i]))
+		{
+			fSuccess = false;
+		}
+		else if (!compareNoCase("-IN", argv[i]))
+		{
+			++i;
+
+			if(i < argc && argv[i][0] != '-')
+			{
+				p.inFileName = argv[i];
+			}
+			else
+			{
+				fSuccess = false;
+			}
+		}
+		else if (!compareNoCase("-XSL", argv[i]))
+		{
+			++i;
+
+			if(i < argc && argv[i][0] != '-')
+			{
+				p.xslFileName = argv[i];
+			}
+			else
+			{
+				fSuccess = false;
+			}
+		}
+		else if (!compareNoCase("-OUT", argv[i]))
+		{
+			++i;
+
+			if(i < argc && argv[i][0] != '-')
+			{
+				p.outFileName = argv[i];
+			}
+			else
+			{
+				fSuccess = false;
+			}
+		}
+		else if (!compareNoCase("-NOINDENT", argv[i]))
+		{
+			p.noIndent = true;
+		} 
+		else if (!compareNoCase("-INDENT", argv[i]))
+		{
+			++i;
+
+			if(i < argc && argv[i][0] != '-')
+			{
+				p.indentAmount = atoi(argv[i]);
+			}
+			else
+			{
+				fSuccess = false;
+			}
+		}
+		else if(!compareNoCase("-VALIDATE", argv[i]))
+		{
+			p.doValidation = true;
+		}
+		else if (!compareNoCase("-PARAM", argv[i])) 
+		{
+			++i;
+
+			if(i < argc && argv[i][0] != '-')
+			{
+				const char* const	name = argv[i];
+
+				++i;
+
+				// Don't check for '-' here, since that might
+				// be a valid character in a parameter value.
+				if(i < argc)
+				{
+					typedef StringPairVectorType::value_type	value_type;
+
+					p.params.push_back(value_type(name, argv[i]));
+				}
+				else
+				{
+					fSuccess = false;
+				}
+			}
+			else
+			{
+				fSuccess = false;
+			}
+		}
+		else if(!compareNoCase("-V", argv[i]))
+		{
+			p.versionOnly = true;
+		}
+		else if(!compareNoCase("-QC", argv[i]))
+		{
+			p.setQuietConflictWarnings = true;
+		}
+		else if(!compareNoCase("-Q", argv[i]))
+		{
+			p.setQuietMode = true;
+		}
+		else if(!compareNoCase("-XML", argv[i]))
+		{
+			if (p.outputType != -1)
+			{
+				warnPreviousOutputMethod(p.outputType);
+			}
+
+			p.outputType = FormatterListener::OUTPUT_METHOD_XML;
+		}
+		else if(!compareNoCase("-TEXT", argv[i]))
+		{
+			if (p.outputType != -1)
+			{
+				warnPreviousOutputMethod(p.outputType);
+			}
+
+			p.outputType = FormatterListener::OUTPUT_METHOD_TEXT;
+		}
+		else if(!compareNoCase("-HTML", argv[i]))
+		{
+			if (p.outputType != -1)
+			{
+				warnPreviousOutputMethod(p.outputType);
+			}
+
+			p.outputType = FormatterListener::OUTPUT_METHOD_HTML;
+		}
+		else if(!compareNoCase("-DOM", argv[i]))
+		{
+			if (p.outputType != -1)
+			{
+				warnPreviousOutputMethod(p.outputType);
+			}
+
+			p.outputType = FormatterListener::OUTPUT_METHOD_DOM;
+		}
+		else if(!compareNoCase("-XST", argv[i]))
+		{
+			if (p.outputType != -1)
+			{
+				warnPreviousOutputMethod(p.outputType);
+			}
+
+			p.outputType = FormatterListener::OUTPUT_METHOD_DOM;
+
+			p.formatToSourceTree = true;
+		}
+		else if(!compareNoCase("-NULL", argv[i]))
+		{
+			p.formatToNull = true;
+		}
+		else if(!compareNoCase("-STRIPCDATA", argv[i]))
+		{
+			p.stripCData = true;
+		}
+		else if(!compareNoCase("-ESCAPECDATA", argv[i]))
+		{
+			p.escapeCData = true;
+		}
+		else if (!compareNoCase("-NH", argv[i]))
+		{
+			p.shouldWriteXMLHeader = false;
+		}
+		else if(!compareNoCase("-TT", argv[i]))
+		{
+			p.traceTemplates = true;
+		}
+		else if(!compareNoCase("-TG", argv[i]))
+		{
+			p.traceGenerationEvent = true;
+		}
+		else if(!compareNoCase("-TS", argv[i]))
+		{
+			p.traceSelectionEvent = true;
+		}
+		else if(!compareNoCase("-TTC", argv[i]))
+		{
+			p.traceTemplateChildren = true;
+		}
+		else if (!compareNoCase("-XD", argv[i]))
+		{
+			p.useDOM = true;
+		}
+		else if (!compareNoCase("-DE", argv[i]))
+		{
+			p.disableExtensions = true;
+		}
+		else if (!compareNoCase("-EN", argv[i]))
+		{
+			++i;
+
+			if(i < argc)
+			{
+				p.extentionsNamespace = argv[i];
+
+				if (strlen(p.extentionsNamespace) == 0)
+				{
+					fSuccess = false;
+				}
+			}
+			else
+			{
+				fSuccess = false;
+			}
+		}
+		else
+		{
+			cerr << endl << "Warning: Ignoring unknown option \"" << argv[i] << "\"." << endl << endl;
+		}
+	}
+
+	return fSuccess;
+}
+
+
+
+FormatterListener*
+createFormatter(
+			int								outputType,
+			bool							shouldWriteXMLHeader,
+			bool							stripCData,
+			bool							escapeCData,
+			bool							noIndent,
+			bool							formatToNull,
+			bool							formatToSourceTree,
+			PrintWriter&					resultWriter,
+			int								indentAmount,
+			const XalanDOMString&			mimeEncoding,
+			const StylesheetRoot*			stylesheet,
+			XMLParserLiaison&				parserLiaison,
+			XalanSourceTreeParserLiaison&	sourceTreeParserLiaison,
+			const PrefixResolver&			prefixResolver,
+			const XalanDocument*&			theResultDocument)
+{
+	FormatterListener*	formatter = 0;
+
+	if (formatToNull == true)
+	{
+		formatter = new FormatterToNull;
+	}
+	else if(FormatterListener::OUTPUT_METHOD_XML == outputType)
+	{
+		XalanDOMString	version;
+		bool			outputIndent = false;
+		XalanDOMString	mediatype;
+		XalanDOMString	doctypeSystem;
+		XalanDOMString	doctypePublic;
+		XalanDOMString	standalone;
+
+		if (stylesheet != 0)
+		{
+			version = stylesheet->m_version;
+
+			mediatype = stylesheet->m_mediatype;
+			doctypeSystem = stylesheet->getOutputDoctypeSystem();
+			doctypePublic = stylesheet->getOutputDoctypePublic();
+			standalone = stylesheet->m_standalone;
+		}
+
+		FormatterToXML* const	fToXML =
+			new FormatterToXML(
+					resultWriter,
+					version,
+					outputIndent,
+					indentAmount,
+					mimeEncoding,
+					mediatype,
+					doctypeSystem,
+					doctypePublic,
+					true,	// xmlDecl
+					standalone);
+
+		fToXML->setShouldWriteXMLHeader(shouldWriteXMLHeader);
+		fToXML->setStripCData(stripCData);
+		fToXML->setEscapeCData(escapeCData);
+
+		formatter = fToXML;
+	}
+	else if(FormatterListener::OUTPUT_METHOD_TEXT == outputType)
+	{
+		formatter = new FormatterToText(resultWriter, mimeEncoding);
+	}
+	else if(FormatterListener::OUTPUT_METHOD_HTML == outputType)
+	{
+		XalanDOMString	version;
+		bool			outputIndent = !noIndent;
+		XalanDOMString	mediatype;
+		XalanDOMString	doctypeSystem;
+		XalanDOMString	doctypePublic;
+		XalanDOMString	standalone;
+
+		if (stylesheet != 0)
+		{
+			version = stylesheet->m_version;
+
+			if (noIndent == false)
+			{
+				outputIndent = stylesheet->getOutputIndent();
+			}
+
+			mediatype = stylesheet->m_mediatype;
+			doctypeSystem = stylesheet->getOutputDoctypeSystem();
+			doctypePublic = stylesheet->getOutputDoctypePublic();
+			standalone = stylesheet->m_standalone;
+		}
+
+		FormatterToHTML* const	fToHTML =
+				new FormatterToHTML(
+						resultWriter,
+						mimeEncoding,
+						mediatype,
+						doctypeSystem,
+						doctypePublic,
+						outputIndent,
+						indentAmount,
+						version,
+						standalone,
+						false);	// xmlDecl
+
+		fToHTML->setStripCData(stripCData);
+		fToHTML->setPrefixResolver(&prefixResolver);
+
+		formatter = fToHTML;
+	}
+	else if(FormatterListener::OUTPUT_METHOD_DOM == outputType)
+	{
+		if (formatToSourceTree == true)
+		{
+			XalanSourceTreeDocument*	theDocument =
+				sourceTreeParserLiaison.createXalanSourceTreeDocument();
+			assert(theDocument != 0);
+
+			theResultDocument = theDocument;
+
+			FormatterToSourceTree* const	fToSourceTree =
+				new FormatterToSourceTree(theDocument);
+
+			fToSourceTree->setPrefixResolver(&prefixResolver);
+
+			formatter = fToSourceTree;
+		}
+		else
+		{
+			XalanDocument* const	theDocument =
+				parserLiaison.createDOMFactory();
+			assert(theDocument != 0);
+
+			theResultDocument = theDocument;
+
+			FormatterToDOM* const	fToDOM =
+				new FormatterToDOM(theDocument, 0);
+
+			fToDOM->setPrefixResolver(&prefixResolver);
+
+			formatter = fToDOM;
+		}
+	}
+
+	return formatter;
+}
+
+
+
+XalanOutputStream*
+createOutputStream(const CmdLineParams&		params)
+{
+	if (params.outFileName == 0)
+	{
+		return new XalanStdOutputStream(cout);
+	}
+	else
+	{
+		return new XalanFileOutputStream(TranscodeFromLocalCodePage(params.outFileName));
+	}
+}
+
+
+
+TraceListener*
+createTraceListener(
+			const CmdLineParams&	params,
+			PrintWriter&			diagnosticsWriter)
+{
+	if (params.traceTemplates == true ||
+		params.traceTemplateChildren == true ||
+		params.traceGenerationEvent == true ||
+		params.traceSelectionEvent == true)
+	{
+		return new TraceListenerDefault(
+				diagnosticsWriter,
+				params.traceTemplates,
+				params.traceTemplateChildren,
+				params.traceGenerationEvent,
+				params.traceSelectionEvent);
+	}
+	else
+	{
+		return 0;
+	}
+
+}
+
+
+
+DOMSupport&
+getDOMSupport(
+		XalanSourceTreeDOMSupport&	theXalanSourceTreeDOMSupport,
+		XercesDOMSupport&			theXercesDOMSupport,
+		const CmdLineParams&		params)
+{
+	if (params.useDOM == false)
+	{
+		return theXalanSourceTreeDOMSupport;
+	}
+	else
+	{
+		return theXercesDOMSupport;
+	}
+}
+
+
+
+XMLParserLiaison&
+getParserLiaison(
+		XalanSourceTreeParserLiaison&	theXalanSourceTreeParserLiaison,
+		XercesParserLiaison&			theXercesParserLiaison,
+		const CmdLineParams&			params)
+{
+	if (params.useDOM == false)
+	{
+		return theXalanSourceTreeParserLiaison;
+	}
+	else
+	{
+		return theXercesParserLiaison;
+	}
+}
+
+
+
+void
+installExtensions(
+			const CmdLineParams&				params,
+			XSLTProcessorEnvSupportDefault&		theXSLProcessorSupport)
+{
+	XalanDOMString	theXalanNamespace;
+
+	if (params.extentionsNamespace != 0)
+	{
+		theXalanNamespace = XalanDOMString(params.extentionsNamespace);
+		assert(length(theXalanNamespace) > 0);
+	}
+	else
+	{
+		theXalanNamespace = XALAN_STATIC_UCODE_STRING("http://xml.apache.org/xalan");
+	}
+
+	theXSLProcessorSupport.installExternalFunctionLocal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("difference")),
+			FunctionDifference());
+
+	theXSLProcessorSupport.installExternalFunctionLocal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("distinct")),
+			FunctionDistinct());
+
+	theXSLProcessorSupport.installExternalFunctionLocal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("evaluate")),
+			FunctionEvaluate());
+
+	theXSLProcessorSupport.installExternalFunctionLocal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("hasSameNodes")),
+			FunctionHasSameNodes());
+
+	theXSLProcessorSupport.installExternalFunctionLocal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("intersection")),
+			FunctionIntersection());
+
+	theXSLProcessorSupport.installExternalFunctionLocal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("nodeset")),
+			FunctionNodeSet());
+}
+
+
+
+int
+xsltMain(const CmdLineParams&	params)
+{
+	// Initialize the XSLT subsystem.  This must stay in scope until
+	// we're done with the subsystem, since its destructor shuts down
+	// the subsystem.
+	XSLTInit	theInit;
+
+#if defined(XALAN_USE_ICU)
+	// Create an installer to install the substitute format-number() function.
+	FunctionICUFormatNumber::FunctionICUFormatNumberInstaller	theInstaller;
+#endif
+
+	const XalanDOMString	mimeEncoding(XALAN_STATIC_UCODE_STRING("UTF-8"));
+	const XalanDOMString	encoding(XALAN_STATIC_UCODE_STRING("UTF-8"));
+
+	/**
+	 * The default diagnostic writer...
+	 */
+	XalanStdOutputStream				theStdErr(cerr);
+	XalanOutputStreamPrintWriter		diagnosticsWriter(theStdErr);
+
+	// Make sure that error reporting, which includes any TraceListener output
+	// does not throw exceptions when transcoding, since that could result in
+	// an exception being thrown will another exception is active.  In particular,
+	// characters that the TraceListener writes might not be representable in the
+	// local code page.
+	theStdErr.setThrowTranscodeException(false);
+
+	// Initialize the XalanSourceTree subsystem.  This must stay in scope until
+	// we're done with the subsystem, since its destructor shuts down the
+	// subsystem.
+	XalanSourceTreeInit				theXalanSourceTreeInit;
+
+	XalanSourceTreeDOMSupport		theXalanSourceTreeDOMSupport;
+	XalanSourceTreeParserLiaison	theXalanSourceTreeParserLiaison(theXalanSourceTreeDOMSupport);
+
+	// Hookup the parser liaison instance to the support instance.
+	theXalanSourceTreeDOMSupport.setParserLiaison(&theXalanSourceTreeParserLiaison);
+
+
+	XercesDOMSupport		theXercesDOMSupport;
+	XercesParserLiaison		theXercesParserLiaison(theXercesDOMSupport);
+
+	DOMSupport&				theDOMSupport = getDOMSupport(
+		theXalanSourceTreeDOMSupport,
+		theXercesDOMSupport,
+		params);
+
+	XMLParserLiaison&		xmlParserLiaison = getParserLiaison(
+		theXalanSourceTreeParserLiaison,
+		theXercesParserLiaison,
+		params);
+
+	XSLTProcessorEnvSupportDefault	theXSLProcessorSupport;
+
+	if (params.disableExtensions == false)
+	{
+		installExtensions(params, theXSLProcessorSupport);
+	}
+
+	XObjectFactoryDefault	theXObjectFactory;
+
+	XPathFactoryDefault		theXPathFactory;
+
+	const XalanAutoPtr<TraceListener>		theTraceListener(
+			createTraceListener(
+				params,
+				diagnosticsWriter));
+
+	XSLTEngineImpl	processor(
+			xmlParserLiaison,
+			theXSLProcessorSupport,
+			theDOMSupport,
+			theXObjectFactory,
+			theXPathFactory);
+
+	theXSLProcessorSupport.setProcessor(&processor);
+
+	if (theTraceListener.get() != 0)
+	{
+		processor.setTraceSelects(params.traceSelectionEvent);
+		processor.addTraceListener(theTraceListener.get());
+	}
+
+	// Use a different factory type for the stylesheet.  This is an optimization, since
+	// stylesheet XPath instances are built all at once and are deleted all at once when
+	// the stylesheet is destroyed.
+	XPathFactoryBlock	theStylesheetXPathFactory;
+
+	StylesheetConstructionContextDefault	theConstructionContext(
+			processor,
+			theStylesheetXPathFactory);
+
+	/*
+	 * Set specified processor flags
+	 */
+	processor.setQuietConflictWarnings(params.setQuietConflictWarnings);
+
+	if (params.params.size() > 0)
+	{
+		StringPairVectorType::const_iterator	it = params.params.begin();
+
+		for ( ; it != params.params.end(); ++it)
+		{
+			assert((*it).first != 0 && (*it).second != 0);
+
+			processor.setStylesheetParam(
+					XalanDOMString((*it).first),
+					XalanDOMString((*it).second));
+		}
+	}
+
+	/*
+	 * Set specified parser flags
+	 */
+	if (params.indentAmount != 0)
+	{
+		xmlParserLiaison.setIndent(params.indentAmount);
+	}
+
+	xmlParserLiaison.setUseValidation(params.doValidation);
+
+	if (!params.setQuietMode)
+	{
+		processor.setDiagnosticsOutput(&diagnosticsWriter);
+	}
+
+	XalanDOMString	xslFileName;
+
+	if(params.xslFileName != 0)
+	{
+		xslFileName = params.xslFileName;
+	}
+
+	const StylesheetRoot*	stylesheet = 0;
+
+	if (!isEmpty(xslFileName))
+	{
+		stylesheet = processor.processStylesheet(xslFileName, theConstructionContext);
+	}
+
+	XalanAutoPtr<XalanOutputStream>		outputFileStream(createOutputStream(params));
+	assert(outputFileStream.get() != 0);
+
+	XalanOutputStreamPrintWriter	resultWriter(*outputFileStream.get());
+
+	const XalanDocument*	theResultDocument = 0;
+
+	const XalanAutoPtr<FormatterListener>	formatter(
+			createFormatter(
+				params.outputType,
+				params.shouldWriteXMLHeader,
+				params.stripCData,
+				params.escapeCData,
+				params.noIndent,
+				params.formatToNull,
+				params.formatToSourceTree,
+				resultWriter,
+				xmlParserLiaison.getIndent(),
+				mimeEncoding,
+				stylesheet,
+				xmlParserLiaison,
+				theXalanSourceTreeParserLiaison,
+				processor,
+				theResultDocument));
+
+	XSLTResultTarget	rTreeTarget;
+
+	if(formatter.get() == 0)
+	{
+		rTreeTarget.setCharacterStream(&resultWriter);
+	}
+	else
+	{
+		rTreeTarget.setFormatterListener(formatter.get());
+	}
+
+	// Do the transformation...
+	XSLTInputSource		theInputSource;
+
+	if (params.inFileName != 0)
+	{
+		theInputSource.setSystemId(c_wstr(XalanDOMString(params.inFileName)));
+	}
+	else
+	{
+		theInputSource.setStream(&cin);
+
+		cerr << "Reading input document from stdin..." << endl;
+	}
+
+	StylesheetExecutionContextDefault	theExecutionContext(processor,
+			theXSLProcessorSupport,
+			theDOMSupport,
+			theXObjectFactory);
+
+#if defined(XALAN_USE_ICU)
+	ICUBridgeCollationCompareFunctor	theICUFunctor;
+
+	theExecutionContext.installCollationCompareFunctor(&theICUFunctor);
+#endif
+
+	if (params.useDOM == false)
+	{
+		theXalanSourceTreeParserLiaison.setExecutionContext(theExecutionContext);
+	}
+	else
+	{
+		theXercesParserLiaison.setExecutionContext(theExecutionContext);
+	}
+
+	if (stylesheet == 0)
+	{
+		// No stylesheet, so our only hope is that the xml file has
+		// PI with the stylesheet...
+
+		// Dummy input source...
+		XSLTInputSource		theStylesheetSource;
+
+		processor.process(
+				theInputSource,
+				theStylesheetSource,
+				rTreeTarget,
+				theConstructionContext,
+				theExecutionContext);
+	}
+	else
+	{
+		theExecutionContext.setStylesheetRoot(stylesheet);
+
+		processor.process(
+				theInputSource,
+				rTreeTarget,
+				theExecutionContext);
+	}
+
+	if (params.outputType == FormatterListener::OUTPUT_METHOD_DOM)
+	{
+		// Output is to DOM, so we have to format to XML to
+		// produce output...
+		assert(rTreeTarget.getFormatterListener() != 0 &&
+			   rTreeTarget.getFormatterListener()->getOutputFormat() ==
+					FormatterListener::OUTPUT_METHOD_DOM);
+
+		if (theResultDocument == 0)
+		{
+			cerr << endl << "Error: No document to format!!!" << endl;
+		}
+		else
+		{
+			// Create a FormaterToXML with the required output
+			// options...
+			const XalanAutoPtr<FormatterListener>	formatter(
+					createFormatter(
+						FormatterListener::OUTPUT_METHOD_XML,
+						params.shouldWriteXMLHeader,
+						params.stripCData,
+						params.escapeCData,
+						params.noIndent,
+						false,
+						false,
+						resultWriter,
+						xmlParserLiaison.getIndent(),
+						mimeEncoding,
+						stylesheet,
+						xmlParserLiaison,
+						theXalanSourceTreeParserLiaison,
+						processor,
+						theResultDocument));
+
+			// Create a FormatterTreeWalker with the the
+			// new formatter...
+			FormatterTreeWalker theTreeWalker(*formatter.get());
+
+			// Walk the document and produce the XML...
+			theTreeWalker.traverse(theResultDocument);
+		}
+	}
+
+	theExecutionContext.reset();
+
+	theConstructionContext.reset();
+	theStylesheetXPathFactory.reset();
+
+	processor.reset();
+
+	theXPathFactory.reset();
+	theXObjectFactory.reset();
+	theXSLProcessorSupport.reset();
+	theDOMSupport.reset();
+
+	xmlParserLiaison.reset();
+
+	return 0;
+}
+
+
+
+int
+main(
+			int				argc,
+			const char*		argv[])
+{
+#if !defined(XALAN_USE_ICU) && !defined(NDEBUG) && defined(_MSC_VER)
+	_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
+
+	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
+	_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+#endif
+
+#if defined(XALAN_VQ_SPECIAL_TRACE)
+	QuantifyStopRecordingData();
+#endif
+
+	int				theResult = 0;
+
+	CmdLineParams	theParams;
+
+	/*
+	 *		Get command line arguments
+	 */
+	if (getArgs(argc, argv, theParams) == false)
+	{
+		printArgOptions();
+	}
+	else if (theParams.versionOnly == true)
+	{
+		cout << endl
+			 << "TestXSLT version 1.2.0 (Xalan C++ version 1.2.0)"
+			 << endl;
+	}
+	else
+	{
+		XMLPlatformUtils::Initialize();
+
+		try
+		{
+			theResult = xsltMain(theParams);
+		}
+		catch (XSLException& e)
+		{
+			cout << "\nXSLException ";
+
+			cout << "Type is: " << e.getType() << endl;
+
+			cout << "Message is: " << e.getMessage() << " (";
+
+			const XalanDOMString&	theURI = e.getURI();
+
+			if (length(theURI) != 0)
+			{
+				cout << theURI;
+			}
+			else
+			{
+				cout << "Unknown URI";
+			}
+
+			const int	theLineNumber = e.getLineNumber();
+
+			if (theLineNumber != -1)
+			{
+				cout << ", line " << theLineNumber;
+			}
+			else
+			{
+				cout << ", unknown line";
+			}
+
+			const int	theColumnNumber = e.getColumnNumber();
+
+			if (theColumnNumber != -1)
+			{
+				cout << ", column " << theColumnNumber;
+			}
+			else
+			{
+				cout << ", unknown column";
+			}
+
+			cout << ")" << endl;
+
+			theResult = -1;
+		}
+		catch (SAXException& e)
+		{
+			cout << "\nSAXException ";
+
+			cout << "Message is: " << e.getMessage() << endl;
+
+			theResult = -2;
+		}
+		catch (XMLException& e)
+		{
+			cout << "\nXMLException ";
+
+			cout << "Type is: " << e.getType() << endl;
+
+			cout << "Message is: " << e.getMessage() << endl;
+
+			theResult = -3;
+		}
+		catch(const XalanDOMException&	e)
+		{
+			cout << endl
+				 << "XalanDOMException caught.  The code is "
+				 << int(e.getExceptionCode())
+				 << "."
+				 << endl;
+
+			theResult = -4;
+		}
+		catch (...)
+		{
+			cout << "\nUnhandled Exception\n";
+
+			theResult = -5;
+		}
+
+#if !defined(NDEBUG)
+		const size_t	theInstanceCount =
+				XalanNode::getInstanceCount();
+
+		if (theInstanceCount > 0)
+		{
+			cout << "There are "
+				 << XalanNode::getInstanceCount()
+				 << " XalanNode instances still alive!"
+				 << endl
+				 << endl
+				 << "A dump of these instances follows..."
+				 << endl
+				 << endl;
+
+			typedef vector<XalanNode*>	NodeVectorType;
+
+			NodeVectorType	theNodes(theInstanceCount, NodeVectorType::value_type(0));
+
+			XalanNode::getLiveInstances(&*theNodes.begin());
+
+			for(unsigned int i = 0; i < theInstanceCount; ++i)
+			{
+				const XalanNode* const	theInstance = theNodes[i];
+
+				if(theInstance == 0)
+				{
+					cout << "No instance information is available..."
+						 << endl;
+				}
+				else
+				{
+					cout << "("
+						 << hex
+						 << theInstance
+						 << ")  Node name: \""
+						 << theInstance->getNodeName()
+						 << "\"  Node value: \""
+						 << theInstance->getNodeValue()
+						 << "\""
+#if defined(XALAN_RTTI_AVAILABLE) && !defined(XALAN_NO_TYPEINFO)
+						 << "  Type: \""
+						 << typeid(*theInstance).name()
+						 << "\""
+#endif
+						 << endl
+						 << endl;
+				}
+			}
+		}
+#endif
+
+		XMLPlatformUtils::Terminate();
+	}
+
+	return theResult;
+}
diff --git a/src/XSLT/Stylesheet.cpp b/src/XSLT/Stylesheet.cpp
new file mode 100644
index 0000000..a6084ca
--- /dev/null
+++ b/src/XSLT/Stylesheet.cpp
@@ -0,0 +1,1866 @@
+/*
+ * 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ * $ Id: $
+ *
+ */
+
+#include "Stylesheet.hpp"
+
+
+
+#include <algorithm>
+
+
+
+#include <sax/AttributeList.hpp>
+
+
+
+#include <Include/STLHelper.hpp>
+
+
+
+#include <XalanDOM/XalanDOMException.hpp>
+
+
+
+#include <DOMSupport/DOMServices.hpp>
+
+
+
+#include <XMLSupport/XMLParserLiaison.hpp>
+
+
+
+#include <XPath/ElementPrefixResolverProxy.hpp>
+#include <XPath/XObject.hpp>
+#include <XPath/XPath.hpp>
+#include <XPath/XalanQNameByReference.hpp>
+
+
+
+#include "Constants.hpp"
+#include "ElemAttributeSet.hpp"
+#include "ElemDecimalFormat.hpp"
+#include "ElemTemplate.hpp"
+#include "ElemTemplateElement.hpp"
+#include "ElemVariable.hpp"
+#include "ExtensionNSHandler.hpp"
+#include "KeyTable.hpp"
+#include "StylesheetConstructionContext.hpp"
+#include "StylesheetExecutionContext.hpp"
+#include "StylesheetRoot.hpp"
+
+
+
+const Stylesheet::NamespaceVectorType	Stylesheet::s_emptyNamespace;
+
+
+
+const XalanDOMString			Stylesheet::s_emptyString;
+
+const XalanQNameByReference		Stylesheet::s_emptyQName;
+
+const XalanEmptyNamedNodeMap	Stylesheet::s_fakeAttributes;
+
+
+
+Stylesheet::Stylesheet(
+		StylesheetRoot& 				root,
+		const XalanDOMString&			baseIdentifier,
+		StylesheetConstructionContext&	constructionContext) :
+	XalanDocument(),
+	PrefixResolver(),
+	m_stylesheetRoot(root),
+	m_baseIdent(baseIdentifier),
+	m_keyDeclarations(),
+	m_XSLTNamespaceURI(constructionContext.getXSLTNamespaceURI()),
+	m_whitespacePreservingElements(),
+	m_whitespaceStrippingElements(),	
+	m_imports(),
+	m_importsSize(0),
+	m_namespaces(),
+	m_namespaceDecls(),
+	m_isWrapperless(false),
+	m_wrapperlessTemplate(0),
+	m_extensionNamespaces(),
+	m_firstTemplate(0),
+	m_includeStack(),
+	m_namedTemplates(),
+	m_topLevelVariables(),
+	m_XSLTVerDeclared(1.0L),
+	m_isRoot(&root == this ? true: false),
+	m_patternTable(),
+	m_patternTableEnd(m_patternTable.end()),
+	m_textPatternList(),
+	m_commentPatternList(),
+	m_rootPatternList(),
+	m_piPatternList(),
+	m_nodePatternList(),
+	m_anyPatternList(),
+	m_matchPattern2Container(),
+	m_patternCount(0),
+	m_attributeSets(),
+	m_attributeSetsSize(0),
+	m_surrogateChildren(*this),
+	m_elemDecimalFormats(),
+	m_prefixAliases(),
+	m_namespacesHandler()
+{
+	if (length(m_baseIdent) == 0)
+	{
+		m_includeStack.push_back(m_baseIdent);
+	}
+	else
+	{
+		try
+		{
+			const XalanDOMString urlString = constructionContext.getURLStringFromString(m_baseIdent);
+
+			if (length(urlString) != 0)
+			{
+				m_includeStack.push_back(urlString);
+
+				m_baseIdent = urlString;
+			}
+		}
+		catch(const XMLException&)
+		{
+			// Assume that any exception here relates to get the urlString from
+			// m_baseIdent.  We'll assume that it's just a fake base identifier
+			// since the parser will throw the real error if the base identifier
+			// can't be resolved.
+			m_includeStack.push_back(baseIdentifier);
+		}
+	}
+}
+
+
+
+Stylesheet::~Stylesheet()
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	// Clean up all entries in the imports vector.
+	for_each(m_imports.begin(),
+			 m_imports.end(),
+			 DeleteFunctor<Stylesheet>());
+
+	// Clean up the atribute sets vector
+	for_each(m_attributeSets.begin(),
+			 m_attributeSets.end(),
+			 DeleteFunctor<ElemAttributeSet>());
+
+	// Clean up the top-level variables vector
+	for_each(m_topLevelVariables.begin(),
+			 m_topLevelVariables.end(),
+			 DeleteFunctor<ElemVariable>());
+
+	// Clean up the decimal formats vector
+	for_each(m_elemDecimalFormats.begin(),
+			 m_elemDecimalFormats.end(),
+			 DeleteFunctor<ElemDecimalFormat>());
+
+	// Clean up the extension namespaces vector
+	for_each(m_extensionNamespaces.begin(),
+			 m_extensionNamespaces.end(),
+			 MapValueDeleteFunctor<ExtensionNamespacesMapType>());
+
+	delete m_wrapperlessTemplate;
+
+	delete m_firstTemplate;
+}
+
+
+
+void
+Stylesheet::processKeyElement(
+			ElemTemplateElement*			nsContext,
+			const AttributeList&			atts,
+			StylesheetConstructionContext&	constructionContext)
+{
+	const XalanDOMChar* 	nameAttr = 0;
+	XPath*					matchAttr = 0;
+	XPath*					useAttr = 0;
+ 
+	const unsigned int	nAttrs = atts.getLength();
+
+	for(unsigned int i = 0; i < nAttrs; i++)
+	{
+		const XalanDOMChar* const	aname = atts.getName(i);
+
+		if (equals(aname, Constants::ATTRNAME_NAME))
+		{
+			nameAttr = atts.getValue(i);
+		}
+		else if(equals(aname, Constants::ATTRNAME_MATCH))
+		{
+			matchAttr =
+					constructionContext.createMatchPattern(
+						0,
+						XalanDOMString(atts.getValue(i)),
+						*nsContext);
+		}
+		else if(equals(aname, Constants::ATTRNAME_USE))
+		{
+			useAttr =
+					constructionContext.createXPath(
+						0,
+						atts.getValue(i),
+						*nsContext);
+		}
+		else if (isAttrOK(aname, atts, i, constructionContext) == false)
+		{
+			constructionContext.error(
+				TranscodeFromLocalCodePage("xsl:key, unrecognized keyword '") +
+					aname +
+					TranscodeFromLocalCodePage("'!"));
+		}
+	}
+
+	if(0 == nameAttr)
+		constructionContext.error(TranscodeFromLocalCodePage("xsl:key requires a ") + Constants::ATTRNAME_NAME + " attribute!");
+
+	if(0 == matchAttr)
+		constructionContext.error(TranscodeFromLocalCodePage("xsl:key requires a ") + Constants::ATTRNAME_MATCH + " attribute!");
+
+	if(0 == useAttr)
+		constructionContext.error(TranscodeFromLocalCodePage("xsl:key requires a ") + Constants::ATTRNAME_USE + " attribute!");
+
+	m_keyDeclarations.push_back(KeyDeclaration(XalanDOMString(nameAttr), *matchAttr, *useAttr));
+}
+
+
+
+void
+Stylesheet::pushNamespaces(const AttributeList&		atts)
+{
+	const unsigned int		nAttrs = atts.getLength();
+
+	NamespaceVectorType 	namespaces;
+
+	for(unsigned int i = 0; i < nAttrs; i++)
+	{
+		const XalanDOMChar* const	aname = atts.getName(i);
+		const XalanDOMChar* const	value = atts.getValue(i);
+
+		const bool	isPrefix = startsWith(aname, DOMServices::s_XMLNamespaceWithSeparator);
+
+		if (equals(aname, DOMServices::s_XMLNamespace) || isPrefix) 
+		{
+			const XalanDOMString	p = isPrefix ? substring(aname, 6) : XalanDOMString();
+
+			namespaces.push_back(NameSpace(p, XalanDOMString(value)));
+		}
+	}
+
+	m_namespaces.push_back(namespaces);
+}
+
+
+
+class attrSetCompare
+{
+public:
+
+	attrSetCompare(const ElemAttributeSet&	theAttrSet) :
+		m_attrSet(theAttrSet)
+	{
+	}
+
+	bool
+	operator()(const ElemAttributeSet*	theRHS) const
+	{
+		assert(theRHS != 0);
+
+		return m_attrSet == *theRHS;
+	}
+
+private:
+
+	const ElemAttributeSet&		m_attrSet;
+};
+
+
+
+void
+Stylesheet::postConstruction(StylesheetConstructionContext&		constructionContext)
+{
+	{
+		m_importsSize = m_imports.size();
+
+		// Call postConstruction() on any imported stylesheets, the get any aliases
+		// in reverse order, to preserve import precedence. Also, get any key declarations.
+		const StylesheetVectorType::reverse_iterator	theEnd = m_imports.rend();
+		StylesheetVectorType::reverse_iterator	i = m_imports.rbegin();
+
+		while(i != theEnd)
+		{
+			(*i)->postConstruction(constructionContext);
+
+			m_namespacesHandler.copyNamespaceAliases((*i)->getNamespacesHandler());
+
+			// $$ ToDo: Should we clear the imported stylesheet's key
+			// declarations after we copy them?
+			m_keyDeclarations.insert(
+				m_keyDeclarations.end(),
+				(*i)->m_keyDeclarations.begin(),
+				(*i)->m_keyDeclarations.end());
+
+			++i;
+		}
+	}
+
+	// Call postConstruction() on our own namespaces handler...
+	m_namespacesHandler.postConstruction();
+
+
+	{
+		for (ElemTemplateElement* node = m_firstTemplate;
+			 node != 0;
+			 node = node->getNextSiblingElem())
+		{
+			node->postConstruction(constructionContext, m_namespacesHandler);
+		}
+	}
+
+	{
+		for (ElemVariableVectorType::iterator it = m_topLevelVariables.begin();
+			 it != m_topLevelVariables.end();
+			 ++it)
+		{
+			(*it)->postConstruction(constructionContext, m_namespacesHandler);
+		}
+	}
+
+	{
+		for (ElemTemplateElement* node = m_wrapperlessTemplate;
+			 node != 0;
+			 node = node->getNextSiblingElem())
+		{
+			node->postConstruction(constructionContext, m_namespacesHandler);
+		}
+	}
+
+	{
+#if !defined(XALAN_NO_NAMESPACES)
+		using std::find_if;
+#endif
+		for (AttributeSetVectorType::size_type i = 0; i < m_attributeSets.size(); ++i)
+		{
+			ElemAttributeSet* const		theCurrent = m_attributeSets[i];
+
+			assert(theCurrent != 0);
+
+			for(;;)
+			{
+				// Look for duplicate sets...
+				const AttributeSetVectorType::iterator 	theResult =
+					find_if(
+							m_attributeSets.begin() + (i + 1),
+							m_attributeSets.end(),
+							attrSetCompare(*theCurrent));
+
+				// Did we find it?
+				if(theResult == m_attributeSets.end())
+				{
+					break;
+				}
+				else
+				{
+					theCurrent->adopt(**theResult);
+
+					delete *theResult;
+
+					m_attributeSets.erase(theResult);
+				}
+			}
+
+			theCurrent->postConstruction(constructionContext, m_namespacesHandler);
+		}
+
+		// Now that we're done with removing duplicates, cache the size...
+		m_attributeSetsSize = m_attributeSets.size();
+	}
+
+	// OK, now we need to add everything template that matches "node()"
+	// to the end of the text, comment, and PI template lists.
+	PatternTableListType::iterator	theBegin = m_nodePatternList.begin();
+	PatternTableListType::iterator	theEnd = m_nodePatternList.end();
+
+	if (theBegin != theEnd)
+	{
+		m_textPatternList.insert(
+			m_textPatternList.end(),
+			theBegin,
+			theEnd);
+
+		m_commentPatternList.insert(
+			m_commentPatternList.end(),
+			theBegin,
+			theEnd);
+
+		m_piPatternList.insert(
+			m_piPatternList.end(),
+			theBegin,
+			theEnd);
+	}
+
+	m_nodePatternList.insert(
+			theEnd,
+			m_anyPatternList.begin(),
+			m_anyPatternList.end());
+
+	theBegin = m_nodePatternList.begin();
+	theEnd = m_nodePatternList.end();
+
+	if (theBegin != theEnd)
+	{
+		PatternTableMapType::iterator	i =
+				m_patternTable.begin();
+
+		while(i != m_patternTable.end())
+		{
+			PatternTableListType&	theTable = (*i).second;
+
+			theTable.insert(
+				theTable.end(),
+				theBegin,
+				theEnd);
+
+			++i;
+		}
+	}
+
+	m_patternCount = m_matchPattern2Container.size();
+}
+
+
+
+bool
+Stylesheet::isAttrOK(
+			const XalanDOMChar* 			attrName,
+			const AttributeList&			/* atts */,
+			int 							/* which */,
+			StylesheetConstructionContext&	constructionContext) const
+{
+	// Namespace declarations are OK by definition
+	bool attrOK = equals(attrName, DOMServices::s_XMLNamespace) ||
+						 startsWith(attrName, DOMServices::s_XMLNamespaceWithSeparator);
+
+	if(!attrOK)
+	{
+		// Others are OK if their prefix has been
+		// bound to a non-null Namespace URI other than XSLT's
+		const unsigned int	indexOfNSSep = indexOf(attrName, XalanUnicode::charColon);
+
+		if(indexOfNSSep < length(attrName))
+		{
+			const XalanDOMString	prefix = substring(attrName, 0, indexOfNSSep);
+			const XalanDOMString*	ns = getNamespaceForPrefixFromStack(prefix);
+
+			attrOK = ns != 0 && !::isEmpty(*ns) && !equals(*ns, constructionContext.getXSLTNamespaceURI());
+		}
+		else
+		{
+			attrOK = false;
+		}
+	}
+
+	return attrOK;
+}
+
+
+
+const XalanDOMString*
+Stylesheet::getNamespaceFromStack(const XalanDOMChar* 	nodeName) const
+{
+	assert(nodeName != 0);
+
+	const unsigned int		indexOfNSSep = indexOf(nodeName, XalanUnicode::charColon);
+
+	const XalanDOMString	prefix =
+		indexOfNSSep < length(nodeName) ?
+				substring(nodeName, 0, indexOfNSSep) :
+				XalanDOMString();
+
+	return getNamespaceForPrefixFromStack(prefix);
+}
+
+
+
+bool
+Stylesheet::getYesOrNo(
+			const XalanDOMChar* 			aname,
+			const XalanDOMChar* 			val,
+			StylesheetConstructionContext&	constructionContext) const
+{
+	if(equals(val, Constants::ATTRVAL_YES))
+	{
+		return true;
+	}
+	else if(equals(val, Constants::ATTRVAL_NO))
+	{
+		return false;
+	}
+	else
+	{
+		constructionContext.error(XalanDOMString(val) + " is unknown value for " + aname);
+
+		return false;
+	}
+}
+
+
+
+void
+Stylesheet::addTemplate(
+			ElemTemplate*					theTemplate,
+			StylesheetConstructionContext&	constructionContext)
+{
+	assert(theTemplate != 0);
+
+	unsigned int	pos = 0;
+
+	if(0 == m_firstTemplate)
+	{
+		m_firstTemplate = theTemplate;
+	}
+	else
+	{
+		ElemTemplateElement*	next = m_firstTemplate;
+
+		// Find the last one, then append the new one.
+		while(0 != next)
+		{
+			if(0 == next->getNextSiblingElem())
+			{
+				next->setNextSiblingElem(theTemplate);
+				theTemplate->setNextSiblingElem(0); // just to play it safe.
+				theTemplate->setPreviousSiblingElem(next);
+				break;
+			}
+
+			pos++;
+
+			next = next->getNextSiblingElem();
+		}
+	}
+
+	// If it's a named template, then we need to
+	// and it to the map of named templates.
+	const XalanQName&	theName = theTemplate->getName();
+
+	if(theName.isEmpty() == false)
+	{
+		if (m_namedTemplates.find(theName) == m_namedTemplates.end())
+		{
+			m_namedTemplates[theName] = theTemplate;
+		}
+		else
+		{
+			// This is an error...
+			XalanDOMString	theMessage(TranscodeFromLocalCodePage("The stylesheet already has a template with the name "));
+
+			const XalanDOMString&	theNamespace = theName.getNamespace();
+
+			if (length(theNamespace) != 0)
+			{
+				theMessage += theNamespace;
+				theMessage += DOMServices::s_XMLNamespaceSeparatorString;
+			}
+
+			theMessage += theName.getLocalPart();
+
+			constructionContext.error(theMessage, 0, theTemplate);
+		}
+	}
+
+	// Now, process the match pattern associated with the
+	// template.
+	const XPath* const	xp = theTemplate->getMatchPattern();
+
+	if(0 != xp)
+	{
+		/* Each string has a list of pattern tables associated with it; if the
+		 * string is not in the map, then create a list of pattern tables with one
+		 * entry for the string, otherwise add to the existing pattern table list
+		 * for that string
+		 */
+		typedef XPath::TargetElementStringsVectorType	TargetElementStringsVectorType;
+
+		TargetElementStringsVectorType		strings;
+
+		xp->getTargetElementStrings(strings);
+
+		TargetElementStringsVectorType::size_type	nTargets =
+				strings.size();
+
+		if(nTargets != 0)
+		{
+			for(TargetElementStringsVectorType::size_type stringIndex = 0;
+								stringIndex < nTargets; stringIndex++) 
+			{
+				const XalanDOMString& target = strings[stringIndex];
+
+				m_matchPattern2Container.push_back(
+					MatchPattern2(
+						*theTemplate,
+						pos,
+						target,
+						*xp,
+						xp->getExpression().getCurrentPattern()));
+
+				const MatchPattern2* const	newMatchPat =
+					&m_matchPattern2Container.back();
+
+				// Always put things on the front of the list, so
+				// templates later in the stylesheet are always
+				// selected first.
+				if (equals(target, XPath::PSEUDONAME_TEXT) == true)
+				{
+					m_textPatternList.insert(
+						m_textPatternList.begin(),
+						newMatchPat);
+				}
+				else if (equals(target, XPath::PSEUDONAME_COMMENT) == true)
+				{
+					m_commentPatternList.insert(
+						m_commentPatternList.begin(),
+						newMatchPat);
+				}
+				else if (equals(target, XPath::PSEUDONAME_ROOT) == true)
+				{
+					m_rootPatternList.insert(
+						m_rootPatternList.begin(),
+						newMatchPat);
+				}
+				else if (equals(target, XPath::PSEUDONAME_PI) == true)
+				{
+					m_piPatternList.insert(
+						m_piPatternList.begin(),
+						newMatchPat);
+				}
+				else if (equals(target, XPath::PSEUDONAME_NODE) == true)
+				{
+					m_nodePatternList.insert(
+						m_nodePatternList.begin(),
+						newMatchPat);
+				}
+				else if (equals(target, XPath::PSEUDONAME_ANY) == true)
+				{
+					m_anyPatternList.insert(
+						m_anyPatternList.begin(),
+						newMatchPat);
+				}
+				else
+				{
+					// Put it in the map.
+					PatternTableListType&	theTable =
+						m_patternTable[target];
+
+					theTable.insert(
+						theTable.begin(),
+						newMatchPat);
+				}
+			}
+		}
+	}
+}
+
+
+
+const ElemTemplate*
+Stylesheet::findNamedTemplate(const XalanQName&		qname) const
+{
+	ElemTemplateMapType::const_iterator it = m_namedTemplates.find(qname);
+
+	if(it != m_namedTemplates.end())
+	{
+		return (*it).second;
+	}
+	else
+	{
+		const ElemTemplate*		namedTemplate = 0;
+
+		// Look for the template in the imports
+		const StylesheetVectorType::size_type	nImports = m_imports.size();
+
+		for(StylesheetVectorType::size_type i = 0; i < nImports; ++i)
+		{
+			const Stylesheet* const stylesheet = m_imports[i];
+
+			namedTemplate = stylesheet->findNamedTemplate(qname);
+
+			if(0 != namedTemplate)
+				break;
+		}
+
+		return namedTemplate;
+	}
+}
+	
+
+
+void
+Stylesheet::addObjectIfNotFound(
+			const MatchPattern2*		thePattern,
+			PatternTableVectorType& 	theVector)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::find;
+#endif
+
+	const PatternTableVectorType::const_iterator 	theResult =
+		find(
+				theVector.begin(),
+				theVector.end(),
+				thePattern);
+
+	// Did we find it?
+	if(theResult == theVector.end())
+	{
+		theVector.push_back(thePattern);
+	}
+}
+
+
+
+inline void
+Stylesheet::addObjectIfNotFound(
+			const MatchPattern2*	thePattern,
+			const MatchPattern2* 	thePatternArray[],
+			unsigned int&			thePatternArraySize)
+{
+	if (thePatternArraySize == 0)
+	{
+		thePatternArray[0] = thePattern;
+
+		++thePatternArraySize;
+	}
+	else
+	{
+		unsigned int i = 0;
+
+		while(i < thePatternArraySize)
+		{
+			if (thePatternArray[i] != thePattern)
+			{
+				++i;
+			}
+			else
+			{
+				break;
+			}
+		}
+
+		if (i == thePatternArraySize)
+		{
+			thePatternArray[thePatternArraySize++] = thePattern;
+		}
+	}
+}
+
+
+
+inline const Stylesheet::PatternTableListType* 
+Stylesheet::locateMatchPatternList2(const XalanDOMString&	theName) const
+{
+	assert(m_patternTableEnd == m_patternTable.end());
+
+	const PatternTableMapType::const_iterator	i =
+		m_patternTable.find(theName);
+
+	if (i != m_patternTableEnd)
+	{
+		return &(*i).second;
+	}
+	else
+	{
+		return &m_nodePatternList;
+	}
+}
+
+
+
+inline const Stylesheet::PatternTableListType*
+Stylesheet::locateMatchPatternList2(const XalanNode&	theNode) const
+{
+	switch(theNode.getNodeType())
+	{
+	case XalanNode::ELEMENT_NODE:
+		return locateMatchPatternList2(DOMServices::getLocalNameOfNode(theNode));
+		break;
+
+	case XalanNode::PROCESSING_INSTRUCTION_NODE:
+		return &m_piPatternList;
+		break;
+
+	case XalanNode::ATTRIBUTE_NODE:
+		return locateMatchPatternList2(DOMServices::getLocalNameOfNode(theNode));
+		break;
+
+	case XalanNode::CDATA_SECTION_NODE:
+	case XalanNode::TEXT_NODE:
+		return &m_textPatternList;
+		break;
+
+	case XalanNode::COMMENT_NODE:
+		return &m_commentPatternList;
+		break;
+
+	case XalanNode::DOCUMENT_NODE:
+		return &m_rootPatternList;
+		break;
+
+	case XalanNode::DOCUMENT_FRAGMENT_NODE:
+		return &m_anyPatternList;
+		break;
+	}
+
+	return locateMatchPatternList2(theNode.getNodeName());
+}
+
+
+
+const ElemTemplate*
+Stylesheet::findTemplate(
+			StylesheetExecutionContext& 	executionContext,
+			XalanNode*						targetNode, 
+			const XalanQName&				mode,
+			bool							onlyUseImports) const
+{
+	assert(targetNode != 0);
+	assert(m_patternCount == m_matchPattern2Container.size());
+
+	if(m_isWrapperless == true)
+	{
+		return m_wrapperlessTemplate;
+	}
+	else
+	{
+		const ElemTemplate*		bestMatchedRule = 0;
+		const MatchPattern2*	bestMatchedPattern = 0; // Syncs with bestMatchedRule
+		const double			matchScoreNoneValue = 
+			XPath::getMatchScoreValue(XPath::eMatchScoreNone);
+
+		double					bestMatchPatPriority = matchScoreNoneValue;
+			
+
+		unsigned int			nConflicts = 0;
+
+		// Use a stack-based array when possible...
+		const MatchPattern2*	conflictsArray[100];
+
+		XalanArrayAutoPtr<const MatchPattern2*>		conflictsVector;
+
+		const MatchPattern2**	conflicts = 0;
+
+		if(onlyUseImports == false)
+		{
+			// Points to the current list of match patterns.  Note
+			// that this may point to more than one table.
+			const PatternTableListType* 	matchPatternList =
+				locateMatchPatternList2(*targetNode);
+			assert(matchPatternList != 0);
+
+			PatternTableListType::const_iterator		theCurrentEntry =
+				matchPatternList->begin();
+
+			const PatternTableListType::const_iterator	theTableEnd =
+				matchPatternList->end();
+
+			if (theCurrentEntry != theTableEnd)
+			{
+				const XalanDOMString*	prevPat = 0;
+				const MatchPattern2*	prevMatchPat = 0;
+				double					prevMatchPatPriority = matchScoreNoneValue;
+
+				do
+				{
+					const MatchPattern2*	matchPat = *theCurrentEntry;
+					double					matchPatPriority = matchScoreNoneValue;
+					assert(matchPat != 0);
+
+					const ElemTemplate*	const	rule = matchPat->getTemplate();
+					assert(rule != 0);
+
+					// We'll be needing to match rules according to what 
+					// mode we're in.
+					const XalanQName&	ruleMode = rule->getMode();
+
+					// The logic here should be that if we are not in a mode AND
+					// the rule does not have a node, then go ahead.
+					// OR if we are in a mode, AND the rule has a node, 
+					// AND the rules match, then go ahead.
+					const bool	haveMode = !mode.isEmpty();
+					const bool	haveRuleMode = !ruleMode.isEmpty();
+
+					if ((!haveMode && !haveRuleMode) ||
+						(haveMode && haveRuleMode && ruleMode.equals(mode)))
+					{
+						const XalanDOMString*	patterns = matchPat->getPattern();
+						assert(patterns != 0);
+
+						if(!isEmpty(*patterns) &&
+						   !(prevMatchPat != 0 &&
+							 (prevPat != 0 && equals(*prevPat, *patterns)) &&
+							 prevMatchPat->getTemplate()->getPriority() == matchPat->getTemplate()->getPriority()))
+						{
+							prevPat = patterns;
+							prevMatchPat = matchPat;
+							prevMatchPatPriority = matchPatPriority;
+							matchPatPriority = matchScoreNoneValue;
+
+							const XPath* const	xpath = matchPat->getExpression();
+
+							XPath::eMatchScore	score =
+									xpath->getMatchScore(targetNode, *this, executionContext);
+
+							if(XPath::eMatchScoreNone != score)
+							{
+								const double priorityVal = rule->getPriority();
+								const double priorityOfRule 
+										  = (matchScoreNoneValue != priorityVal) 
+										  ? priorityVal : XPath::getMatchScoreValue(score);
+
+								matchPatPriority = priorityOfRule;
+								const double priorityOfBestMatched =
+											(0 != bestMatchedPattern) ?
+													bestMatchPatPriority : 
+													matchScoreNoneValue;
+
+								if(priorityOfRule > priorityOfBestMatched)
+								{
+									nConflicts = 0;
+
+									bestMatchedRule = rule;
+									bestMatchedPattern = matchPat;
+									bestMatchPatPriority = matchPatPriority;
+								}
+								else if(priorityOfRule == priorityOfBestMatched)
+								{
+									if (conflicts == 0)
+									{
+										if (m_patternCount > sizeof(conflictsArray) / sizeof(conflictsArray[0]))
+										{
+											conflictsVector.reset(new const MatchPattern2*[m_patternCount]);
+
+											conflicts = conflictsVector.get();
+										}
+										else
+										{
+											conflicts = conflictsArray;
+										}
+									}
+
+									assert(conflicts != 0);
+
+									// Add the best matched pattern so far.
+									addObjectIfNotFound(bestMatchedPattern, conflicts, nConflicts);
+
+									// Add the pattern that caused the conflict...
+									conflicts[nConflicts++] = matchPat;
+
+									bestMatchedRule = rule;
+									bestMatchedPattern = matchPat;
+									bestMatchPatPriority = matchPatPriority;
+								}
+							}
+						}
+					}
+
+					++theCurrentEntry;
+
+				} while(theCurrentEntry != theTableEnd);
+			}
+		} // end if(useImports == false)
+
+		if(0 == bestMatchedRule)
+		{
+			assert(m_importsSize == m_imports.size());
+
+			for(unsigned int i = 0; i < m_importsSize; i++)
+			{
+				const Stylesheet* const 	stylesheet =
+					m_imports[i];
+
+				bestMatchedRule = stylesheet->findTemplate(executionContext,
+														   targetNode,
+														   mode, 
+														   false);
+				if(0 != bestMatchedRule)
+					break;
+			}
+		}
+
+		if(nConflicts > 0)
+		{
+			assert(conflicts != 0);
+
+			const bool		quietConflictWarnings = executionContext.getQuietConflictWarnings();
+
+			XalanDOMString	conflictsString;
+			
+			if (quietConflictWarnings == false)
+			{
+				conflictsString = XALAN_STATIC_UCODE_STRING("Specificity conflicts found: ");
+			}
+
+			for(unsigned int i = 0; i < nConflicts; i++)
+			{
+				const MatchPattern2* const	conflictPat = conflicts[i];
+
+				if(0 != i)
+				{
+					if(quietConflictWarnings == false)
+					{
+						conflictsString += XALAN_STATIC_UCODE_STRING(", ");
+					}
+					// Find the furthest one towards the bottom of the document.
+					if(conflictPat->getPositionInStylesheet() >
+						bestMatchedPattern->getPositionInStylesheet())
+					{
+						bestMatchedPattern = conflictPat;
+					}
+				}
+				else
+				{
+					bestMatchedPattern = conflictPat;
+				}
+
+				if(quietConflictWarnings == false)
+				{
+					conflictsString += XalanDOMString(XALAN_STATIC_UCODE_STRING("\"")) +
+										*conflictPat->getPattern() +
+										XalanDOMString(XALAN_STATIC_UCODE_STRING("\""));
+				}
+			}
+
+			bestMatchedRule = bestMatchedPattern->getTemplate();
+
+			if(quietConflictWarnings == false)
+			{
+				conflictsString += XALAN_STATIC_UCODE_STRING(" ");
+				conflictsString += XALAN_STATIC_UCODE_STRING("Last found in stylesheet will be used.");
+				executionContext.warn(conflictsString);
+			}
+		}
+
+		return bestMatchedRule;
+	}
+}
+
+
+
+void
+Stylesheet::addExtensionNamespace(
+			const XalanDOMString&	uri,
+			ExtensionNSHandler*		nsh)
+{
+	m_extensionNamespaces.insert(ExtensionNamespacesMapType::value_type(uri, nsh));
+
+	m_namespacesHandler.addExtensionNamespaceURI(uri);
+}
+
+
+
+void
+Stylesheet::pushTopLevelVariables(
+			StylesheetExecutionContext& 	executionContext,
+			const ParamVectorType&			topLevelParams) const
+{
+	{
+		// First, push any imports...
+		const StylesheetVectorType::const_reverse_iterator	rend = m_imports.rend();
+
+		for(StylesheetVectorType::const_reverse_iterator i = m_imports.rbegin(); i != rend; ++i)
+		{
+			const Stylesheet* const stylesheet = *i;
+			assert(stylesheet != 0);
+
+			stylesheet->pushTopLevelVariables(executionContext, topLevelParams);
+		}
+	}
+
+	const ParamVectorType::size_type	nVars = m_topLevelVariables.size();
+
+	for(ParamVectorType::size_type i = 0; i < nVars; ++i)
+	{
+		ElemVariable* const 	var = m_topLevelVariables[i];
+
+		bool					isParam =
+				Constants::ELEMNAME_PARAMVARIABLE == var->getXSLToken();
+
+		if(isParam == true)
+		{
+			isParam = false;
+
+			const ParamVectorType::size_type	n = topLevelParams.size();
+
+			for(ParamVectorType::size_type k = 0; k < n; k++)
+			{
+				const ParamVectorType::value_type&	arg = topLevelParams[k];
+
+				if(arg.getName().equals(var->getName()))
+				{
+					isParam = true;
+
+					if (arg.getXObject().null() == false)
+					{
+						executionContext.pushVariable(
+							arg.getName(),
+							arg.getXObject(),
+							0);
+					}
+					else
+					{
+						executionContext.pushVariable(
+							arg.getName(),
+							0,
+							arg.getExpression(),
+							executionContext.getRootDocument(),
+							*this);
+					}
+
+					break;
+				}
+			}
+		}
+
+		if (isParam == false)
+		{
+			executionContext.pushVariable(var->getName(),
+										  var,
+										  var->getParentNodeElem());
+		}
+	}
+}
+
+
+
+void
+Stylesheet::processNSAliasElement(
+			const XalanDOMChar*				name,
+			const AttributeList&			atts,
+			StylesheetConstructionContext&	constructionContext)
+{
+	const unsigned int		nAttrs = atts.getLength();
+
+	const XalanDOMString*	stylesheetNamespace = &DOMServices::s_emptyString;
+	const XalanDOMString*	resultNamespace = &DOMServices::s_emptyString;
+	const XalanDOMString	dummy;
+
+	for(unsigned int i = 0; i < nAttrs; i++)
+	{
+		const XalanDOMChar* const	aname = atts.getName(i);
+
+		if(equals(aname, Constants::ATTRNAME_STYLESHEET_PREFIX) == true)
+		{
+			const XalanDOMChar* const	value = atts.getValue(i);
+
+			if (equals(value, Constants::ATTRVAL_DEFAULT_PREFIX) == true)
+			{
+				stylesheetNamespace = getNamespaceForPrefix(dummy);
+			}
+			else
+			{
+				stylesheetNamespace = getNamespaceForPrefix(XalanDOMString(value));
+			}
+		}
+		else if(equals(aname, Constants::ATTRNAME_RESULT_PREFIX))
+		{
+			const XalanDOMChar* const	value = atts.getValue(i);
+
+			if (equals(value, Constants::ATTRVAL_DEFAULT_PREFIX) == true)
+			{
+				resultNamespace = getNamespaceForPrefix(dummy);
+			}
+			else
+			{
+				resultNamespace = getNamespaceForPrefix(XalanDOMString(value));
+			}
+		}
+		else if(!isAttrOK(aname, atts, i, constructionContext))
+		{
+			constructionContext.error(XalanDOMString(name) + " has an illegal attribute: " + aname);
+		}
+	}
+
+	// Build a table of aliases, the key is the stylesheet uri and the
+	// value is the result uri
+	if (length(*stylesheetNamespace) == 0 ||
+		length(*resultNamespace) == 0)
+	{
+		constructionContext.error("Missing namespace URI for specified prefix");
+	}
+	else
+	{
+#if 1
+		// $$$ ToDo: Enable other code.  Perhaps an error?
+		m_prefixAliases[*stylesheetNamespace] = *resultNamespace;
+
+		m_namespacesHandler.setNamespaceAlias(*stylesheetNamespace, *resultNamespace);
+#else
+		const PrefixAliasesMapType::iterator	i =
+			m_prefixAliases.find(*stylesheetNamespace);
+
+		if (i != m_prefixAliases.end())
+		{
+			// $$$ ToDo: This could also be an error?
+			(*i).second = *resultNamespace;
+		}
+		else
+		{
+			m_prefixAliases.insert(PrefixAliasesMapType::value_type(*stylesheetNamespace, *resultNamespace));
+		}
+#endif
+	}
+}
+
+
+
+XalanDOMString
+Stylesheet::getAliasNamespaceURI(const XalanDOMChar*	uri) const
+{
+	assert(uri != 0);
+
+	return getAliasNamespaceURI(XalanDOMString(uri));
+}
+
+
+
+XalanDOMString
+Stylesheet::getAliasNamespaceURI(const XalanDOMString&	uri) const
+{
+	const StringToStringMapType::const_iterator	i =
+		m_prefixAliases.find(uri);
+
+	if (i != m_prefixAliases.end())
+	{
+		assert(length((*i).second) > 0);
+
+		return (*i).second;
+	}
+	else
+	{
+		XalanDOMString	theResult;
+
+		const StylesheetVectorType::size_type	nImports =
+			m_imports.size();
+
+		for(StylesheetVectorType::size_type i = 0; i < nImports; ++i)
+		{
+			theResult = m_imports[i]->getAliasNamespaceURI(uri);
+
+			if(length(theResult) != 0)
+			{
+				break;
+			}
+		}
+
+		return theResult;
+	}
+}
+
+
+
+const XalanDecimalFormatSymbols*
+Stylesheet::getDecimalFormatSymbols(const XalanDOMString&	name) const
+{
+	const XalanDecimalFormatSymbols* 				dfs = 0;
+
+	const ElemDecimalFormatVectorType::size_type	theSize =
+		m_elemDecimalFormats.size();
+
+	if(theSize > 0)
+	{
+		// Start from the top of the stack
+		for (int i = theSize - 1; i >= 0; --i)
+		{
+			assert(m_elemDecimalFormats[i] != 0);
+
+			if (equals(m_elemDecimalFormats[i]->getName(), name) == true)
+			{
+				dfs = &m_elemDecimalFormats[i]->getDecimalFormatSymbols();
+
+				break;
+			}
+		}
+	}
+
+	// If dfs is null at this point, it should
+	// mean there wasn't an xsl:decimal-format declared
+	// with the given name.	So go up the import hierarchy
+	// and see if one of the imported stylesheets declared
+	// it.
+	if(dfs == 0)
+	{
+		for(StylesheetVectorType::size_type i = 0; i < m_importsSize; ++i)
+		{
+			dfs = m_imports[i]->getDecimalFormatSymbols(name);
+
+			if(dfs != 0)
+			{
+				break;
+			}
+		}
+	}
+
+	return dfs;
+}
+
+
+
+void
+Stylesheet::applyAttrSets(
+			const QNameVectorType&			attributeSetsNames,
+			StylesheetExecutionContext& 	executionContext,			
+			XalanNode*						sourceNode) const
+{
+	const QNameVectorType::size_type	nNames = attributeSetsNames.size();
+
+	if(0 != nNames)
+	{
+		assert(m_importsSize == m_imports.size());
+
+		// Process up the import chain...
+		for(StylesheetVectorType::size_type i = 0; i < m_importsSize; i++)
+		{
+			const Stylesheet* const 	stylesheet = m_imports[i];
+
+			stylesheet->applyAttrSets(
+				attributeSetsNames, 
+				executionContext,
+				sourceNode);
+		}
+
+		for(QNameVectorType::size_type j = 0; j < nNames; j++)
+		{
+			const XalanQName&	qname = attributeSetsNames[j];
+
+			assert(m_attributeSetsSize == m_attributeSets.size());
+
+			for(StylesheetVectorType::size_type k = 0; k < m_attributeSetsSize; k++)
+			{
+				const ElemAttributeSet* const	attrSet = m_attributeSets[k];
+				assert(attrSet != 0);
+
+				if(qname.equals(attrSet->getQName()))
+				{
+					attrSet->execute(executionContext);
+				}
+			}
+		}
+	}
+}
+
+
+
+const XalanDOMString&
+Stylesheet::getNodeName() const
+{
+	return s_emptyString;
+}
+
+
+
+const XalanDOMString&
+Stylesheet::getNodeValue() const
+{
+	return s_emptyString;
+}
+
+
+
+Stylesheet::NodeType
+Stylesheet::getNodeType() const
+{
+	return XalanNode::DOCUMENT_NODE;
+}
+
+
+
+XalanNode*
+Stylesheet::getParentNode() const
+{
+	return 0;
+}
+
+
+
+const XalanNodeList*
+Stylesheet::getChildNodes() const
+{
+	return &m_surrogateChildren;
+}
+
+
+
+XalanNode*
+Stylesheet::getFirstChild() const
+{
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::getLastChild() const
+{
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::getPreviousSibling() const 
+{
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::getNextSibling() const 
+{
+	return 0;
+}
+
+
+
+const XalanNamedNodeMap*
+Stylesheet::getAttributes() const
+{
+	return &s_fakeAttributes;
+}
+
+
+
+XalanDocument*
+Stylesheet::getOwnerDocument() const
+{
+	return 0;
+}
+
+
+
+#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
+XalanNode*
+#else
+Stylesheet*
+#endif
+Stylesheet::cloneNode(bool		/* deep */) const
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::insertBefore(
+			XalanNode*	/* newChild */,
+			XalanNode*	/* refChild */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::replaceChild(
+			XalanNode*	/* newChild */,
+			XalanNode*	/* oldChild */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::removeChild(XalanNode*		/* oldChild */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::appendChild(XalanNode*		/* oldChild */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+bool
+Stylesheet::hasChildNodes() const
+{
+	// $$$ ToDo: Is this always true?
+	return true;
+}
+
+
+
+void
+Stylesheet::setNodeValue(const XalanDOMString&		/* nodeValue */)
+{
+	throw XalanDOMException(XalanDOMException::NO_MODIFICATION_ALLOWED_ERR);
+}
+
+
+
+void
+Stylesheet::normalize()
+{
+}
+
+
+
+bool
+Stylesheet::supports(
+			const XalanDOMString&	/* feature */,
+			const XalanDOMString&	/* version */) const
+{
+	return false;
+}
+
+
+
+const XalanDOMString&
+Stylesheet::getNamespaceURI() const
+{
+	// $$ ToDo: Is this the same value as PrefixResolver::getURI()?
+	return s_emptyString;
+}
+
+
+
+const XalanDOMString&
+Stylesheet::getPrefix() const
+{
+	return s_emptyString;
+}
+
+
+
+const XalanDOMString&
+Stylesheet::getLocalName() const
+{
+	return s_emptyString;
+}
+
+
+
+void
+Stylesheet::setPrefix(const XalanDOMString& /* prefix */)
+{
+	throw XalanDOMException(XalanDOMException::NO_MODIFICATION_ALLOWED_ERR);
+}
+
+
+
+unsigned long
+Stylesheet::getIndex() const
+{
+	return 0;
+}
+
+
+
+XalanElement*
+Stylesheet::createElement(const XalanDOMString& 	/* tagName */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanDocumentFragment*
+Stylesheet::createDocumentFragment()
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanText*
+Stylesheet::createTextNode(const XalanDOMString&	/* data */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanComment*
+Stylesheet::createComment(const XalanDOMString& 	/* data */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanCDATASection*
+Stylesheet::createCDATASection(const XalanDOMString&	/* data */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanProcessingInstruction*
+Stylesheet::createProcessingInstruction(
+			const XalanDOMString&	/* target */,
+			const XalanDOMString&	/* data */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanAttr*
+Stylesheet::createAttribute(const XalanDOMString&	/* name */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanEntityReference*
+Stylesheet::createEntityReference(const XalanDOMString& 	/* name */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanDocumentType*
+Stylesheet::getDoctype() const
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanDOMImplementation*
+Stylesheet::getImplementation() const
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanElement*
+Stylesheet::getDocumentElement() const
+{
+	// $$$ ToDo: Is this correct?
+
+	return m_wrapperlessTemplate != 0 ? m_wrapperlessTemplate : m_firstTemplate;
+}
+
+
+
+XalanNodeList*
+Stylesheet::getElementsByTagName(const XalanDOMString&		/* name */) const
+{
+	return 0;
+}
+
+
+
+XalanNodeList*
+Stylesheet::getElementsByTagNameNS(
+			const XalanDOMString&	/* namespaceURI */,
+			const XalanDOMString&	/* localName */) const
+{
+	return 0;
+}
+
+
+
+XalanNode*
+Stylesheet::importNode(
+			XalanNode*	/* importedNode */,
+			bool		/* deep */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanElement*
+Stylesheet::createElementNS(
+			const XalanDOMString&	/* namespaceURI */,
+			const XalanDOMString&	/* qualifiedName */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanAttr*
+Stylesheet::createAttributeNS(
+			const XalanDOMString&	/* namespaceURI */,
+			const XalanDOMString&	/* qualifiedName */)
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+XalanElement*
+Stylesheet::getElementById(const XalanDOMString&	/* elementId */) const
+{
+	//should not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+bool
+Stylesheet::isIndexed() const
+{
+	// This member functionshould not be called
+	assert(false);	
+
+	return false;
+}
+
+
+
+unsigned long
+Stylesheet::getNumber() const
+{
+	// This member functionshould not be called
+	assert(false);	
+
+	return 0;
+}
+
+
+
+const XalanDOMString*
+Stylesheet::getNamespaceForPrefix(const XalanDOMString& 	prefix) const
+{
+	return XalanQName::getNamespaceForPrefix(m_namespaceDecls, prefix);
+}
+
+
+
+const XalanDOMString&
+Stylesheet::getURI() const
+{
+	return m_baseIdent;
+}
diff --git a/src/XSLT/XSLTEngineImpl.cpp b/src/XSLT/XSLTEngineImpl.cpp
new file mode 100644
index 0000000..5ce03dd
--- /dev/null
+++ b/src/XSLT/XSLTEngineImpl.cpp
@@ -0,0 +1,3349 @@
+/*
+ * 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+
+
+// Class header file.
+#include "XSLTEngineImpl.hpp"
+
+
+
+#include <sax/DocumentHandler.hpp>
+#include <sax/EntityResolver.hpp>
+#include <sax/Locator.hpp>
+#include <sax/SAXException.hpp>
+#include <util/PlatformUtils.hpp>
+#include <framework/URLInputSource.hpp>
+
+
+
+#include <Include/STLHelper.hpp>
+
+
+
+#include <XalanDOM/XalanDOMException.hpp>
+#include <XalanDOM/XalanNode.hpp>
+#include <XalanDOM/XalanAttr.hpp>
+#include <XalanDOM/XalanComment.hpp>
+#include <XalanDOM/XalanCDATASection.hpp>
+#include <XalanDOM/XalanNodeList.hpp>
+#include <XalanDOM/XalanNamedNodeMap.hpp>
+#include <XalanDOM/XalanProcessingInstruction.hpp>
+#include <XalanDOM/XalanText.hpp>
+
+
+
+#include <PlatformSupport/PrintWriter.hpp>
+#include <PlatformSupport/StringTokenizer.hpp>
+#include <PlatformSupport/XalanUnicode.hpp>
+
+
+
+#include <DOMSupport/DOMServices.hpp>
+#include <DOMSupport/DOMSupport.hpp>
+
+
+
+#include <XMLSupport/FormatterToDOM.hpp>
+#include <XMLSupport/FormatterToText.hpp>
+#include <XMLSupport/FormatterToXML.hpp>
+#include <XMLSupport/FormatterToHTML.hpp>
+#include <XMLSupport/FormatterTreeWalker.hpp>
+#include <XMLSupport/XMLParserLiaison.hpp>
+#include <XMLSupport/FormatterTreeWalker.hpp>
+
+
+
+#include <XPath/ElementPrefixResolverProxy.hpp>
+#include <XPath/XalanQNameByReference.hpp>
+#include <XPath/ResultTreeFrag.hpp>
+#include <XPath/XObject.hpp>
+#include <XPath/XObjectFactory.hpp>
+#include <XPath/XPathEnvSupport.hpp>
+#include <XPath/XPathEnvSupportDefault.hpp>
+#include <XPath/XPathExecutionContextDefault.hpp>
+#include <XPath/XPathFactory.hpp>
+#include <XPath/XPathProcessorImpl.hpp>
+#include <XPath/XResultTreeFrag.hpp>
+
+
+
+#include "Constants.hpp"
+#include "ElemWithParam.hpp"
+#include "FunctionCurrent.hpp"
+#include "FunctionDocument.hpp"
+#include "FunctionElementAvailable.hpp"
+#include "FunctionFunctionAvailable.hpp"
+#include "FunctionFormatNumber.hpp"
+#include "FunctionGenerateID.hpp"
+#include "FunctionKey.hpp"
+#include "FunctionSystemProperty.hpp"
+#include "FunctionUnparsedEntityURI.hpp"
+#include "GenerateEvent.hpp"
+#include "ProblemListener.hpp"
+#include "ProblemListenerDefault.hpp"
+#include "Stylesheet.hpp"
+#include "StylesheetConstructionContext.hpp"
+#include "StylesheetExecutionContext.hpp"
+#include "StylesheetHandler.hpp"
+#include "StylesheetRoot.hpp"
+#include "TraceListener.hpp"
+#include "XSLTInputSource.hpp"
+#include "XSLTProcessorException.hpp"
+#include "XSLTResultTarget.hpp"
+
+
+
+//#define XALAN_VQ_SPECIAL_TRACE
+#if defined(XALAN_VQ_SPECIAL_TRACE)
+#include "C:/Program Files/Rational/Quantify/pure.h"
+#endif
+
+
+
+const XalanDOMString	XSLTEngineImpl::s_emptyString;
+
+
+
+//==========================================================
+// SECTION: Constructors
+//==========================================================
+
+XSLTEngineImpl::XSLTEngineImpl(
+			XMLParserLiaison&	parserLiaison,
+			XPathEnvSupport&	xpathEnvSupport,
+			DOMSupport&			domSupport,
+			XObjectFactory&		xobjectFactory,
+			XPathFactory&		xpathFactory) :
+	XSLTProcessor(),
+	DocumentHandler(),
+	PrefixResolver(),
+	m_useDOMResultTreeFactory(false),
+	m_domResultTreeFactory(0),
+	m_resultNameSpacePrefix(),
+	m_resultNameSpaceURL(),
+	m_xpathFactory(xpathFactory),
+	m_xobjectFactory(xobjectFactory),
+	m_xpathProcessor(new XPathProcessorImpl),
+	m_cdataStack(),
+	m_stylesheetLocatorStack(),
+	m_defaultProblemListener(),
+	m_problemListener(&m_defaultProblemListener),
+	m_stylesheetRoot(0),
+	m_traceSelects(false),
+	m_quietConflictWarnings(false),
+	m_diagnosticsPrintWriter(0),
+	m_durationsTable(),
+	m_traceListeners(),
+	m_uniqueNSValue(0),
+	m_topLevelParams(),
+	m_parserLiaison(parserLiaison),
+	m_xpathEnvSupport(xpathEnvSupport),
+	m_domSupport(domSupport),
+	m_executionContext(0),
+	m_outputContextStack(),
+	m_resultNamespacesStack(),
+	m_dummyAttributesList()
+{
+	m_outputContextStack.pushContext();
+}
+
+
+
+void
+XSLTEngineImpl::reset()
+{
+	m_topLevelParams.clear();
+	m_durationsTable.clear();
+	m_stylesheetLocatorStack.clear();
+	m_cdataStack.clear();
+
+	if (m_domResultTreeFactory != 0)
+	{
+		m_parserLiaison.destroyDocument(m_domResultTreeFactory);
+		m_domResultTreeFactory = 0;
+	}
+
+	m_stylesheetRoot = 0;
+
+	m_outputContextStack.reset();
+
+	m_outputContextStack.pushContext();
+
+	m_xpathEnvSupport.reset();
+	m_xpathFactory.reset();
+	m_xobjectFactory.reset();
+	m_domSupport.reset();
+
+	m_resultNamespacesStack.clear();
+}
+
+
+
+XSLTEngineImpl::~XSLTEngineImpl()
+{
+	reset();
+}
+
+
+
+//==========================================================
+// SECTION: Main API Functions
+//==========================================================
+
+
+
+static const XalanDOMChar	s_dummyString = 0;
+
+
+void
+XSLTEngineImpl::process(
+			const XSLTInputSource&			inputSource, 
+	        const XSLTInputSource&			stylesheetSource,
+	        XSLTResultTarget&				outputTarget,
+			StylesheetConstructionContext&	constructionContext,
+			StylesheetExecutionContext&		executionContext)
+{
+	XalanDOMString	xslIdentifier;
+
+	if (0 == stylesheetSource.getSystemId())
+	{
+		xslIdentifier = XalanDOMString(XALAN_STATIC_UCODE_STRING("Input XSL"));
+	}
+	else
+	{
+		xslIdentifier = stylesheetSource.getSystemId();
+	}
+
+	bool totalTimeID = true;
+
+	pushTime(&totalTimeID);
+
+	XalanNode*	sourceTree = getSourceTreeFromInput(inputSource);
+
+	m_stylesheetRoot = processStylesheet(stylesheetSource, constructionContext);
+
+	if(0 != sourceTree && m_stylesheetRoot == 0)
+	{
+		// Didn't get a stylesheet from the input source, so look for a
+		// stylesheet processing instruction...
+		XalanDOMString			stylesheetURI;
+
+		// The PI must be a child of the document...
+		XalanNode*				child = sourceTree->getFirstChild();
+
+#if !defined(XALAN_NO_NAMESPACES)
+		using std::vector;
+#endif
+
+		vector<XalanDOMString>	hrefs;
+
+		// $$$ ToDo: is this first one style valid?
+		const XalanDOMString	stylesheetNodeName1(XALAN_STATIC_UCODE_STRING("xml-stylesheet"));
+		const XalanDOMString	stylesheetNodeName2(XALAN_STATIC_UCODE_STRING("xml:stylesheet"));
+
+		// $$$ ToDo: This code is much like that in getStyleSheetURIFromDoc().
+		// Why is it repeated???
+		// $$$ ToDo: Move these embedded strings from inside these loops
+		// out here...
+		// $$$ ToDo: These loops are a mess of repeated use of the
+		// same data values.
+		while(child != 0)
+		{
+			if(XalanNode::PROCESSING_INSTRUCTION_NODE == child->getNodeType())
+			{
+				const XalanDOMString	nodeName(child->getNodeName());
+
+				if(equals(nodeName, stylesheetNodeName1) ||
+				   equals(nodeName, stylesheetNodeName2))
+				{
+					bool isOK = true;
+
+					StringTokenizer 	tokenizer(child->getNodeValue(), XALAN_STATIC_UCODE_STRING(" \t="));
+
+					while(tokenizer.hasMoreTokens())
+					{
+						if(equals(tokenizer.nextToken(), XALAN_STATIC_UCODE_STRING("type")))
+						{
+							XalanDOMString	typeVal = tokenizer.nextToken();
+
+							typeVal = substring(typeVal, 1, length(typeVal) - 1);
+
+							if(!equals(typeVal, XALAN_STATIC_UCODE_STRING("text/xsl")))
+							{
+								isOK = false;
+							}
+						}
+					}	
+						
+					if(isOK)
+					{
+						StringTokenizer 	tokenizer(child->getNodeValue(), XALAN_STATIC_UCODE_STRING(" \t="));
+
+						while(tokenizer.hasMoreTokens())
+						{
+							const XalanDOMString	theCurrentToken = tokenizer.nextToken();
+
+							if(equals(theCurrentToken, XALAN_STATIC_UCODE_STRING("href")))
+							{
+								stylesheetURI = tokenizer.nextToken();
+								stylesheetURI = substring(stylesheetURI, 1, length(stylesheetURI) - 1);
+								hrefs.push_back(stylesheetURI);
+							}
+						}
+					}
+				}
+			}
+
+			child = child->getNextSibling();
+		}
+
+		bool isRoot = true;
+		Stylesheet* prevStylesheet = 0;
+			
+		if (hrefs.empty() == false)
+		{
+			const XalanDOMChar* const	pxch = inputSource.getSystemId();
+
+			const XalanDOMString		sysid(pxch == 0 ? &s_dummyString : pxch); 
+
+			do
+			{
+				const XalanDOMString&	ref =  hrefs.back();
+
+				Stylesheet* stylesheet =
+							getStylesheetFromPIURL(
+								ref,
+								*sourceTree,
+								sysid,
+								isRoot,
+								constructionContext);
+
+				if(false == isRoot)
+				{
+					prevStylesheet->addImport(stylesheet, false);
+				}
+
+				prevStylesheet = stylesheet;
+				isRoot = false;
+				hrefs.pop_back();
+			} while(!hrefs.empty());
+		}
+	}
+
+	if(0 == m_stylesheetRoot)
+	{
+		error("Failed to process stylesheet!");
+	}
+	else if(0 != sourceTree)
+	{
+		executionContext.setStylesheetRoot(m_stylesheetRoot);
+
+		FormatterListener* const	theFormatter =
+				outputTarget.getDocumentHandler();
+
+		if (theFormatter != 0)
+		{
+			theFormatter->setPrefixResolver(this);
+		}
+
+		m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
+
+		if(0 != m_diagnosticsPrintWriter)
+		{
+			displayDuration(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Total time")), &totalTimeID);
+		}
+	}
+}
+
+
+
+void
+XSLTEngineImpl::process(
+			const XSLTInputSource&			inputSource, 
+	        XSLTResultTarget&				outputTarget,
+			StylesheetExecutionContext&		executionContext)
+{
+	bool	totalTimeID = true;
+
+	if(0 != m_diagnosticsPrintWriter)
+	{
+		pushTime(&totalTimeID);
+	}
+
+	XalanNode* const	sourceTree = getSourceTreeFromInput(inputSource);
+
+	if(0 != sourceTree)
+	{
+		if (m_stylesheetRoot == 0)
+		{
+			error("No stylesheet is available to process!");
+		}
+
+		FormatterListener* const	theFormatter =
+				outputTarget.getDocumentHandler();
+
+		if (theFormatter != 0)
+		{
+			theFormatter->setPrefixResolver(this);
+		}
+
+		m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
+	}
+
+	if(0 != m_diagnosticsPrintWriter)
+	{
+		displayDuration(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Total time")), &totalTimeID);
+	}
+}
+
+
+
+StylesheetRoot*
+XSLTEngineImpl::processStylesheet(
+			const XalanDOMString&			xsldocURLString,
+			StylesheetConstructionContext&	constructionContext)
+{
+	const XSLTInputSource	input(c_wstr(xsldocURLString));
+
+	return processStylesheet(input, constructionContext);
+}
+
+
+
+StylesheetRoot*
+XSLTEngineImpl::processStylesheet(
+  			const XSLTInputSource&			stylesheetSource,
+			StylesheetConstructionContext&	constructionContext)
+{
+	StylesheetRoot*		theStylesheet = 0;
+
+	const XalanDOMChar* const	systemID = stylesheetSource.getSystemId();
+	XalanNode* const			stylesheetNode = stylesheetSource.getNode();
+
+	if (systemID != 0 || stylesheetNode != 0 || stylesheetSource.getStream() != 0)
+	{
+		XalanDOMString	xslIdentifier;
+
+		theStylesheet = constructionContext.create(stylesheetSource);
+
+		StylesheetHandler	stylesheetProcessor(*theStylesheet, constructionContext);
+
+		if(stylesheetNode != 0)
+		{
+			xslIdentifier = XALAN_STATIC_UCODE_STRING("Input XSL");
+
+			FormatterTreeWalker tw(stylesheetProcessor);
+
+			tw.traverse(stylesheetSource.getNode());
+		}
+		else
+		{
+			if (systemID != 0)
+			{
+				xslIdentifier = systemID;
+			}
+
+			diag(XALAN_STATIC_UCODE_STRING("========= Parsing ") + xslIdentifier + XALAN_STATIC_UCODE_STRING(" =========="));
+
+			pushTime(&xslIdentifier);
+
+			m_parserLiaison.parseXMLStream(stylesheetSource,
+										   stylesheetProcessor);
+
+			if(0 != m_diagnosticsPrintWriter)
+				displayDuration(XALAN_STATIC_UCODE_STRING("Parse of ") + xslIdentifier, &xslIdentifier);
+		}
+
+		theStylesheet->postConstruction(constructionContext);
+	}
+
+	return theStylesheet;
+}
+
+
+
+//==========================================================
+// SECTION: XML Parsing Functions
+//==========================================================
+
+XalanNode*
+XSLTEngineImpl::getSourceTreeFromInput(const XSLTInputSource&	inputSource)
+{
+	XalanNode*		sourceTree = inputSource.getNode();
+
+	if(0 == sourceTree)
+	{
+		const XalanDOMString	xmlIdentifier = 0 != inputSource.getSystemId() ?
+												XalanDOMString(inputSource.getSystemId()) :
+												StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Input XML"));
+
+		// In case we have a fragment identifier, go ahead and 
+		// try to parse the XML here.
+		diag(XALAN_STATIC_UCODE_STRING("========= Parsing ") +
+					xmlIdentifier +
+					XALAN_STATIC_UCODE_STRING(" =========="));
+
+		pushTime(&xmlIdentifier);
+
+#if defined(XALAN_VQ_SPECIAL_TRACE)
+		QuantifyStartRecordingData();
+#endif
+
+		XalanDocument* const	theDocument =
+						m_parserLiaison.parseXMLStream(inputSource,
+													   xmlIdentifier);
+		assert(theDocument != 0);
+
+#if defined(XALAN_VQ_SPECIAL_TRACE)
+		QuantifyStopRecordingData();
+#endif
+		if(0 != m_diagnosticsPrintWriter)
+		{
+			displayDuration(
+				XALAN_STATIC_UCODE_STRING("Parse of ") + xmlIdentifier,
+				&xmlIdentifier);
+		}
+
+		m_xpathEnvSupport.setSourceDocument(xmlIdentifier, theDocument);
+
+		sourceTree = theDocument;
+	}
+
+	return sourceTree;
+}
+
+
+
+const XalanDOMString*
+XSLTEngineImpl::getNamespaceForPrefix(const XalanDOMString&		prefix) const
+{
+	return m_resultNamespacesStack.getNamespaceForPrefix(prefix);
+}
+
+
+
+const XalanDOMString&
+XSLTEngineImpl::getURI() const
+{
+	return s_emptyString;
+}
+
+
+
+XalanDocument*
+XSLTEngineImpl::parseXML(
+			const XalanDOMString&	urlString,
+			DocumentHandler*		docHandler,
+			XalanDocument*			docToRegister)
+{
+	
+	XalanDocument*	doc =
+			m_xpathEnvSupport.getSourceDocument(urlString);
+
+	if(doc == 0)
+	{
+		EntityResolver* const	theResolver = 
+			m_parserLiaison.getEntityResolver();
+
+		if (theResolver == 0)
+		{
+			const XSLTInputSource	inputSource(c_wstr(urlString));
+
+			doc = parseXML(inputSource, docHandler, docToRegister);
+		}
+		else
+		{
+			const XalanAutoPtr<InputSource>		resolverInputSource =
+				theResolver->resolveEntity(0, c_wstr(urlString));
+
+			if (resolverInputSource.get() != 0)
+			{
+				doc = parseXML(*resolverInputSource.get(), docHandler, docToRegister);
+			}
+			else
+			{
+				const XSLTInputSource	inputSource(c_wstr(urlString));
+
+				doc = parseXML(inputSource, docHandler, docToRegister);
+			}
+		}
+
+		if (doc != 0)
+		{
+			m_xpathEnvSupport.setSourceDocument(urlString, doc);
+		}
+	}
+
+	return doc;
+}
+
+
+
+XalanDocument*
+XSLTEngineImpl::parseXML(
+			const InputSource&	inputSource,
+			DocumentHandler*	docHandler,
+			XalanDocument*		docToRegister)
+{
+	if(0 != docHandler)
+	{
+		m_parserLiaison.parseXMLStream(inputSource, *docHandler);
+
+		return docToRegister;
+	}
+	else
+	{
+		return m_parserLiaison.parseXMLStream(inputSource);
+	}
+}
+
+
+
+Stylesheet*
+XSLTEngineImpl::getStylesheetFromPIURL(
+			const XalanDOMString&			xslURLString,
+			XalanNode&						fragBase,
+			const XalanDOMString&			xmlBaseIdent,
+			bool							isRoot,
+			StylesheetConstructionContext&	constructionContext)
+{
+	Stylesheet*				stylesheet = 0;
+
+	XalanDOMString			stringHolder;
+
+	XalanDOMString			localXSLURLString = trim(xslURLString);
+
+	const unsigned int		fragIndex = indexOf(localXSLURLString, XalanUnicode::charNumberSign);
+
+	const XalanDocument*	stylesheetDoc = 0;
+
+	if(fragIndex == 0)
+	{
+		diag("Locating stylesheet from fragment identifier...");
+
+		const XalanDOMString	fragID = substring(localXSLURLString, 1);
+
+		const XalanElement*		nsNode = 0;
+
+		const XalanNode::NodeType	theType = fragBase.getNodeType();
+
+		if (theType == XalanNode::DOCUMENT_NODE)
+		{
+			const XalanDocument&	doc =
+#if defined(XALAN_OLD_STYLE_CASTS)
+				(const XalanDocument&)fragBase;
+#else
+				static_cast<const XalanDocument&>(fragBase);
+#endif
+
+			nsNode = doc.getDocumentElement(); 
+		}
+		else if	(theType == XalanNode::ELEMENT_NODE)
+		{
+#if defined(XALAN_OLD_STYLE_CASTS)
+			nsNode = (const XalanElement*)&fragBase;
+#else
+			nsNode = static_cast<const XalanElement*>(&fragBase);
+#endif
+		}
+		else
+		{
+			XalanNode* const	node = fragBase.getParentNode();
+
+			if	(node->getNodeType() == XalanNode::ELEMENT_NODE) 
+			{
+#if defined(XALAN_OLD_STYLE_CASTS)
+				nsNode = (const XalanElement*)&fragBase;
+#else
+				nsNode = static_cast<XalanElement*>(node);
+#endif
+			}
+			else
+			{
+				error("Could not identify fragment: " + fragID);
+			}
+		}
+
+		// Try a bunch of really ugly stuff to find the fragment.
+		// What's the right way to do this?
+		XalanDOMString	ds(XALAN_STATIC_UCODE_STRING("id("));
+
+		ds += fragID;
+		ds += XALAN_STATIC_UCODE_STRING(")");
+
+		ElementPrefixResolverProxy		theProxy(nsNode, m_xpathEnvSupport, m_domSupport);
+
+		XPathExecutionContextDefault	theExecutionContext(m_xpathEnvSupport,
+															m_domSupport,
+															m_xobjectFactory,
+															&fragBase,
+															0,
+															&theProxy);
+
+		const XObjectPtr	xobj(evalXPathStr(ds, theExecutionContext));
+		assert(xobj.null() == false);
+
+		NodeRefList		nl(xobj->nodeset());
+
+		if(nl.getLength() == 0)
+		{
+			NodeRefList		theEmptyList;
+
+			ds = XALAN_STATIC_UCODE_STRING("//*[@id='");
+			ds += fragID;
+			ds += XALAN_STATIC_UCODE_STRING("']");
+
+			theExecutionContext.setContextNodeList(theEmptyList);
+
+			const XObjectPtr	xobj(evalXPathStr(ds, theExecutionContext));
+			assert(xobj.null() == false);
+
+			nl = xobj->nodeset();
+
+			if(nl.getLength() == 0)
+			{
+				ds = XALAN_STATIC_UCODE_STRING("//*[@name='");
+				ds += fragID;
+				ds += XALAN_STATIC_UCODE_STRING("']");
+
+				theExecutionContext.setContextNodeList(theEmptyList);
+
+				const XObjectPtr	xobj(evalXPathStr(ds, theExecutionContext));
+				assert(xobj.null() == false);
+
+				nl = xobj->nodeset();
+
+				if(nl.getLength() == 0)
+				{
+					// Well, hell, maybe it's an XPath...
+					theExecutionContext.setContextNodeList(theEmptyList);
+
+					const XObjectPtr	xobj(evalXPathStr(fragID, theExecutionContext));
+					assert(xobj.null() == false);
+
+					nl = xobj->nodeset();
+				}
+			}
+		}
+
+		if(nl.getLength() == 0)
+		{
+			error("Could not find fragment: " + fragID);
+		}
+
+		XalanNode* const	frag = nl.item(0);
+
+		if(XalanNode::ELEMENT_NODE == frag->getNodeType())
+		{
+			pushTime(frag);
+
+			XalanAutoPtr<Stylesheet>	theGuard;
+
+			if(isRoot)
+			{
+				StylesheetRoot* const	theLocalRoot =
+					constructionContext.create(stringHolder);
+
+				stylesheet = theLocalRoot;
+
+				m_stylesheetRoot = theLocalRoot;
+			}
+			else
+			{
+#if defined(XALAN_OLD_STYLE_CASTS)
+				stylesheet = constructionContext.create(*((StylesheetRoot*)m_stylesheetRoot), stringHolder);
+#else
+				stylesheet = constructionContext.create(*const_cast<StylesheetRoot*>(m_stylesheetRoot), stringHolder);
+#endif
+
+				theGuard.reset(stylesheet);
+			}
+
+			StylesheetHandler stylesheetProcessor(*stylesheet, constructionContext);
+
+			FormatterTreeWalker tw(stylesheetProcessor);
+
+			tw.traverse(frag, frag->getParentNode());
+
+			displayDuration(
+					XalanDOMString(XALAN_STATIC_UCODE_STRING("Setup of ")) +
+					localXSLURLString,
+					frag);
+
+			stylesheet->postConstruction(constructionContext);
+
+			theGuard.release();
+		}
+		else
+		{
+			stylesheetDoc = 0;
+			error("Node pointed to by fragment identifier was not an element: " + fragID);
+		}
+	}
+	else
+	{
+		diag(XalanDOMString(XALAN_STATIC_UCODE_STRING("========= Parsing and preparing ")) +
+				localXSLURLString +
+				XALAN_STATIC_UCODE_STRING(" =========="));
+		pushTime(&localXSLURLString);
+
+		XalanAutoPtr<Stylesheet>	theGuard;
+
+		const XalanDocument* const	theOwnerDocument =
+				fragBase.getNodeType() == XalanNode::DOCUMENT_NODE ?
+#if defined(XALAN_OLD_STYLE_CASTS)
+				(const XalanDocument*)&fragBase :
+#else
+				static_cast<const XalanDocument*>(&fragBase) :
+#endif
+				fragBase.getOwnerDocument();
+		assert(theOwnerDocument != 0);
+
+		if (length(xmlBaseIdent) == 0)
+		{
+			localXSLURLString =
+					URISupport::getURLStringFromString(
+						localXSLURLString,
+						m_xpathEnvSupport.findURIFromDoc(theOwnerDocument));
+		}
+		else
+		{
+			localXSLURLString =
+					URISupport::getURLStringFromString(
+						localXSLURLString,
+						xmlBaseIdent);
+		}
+
+		if(isRoot)
+		{
+			StylesheetRoot* const	theLocalRoot =
+					constructionContext.create(localXSLURLString);
+
+			stylesheet = theLocalRoot;
+
+			m_stylesheetRoot = theLocalRoot;
+		}
+		else
+		{
+#if defined(XALAN_OLD_STYLE_CASTS)
+			stylesheet = new Stylesheet(*(StylesheetRoot*)m_stylesheetRoot, localXSLURLString, constructionContext);
+#else
+			stylesheet = new Stylesheet(*const_cast<StylesheetRoot*>(m_stylesheetRoot), localXSLURLString, constructionContext);
+#endif
+
+			theGuard.reset(stylesheet);
+		}
+
+		StylesheetHandler stylesheetProcessor(*stylesheet, constructionContext);
+
+		typedef StylesheetConstructionContext::URLAutoPtrType	URLAutoPtrType;
+
+		URLAutoPtrType	xslURL(constructionContext.getURLFromString(localXSLURLString));
+
+		XSLTInputSource		inputSource(xslURL->getURLText());
+
+		m_parserLiaison.parseXMLStream(inputSource, stylesheetProcessor);
+
+		stylesheet->postConstruction(constructionContext);
+
+		theGuard.release();
+
+		displayDuration("Parsing and init of " + localXSLURLString, &localXSLURLString);
+	}
+
+	return stylesheet;
+}
+
+
+//==========================================================
+// SECTION: Stylesheet Tables
+//==========================================================
+
+
+double
+XSLTEngineImpl::getXSLTVerSupported()
+{
+	return s_XSLTVerSupported;
+}
+
+
+//==========================================================
+// SECTION: XSL directive handling functions
+//==========================================================  
+
+
+
+int
+XSLTEngineImpl::getXSLToken(const XalanNode&	node) const
+{
+	int 	tok = -2;
+
+	if(XalanNode::ELEMENT_NODE != node.getNodeType()) return tok;
+
+	const XalanDOMString& 	ns = node.getNamespaceURI();
+
+	if(equals(ns, s_XSLNameSpaceURL))
+	{
+		const XalanDOMString& 	localName =
+			DOMServices::getLocalNameOfNode(node);
+
+		const ElementKeysMapType::const_iterator		j =
+						s_elementKeys.find(localName);
+
+		if(j != s_elementKeys.end())
+		{
+			tok = (*j).second;
+		}
+	}
+	else if(equals(ns, s_XSLT4JNameSpaceURL))
+	{
+		const XalanDOMString&	localName =
+			DOMServices::getLocalNameOfNode(node);
+
+		const ElementKeysMapType::const_iterator		j =
+						s_XSLT4JElementKeys.find(localName);
+
+		if(j != s_XSLT4JElementKeys.end())
+		{
+			tok = (*j).second;
+		}
+	}
+
+	return tok;
+}
+
+
+
+void
+XSLTEngineImpl::outputToResultTree(
+			StylesheetExecutionContext&		executionContext,
+			const XObject&					value)
+{
+	const XObject::eObjectType	type = value.getType();
+
+	switch(type)
+	{
+	case XObject::eTypeBoolean:
+	case XObject::eTypeNumber:
+	case XObject::eTypeString:
+		{
+			const XalanDOMString&	s = value.str();
+
+			characters(toCharArray(s), 0, length(s));
+		}
+		break;				
+
+	case XObject::eTypeNodeSet:
+		{
+			const NodeRefListBase&	nl = value.nodeset();
+
+			const unsigned int		nChildren = nl.getLength();
+
+			for(unsigned int i = 0; i < nChildren; i++)
+			{
+				XalanNode*			pos = nl.item(i);
+				assert(pos != 0);
+
+				XalanNode* const	top = pos;
+
+				while(0 != pos)
+				{
+					flushPending();
+
+					XalanNode::NodeType		posNodeType = pos->getNodeType();
+
+					cloneToResultTree(*pos, posNodeType, false, false, true);
+
+					XalanNode*	nextNode = pos->getFirstChild();
+
+					while(0 == nextNode)
+					{
+						if(XalanNode::ELEMENT_NODE == posNodeType)
+						{
+							endElement(c_wstr(pos->getNodeName()));
+						}
+
+						if(top == pos)
+							break;
+
+						nextNode = pos->getNextSibling();
+
+						if(0 == nextNode)
+						{
+							pos = pos->getParentNode();
+							assert(pos != 0);
+
+							posNodeType = pos->getNodeType();
+
+							if(top == pos)
+							{
+								if(XalanNode::ELEMENT_NODE == posNodeType)
+								{
+									endElement(c_wstr(pos->getNodeName()));
+								}
+
+								nextNode = 0;
+								break;
+							}
+						}
+					}
+
+					pos = nextNode;
+
+					if (pos != 0)
+					{
+						posNodeType = pos->getNodeType();
+					}
+				}
+			}
+		}
+		break;
+		
+	case XObject::eTypeResultTreeFrag:
+		outputResultTreeFragment(executionContext, value);
+		break;
+
+	case XObject::eTypeNull:
+	case XObject::eTypeUnknown:
+	case XObject::eUnknown:
+	default:
+		assert(0);
+	}
+}
+
+
+
+const StylesheetRoot*
+XSLTEngineImpl::getStylesheetRoot() const
+{
+	return m_stylesheetRoot;
+}
+
+
+
+void
+XSLTEngineImpl::setStylesheetRoot(const StylesheetRoot*		theStylesheet)
+{
+	m_stylesheetRoot = theStylesheet;
+}
+
+
+
+void
+XSLTEngineImpl::setExecutionContext(StylesheetExecutionContext*		theExecutionContext)
+{
+	m_executionContext = theExecutionContext;
+}
+
+
+
+//==========================================================
+// SECTION: Diagnostic functions
+//==========================================================
+
+unsigned long
+XSLTEngineImpl::getTraceListeners() const
+{
+	return m_traceListeners.size();
+}
+
+
+
+void
+XSLTEngineImpl::addTraceListener(TraceListener* tl)
+{
+	if (tl != 0)
+	{
+		m_traceListeners.push_back(tl);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::removeTraceListener(TraceListener*	tl)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::remove;
+#endif
+
+	const TraceListenerVectorType::iterator		i =
+		remove(
+			m_traceListeners.begin(),
+			m_traceListeners.end(),
+			tl);
+
+	m_traceListeners.erase(i);
+}
+
+
+
+void
+XSLTEngineImpl::fireGenerateEvent(const GenerateEvent&	ge)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	for_each(
+		m_traceListeners.begin(),
+		m_traceListeners.end(),
+		TraceListener::TraceListenerGenerateFunctor(ge));
+}
+
+
+
+void
+XSLTEngineImpl::fireSelectEvent(const SelectionEvent&	se)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	for_each(
+		m_traceListeners.begin(),
+		m_traceListeners.end(),
+		TraceListener::TraceListenerSelectFunctor(se));
+}
+
+
+
+void
+XSLTEngineImpl::fireTraceEvent(const TracerEvent& te)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	for_each(
+		m_traceListeners.begin(),
+		m_traceListeners.end(),
+		TraceListener::TraceListenerTraceFunctor(te));
+}
+
+
+
+bool
+XSLTEngineImpl::getTraceSelects() const
+{
+	return m_traceSelects;
+}
+
+
+
+void
+XSLTEngineImpl::setTraceSelects(bool	b)
+{
+	m_traceSelects = b;
+}
+
+
+
+void
+XSLTEngineImpl::message(
+			const XalanDOMString&	msg,
+			const XalanNode*		sourceNode,
+			const XalanNode*		styleNode) const
+{
+	problem(msg, ProblemListener::eMESSAGE, sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::message(
+			const XalanDOMString&		msg,
+			const XalanNode*			sourceNode,
+			const ElemTemplateElement*	styleNode) const
+{
+	problem(msg, ProblemListener::eMESSAGE, sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::message(
+			const char*			msg,
+			const XalanNode*	sourceNode,
+			const XalanNode*	styleNode) const
+{
+	message(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::problem(
+			const XalanDOMString&				msg, 
+			ProblemListener::eClassification	classification,
+			const XalanNode*					sourceNode,
+			const XalanNode*					styleNode) const
+{
+	const Locator* const	locator = getLocatorFromStack();
+
+	const XalanDOMChar*		id = 0;
+
+	XalanDOMString			uri;
+
+	int						lineNumber = -1;
+	int 					columnNumber = -1;
+
+	if (locator != 0)
+	{
+		id = locator->getPublicId();
+
+		if (id == 0)
+		{
+			id = locator->getSystemId();
+		}
+
+		if (id != 0)
+		{
+			uri = id;
+		}
+
+		lineNumber = locator->getLineNumber();
+		columnNumber = locator->getColumnNumber();
+	}
+
+	if (m_problemListener != 0)
+	{
+		m_problemListener->problem(
+					ProblemListener::eXSLPROCESSOR,
+					classification,
+					sourceNode,
+					styleNode,
+					msg,
+					id,
+					lineNumber,
+					columnNumber);
+	}
+
+	if (classification == ProblemListener::eERROR)
+	{
+		throw XSLTProcessorException(msg, uri, lineNumber, columnNumber);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::problem(
+			const XalanDOMString&				msg, 
+			ProblemListener::eClassification	classification,
+			const XalanNode*					sourceNode,
+			const ElemTemplateElement*			styleNode) const
+{
+	const XalanDOMChar*		id = 0;
+
+	XalanDOMString			uri;
+
+	int						lineNumber = -1;
+	int 					columnNumber = -1;
+
+	const Locator*			locator = getLocatorFromStack();
+
+	if (locator == 0)
+	{
+		locator = styleNode->getLocator();
+	}
+
+	if (locator != 0)
+	{
+		id = locator->getPublicId();
+
+		if (id == 0)
+		{
+			id = locator->getSystemId();
+		}
+
+		if (id != 0)
+		{
+			uri = id;
+		}
+
+		lineNumber = locator->getLineNumber();
+		columnNumber = locator->getColumnNumber();
+	}
+	else if (styleNode != 0)
+	{
+		lineNumber = styleNode->getLineNumber();
+		columnNumber = styleNode->getColumnNumber();
+
+		uri = styleNode->getURI();
+	}
+
+	if (m_problemListener != 0)
+	{
+		m_problemListener->problem(
+					ProblemListener::eXSLPROCESSOR,
+					classification,
+					styleNode,
+					sourceNode,
+					msg,
+					id,
+					lineNumber,
+					columnNumber);
+	}
+
+	if (classification == ProblemListener::eERROR)
+	{
+		throw XSLTProcessorException(msg, uri, lineNumber, columnNumber);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::warn(
+			const XalanDOMString&	msg,
+			const XalanNode*		sourceNode,
+			const XalanNode*		styleNode) const
+{
+	problem(msg, ProblemListener::eWARNING, sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::warn(
+			const XalanDOMString&		msg,
+			const XalanNode*			sourceNode,
+			const ElemTemplateElement*	styleNode) const
+{
+	problem(msg, ProblemListener::eWARNING, sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::warn(
+			const char*			msg,
+			const XalanNode*	sourceNode,
+			const XalanNode*	styleNode) const
+{
+	warn(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::error(
+			const XalanDOMString&	msg,
+			const XalanNode*		sourceNode,
+			const XalanNode*		styleNode) const
+{
+	problem(msg, ProblemListener::eERROR, sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::error(
+			const XalanDOMString&		msg,
+			const XalanNode*			sourceNode,
+			const ElemTemplateElement*	styleNode) const
+{
+	problem(msg, ProblemListener::eERROR, sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::error(
+			const char*			msg,
+			const XalanNode*	sourceNode,
+			const XalanNode*	styleNode) const
+{
+	error(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
+}
+
+
+
+void
+XSLTEngineImpl::pushTime(const void*	key)
+{
+	if(0 != key)
+	{
+		m_durationsTable[key] = clock();
+	}
+}
+
+
+
+clock_t
+XSLTEngineImpl::popDuration(const void*		key)
+{
+	clock_t 	clockTicksDuration = 0;
+
+	if(0 != key)
+	{
+		const DurationsTableMapType::iterator	i =
+				m_durationsTable.find(key);
+
+		if (i != m_durationsTable.end())
+		{
+			clockTicksDuration = clock() - (*i).second;
+
+			m_durationsTable.erase(i);
+		}
+	}
+
+	return clockTicksDuration;
+}
+
+
+
+void
+XSLTEngineImpl::displayDuration(
+			const XalanDOMString&	info,
+			const void*				key)
+{
+	if(0 != key)
+	{
+		const clock_t	theDuration = popDuration(key);
+
+		if(0 != m_diagnosticsPrintWriter)
+		{
+			const double	millis = (double(theDuration) / CLOCKS_PER_SEC) * 1000.0L;
+
+			XalanDOMString	msg(info);
+
+			msg += XALAN_STATIC_UCODE_STRING(" took ");
+			msg += DoubleToDOMString(millis);
+			msg += XALAN_STATIC_UCODE_STRING(" milliseconds");
+
+			m_diagnosticsPrintWriter->println(msg);
+		}
+	}
+}
+
+
+
+void
+XSLTEngineImpl::setDiagnosticsOutput(PrintWriter*	pw)
+{
+	m_diagnosticsPrintWriter = pw;
+
+	m_problemListener->setPrintWriter(pw);
+}
+
+
+
+void
+XSLTEngineImpl::diag(const XalanDOMString& 	s) const
+{
+	if (0 != m_diagnosticsPrintWriter)
+	{
+		m_diagnosticsPrintWriter->println(s);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::diag(const char*	s) const
+{
+	diag(TranscodeFromLocalCodePage(s));
+}
+
+
+
+void
+XSLTEngineImpl::setQuietConflictWarnings(bool	b)
+{
+	m_quietConflictWarnings = b;
+}
+
+
+
+void
+XSLTEngineImpl::setDocumentLocator(const Locator* const		/* locator */)
+{
+	// Do nothing for now
+}
+
+
+
+void
+XSLTEngineImpl::traceSelect(
+			const XalanElement& 	theTemplate,
+			const NodeRefListBase&	nl) const
+{
+	if (0 != m_diagnosticsPrintWriter)
+	{
+		XalanDOMString	msg = theTemplate.getNodeName() + XalanDOMString(XALAN_STATIC_UCODE_STRING(": "));
+
+		XalanAttr*		attr = theTemplate.getAttributeNode(Constants::ATTRNAME_SELECT);
+
+		if(0 != attr)
+		{
+			msg += attr->getValue();
+			msg += XALAN_STATIC_UCODE_STRING(", ");
+			msg += LongToDOMString(nl.getLength());
+			msg += XALAN_STATIC_UCODE_STRING(" selected");
+		}
+		else
+		{
+			msg += XALAN_STATIC_UCODE_STRING("*|text(), (default select), ");
+			msg += LongToDOMString(nl.getLength());
+			msg += XALAN_STATIC_UCODE_STRING(" selected");
+		}
+
+		attr = theTemplate.getAttributeNode(Constants::ATTRNAME_MODE);
+
+		if(0 != attr)
+		{
+			msg += XalanDOMString(XALAN_STATIC_UCODE_STRING(", mode = ")) + attr->getValue();
+		}
+
+		m_diagnosticsPrintWriter->println(msg);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::startDocument()
+{
+	assert(getFormatterListener() != 0);
+	assert(m_executionContext != 0);
+
+	if (getHasPendingStartDocument() == false)
+	{
+		m_resultNamespacesStack.pushContext();
+
+		setHasPendingStartDocument(true);
+
+		setMustFlushPendingStartDocument(false);
+	}
+	else if (getMustFlushPendingStartDocument() == true)
+	{
+		getFormatterListener()->startDocument();
+
+		if(getTraceListeners() > 0)
+		{
+			const GenerateEvent		ge(GenerateEvent::EVENTTYPE_STARTDOCUMENT);
+
+			fireGenerateEvent(ge);
+		}
+
+		// Reset this, but leave getMustFlushPendingStartDocument() alone,
+		// since it will still be needed.
+		setHasPendingStartDocument(false);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::endDocument()
+{
+	assert(getFormatterListener() != 0);
+	assert(m_executionContext != 0);
+
+	setMustFlushPendingStartDocument(true);
+
+	flushPending();
+
+	getFormatterListener()->endDocument();
+
+	if(getTraceListeners() > 0)
+	{
+		const GenerateEvent		ge(GenerateEvent::EVENTTYPE_ENDDOCUMENT);
+
+		fireGenerateEvent(ge);
+	}
+
+	m_resultNamespacesStack.popContext();
+
+	assert(m_resultNamespacesStack.size() == 0);
+}
+
+
+
+void
+XSLTEngineImpl::addResultNamespaceDecl(
+			const XalanDOMString&	prefix, 
+	        const XalanDOMString&	namespaceVal)
+{
+	m_resultNamespacesStack.addDeclaration(prefix, namespaceVal);
+}
+
+
+
+void
+XSLTEngineImpl::addResultAttribute(
+			AttributeListImpl&	attList,
+			const XalanDOMString&	aname,
+			const XalanDOMString&	value)
+{
+	bool	fExcludeAttribute = false;
+
+	if (equals(aname, DOMServices::s_XMLNamespace)) 
+	{
+		// OK, we're adding a default namespace declaration.  So see if the length
+		// of the namespace is 0.  If it's not, go ahead and add the declaration.
+		// If it's not, it means we're "turning off" the previous default
+		// declaration.
+
+		const XalanDOMString* const		currentDefaultNamespace =
+					getNamespaceForPrefix(s_emptyString);
+
+		// Note that we use an empty string for the prefix, instead of "xmlns", since the
+		// prefix really is "".
+		if (length(value) != 0)
+		{
+			if (currentDefaultNamespace != 0 &&
+				equals(*currentDefaultNamespace, value) == true)
+			{
+				fExcludeAttribute = true;
+			}
+			else
+			{
+				addResultNamespaceDecl(s_emptyString, value);
+			}
+		}
+		else
+		{
+			// OK, we're turning of the previous default namespace declaration.
+			// Check to see if there is one, and if there isn't, don't add
+			// the namespace declaration _and_ don't add the attribute.
+			if (currentDefaultNamespace != 0 && length(*currentDefaultNamespace) != 0)
+			{
+				addResultNamespaceDecl(s_emptyString, value);
+			}
+			else
+			{
+				fExcludeAttribute = true;
+			}
+		}
+	}
+	else if (startsWith(aname, DOMServices::s_XMLNamespaceWithSeparator) == true)
+	{
+		assert(m_executionContext != 0);
+
+		StylesheetExecutionContext::GetAndReleaseCachedString	prefixGuard(*m_executionContext);
+
+		XalanDOMString&		prefix = prefixGuard.get();
+
+		prefix = substring(aname, DOMServices::s_XMLNamespaceWithSeparatorLength);
+
+		addResultNamespaceDecl(prefix, value);
+	}
+
+	if (fExcludeAttribute == false)
+	{
+		attList.addAttribute(
+			c_wstr(aname),
+			c_wstr(Constants::ATTRTYPE_CDATA),
+			c_wstr(value));
+	}
+}
+
+
+
+bool
+XSLTEngineImpl::pendingAttributesHasDefaultNS() const
+{
+	const AttributeListImpl&	thePendingAttributes =
+		getPendingAttributes();
+
+	const unsigned int	n = thePendingAttributes.getLength();
+
+	for(unsigned int i = 0; i < n; i++)
+	{
+		if(equals(thePendingAttributes.getName(i),
+				  DOMServices::s_XMLNamespace) == true)
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
+
+
+
+void
+XSLTEngineImpl::flushPending()
+{
+	if(getHasPendingStartDocument() == true && 0 != length(getPendingElementName()))
+	{
+		assert(getFormatterListener() != 0);
+		assert(m_executionContext != 0);
+
+		if (m_stylesheetRoot->isOutputMethodSet() == false)
+		{
+			if (equalsIgnoreCaseASCII(getPendingElementName(),
+								 Constants::ELEMNAME_HTML_STRING) == true &&
+				pendingAttributesHasDefaultNS() == false)
+			{
+				if (getFormatterListener()->getOutputFormat() == FormatterListener::OUTPUT_METHOD_XML)
+				{
+					// Yuck!!! Ugly hack to switch to HTML on-the-fly.
+					FormatterToXML* const	theFormatter =
+#if defined(XALAN_OLD_STYLE_CASTS)
+						(FormatterToXML*)getFormatterListener();
+#else
+						static_cast<FormatterToXML*>(getFormatterListener());
+#endif
+
+					setFormatterListenerImpl(
+						m_executionContext->createFormatterToHTML(
+							*theFormatter->getWriter(),
+							theFormatter->getEncoding(),
+							theFormatter->getMediaType(),
+							theFormatter->getDoctypeSystem(),
+							theFormatter->getDoctypePublic(),
+							true,	// indent
+							theFormatter->getIndent() > 0 ? theFormatter->getIndent() :
+											StylesheetExecutionContext::eDefaultHTMLIndentAmount));
+				}
+			}
+		}
+	}
+
+	XalanDOMString&		thePendingElementName = getPendingElementNameImpl();
+
+	if(getHasPendingStartDocument() == true && getMustFlushPendingStartDocument() == true)
+	{
+		startDocument();
+	}
+
+	if(0 != length(thePendingElementName) && getMustFlushPendingStartDocument() == true)
+	{
+		assert(getFormatterListener() != 0);
+		assert(m_executionContext != 0);
+
+		m_cdataStack.push_back(isCDataResultElem(thePendingElementName) ? true : false);
+
+		AttributeListImpl&	thePendingAttributes =
+				getPendingAttributesImpl();
+
+		getFormatterListener()->startElement(c_wstr(thePendingElementName), thePendingAttributes);
+
+		if(getTraceListeners() > 0)
+		{
+			const GenerateEvent		ge(
+				GenerateEvent::EVENTTYPE_STARTELEMENT,
+				thePendingElementName,
+				&thePendingAttributes);
+
+			fireGenerateEvent(ge);
+		}
+
+		thePendingAttributes.clear();
+
+		clear(thePendingElementName);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::startElement(const XMLCh* const	name)
+{
+	assert(getFormatterListener() != 0);
+	assert(name != 0);
+
+	flushPending();
+
+	m_resultNamespacesStack.pushContext();
+
+	setPendingElementName(name);
+
+	setMustFlushPendingStartDocument(true);
+}
+
+
+
+void
+XSLTEngineImpl::startElement(
+			const XMLCh* const	name,
+			AttributeList&		atts)
+{
+	assert(getFormatterListener() != 0);
+	assert(name != 0);
+
+	flushPending();
+
+	const unsigned int	nAtts = atts.getLength();
+
+	assert(m_outputContextStack.size() > 0);
+
+	AttributeListImpl&	thePendingAttributes =
+		getPendingAttributesImpl();
+
+	thePendingAttributes.clear();
+
+	for(unsigned int i = 0; i < nAtts; i++)
+	{
+		thePendingAttributes.addAttribute(
+			atts.getName(i),
+			atts.getType(i),
+			atts.getValue(i));
+	}
+
+	m_resultNamespacesStack.pushContext();
+
+	setPendingElementName(name);
+}
+
+
+
+void
+XSLTEngineImpl::endElement(const XMLCh* const 	name)
+{
+	assert(getFormatterListener() != 0);
+	assert(name != 0);
+
+	flushPending();
+
+	getFormatterListener()->endElement(name);
+
+	if(getTraceListeners() > 0)
+	{
+		const GenerateEvent		ge(GenerateEvent::EVENTTYPE_ENDELEMENT, name);
+
+		fireGenerateEvent(ge);
+	}
+
+	m_resultNamespacesStack.popContext();
+
+	if(m_stylesheetRoot->hasCDATASectionElements() == true)
+	{
+		m_cdataStack.pop_back();
+	}
+}
+
+
+
+void
+XSLTEngineImpl::characters(
+			const XMLCh* const	ch,
+			const unsigned int 	length)
+{
+	characters(ch,
+			   0,
+			   length);
+}
+
+
+
+void
+XSLTEngineImpl::characters(
+			const XMLCh* const	ch,
+			const unsigned int	start,
+			const unsigned int 	length)
+{
+	assert(getFormatterListener() != 0);
+	assert(ch != 0);
+
+	doFlushPending();
+
+	if(generateCDATASection() == true)
+	{
+		getFormatterListener()->cdata(ch + start, length);
+
+		if(getTraceListeners() > 0)
+		{
+			fireCharacterGenerateEvent(ch, start, length, true);
+		}
+	}
+	else
+	{
+		getFormatterListener()->characters(ch + start, length);
+
+		if(getTraceListeners() > 0)
+		{
+			fireCharacterGenerateEvent(ch, start, length, false);
+		}
+	}
+}
+
+
+
+void
+XSLTEngineImpl::characters(const XalanNode&		node)
+{
+	assert(getFormatterListener() != 0);
+
+	doFlushPending();
+
+	if(generateCDATASection() == true)
+	{
+		DOMServices::getNodeData(node, *getFormatterListener(), &FormatterListener::cdata);
+
+		if(getTraceListeners() > 0)
+		{
+			fireCharacterGenerateEvent(node, true);
+		}
+	}
+	else
+	{
+		DOMServices::getNodeData(node, *getFormatterListener(), &FormatterListener::characters);
+
+		if(getTraceListeners() > 0)
+		{
+			fireCharacterGenerateEvent(node, false);
+		}
+	}
+}
+
+
+
+void
+XSLTEngineImpl::characters(const XObjectPtr&	xobject)
+{
+	assert(getFormatterListener() != 0);
+	assert(xobject.null() == false);
+
+	doFlushPending();
+
+	if(generateCDATASection() == true)
+	{
+		xobject->str(*getFormatterListener(), &FormatterListener::cdata);
+
+		if(getTraceListeners() > 0)
+		{
+			fireCharacterGenerateEvent(xobject, true);
+		}
+	}
+	else
+	{
+		xobject->str(*getFormatterListener(), &FormatterListener::characters);
+
+		if(getTraceListeners() > 0)
+		{
+			fireCharacterGenerateEvent(xobject, false);
+		}
+	}
+}
+
+
+
+void 
+XSLTEngineImpl::charactersRaw(
+			const XMLCh* const	ch,
+			const unsigned int	start,
+			const unsigned int	length)
+{
+	assert(ch != 0);
+
+	doFlushPending();
+
+	getFormatterListener()->charactersRaw(ch, length);
+
+	if(getTraceListeners() > 0)
+	{
+		fireCharacterGenerateEvent(ch, start, length, false);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::charactersRaw(const XalanNode&	node)
+{
+	doFlushPending();
+
+	DOMServices::getNodeData(node, *getFormatterListener(), &FormatterListener::charactersRaw);
+
+	if(getTraceListeners() > 0)
+	{
+		fireCharacterGenerateEvent(node, false);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::charactersRaw(const XObjectPtr&		xobject)
+{
+	doFlushPending();
+
+	xobject->str(*getFormatterListener(), &FormatterListener::charactersRaw);
+
+	if(getTraceListeners() > 0)
+	{
+		fireCharacterGenerateEvent(xobject, false);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::resetDocument()
+{
+	assert(getFormatterListener() != 0);
+
+	flushPending();
+	
+	getFormatterListener()->resetDocument();
+}
+
+
+
+void
+XSLTEngineImpl::ignorableWhitespace(
+			const XMLCh* const	ch,
+			const unsigned int 	length)
+{
+	assert(getFormatterListener() != 0);
+	assert(ch != 0);
+
+	doFlushPending();
+
+	getFormatterListener()->ignorableWhitespace(ch, length);
+
+	if(getTraceListeners() > 0)
+	{
+		GenerateEvent ge(GenerateEvent::EVENTTYPE_IGNORABLEWHITESPACE,
+					ch, 0, length);
+
+		fireGenerateEvent(ge);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::processingInstruction(
+			const XMLCh* const	target,
+			const XMLCh* const	data)
+{
+	assert(getFormatterListener() != 0);
+	assert(target != 0);
+	assert(data != 0);
+
+	doFlushPending();
+
+	getFormatterListener()->processingInstruction(target, data);
+
+	if(getTraceListeners() > 0)
+	{
+		GenerateEvent ge(
+				GenerateEvent::EVENTTYPE_PI,
+                target,
+				data);
+
+		fireGenerateEvent(ge);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::comment(const XMLCh* const	data)
+{
+	assert(getFormatterListener() != 0);
+	assert(data != 0);
+
+	doFlushPending();
+
+	getFormatterListener()->comment(data);
+
+	if(getTraceListeners() > 0)
+	{
+		GenerateEvent ge(GenerateEvent::EVENTTYPE_COMMENT,
+                                          data);
+		fireGenerateEvent(ge);
+	}
+}
+
+
+void
+XSLTEngineImpl::entityReference(const XMLCh* const	name)
+{
+	assert(getFormatterListener() != 0);
+	assert(name != 0);
+
+	doFlushPending();
+
+	getFormatterListener()->entityReference(name);
+
+	if(getTraceListeners() > 0)
+	{
+		GenerateEvent ge(GenerateEvent::EVENTTYPE_ENTITYREF,
+                                          name);
+
+		fireGenerateEvent(ge);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::cdata(
+			const XMLCh* const	ch,
+			const unsigned int 	start,
+			const unsigned int 	length)
+{
+	assert(getFormatterListener() != 0);
+	assert(ch != 0);
+
+	setMustFlushPendingStartDocument(true);
+
+	flushPending();
+
+	if(m_stylesheetRoot->hasCDATASectionElements() == true &&
+	   0 != m_cdataStack.size())
+	{
+		getFormatterListener()->cdata(ch, length);
+
+		if(getTraceListeners() > 0)
+		{
+			GenerateEvent ge(GenerateEvent::EVENTTYPE_CDATA, ch, start,
+					length);
+
+			fireGenerateEvent(ge);
+		}
+	}
+	else
+	{
+		getFormatterListener()->characters(ch, length);
+
+		if(getTraceListeners() > 0)
+		{
+			GenerateEvent ge(GenerateEvent::EVENTTYPE_CHARACTERS, ch,
+					start, length);
+
+			fireGenerateEvent(ge);
+		}
+	}
+}
+
+
+
+void
+XSLTEngineImpl::cloneToResultTree(
+			XalanNode&				node,
+			XalanNode::NodeType		nodeType,
+			bool					isLiteral,
+			bool					overrideStrip,
+			bool					shouldCloneAttributes)
+{
+	assert(nodeType == node.getNodeType());
+
+	switch(nodeType)
+	{
+	case XalanNode::TEXT_NODE:
+		{
+			bool	stripWhiteSpace = false;
+
+			// If stripWhiteSpace is false, then take this as an override and 
+			// just preserve the space, otherwise use the XSL whitespace rules.
+			if(!overrideStrip)
+			{
+				stripWhiteSpace = isLiteral ? true : false;
+			  // was: stripWhiteSpace = isLiteral ? true : shouldStripSourceNode(node);
+			}
+
+			const XalanText& 	tx =
+#if defined(XALAN_OLD_STYLE_CASTS)
+				(const XalanText&)node;
+#else
+				static_cast<const XalanText&>(node);
+#endif
+
+			const bool	isIgnorableWhitespace = tx.isIgnorableWhitespace();
+
+			if(stripWhiteSpace == false || isIgnorableWhitespace == false)
+			{
+				assert(tx.getParentNode() == 0 ||
+					   tx.getParentNode()->getNodeType() != XalanNode::DOCUMENT_NODE);
+
+				const XalanDOMString&	data = tx.getData();
+
+				if(0 != length(data))
+				{
+					if(isIgnorableWhitespace == true)
+					{
+						ignorableWhitespace(toCharArray(data), length(data));
+					}
+					else
+					{
+						characters(toCharArray(data), 0, length(data));
+					}
+				}
+			}			
+		}
+		break;
+
+	case XalanNode::ELEMENT_NODE:
+		startElement(c_wstr(node.getNodeName()));
+
+		if(shouldCloneAttributes == true)
+		{
+			copyAttributesToAttList(
+									m_stylesheetRoot,
+									node,
+									getPendingAttributesImpl());
+
+			copyNamespaceAttributes(node);
+		}
+		break;
+
+	case XalanNode::CDATA_SECTION_NODE:
+		{
+			const XalanDOMString& 	data = node.getNodeValue();
+
+			cdata(toCharArray(data), 0, length(data));
+		}
+		break;
+
+	case XalanNode::ATTRIBUTE_NODE:
+		addResultAttribute(
+				getPendingAttributesImpl(),
+#if defined(XALAN_OLD_STYLE_CASTS)
+				DOMServices::getNameOfNode((const XalanAttr&)node),
+#else
+				DOMServices::getNameOfNode(static_cast<const XalanAttr&>(node)),
+#endif
+				node.getNodeValue());
+		break;
+
+	case XalanNode::COMMENT_NODE:
+		comment(c_wstr(node.getNodeValue()));
+		break;
+
+	case XalanNode::DOCUMENT_FRAGMENT_NODE:
+		error("No clone of a document fragment!");
+		break;
+	
+	case XalanNode::ENTITY_REFERENCE_NODE:
+		entityReference(c_wstr(node.getNodeName()));
+		break;
+
+	case XalanNode::PROCESSING_INSTRUCTION_NODE:
+		processingInstruction(
+				c_wstr(node.getNodeName()),
+				c_wstr(node.getNodeValue()));
+		break;
+
+	// Can't really do this, but we won't throw an error so that copy-of will
+	// work
+	case XalanNode::DOCUMENT_NODE:
+	case XalanNode::DOCUMENT_TYPE_NODE:
+	break;
+
+	default:
+		error("Cannot create item in result tree: " + node.getNodeName());
+	break;
+
+	}
+}
+
+
+
+void
+XSLTEngineImpl::outputResultTreeFragment(
+			StylesheetExecutionContext&		executionContext,
+			const XObject&					theTree)
+{
+	const ResultTreeFragBase&	docFrag = theTree.rtree(executionContext);
+
+	const XalanNodeList* const	nl = docFrag.getChildNodes();
+	assert(nl != 0);
+
+	const unsigned int			nChildren = nl->getLength();
+
+	for(unsigned int i = 0; i < nChildren; i++)
+	{
+		XalanNode*				pos = nl->item(i);
+		assert(pos != 0);
+
+		XalanNode::NodeType		posNodeType = pos->getNodeType();
+
+		XalanNode* const		top = pos;
+
+		while(0 != pos)
+		{
+			flushPending();
+
+			cloneToResultTree(*pos, posNodeType, false, false, true);
+
+			XalanNode*	nextNode = pos->getFirstChild();
+
+			while(0 == nextNode)
+			{
+				if(XalanNode::ELEMENT_NODE == posNodeType)
+				{
+					endElement(c_wstr(pos->getNodeName()));
+				}
+
+				if(top == pos)
+					break;
+
+				nextNode = pos->getNextSibling();
+
+				if(0 == nextNode)
+				{
+					pos = pos->getParentNode();
+
+					if(0 == pos)
+					{
+						nextNode = 0;
+
+						break;
+					}
+					else
+					{
+						assert(0 != pos);
+
+						posNodeType = pos->getNodeType();
+
+						if(top == pos)
+						{
+							if(XalanNode::ELEMENT_NODE == posNodeType)
+							{
+								endElement(c_wstr(pos->getNodeName()));
+							}
+
+							nextNode = 0;
+
+							break;
+						}
+					}
+				}
+			}
+
+			pos = nextNode;
+
+			if (pos != 0)
+			{
+				posNodeType = pos->getNodeType();
+			}
+		}
+	}
+}
+
+
+
+bool
+XSLTEngineImpl::isCDataResultElem(const XalanDOMString&		elementName) const
+{
+	assert(m_executionContext != 0);
+
+	if(m_stylesheetRoot->hasCDATASectionElements() == false)
+	{
+		return false;
+	}
+	else
+	{
+		bool	fResult = false;
+
+		const unsigned int	indexOfNSSep = indexOf(elementName, XalanUnicode::charColon);
+
+		if(indexOfNSSep == length(elementName))
+		{
+			fResult = m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(s_emptyString, elementName));
+		}
+		else
+		{
+			typedef StylesheetExecutionContext::GetAndReleaseCachedString	GetAndReleaseCachedString;
+
+			GetAndReleaseCachedString	elemLocalNameGuard(*m_executionContext);
+			GetAndReleaseCachedString	prefixGuard(*m_executionContext);
+
+			XalanDOMString&		elemLocalName = elemLocalNameGuard.get();
+			XalanDOMString&		prefix = prefixGuard.get();
+
+			substring(elementName, prefix, 0, indexOfNSSep);
+			substring(elementName, elemLocalName, indexOfNSSep + 1);
+
+			if(equals(prefix, DOMServices::s_XMLString))
+			{
+				fResult =
+					m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(DOMServices::s_XMLNamespaceURI, elementName));
+			}
+			else
+			{
+				const XalanDOMString* const		elemNS =
+					getResultNamespaceForPrefix(prefix);
+
+				if(elemNS == 0)
+				{
+					error("Prefix must resolve to a namespace: " + prefix);
+				}
+				else
+				{
+					fResult =
+						m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(*elemNS, elementName));
+				}
+			}
+		}
+
+		return fResult;
+	}
+}
+	
+
+
+const XalanDOMString*
+XSLTEngineImpl::getResultNamespaceForPrefix(const XalanDOMString&	prefix) const
+{
+	return m_resultNamespacesStack.getNamespaceForPrefix(prefix);
+}
+  
+
+
+const XalanDOMString*
+XSLTEngineImpl::getResultPrefixForNamespace(const XalanDOMString&	theNamespace) const
+{
+	return m_resultNamespacesStack.getPrefixForNamespace(theNamespace);
+}
+
+
+
+inline bool
+isPrefixUsed(
+			const XalanDOMString&	thePrefix,
+			unsigned int			thePrefixLength,
+			const XalanDOMChar*		theName,
+			unsigned int			theNameLength)
+{
+	assert(thePrefixLength != 0);
+
+	// The name must be greater than the length of the prefix + 1, since
+	// there must be a ':' to separate the prefix from the local part...
+	if (theNameLength <= thePrefixLength + 1)
+	{
+		return false;
+	}
+	else
+	{
+		assert(theName != 0);
+
+		const unsigned int	theIndex = indexOf(
+			theName,
+			XalanUnicode::charColon);
+
+		// OK, if the index of the ':' is the same as the length of the prefix,
+		// and theElementName starts with thePrefix, then the prefix is in use.
+		if (theIndex == thePrefixLength &&
+			startsWith(theName, thePrefix) == true)
+		{
+			return true;
+		}
+		else
+		{
+			return false;
+		}
+	}
+}
+
+
+
+inline bool
+isPrefixUsed(
+			const XalanDOMString&	thePrefix,
+			unsigned int			thePrefixLength,
+			const XalanDOMString&	theName)
+{
+	return isPrefixUsed(thePrefix, thePrefixLength, c_wstr(theName), length(theName));
+}
+
+
+
+inline bool
+isPrefixUsedOrDeclared(
+			const XalanDOMString&	thePrefix,
+			unsigned int			thePrefixLength,
+			const XalanDOMChar*		theName,
+			unsigned int			theNameLength)
+{
+	if (isPrefixUsed(thePrefix, thePrefixLength, theName, theNameLength) == true)
+	{
+		return true;
+	}
+	else
+	{
+		const unsigned int	theDeclarationLength =
+			thePrefixLength + DOMServices::s_XMLNamespaceWithSeparatorLength;
+
+		// If this is a namespace declaration for this prefix, then all of
+		// these conditions must be true...
+		if (theDeclarationLength == theNameLength &&
+			startsWith(theName, DOMServices::s_XMLNamespaceWithSeparator) == true &&
+			endsWith(theName, c_wstr(thePrefix)) == true)
+		{
+			return true;
+		}
+		else
+		{
+			return false;
+		}
+	}
+}
+
+
+
+inline bool
+isPendingAttributePrefix(
+			const AttributeList&		thePendingAttributes,
+			const XalanDOMString&		thePrefix,
+			unsigned int				thePrefixLength)
+{
+	const unsigned int	thePendingAttributesCount =
+				thePendingAttributes.getLength();
+
+	if (thePendingAttributesCount == 0)
+	{
+		// No attributes, no problem...
+		return false;
+	}
+	else
+	{
+		bool	fResult = false;
+
+		// Check each attribute...
+		for (unsigned int i = 0; i < thePendingAttributesCount; ++i)
+		{
+			const XalanDOMChar* const	thePendingAttributeName =
+							thePendingAttributes.getName(i);
+			assert(thePendingAttributeName != 0);
+
+			if (isPrefixUsedOrDeclared(
+					thePrefix,
+					thePrefixLength,
+					thePendingAttributeName,
+					length(thePendingAttributeName)) == true)
+			{
+				fResult = true;
+
+				break;
+			}
+		}
+
+		return fResult;
+	}
+}
+
+
+
+bool
+XSLTEngineImpl::isPendingResultPrefix(const XalanDOMString&		thePrefix) const
+{
+	const unsigned int	thePrefixLength = length(thePrefix);
+	assert(thePrefixLength > 0);
+
+	// The element name must be greater than the length of the prefix + 1, since
+	// there must be a ':' to separate the prefix from the local part...
+	if (isPrefixUsed(thePrefix, thePrefixLength, getPendingElementName()) == true)
+	{
+		return true;
+	}
+	else
+	{
+		// The element is not using the prefix, so check the
+		// pending attributes...
+		return isPendingAttributePrefix(
+						getPendingAttributes(),
+						thePrefix,
+						thePrefixLength);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::addResultNamespace(
+			const XalanNode&	theNode,
+			AttributeListImpl&	thePendingAttributes,
+			bool				fOnlyIfPrefixNotPresent)
+{
+	assert(theNode.getNodeType() == XalanNode::ATTRIBUTE_NODE);
+
+	const XalanDOMString& 	aname = theNode.getNodeName();
+
+	const bool	isPrefix = startsWith(aname, DOMServices::s_XMLNamespaceWithSeparator);
+
+	const XalanDOMString 	prefix = isPrefix == true ?
+			substring(aname, DOMServices::s_XMLNamespaceWithSeparatorLength) : XalanDOMString();
+
+	if (equals(aname, DOMServices::s_XMLNamespace) || isPrefix) 
+	{
+		if (fOnlyIfPrefixNotPresent == true)
+		{
+			if (m_resultNamespacesStack.prefixIsPresentLocal(prefix) == false)
+			{
+				const XalanDOMString* const 	desturi = getResultNamespaceForPrefix(prefix);
+				const XalanDOMString&			srcURI = theNode.getNodeValue();
+
+				if(desturi == 0 || equals(srcURI, *desturi) == false)
+				{
+					addResultAttribute(thePendingAttributes, aname, srcURI);
+				}
+			}
+		}
+		else
+		{
+			const XalanDOMString* const 	desturi = getResultNamespaceForPrefix(prefix);
+			const XalanDOMString&			srcURI = theNode.getNodeValue();
+
+			if(desturi == 0 || equals(srcURI, *desturi) == false)
+			{
+				addResultAttribute(thePendingAttributes, aname, srcURI);
+			}
+		}
+	}
+}
+
+
+
+void
+XSLTEngineImpl::copyNamespaceAttributes(const XalanNode&	src) 
+{
+	const XalanNode*	parent = &src;
+
+	while (parent != 0 &&
+		   parent->getNodeType() == XalanNode::ELEMENT_NODE) 
+	{
+		const XalanNamedNodeMap* const	nnm =
+				parent->getAttributes();
+		assert(nnm != 0);
+
+		const unsigned int	nAttrs = nnm->getLength();
+
+		assert(m_outputContextStack.size() > 0);
+
+		AttributeListImpl&	thePendingAttributes =
+				getPendingAttributesImpl();
+
+		for (unsigned int i = 0;  i < nAttrs; i++) 
+		{
+			const XalanNode* const	attr = nnm->item(i);
+			assert(attr != 0);
+
+			addResultNamespace(*attr, thePendingAttributes, true);
+		}
+
+		parent = parent->getParentNode();
+	}
+}
+
+
+
+const XObjectPtr
+XSLTEngineImpl::evalXPathStr(
+			const XalanDOMString&	str,
+			XPathExecutionContext&	executionContext)
+{
+	assert(executionContext.getPrefixResolver() != 0);
+
+	XPath* const	theXPath = m_xpathFactory.create();
+
+	XPathGuard	theGuard(m_xpathFactory,
+						 theXPath);
+
+    m_xpathProcessor->initXPath(*theXPath,
+								str,
+								*executionContext.getPrefixResolver(),
+								getLocatorFromStack());
+
+    return theXPath->execute(executionContext.getCurrentNode(),
+							 *executionContext.getPrefixResolver(),
+							 executionContext);
+}
+
+
+
+const XObjectPtr
+XSLTEngineImpl::evalXPathStr(
+			const XalanDOMString&	str,
+			XalanNode*				contextNode,
+			const PrefixResolver&	prefixResolver,
+			XPathExecutionContext&	executionContext)
+{
+	XPath* const	theXPath = m_xpathFactory.create();
+
+	XPathGuard	theGuard(m_xpathFactory,
+						 theXPath);
+
+    m_xpathProcessor->initXPath(*theXPath,
+								str,
+								prefixResolver,
+								getLocatorFromStack());
+
+    return theXPath->execute(contextNode, prefixResolver, executionContext);
+}
+
+
+
+const XObjectPtr
+XSLTEngineImpl::evalXPathStr(
+			const XalanDOMString&	str,
+			XalanNode*				contextNode,
+			const XalanElement&		prefixResolver,
+			XPathExecutionContext&	executionContext)
+{
+	ElementPrefixResolverProxy	theProxy(&prefixResolver,
+										 m_xpathEnvSupport,
+										 m_domSupport);
+
+	return evalXPathStr(str, contextNode, theProxy, executionContext);
+}
+
+
+
+
+/**
+ * Create and initialize an xpath and return it.
+ */
+const XPath*
+XSLTEngineImpl::createMatchPattern(
+			const XalanDOMString&	str,
+			const PrefixResolver&	resolver)
+{
+	XPath* const	xpath = m_xpathFactory.create();
+
+	m_xpathProcessor->initMatchPattern(*xpath, str, resolver, getLocatorFromStack());
+
+	return xpath;
+}
+
+
+
+void
+XSLTEngineImpl::returnXPath(const XPath*	xpath)
+{
+	m_xpathFactory.returnObject(xpath);
+}
+
+
+
+inline void
+XSLTEngineImpl::copyAttributeToTarget(
+			const XalanDOMString&	attrName,
+			const XalanDOMString&	attrValue,
+			AttributeListImpl&		attrList)
+{
+	// TODO: Find out about empty attribute template expression handling.
+	if(0 != length(attrValue))
+	{
+		addResultAttribute(attrList, attrName, attrValue);
+	}
+}
+
+
+
+void
+XSLTEngineImpl::copyAttributesToAttList(
+			const Stylesheet* 	stylesheetTree,
+			const XalanNode& 	node,
+			AttributeListImpl&	attList)
+{
+	assert(m_stylesheetRoot != 0);
+	assert(stylesheetTree != 0);
+
+	const XalanNamedNodeMap* const	attributes =
+		node.getAttributes();
+
+	if (attributes != 0)
+	{
+		const unsigned int	nAttributes = attributes->getLength();
+
+		for(unsigned int i = 0; i < nAttributes; ++i)  
+		{	
+			const XalanNode* const 	attr = attributes->item(i);
+			assert(attr != 0);
+
+			copyAttributeToTarget(
+				attr->getNodeName(),
+				attr->getNodeValue(),
+				attList);
+		}
+	}
+}
+
+
+
+bool
+XSLTEngineImpl::shouldStripSourceNode(
+			XPathExecutionContext&	executionContext,
+			const XalanNode&		textNode) const
+{
+	if (m_stylesheetRoot == 0)
+	{
+		return false;
+	}
+	else
+	{
+		bool	strip = false; // return value
+
+		if((m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
+			m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0))
+		{
+			const XalanNode::NodeType	type = textNode.getNodeType();
+
+			if(XalanNode::TEXT_NODE == type || XalanNode::CDATA_SECTION_NODE == type)
+			{
+				const XalanText& 	theTextNode =
+#if defined(XALAN_OLD_STYLE_CASTS)
+						(const XalanText&)textNode;
+#else
+						static_cast<const XalanText&>(textNode);
+#endif
+
+				if(!theTextNode.isIgnorableWhitespace())
+				{
+					const XalanDOMString&	data = theTextNode.getData();
+
+					if(0 == length(data))
+					{
+						return true;
+					}
+					else if(!isXMLWhitespace(data))
+					{
+						return false;
+					}
+				}
+
+				XalanNode*	parent = DOMServices::getParentOfNode(textNode);
+
+				while(0 != parent)
+				{
+					if(parent->getNodeType() == XalanNode::ELEMENT_NODE)
+					{
+						const XalanElement*	const	parentElem =
+#if defined(XALAN_OLD_STYLE_CASTS)
+							(const XalanElement*)parent;
+#else
+							static_cast<const XalanElement*>(parent);
+#endif
+
+						XPath::eMatchScore	highPreserveScore = XPath::eMatchScoreNone;
+						XPath::eMatchScore	highStripScore = XPath::eMatchScoreNone;
+
+						ElementPrefixResolverProxy	theProxy(parentElem, m_xpathEnvSupport, m_domSupport);
+
+						{
+							// $$$ ToDo:  All of this should be moved into a member of
+							// Stylesheet, so as not to expose these two data members...
+							typedef Stylesheet::XPathVectorType		XPathVectorType;
+
+							const XPathVectorType&	theElements =
+								m_stylesheetRoot->getWhitespacePreservingElements();
+
+							const XPathVectorType::size_type	nTests =
+								theElements.size();
+
+							for(XPathVectorType::size_type i = 0; i < nTests; i++)
+							{
+								const XPath* const	matchPat = theElements[i];
+								assert(matchPat != 0);
+
+								const XPath::eMatchScore	score = matchPat->getMatchScore(parent, theProxy, executionContext);
+
+								if(score > highPreserveScore)
+									highPreserveScore = score;
+							}
+						}
+
+						{
+							typedef Stylesheet::XPathVectorType		XPathVectorType;
+
+							const XPathVectorType&	theElements =
+								m_stylesheetRoot->getWhitespaceStrippingElements();
+
+							const XPathVectorType::size_type	nTests =
+								theElements.size();
+
+							for(XPathVectorType::size_type i = 0; i < nTests; i++)
+							{
+								const XPath* const	matchPat =
+									theElements[i];
+								assert(matchPat != 0);
+
+								const XPath::eMatchScore	score = matchPat->getMatchScore(parent, theProxy, executionContext);
+
+								if(score > highStripScore)
+									highStripScore = score;
+							}
+						}
+
+						if(highPreserveScore > XPath::eMatchScoreNone ||
+						   highStripScore > XPath::eMatchScoreNone)
+						{
+							if(highPreserveScore > highStripScore)
+							{
+								strip = false;
+							}
+							else if(highStripScore > highPreserveScore)
+							{
+								strip = true;
+							}
+							else
+							{
+								warn("Match conflict between xsl:strip-space and xsl:preserve-space");
+							}
+							break;
+						}
+					}
+
+					parent = parent->getParentNode();
+				}
+			}
+		}
+
+		return strip;
+	}
+}
+
+
+
+XMLParserLiaison&
+XSLTEngineImpl::getXMLParserLiaison() const
+{
+	return m_parserLiaison;
+}
+
+
+
+const XalanDOMString
+XSLTEngineImpl::getUniqueNamespaceValue()
+{
+	XalanDOMString	theResult;
+
+	getUniqueNamespaceValue(theResult);
+
+	return theResult;
+}
+
+
+
+void
+XSLTEngineImpl::getUniqueNamespaceValue(XalanDOMString&		theValue)
+{
+	append(theValue, s_uniqueNamespacePrefix);
+
+	UnsignedLongToDOMString(m_uniqueNSValue++, theValue);
+}
+
+
+
+XalanDocument*
+XSLTEngineImpl::getDOMFactory() const
+{
+	if(m_domResultTreeFactory == 0)
+	{
+#if defined(XALAN_NO_MUTABLE)
+		((XSLTEngineImpl*)this)->m_domResultTreeFactory = m_parserLiaison.createDOMFactory();
+#else
+		m_domResultTreeFactory = m_parserLiaison.createDOMFactory();
+#endif
+	}
+
+	return m_domResultTreeFactory;
+}
+
+
+
+void
+XSLTEngineImpl::setStylesheetParam(
+			const XalanDOMString&	theName,
+			const XalanDOMString&	expression)
+{
+	const XalanQNameByValue		qname(theName, 0, m_xpathEnvSupport, m_domSupport);
+
+	m_topLevelParams.push_back(ParamVectorType::value_type(qname, expression));
+}
+
+
+
+void
+XSLTEngineImpl::setStylesheetParam(
+			const XalanDOMString&	theName,
+			XObjectPtr				theValue)
+{
+	const XalanQNameByValue		qname(theName, 0, m_xpathEnvSupport, m_domSupport);
+
+	m_topLevelParams.push_back(ParamVectorType::value_type(qname, theValue));
+}
+
+
+
+void
+XSLTEngineImpl::resolveTopLevelParams(StylesheetExecutionContext&	executionContext)
+{
+	executionContext.pushTopLevelVariables(m_topLevelParams);
+}
+
+
+
+FormatterListener*
+XSLTEngineImpl::getFormatterListener() const
+{
+	return getFormatterListenerImpl();
+}
+
+
+
+void
+XSLTEngineImpl::setFormatterListener(FormatterListener*		flistener)
+{
+	if (getHasPendingStartDocument() == true && getFormatterListener() != 0)
+	{
+		setMustFlushPendingStartDocument(true);
+
+		flushPending();
+	}
+
+	setFormatterListenerImpl(flistener);
+}
+
+
+
+void
+XSLTEngineImpl::fireCharacterGenerateEvent(
+			const XalanNode&	theNode,
+			bool				isCDATA)
+{
+	fireCharacterGenerateEvent(DOMServices::getNodeData(theNode), isCDATA);
+}
+
+
+
+void
+XSLTEngineImpl::fireCharacterGenerateEvent(
+			const XObjectPtr&	theXObject,
+			bool				isCDATA)
+{
+	fireCharacterGenerateEvent(theXObject->str(), isCDATA);
+}
+
+
+
+void
+XSLTEngineImpl::fireCharacterGenerateEvent(
+			const XalanDOMString&	theString,
+			bool					isCDATA)
+{
+	fireCharacterGenerateEvent(c_wstr(theString), 0, length(theString), isCDATA);
+}
+
+
+
+void
+XSLTEngineImpl::fireCharacterGenerateEvent(
+			const XMLCh*	ch,
+			unsigned int	start,
+			unsigned int	length,
+			bool			isCDATA)
+{
+	const GenerateEvent		ge(
+		isCDATA == true ? GenerateEvent::EVENTTYPE_CDATA : GenerateEvent::EVENTTYPE_CHARACTERS,
+		ch,
+		start,
+		length);
+
+	fireGenerateEvent(ge);
+}
+
+
+
+void
+XSLTEngineImpl::installFunctions()
+{
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("current")), FunctionCurrent());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("document")), FunctionDocument());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("element-available")), FunctionElementAvailable());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("function-available")), FunctionFunctionAvailable());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("format-number")), FunctionFormatNumber());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("generate-id")), FunctionGenerateID());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("key")), FunctionKey());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("system-property")), FunctionSystemProperty());
+	XPath::installFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("unparsed-entity-uri")), FunctionUnparsedEntityURI());
+}
+
+
+
+void
+XSLTEngineImpl::uninstallFunctions()
+{
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("current")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("document")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("element-available")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("function-available")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("format-number")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("generate-id")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("key")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("system-property")));
+	XPath::uninstallFunction(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("unparsed-entity-uri")));
+}
+
+
+
+void
+XSLTEngineImpl::initializeAttributeKeysTable(AttributeKeysMapType&	theAttributeKeys)
+{
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_METHOD] = Constants::TATTRNAME_OUTPUT_METHOD;
+	theAttributeKeys[Constants::ATTRNAME_AMOUNT] = Constants::TATTRNAME_AMOUNT;
+	theAttributeKeys[Constants::ATTRNAME_ANCESTOR] = Constants::TATTRNAME_ANCESTOR;
+	theAttributeKeys[Constants::ATTRNAME_ARCHIVE] = Constants::TATTRNAME_ARCHIVE;
+	theAttributeKeys[Constants::ATTRNAME_ATTRIBUTE] = Constants::TATTRNAME_ATTRIBUTE;
+	theAttributeKeys[Constants::ATTRNAME_ATTRIBUTE_SET] = Constants::TATTRNAME_ATTRIBUTE_SET;
+	theAttributeKeys[Constants::ATTRNAME_CASEORDER] = Constants::TATTRNAME_CASEORDER;
+	theAttributeKeys[Constants::ATTRNAME_CLASS] = Constants::TATTRNAME_CLASS;
+	theAttributeKeys[Constants::ATTRNAME_CLASSID] = Constants::TATTRNAME_CLASSID;
+	theAttributeKeys[Constants::ATTRNAME_CODEBASE] = Constants::TATTRNAME_CODEBASE;
+	theAttributeKeys[Constants::ATTRNAME_CODETYPE] = Constants::TATTRNAME_CODETYPE;
+	theAttributeKeys[Constants::ATTRNAME_CONDITION] = Constants::TATTRNAME_CONDITION;
+	theAttributeKeys[Constants::ATTRNAME_COPYTYPE] = Constants::TATTRNAME_COPYTYPE;
+	theAttributeKeys[Constants::ATTRNAME_COUNT] = Constants::TATTRNAME_COUNT;
+	theAttributeKeys[Constants::ATTRNAME_DATATYPE] = Constants::TATTRNAME_DATATYPE;
+	theAttributeKeys[Constants::ATTRNAME_DEFAULT] = Constants::TATTRNAME_DEFAULT;
+	theAttributeKeys[Constants::ATTRNAME_DEFAULTSPACE] = Constants::TATTRNAME_DEFAULTSPACE;
+	theAttributeKeys[Constants::ATTRNAME_DEPTH] = Constants::TATTRNAME_DEPTH;
+	theAttributeKeys[Constants::ATTRNAME_DIGITGROUPSEP] = Constants::TATTRNAME_DIGITGROUPSEP;
+	theAttributeKeys[Constants::ATTRNAME_DISABLE_OUTPUT_ESCAPING] = Constants::TATTRNAME_DISABLE_OUTPUT_ESCAPING;
+	theAttributeKeys[Constants::ATTRNAME_ELEMENT] = Constants::TATTRNAME_ELEMENT;
+	theAttributeKeys[Constants::ATTRNAME_ELEMENTS] = Constants::TATTRNAME_ELEMENTS;
+	theAttributeKeys[Constants::ATTRNAME_EXPR] = Constants::TATTRNAME_EXPR;
+	theAttributeKeys[Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES] = Constants::TATTRNAME_EXTENSIONELEMENTPREFIXES;
+	theAttributeKeys[Constants::ATTRNAME_FORMAT] = Constants::TATTRNAME_FORMAT;
+	theAttributeKeys[Constants::ATTRNAME_FROM] = Constants::TATTRNAME_FROM;
+	theAttributeKeys[Constants::ATTRNAME_GROUPINGSEPARATOR] = Constants::TATTRNAME_GROUPINGSEPARATOR;
+	theAttributeKeys[Constants::ATTRNAME_GROUPINGSIZE] = Constants::TATTRNAME_GROUPINGSIZE;
+	theAttributeKeys[Constants::ATTRNAME_HREF] = Constants::TATTRNAME_HREF;
+	theAttributeKeys[Constants::ATTRNAME_ID] = Constants::TATTRNAME_ID;
+	theAttributeKeys[Constants::ATTRNAME_IMPORTANCE] = Constants::TATTRNAME_IMPORTANCE;
+	theAttributeKeys[Constants::ATTRNAME_INDENTRESULT] = Constants::TATTRNAME_INDENTRESULT;
+	theAttributeKeys[Constants::ATTRNAME_LANG] = Constants::TATTRNAME_LANG;
+	theAttributeKeys[Constants::ATTRNAME_LETTERVALUE] = Constants::TATTRNAME_LETTERVALUE;
+	theAttributeKeys[Constants::ATTRNAME_LEVEL] = Constants::TATTRNAME_LEVEL;
+	theAttributeKeys[Constants::ATTRNAME_MATCH] = Constants::TATTRNAME_MATCH;
+	theAttributeKeys[Constants::ATTRNAME_METHOD] = Constants::TATTRNAME_METHOD;
+	theAttributeKeys[Constants::ATTRNAME_MODE] = Constants::TATTRNAME_MODE;
+	theAttributeKeys[Constants::ATTRNAME_NAME] = Constants::TATTRNAME_NAME;
+	theAttributeKeys[Constants::ATTRNAME_NAMESPACE] = Constants::TATTRNAME_NAMESPACE;
+	theAttributeKeys[Constants::ATTRNAME_NDIGITSPERGROUP] = Constants::TATTRNAME_NDIGITSPERGROUP;
+	theAttributeKeys[Constants::ATTRNAME_NS] = Constants::TATTRNAME_NS;
+	theAttributeKeys[Constants::ATTRNAME_ONLY] = Constants::TATTRNAME_ONLY;
+	theAttributeKeys[Constants::ATTRNAME_ORDER] = Constants::TATTRNAME_ORDER;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_CDATA_SECTION_ELEMENTS] = Constants::TATTRNAME_OUTPUT_CDATA_SECTION_ELEMENTS;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_DOCTYPE_PUBLIC] = Constants::TATTRNAME_OUTPUT_DOCTYPE_PUBLIC;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_DOCTYPE_SYSTEM] = Constants::TATTRNAME_OUTPUT_DOCTYPE_SYSTEM;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_ENCODING] = Constants::TATTRNAME_OUTPUT_ENCODING;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_INDENT] = Constants::TATTRNAME_OUTPUT_INDENT;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_MEDIATYPE] = Constants::TATTRNAME_OUTPUT_MEDIATYPE;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_STANDALONE] = Constants::TATTRNAME_OUTPUT_STANDALONE;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_VERSION] = Constants::TATTRNAME_OUTPUT_VERSION;
+	theAttributeKeys[Constants::ATTRNAME_OUTPUT_OMITXMLDECL] = Constants::TATTRNAME_OUTPUT_OMITXMLDECL;
+	theAttributeKeys[Constants::ATTRNAME_PRIORITY] = Constants::TATTRNAME_PRIORITY;
+	theAttributeKeys[Constants::ATTRNAME_REFID] = Constants::TATTRNAME_REFID;
+	theAttributeKeys[Constants::ATTRNAME_RESULTNS] = Constants::TATTRNAME_RESULTNS;
+	theAttributeKeys[Constants::ATTRNAME_SELECT] = Constants::TATTRNAME_SELECT;
+	theAttributeKeys[Constants::ATTRNAME_SEQUENCESRC] = Constants::TATTRNAME_SEQUENCESRC;
+	theAttributeKeys[Constants::ATTRNAME_STYLE] = Constants::TATTRNAME_STYLE;
+	theAttributeKeys[Constants::ATTRNAME_TEST] = Constants::TATTRNAME_TEST;
+	theAttributeKeys[Constants::ATTRNAME_TOSTRING] = Constants::TATTRNAME_TOSTRING;
+	theAttributeKeys[Constants::ATTRNAME_TYPE] = Constants::TATTRNAME_TYPE;
+	theAttributeKeys[Constants::ATTRNAME_USE] = Constants::TATTRNAME_USE;
+	theAttributeKeys[Constants::ATTRNAME_USEATTRIBUTESETS] = Constants::TATTRNAME_USEATTRIBUTESETS;
+	theAttributeKeys[Constants::ATTRNAME_VALUE] = Constants::TATTRNAME_VALUE;
+
+	theAttributeKeys[Constants::ATTRNAME_XMLNSDEF] = Constants::TATTRNAME_XMLNSDEF;
+	theAttributeKeys[Constants::ATTRNAME_XMLNS] = Constants::TATTRNAME_XMLNS;
+	theAttributeKeys[Constants::ATTRNAME_XMLSPACE] = Constants::TATTRNAME_XMLSPACE;
+}
+
+
+
+void
+XSLTEngineImpl::initializeElementKeysTable(ElementKeysMapType&	theElementKeys)
+{
+	theElementKeys[Constants::ELEMNAME_APPLY_TEMPLATES_STRING] = Constants::ELEMNAME_APPLY_TEMPLATES;
+	theElementKeys[Constants::ELEMNAME_WITHPARAM_STRING] = Constants::ELEMNAME_WITHPARAM;
+	theElementKeys[Constants::ELEMNAME_CONSTRUCT_STRING] = Constants::ELEMNAME_CONSTRUCT;
+	theElementKeys[Constants::ELEMNAME_CONTENTS_STRING] = Constants::ELEMNAME_CONTENTS;
+	theElementKeys[Constants::ELEMNAME_COPY_STRING] = Constants::ELEMNAME_COPY;
+	theElementKeys[Constants::ELEMNAME_COPY_OF_STRING] = Constants::ELEMNAME_COPY_OF;
+
+	theElementKeys[Constants::ELEMNAME_ATTRIBUTESET_STRING] = Constants::ELEMNAME_DEFINEATTRIBUTESET;
+
+	theElementKeys[Constants::ELEMNAME_USE_STRING] = Constants::ELEMNAME_USE;
+
+	theElementKeys[Constants::ELEMNAME_VARIABLE_STRING] = Constants::ELEMNAME_VARIABLE;
+	theElementKeys[Constants::ELEMNAME_PARAMVARIABLE_STRING] = Constants::ELEMNAME_PARAMVARIABLE;
+
+	theElementKeys[Constants::ELEMNAME_DISPLAYIF_STRING] = Constants::ELEMNAME_DISPLAYIF;
+	theElementKeys[Constants::ELEMNAME_EMPTY_STRING] = Constants::ELEMNAME_EMPTY;
+	theElementKeys[Constants::ELEMNAME_EVAL_STRING] = Constants::ELEMNAME_EVAL;
+	theElementKeys[Constants::ELEMNAME_CALLTEMPLATE_STRING] = Constants::ELEMNAME_CALLTEMPLATE;
+	theElementKeys[Constants::ELEMNAME_TEMPLATE_STRING] = Constants::ELEMNAME_TEMPLATE;
+	theElementKeys[Constants::ELEMNAME_STYLESHEET_STRING] = Constants::ELEMNAME_STYLESHEET;
+	theElementKeys[Constants::ELEMNAME_TRANSFORM_STRING] = Constants::ELEMNAME_STYLESHEET;
+	theElementKeys[Constants::ELEMNAME_IMPORT_STRING] = Constants::ELEMNAME_IMPORT;
+	theElementKeys[Constants::ELEMNAME_INCLUDE_STRING] = Constants::ELEMNAME_INCLUDE;
+	theElementKeys[Constants::ELEMNAME_FOREACH_STRING] = Constants::ELEMNAME_FOREACH;
+	theElementKeys[Constants::ELEMNAME_VALUEOF_STRING] = Constants::ELEMNAME_VALUEOF;
+	theElementKeys[Constants::ELEMNAME_KEY_STRING] = Constants::ELEMNAME_KEY;
+	theElementKeys[Constants::ELEMNAME_STRIPSPACE_STRING] = Constants::ELEMNAME_STRIPSPACE;
+	theElementKeys[Constants::ELEMNAME_PRESERVESPACE_STRING] = Constants::ELEMNAME_PRESERVESPACE;
+	theElementKeys[Constants::ELEMNAME_NUMBER_STRING] = Constants::ELEMNAME_NUMBER;
+	theElementKeys[Constants::ELEMNAME_IF_STRING] = Constants::ELEMNAME_IF;
+	theElementKeys[Constants::ELEMNAME_CHOOSE_STRING] = Constants::ELEMNAME_CHOOSE;
+	theElementKeys[Constants::ELEMNAME_WHEN_STRING] = Constants::ELEMNAME_WHEN;
+	theElementKeys[Constants::ELEMNAME_OTHERWISE_STRING] = Constants::ELEMNAME_OTHERWISE;
+	theElementKeys[Constants::ELEMNAME_TEXT_STRING] = Constants::ELEMNAME_TEXT;
+	theElementKeys[Constants::ELEMNAME_ELEMENT_STRING] = Constants::ELEMNAME_ELEMENT;
+	theElementKeys[Constants::ELEMNAME_ATTRIBUTE_STRING] = Constants::ELEMNAME_ATTRIBUTE;
+	theElementKeys[Constants::ELEMNAME_SORT_STRING] = Constants::ELEMNAME_SORT;
+	theElementKeys[Constants::ELEMNAME_PI_STRING] = Constants::ELEMNAME_PI;
+	theElementKeys[Constants::ELEMNAME_COMMENT_STRING] = Constants::ELEMNAME_COMMENT;
+   
+	theElementKeys[Constants::ELEMNAME_COUNTER_STRING] = Constants::ELEMNAME_COUNTER;
+	theElementKeys[Constants::ELEMNAME_COUNTERS_STRING] = Constants::ELEMNAME_COUNTERS;
+	theElementKeys[Constants::ELEMNAME_COUNTERINCREMENT_STRING] = Constants::ELEMNAME_COUNTERINCREMENT;
+	theElementKeys[Constants::ELEMNAME_COUNTERRESET_STRING] = Constants::ELEMNAME_COUNTERRESET;
+	theElementKeys[Constants::ELEMNAME_COUNTERSCOPE_STRING] = Constants::ELEMNAME_COUNTERSCOPE;
+	
+	theElementKeys[Constants::ELEMNAME_APPLY_IMPORTS_STRING] = Constants::ELEMNAME_APPLY_IMPORTS;
+	
+	theElementKeys[Constants::ELEMNAME_EXTENSION_STRING] = Constants::ELEMNAME_EXTENSION;
+	theElementKeys[Constants::ELEMNAME_MESSAGE_STRING] = Constants::ELEMNAME_MESSAGE;
+	theElementKeys[Constants::ELEMNAME_LOCALE_STRING] = Constants::ELEMNAME_LOCALE;
+	theElementKeys[Constants::ELEMNAME_FALLBACK_STRING] = Constants::ELEMNAME_FALLBACK;
+	theElementKeys[Constants::ELEMNAME_OUTPUT_STRING] = Constants::ELEMNAME_OUTPUT;
+
+	theElementKeys[Constants::ELEMNAME_DECIMALFORMAT_STRING] = Constants::ELEMNAME_DECIMALFORMAT;
+	theElementKeys[Constants::ELEMNAME_NSALIAS_STRING] = Constants::ELEMNAME_NSALIAS;
+}
+
+
+
+void
+XSLTEngineImpl::initializeXSLT4JElementKeys(ElementKeysMapType&		theElementKeys)
+{
+	theElementKeys[Constants::ELEMNAME_COMPONENT_STRING] = Constants::ELEMNAME_COMPONENT;
+	theElementKeys[Constants::ELEMNAME_SCRIPT_STRING] = Constants::ELEMNAME_SCRIPT;
+}
+
+
+
+static XalanDOMString							s_XSLNameSpaceURL;
+
+static XalanDOMString							s_XSLT4JNameSpaceURL;
+
+static XalanDOMString							s_uniqueNamespacePrefix;
+
+static XSLTEngineImpl::AttributeKeysMapType		s_attributeKeys;
+
+static XSLTEngineImpl::ElementKeysMapType		s_elementKeys;
+
+static XSLTEngineImpl::ElementKeysMapType		s_XSLT4JElementKeys;
+
+
+
+const double			XSLTEngineImpl::s_XSLTVerSupported(1.0);
+
+const XalanDOMString&	XSLTEngineImpl::s_XSLNameSpaceURL = ::s_XSLNameSpaceURL;
+
+const XalanDOMString&	XSLTEngineImpl::s_XSLT4JNameSpaceURL = ::s_XSLT4JNameSpaceURL;
+
+const XalanDOMString&	XSLTEngineImpl::s_uniqueNamespacePrefix = ::s_uniqueNamespacePrefix;
+
+
+const XSLTEngineImpl::AttributeKeysMapType&		XSLTEngineImpl::s_attributeKeys = ::s_attributeKeys;
+
+const XSLTEngineImpl::ElementKeysMapType&		XSLTEngineImpl::s_elementKeys = ::s_elementKeys;
+
+const XSLTEngineImpl::ElementKeysMapType&		XSLTEngineImpl::s_XSLT4JElementKeys = ::s_XSLT4JElementKeys;
+
+
+
+void
+XSLTEngineImpl::initialize()
+{
+	::s_XSLNameSpaceURL = XALAN_STATIC_UCODE_STRING("http://www.w3.org/1999/XSL/Transform");
+
+	::s_XSLT4JNameSpaceURL = XALAN_STATIC_UCODE_STRING("http://xml.apache.org/xslt");
+
+	::s_uniqueNamespacePrefix = XALAN_STATIC_UCODE_STRING("ns");
+
+	installFunctions();
+
+	initializeAttributeKeysTable(::s_attributeKeys);
+
+	initializeElementKeysTable(::s_elementKeys);
+
+	initializeXSLT4JElementKeys(::s_XSLT4JElementKeys);
+}
+
+
+
+void
+XSLTEngineImpl::terminate()
+{
+	ElementKeysMapType().swap(::s_XSLT4JElementKeys);
+
+	ElementKeysMapType().swap(::s_elementKeys);
+
+	AttributeKeysMapType().swap(::s_attributeKeys);
+
+	uninstallFunctions();
+
+	releaseMemory(::s_uniqueNamespacePrefix);
+
+	releaseMemory(::s_XSLT4JNameSpaceURL);
+
+	releaseMemory(::s_XSLNameSpaceURL);
+}
diff --git a/src/XalanExtensions/FunctionEvaluate.cpp b/src/XalanExtensions/FunctionEvaluate.cpp
new file mode 100644
index 0000000..90a4ef0
--- /dev/null
+++ b/src/XalanExtensions/FunctionEvaluate.cpp
@@ -0,0 +1,207 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#include "FunctionEvaluate.hpp"
+
+
+
+#include <PlatformSupport/PrefixResolver.hpp>
+
+
+
+#include <XPath/XObjectFactory.hpp>
+#include <XPath/XPath.hpp>
+#include <XPath/XPathProcessorImpl.hpp>
+
+
+
+FunctionEvaluate::FunctionEvaluate()
+{
+}
+
+
+
+FunctionEvaluate::~FunctionEvaluate()
+{
+}
+
+
+
+XObjectPtr
+FunctionEvaluate::execute(
+		XPathExecutionContext&			executionContext,
+		XalanNode*						context)
+{
+	executionContext.error(getError(), context);
+
+	return XObjectPtr(0);
+}
+
+
+
+XObjectPtr
+FunctionEvaluate::execute(
+		XPathExecutionContext&	executionContext,
+		XalanNode*				context,			
+		const XObjectPtr		arg1)
+{
+	assert(arg1.null() == false);	
+
+	const PrefixResolver* const	theResolver =
+		executionContext.getPrefixResolver();
+
+	if (theResolver == 0)
+	{
+		executionContext.warn(
+			"No prefix resolver available in evaluate()!",
+			context);
+
+		return arg1;
+	}
+	else
+	{
+		const XalanDOMString&	theString =
+			arg1->str();
+
+		if (length(theString) == 0)
+		{
+			return XObjectPtr(0);
+		}
+		else
+		{
+			XPathProcessorImpl	theProcessor;
+
+			XPath				theXPath;
+
+			theProcessor.initXPath(
+				theXPath,
+				theString,
+				*theResolver);
+
+			return theXPath.execute(context, *theResolver, executionContext);
+		}
+	}
+}
+
+
+
+XObjectPtr
+FunctionEvaluate::execute(
+			XPathExecutionContext&	executionContext,
+			XalanNode*				context,			
+			const XObjectPtr		/* arg1 */,
+			const XObjectPtr		/* arg2 */)
+{
+	executionContext.error(getError(), context);
+
+	return XObjectPtr(0);
+}
+
+
+
+XObjectPtr
+FunctionEvaluate::execute(
+			XPathExecutionContext&	executionContext,
+			XalanNode*				context,			
+			const XObjectPtr		/* arg1 */,
+			const XObjectPtr		/* arg2 */,
+			const XObjectPtr		/* arg3 */)
+{
+	executionContext.error(getError(), context);
+
+	return XObjectPtr(0);
+}
+
+
+
+XObjectPtr
+FunctionEvaluate::execute(
+			XPathExecutionContext&			executionContext,
+			XalanNode*						context,
+			int								/* opPos */,
+			const XObjectArgVectorType&		args)
+{
+	if (args.size() != 1)
+	{
+		executionContext.error(getError(), context);
+
+		return XObjectPtr(0);
+	}
+	else
+	{
+		return execute(executionContext, context, args[0]);
+	}
+}
+
+
+
+#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
+Function*
+#else
+FunctionEvaluate*
+#endif
+FunctionEvaluate::clone() const
+{
+	return new FunctionEvaluate(*this);
+}
+
+
+
+const XalanDOMString
+FunctionEvaluate::getError() const
+{
+	return XALAN_STATIC_UCODE_STRING("The evaluate() function takes one argument");
+}
diff --git a/src/XalanSourceTree/XalanSourceTreeParserLiaison.cpp b/src/XalanSourceTree/XalanSourceTreeParserLiaison.cpp
new file mode 100644
index 0000000..f2a98cb
--- /dev/null
+++ b/src/XalanSourceTree/XalanSourceTreeParserLiaison.cpp
@@ -0,0 +1,523 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999-2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+// Class header file.
+#include "XalanSourceTreeParserLiaison.hpp"
+
+
+
+#include <algorithm>
+
+
+
+#include <sax2/XMLReaderFactory.hpp>
+
+
+
+#include <Include/XalanAutoPtr.hpp>
+#include <Include/STLHelper.hpp>
+
+
+
+#include <PlatformSupport/XalanUnicode.hpp>
+
+
+
+#include "XalanSourceTreeContentHandler.hpp"
+#include "XalanSourceTreeDOMSupport.hpp"
+#include "XalanSourceTreeDocument.hpp"
+
+
+
+// http://xml.org/sax/features/validation
+const XalanDOMChar	XalanSourceTreeParserLiaison::validationString[] = {
+	XalanUnicode::charLetter_h,
+	XalanUnicode::charLetter_t,
+	XalanUnicode::charLetter_t,
+	XalanUnicode::charLetter_p,
+	XalanUnicode::charColon,
+	XalanUnicode::charSolidus,
+	XalanUnicode::charSolidus,
+	XalanUnicode::charLetter_x,
+	XalanUnicode::charLetter_m,
+	XalanUnicode::charLetter_l,
+	XalanUnicode::charFullStop,
+	XalanUnicode::charLetter_o,
+	XalanUnicode::charLetter_r,
+	XalanUnicode::charLetter_g,
+	XalanUnicode::charSolidus,
+	XalanUnicode::charLetter_s,
+	XalanUnicode::charLetter_a,
+	XalanUnicode::charLetter_x,
+	XalanUnicode::charSolidus,
+	XalanUnicode::charLetter_f,
+	XalanUnicode::charLetter_e,
+	XalanUnicode::charLetter_a,
+	XalanUnicode::charLetter_t,
+	XalanUnicode::charLetter_u,
+	XalanUnicode::charLetter_r,
+	XalanUnicode::charLetter_e,
+	XalanUnicode::charLetter_s,
+	XalanUnicode::charSolidus,
+	XalanUnicode::charLetter_v,
+	XalanUnicode::charLetter_a,
+	XalanUnicode::charLetter_l,
+	XalanUnicode::charLetter_i,
+	XalanUnicode::charLetter_d,
+	XalanUnicode::charLetter_a,
+	XalanUnicode::charLetter_t,
+	XalanUnicode::charLetter_i,
+	XalanUnicode::charLetter_o,
+	XalanUnicode::charLetter_n,
+	0
+};
+
+
+
+XalanSourceTreeParserLiaison::XalanSourceTreeParserLiaison(XalanSourceTreeDOMSupport&	/* theSupport */) :
+	m_documentNumber(0),
+	m_xercesParserLiaison(),
+	m_documentMap(),
+	m_persistentDocumentMap(),
+	m_poolAllText(true)
+{
+}
+
+
+
+XalanSourceTreeParserLiaison::XalanSourceTreeParserLiaison() :
+	m_xercesParserLiaison(),
+	m_documentMap(),
+	m_persistentDocumentMap(),
+	m_poolAllText(true)
+{
+}
+
+
+
+XalanSourceTreeParserLiaison::~XalanSourceTreeParserLiaison()
+{
+	reset();
+
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	// Delete any persistent documents.
+	for_each(m_persistentDocumentMap.begin(),
+			 m_persistentDocumentMap.end(),
+			 makeMapValueDeleteFunctor(m_persistentDocumentMap));
+
+	m_persistentDocumentMap.clear();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::reset()
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	// Delete any documents.
+	for_each(m_documentMap.begin(),
+			 m_documentMap.end(),
+			 makeMapValueDeleteFunctor(m_documentMap));
+
+	m_documentMap.clear();
+
+	m_xercesParserLiaison.reset();
+}
+
+
+
+ExecutionContext*
+XalanSourceTreeParserLiaison::getExecutionContext() const
+{
+	return m_xercesParserLiaison.getExecutionContext();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setExecutionContext(ExecutionContext&		theContext)
+{
+	m_xercesParserLiaison.setExecutionContext(theContext);
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::parseXMLStream(
+			const InputSource&		inputSource,
+			DocumentHandler&		handler,
+			const XalanDOMString&	identifier)
+{
+	m_xercesParserLiaison.parseXMLStream(inputSource, handler, identifier);
+}
+
+
+
+XalanDocument*
+XalanSourceTreeParserLiaison::parseXMLStream(
+			const InputSource&		inputSource,
+			const XalanDOMString&	/* identifier */)
+{
+	XalanSourceTreeContentHandler	theContentHandler(createXalanSourceTreeDocument());
+
+	XalanAutoPtr<SAX2XMLReader>		theReader(XMLReaderFactory::createXMLReader());
+
+	theReader->setFeature(
+		validationString,
+		m_xercesParserLiaison.getUseValidation());
+
+	theReader->setContentHandler(&theContentHandler);
+
+	theReader->setDTDHandler(&theContentHandler);
+
+	theReader->setErrorHandler(&m_xercesParserLiaison);
+
+	theReader->setLexicalHandler(&theContentHandler);
+
+	theReader->setEntityResolver(getEntityResolver());
+
+	theReader->parse(inputSource);
+
+	return theContentHandler.getDocument();
+}
+
+
+
+XalanDocument*
+XalanSourceTreeParserLiaison::createDocument()
+{
+	return createXalanSourceTreeDocument();
+}
+
+
+
+XalanDocument*
+XalanSourceTreeParserLiaison::createDOMFactory()
+{
+	return m_xercesParserLiaison.createDocument();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::destroyDocument(XalanDocument*		theDocument)
+{
+	if (mapDocument(theDocument) != 0)
+	{
+		m_documentMap.erase(theDocument);
+
+		delete theDocument;
+	}
+}
+
+
+
+unsigned long
+XalanSourceTreeParserLiaison::getDocumentNumber()
+{
+	return m_documentNumber++;
+}
+
+
+
+int
+XalanSourceTreeParserLiaison::getIndent() const
+{
+	return m_xercesParserLiaison.getIndent();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setIndent(int		i)
+{
+	m_xercesParserLiaison.setIndent(i);
+}
+
+
+
+bool
+XalanSourceTreeParserLiaison::getUseValidation() const
+{
+	return m_xercesParserLiaison.getUseValidation();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setUseValidation(bool		b)
+{
+	m_xercesParserLiaison.setUseValidation(b);
+}
+
+
+
+const XalanDOMString
+XalanSourceTreeParserLiaison::getParserDescription() const
+{
+	return XALAN_STATIC_UCODE_STRING("XalanSourceTree");
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::parseXMLStream(
+			const InputSource&		theInputSource,
+			ContentHandler&			theContentHandler,
+			DTDHandler*				theDTDHandler,
+			LexicalHandler*			theLexicalHandler,
+			const XalanDOMString&	/* theIdentifier */)
+{
+	XalanAutoPtr<SAX2XMLReader>		theReader(XMLReaderFactory::createXMLReader());
+
+	theReader->setFeature(
+		validationString,
+		m_xercesParserLiaison.getUseValidation());
+
+	theReader->setContentHandler(&theContentHandler);
+
+	theReader->setDTDHandler(theDTDHandler);
+
+	theReader->setErrorHandler(&m_xercesParserLiaison);
+
+	theReader->setLexicalHandler(theLexicalHandler);
+
+	EntityResolver* const	theResolver = getEntityResolver();
+
+	if (theResolver != 0)
+	{
+		theReader->setEntityResolver(theResolver);
+	}
+
+	theReader->parse(theInputSource);
+}
+
+
+
+bool
+XalanSourceTreeParserLiaison::getIncludeIgnorableWhitespace() const
+{
+	return m_xercesParserLiaison.getIncludeIgnorableWhitespace();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setIncludeIgnorableWhitespace(bool	include)
+{
+	m_xercesParserLiaison.setIncludeIgnorableWhitespace(include);
+}
+
+
+
+ErrorHandler*
+XalanSourceTreeParserLiaison::getErrorHandler()
+{
+	return m_xercesParserLiaison.getErrorHandler();
+}
+
+
+
+const ErrorHandler*
+XalanSourceTreeParserLiaison::getErrorHandler() const
+{
+	return m_xercesParserLiaison.getErrorHandler();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setErrorHandler(ErrorHandler*	handler)
+{
+	m_xercesParserLiaison.setErrorHandler(handler);
+}
+
+
+
+bool
+XalanSourceTreeParserLiaison::getDoNamespaces() const
+{
+	return m_xercesParserLiaison.getDoNamespaces();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setDoNamespaces(bool	newState)
+{
+	m_xercesParserLiaison.setDoNamespaces(newState);
+}
+
+
+
+bool
+XalanSourceTreeParserLiaison::getExitOnFirstFatalError() const
+{
+	return m_xercesParserLiaison.getExitOnFirstFatalError();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setExitOnFirstFatalError(bool		newState)
+{
+	m_xercesParserLiaison.setExitOnFirstFatalError(newState);
+}
+
+
+
+EntityResolver*
+XalanSourceTreeParserLiaison::getEntityResolver()
+{
+	return m_xercesParserLiaison.getEntityResolver();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setEntityResolver(EntityResolver*	resolver)
+{
+	m_xercesParserLiaison.setEntityResolver(resolver);
+}
+
+
+
+XalanSourceTreeDocument*
+XalanSourceTreeParserLiaison::mapDocument(const XalanDocument*	theDocument) const
+{
+	DocumentMapType::const_iterator		i =
+		m_documentMap.find(theDocument);
+
+	if (i != m_documentMap.end())
+	{
+		return (*i).second;
+	}
+	else
+	{
+		i =	m_persistentDocumentMap.find(theDocument);
+
+		if (i != m_persistentDocumentMap.end())
+		{
+			return (*i).second;
+		}
+		else
+		{
+			return 0;
+		}
+	}
+}
+
+
+
+XalanSourceTreeDocument*
+XalanSourceTreeParserLiaison::createXalanSourceTreeDocument()
+{
+	XalanSourceTreeDocument* const	theNewDocument =
+		new XalanSourceTreeDocument(m_documentNumber++, m_poolAllText);
+
+	m_documentMap[theNewDocument] = theNewDocument;
+
+	return theNewDocument;
+}
+
+
+
+bool
+XalanSourceTreeParserLiaison::setPersistent(XalanSourceTreeDocument*	theDocument)
+{
+	const DocumentMapType::iterator		i =
+		m_documentMap.find(theDocument);
+
+	if (i != m_documentMap.end())
+	{
+		return false;
+	}
+	else
+	{
+		m_persistentDocumentMap[(*i).first] = (*i).second;
+
+		m_documentMap.erase(i);
+
+		return true;
+	}
+}
+
+
+bool
+XalanSourceTreeParserLiaison::unsetPersistent(XalanSourceTreeDocument*	theDocument)
+{
+	const DocumentMapType::iterator		i =
+		m_persistentDocumentMap.find(theDocument);
+
+	if (i != m_persistentDocumentMap.end())
+	{
+		return false;
+	}
+	else
+	{
+		m_documentMap[(*i).first] = (*i).second;
+
+		m_persistentDocumentMap.erase(i);
+
+		return true;
+	}
+}
diff --git a/src/XalanTransformer/XalanCompiledStylesheet.hpp b/src/XalanTransformer/XalanCompiledStylesheet.hpp
new file mode 100644
index 0000000..4d174e7
--- /dev/null
+++ b/src/XalanTransformer/XalanCompiledStylesheet.hpp
@@ -0,0 +1,88 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#if !defined(XALANCOMPILEDSTYLESHEET_HEADER_GUARD)
+#define XALANCOMPILEDSTYLESHEET_HEADER_GUARD
+
+
+
+// Base include file.  Must be first.
+#include <XalanTransformer/XalanTransformerDefinitions.hpp>
+
+
+
+class StylesheetRoot;
+
+
+
+/**
+ * This is an abstraction of the StylesheetRoot class. It is designed
+ * to allow a XalanTranfomer object to reuse a compliled stylesheet. 
+ */
+class XALAN_TRANSFORMER_EXPORT XalanCompiledStylesheet
+{
+public:
+
+	virtual
+	~XalanCompiledStylesheet() {}
+
+	virtual const StylesheetRoot*
+	getStylesheetRoot() const = 0;
+};
+
+
+
+#endif	// XALANCOMPILEDSTYLESHEET_HEADER_GUARD
diff --git a/src/XalanTransformer/XalanDefaultDocumentBuilder.cpp b/src/XalanTransformer/XalanDefaultDocumentBuilder.cpp
new file mode 100644
index 0000000..9b5782a
--- /dev/null
+++ b/src/XalanTransformer/XalanDefaultDocumentBuilder.cpp
@@ -0,0 +1,130 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+// Class header file.
+#include "XalanDefaultDocumentBuilder.hpp"
+
+
+
+#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
+
+
+
+#include "XalanDefaultParsedSource.hpp"
+
+
+
+XalanDefaultDocumentBuilder::XalanDefaultDocumentBuilder(const XalanDOMString&	theURI) :
+	m_domSupport(),
+	m_parserLiaison(),
+	m_contentHandler(m_parserLiaison.mapDocument(m_parserLiaison.createDocument())),
+	m_uri(theURI)
+{
+	m_domSupport.setParserLiaison(&m_parserLiaison);
+}
+
+
+
+XalanDefaultDocumentBuilder::~XalanDefaultDocumentBuilder()
+{
+}
+
+
+
+XalanDocument*
+XalanDefaultDocumentBuilder::getDocument() const
+{
+	return m_contentHandler.getDocument();
+}
+
+
+
+XalanParsedSourceHelper*
+XalanDefaultDocumentBuilder::createHelper() const
+{
+	return new XalanDefaultParsedSourceHelper(m_domSupport);
+}
+
+
+ContentHandler*
+XalanDefaultDocumentBuilder::getContentHandler()
+{
+	return &m_contentHandler;
+}
+
+
+
+DTDHandler*
+XalanDefaultDocumentBuilder::getDTDHandler()
+{
+	return &m_contentHandler;
+}
+
+
+
+LexicalHandler*
+XalanDefaultDocumentBuilder::getLexicalHandler()
+{
+	return &m_contentHandler;
+}
+
+
+
+const XalanDOMString&
+XalanDefaultDocumentBuilder::getURI() const
+{
+	return m_uri;
+}
diff --git a/src/XalanTransformer/XalanDefaultDocumentBuilder.hpp b/src/XalanTransformer/XalanDefaultDocumentBuilder.hpp
new file mode 100644
index 0000000..c9db42d
--- /dev/null
+++ b/src/XalanTransformer/XalanDefaultDocumentBuilder.hpp
@@ -0,0 +1,126 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#if !defined(XALANDEFAULTDOCUMENTBUILDER_HEADER_GUARD)
+#define XALANDEFAULTDOCUMENTBUILDER_HEADER_GUARD
+
+
+
+// Base include file.  Must be first.
+#include <XalanTransformer/XalanTransformerDefinitions.hpp>
+
+
+
+#include <XalanTransformer/XalanDocumentBuilder.hpp>
+
+
+
+#include <XalanSourceTree/XalanSourceTreeContentHandler.hpp>
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+#include <XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
+
+
+
+/**
+ * This is class is designed to allow a XalanTranfomer object
+ * to use a document that is build dynamically by a user.
+ */
+class XALAN_TRANSFORMER_EXPORT XalanDefaultDocumentBuilder : public XalanDocumentBuilder
+{
+public:
+
+	/**
+	 * Create a XalanDefaultDocumentBuilder instance,
+	 *
+	 * @param theURI An optional string to identify the document.
+	 */
+	XalanDefaultDocumentBuilder(const XalanDOMString&	theURI = XalanDOMString());
+
+	virtual
+	~XalanDefaultDocumentBuilder();
+
+	virtual XalanDocument*
+	getDocument() const;
+
+	virtual XalanParsedSourceHelper*
+	createHelper() const;
+
+	virtual const XalanDOMString&
+	getURI() const;
+
+	virtual ContentHandler*
+	getContentHandler();
+
+	virtual DTDHandler*
+	getDTDHandler();
+
+	virtual LexicalHandler*
+	getLexicalHandler();
+
+private:
+
+	XalanSourceTreeDOMSupport		m_domSupport;
+
+	XalanSourceTreeParserLiaison	m_parserLiaison;
+
+	XalanSourceTreeContentHandler	m_contentHandler;
+
+	const XalanDOMString			m_uri;
+};
+
+
+
+#endif	// XALANDEFAULTDOCUMENTBUILDER_HEADER_GUARD
diff --git a/src/XalanTransformer/XalanDefaultParsedSource.cpp b/src/XalanTransformer/XalanDefaultParsedSource.cpp
new file mode 100644
index 0000000..8f3d39f
--- /dev/null
+++ b/src/XalanTransformer/XalanDefaultParsedSource.cpp
@@ -0,0 +1,225 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#include "XalanDefaultParsedSource.hpp"
+
+
+
+#include <XalanDOM/XalanDocument.hpp>
+
+
+
+#include <PlatformSupport/URISupport.hpp>
+
+
+
+#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+
+
+
+XalanDefaultParsedSourceDOMSupport::XalanDefaultParsedSourceDOMSupport(const XalanSourceTreeDOMSupport&		theDOMSupport) :
+	XalanSourceTreeDOMSupport(),
+	m_domSupport(theDOMSupport)
+{
+}
+
+
+
+XalanDefaultParsedSourceDOMSupport::~XalanDefaultParsedSourceDOMSupport()
+{
+}
+
+
+
+void
+XalanDefaultParsedSourceDOMSupport::reset()
+{
+}
+
+
+
+const XalanDOMString*
+XalanDefaultParsedSourceDOMSupport::getNamespaceForPrefix(
+			const XalanDOMString&	prefix, 
+			const XalanElement&		namespaceContext) const
+{
+	return m_domSupport.getNamespaceForPrefix(
+					prefix, 
+					namespaceContext);
+}
+
+
+
+const XalanDOMString&
+XalanDefaultParsedSourceDOMSupport::getUnparsedEntityURI(
+			const XalanDOMString&	theName,
+			const XalanDocument&	theDocument) const
+{
+	const XalanDOMString&	theURI =
+			m_domSupport.getUnparsedEntityURI(
+					theName,
+					theDocument);
+
+	if (length(theURI) != 0)
+	{
+		return theURI;
+	}
+	else
+	{
+		return XalanSourceTreeDOMSupport::getUnparsedEntityURI(
+					theName,
+					theDocument);
+	}
+}
+
+
+
+bool
+XalanDefaultParsedSourceDOMSupport::isNodeAfter(
+			const XalanNode&	node1,
+			const XalanNode&	node2) const
+{
+	return m_domSupport.isNodeAfter(
+					node1, 
+					node2);
+}
+
+
+
+XalanDefaultParsedSourceHelper::XalanDefaultParsedSourceHelper(const XalanSourceTreeDOMSupport&	theSourceDOMSupport) :
+	m_domSupport(theSourceDOMSupport),
+	m_parserLiaison()
+{
+	m_domSupport.setParserLiaison(&m_parserLiaison);
+}
+
+
+
+DOMSupport&
+XalanDefaultParsedSourceHelper::getDOMSupport()
+{
+	return m_domSupport;
+}
+
+
+
+XMLParserLiaison&
+XalanDefaultParsedSourceHelper::getParserLiaison()
+{
+	return m_parserLiaison;
+}
+
+
+
+XalanDefaultParsedSource::XalanDefaultParsedSource(const XSLTInputSource&	theInputSource):
+	XalanParsedSource(),
+	m_domSupport(),
+	m_parserLiaison(m_domSupport),
+	m_parsedSource(m_parserLiaison.mapDocument(m_parserLiaison.parseXMLStream(theInputSource)))
+{
+	assert(m_parsedSource != 0);
+
+	m_domSupport.setParserLiaison(&m_parserLiaison);
+
+	const XalanDOMChar* const	theSystemID = theInputSource.getSystemId();
+
+	if (theSystemID != 0)
+	{
+		try
+		{
+			m_uri = URISupport::getURLStringFromString(theSystemID);
+		}
+		catch(const XMLException&)
+		{
+			// Assume that any exception here relates to get the url from
+			// the system ID.  We'll assume that it's just a fake base identifier
+			// since the parser would have thrown an error if the system ID
+			// wasn't resolved.
+			m_uri = theSystemID;
+		}
+	}
+}
+
+
+
+XalanDefaultParsedSource::~XalanDefaultParsedSource()
+{
+}
+
+
+
+XalanDocument*	
+XalanDefaultParsedSource::getDocument() const
+{
+	return m_parsedSource;
+}
+
+
+
+XalanParsedSourceHelper*
+XalanDefaultParsedSource::createHelper() const
+{
+	return new XalanDefaultParsedSourceHelper(m_domSupport);
+}
+
+
+
+const XalanDOMString&
+XalanDefaultParsedSource::getURI() const
+{
+	return m_uri;
+}
diff --git a/src/XalanTransformer/XalanDefaultParsedSource.hpp b/src/XalanTransformer/XalanDefaultParsedSource.hpp
new file mode 100644
index 0000000..a4c1408
--- /dev/null
+++ b/src/XalanTransformer/XalanDefaultParsedSource.hpp
@@ -0,0 +1,179 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#if !defined(XALANDEFAULTPARSEDSOURCE_HEADER_GUARD)
+#define XALANDEFAULTPARSEDSOURCE_HEADER_GUARD
+
+
+
+// Base include file.  Must be first.
+#include <XalanTransformer/XalanTransformerDefinitions.hpp>
+
+
+
+#include <XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+
+
+
+#include <XSLT/XSLTInputSource.hpp>
+
+
+
+#include <XalanTransformer/XalanParsedSource.hpp>
+
+
+
+class XalanSourceTreeDocument;
+
+
+
+class XalanDefaultParsedSourceDOMSupport : public XalanSourceTreeDOMSupport
+{
+public:
+
+	XalanDefaultParsedSourceDOMSupport(const XalanSourceTreeDOMSupport&		theDOMSupport);
+
+	virtual
+	~XalanDefaultParsedSourceDOMSupport();
+
+	virtual void
+	reset();
+
+	// These interfaces are inherited from DOMSupport...
+
+	virtual const XalanDOMString*
+	getNamespaceForPrefix(
+			const XalanDOMString&	prefix, 
+			const XalanElement&		namespaceContext) const;
+
+	virtual const XalanDOMString&
+	getUnparsedEntityURI(
+			const XalanDOMString&	theName,
+			const XalanDocument&	theDocument) const;
+
+	virtual bool
+	isNodeAfter(
+			const XalanNode&	node1,
+			const XalanNode&	node2) const;
+
+private:
+
+	const XalanSourceTreeDOMSupport&	m_domSupport;
+};
+
+
+
+class XALAN_TRANSFORMER_EXPORT XalanDefaultParsedSourceHelper : public XalanParsedSourceHelper
+{
+public:
+
+	XalanDefaultParsedSourceHelper(const XalanSourceTreeDOMSupport&	theSourceDOMSupport);
+
+	virtual DOMSupport&
+	getDOMSupport();
+
+	virtual XMLParserLiaison&
+	getParserLiaison();
+
+private:
+
+	XalanDefaultParsedSourceDOMSupport	m_domSupport;
+
+	XalanSourceTreeParserLiaison		m_parserLiaison;
+};
+
+
+
+/**
+ * This is designed to allow a XalanTranfomer object to reuse a parsed
+ * document. 
+ */
+class XALAN_TRANSFORMER_EXPORT XalanDefaultParsedSource : public XalanParsedSource
+{
+public:
+
+	XalanDefaultParsedSource(const XSLTInputSource&		theInputSource);
+
+	virtual
+	~XalanDefaultParsedSource();
+
+	virtual XalanDocument*
+	getDocument() const;
+
+	virtual XalanParsedSourceHelper*
+	createHelper() const;
+
+	virtual const XalanDOMString&
+	getURI() const;
+
+private:
+
+	XalanSourceTreeDOMSupport		m_domSupport;
+
+	XalanSourceTreeParserLiaison	m_parserLiaison;
+
+	XalanSourceTreeDocument* const	m_parsedSource;
+
+	XalanDOMString					m_uri;
+};
+
+
+
+#endif	// XALANDEFAULTPARSEDSOURCE_HEADER_GUARD
+
+
+
diff --git a/src/XalanTransformer/XalanDocumentBuilder.hpp b/src/XalanTransformer/XalanDocumentBuilder.hpp
new file mode 100644
index 0000000..40be256
--- /dev/null
+++ b/src/XalanTransformer/XalanDocumentBuilder.hpp
@@ -0,0 +1,118 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#if !defined(XALANDOCUMENTBUILDER_HEADER_GUARD)
+#define XALANDOCUMENTBUILDER_HEADER_GUARD
+
+
+
+// Base include file.  Must be first.
+#include <XalanTransformer/XalanTransformerDefinitions.hpp>
+
+
+
+// Base class include file.
+#include <XalanTransformer/XalanParsedSource.hpp>
+
+
+
+class ContentHandler;
+class DOMSupport;
+class DTDHandler;
+class LexicalHandler;
+class XalanDocument;
+
+
+
+/**
+ * This is abstract base class designed to allow a XalanTranfomer 
+ * object to use a document that is build dynamically by a user.
+ */
+class XALAN_TRANSFORMER_EXPORT XalanDocumentBuilder : public XalanParsedSource
+{
+public:
+
+	virtual
+	~XalanDocumentBuilder()
+	{
+	}
+
+	// These are inherited from XalanParsedSource...
+	virtual XalanDocument*
+	getDocument() const = 0;	
+
+	virtual XalanParsedSourceHelper*
+	createHelper() const = 0;
+
+	virtual const XalanDOMString&
+	getURI() const = 0;
+
+	// These are new to XalanDocumentBuilder...
+	virtual ContentHandler*
+	getContentHandler() = 0;
+
+	virtual DTDHandler*
+	getDTDHandler() = 0;
+
+	virtual LexicalHandler*
+	getLexicalHandler() = 0;
+
+private:
+};
+
+
+
+#endif	// XALANDOCUMENTBUILDER_HEADER_GUARD
diff --git a/src/XalanTransformer/XalanParsedSource.hpp b/src/XalanTransformer/XalanParsedSource.hpp
new file mode 100644
index 0000000..f18ed20
--- /dev/null
+++ b/src/XalanTransformer/XalanParsedSource.hpp
@@ -0,0 +1,154 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#if !defined(XALANPARSEDSOURCE_HEADER_GUARD)
+#define XALANPARSEDSOURCE_HEADER_GUARD
+
+
+
+// Base include file.  Must be first.
+#include <XalanTransformer/XalanTransformerDefinitions.hpp>
+
+
+
+// We're bringing in XalanDocument so that its derivation from XalanNode
+// is known...
+#include <XalanDOM/XalanDocument.hpp>
+
+
+
+class DOMSupport;
+class XMLParserLiaison;
+
+
+
+class XALAN_TRANSFORMER_EXPORT XalanParsedSourceHelper
+{
+public:
+
+	virtual
+	~XalanParsedSourceHelper()
+	{
+	}
+
+	/**
+	 * Get the DOMSupport instance.
+	 *
+	 * @return A reference to a DOMSupport instance.
+	 */
+	virtual DOMSupport&
+	getDOMSupport() = 0;
+
+	/**
+	 * Get the XMLParserLiaison instance.
+	 *
+	 * @return A rerefernce to an XMLParserLiaison instance.
+	 */
+	virtual XMLParserLiaison&
+	getParserLiaison() = 0;
+};
+
+
+
+/**
+ * This is abstract base class designed to allow a XalanTranfomer 
+ * object to reuse a parsed document. 
+ */
+class XALAN_TRANSFORMER_EXPORT XalanParsedSource
+{
+public:
+
+	XalanParsedSource();
+
+	virtual
+	~XalanParsedSource();
+
+	/**
+	 * Get a pointer to the XalanDocument instance for the source
+	 * document
+	 *
+	 * @return A pointer to a XalanDocument instance.
+	 */
+	virtual XalanDocument*
+	getDocument() const = 0;
+
+	/**
+	 * Create the appropriate XalanParsedSourceHelper instance to
+	 * use for transforming with the instance.
+	 *
+	 * The caller is responsible for deleting the object when finished.
+	 *
+	 * @return A pointer to a XalanParsedSourceHelper instance.
+	 */
+	virtual XalanParsedSourceHelper*
+	createHelper() const = 0;
+
+	/**
+	 * Get the URI for the parsed source, if any.
+	 * use for transforming with the instance.
+	 *
+	 * @return A const reference to a string containing the URI
+	 */
+	virtual const XalanDOMString&
+	getURI() const = 0;
+};
+
+
+
+#endif	// XALANPARSEDSOURCE_HEADER_GUARD
+
+
+
diff --git a/src/XalanTransformer/XalanTransformer.cpp b/src/XalanTransformer/XalanTransformer.cpp
new file mode 100644
index 0000000..bf56996
--- /dev/null
+++ b/src/XalanTransformer/XalanTransformer.cpp
@@ -0,0 +1,1142 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#include "XalanTransformer.hpp"
+
+
+
+#include <algorithm>
+
+
+
+#include <sax/SAXException.hpp>
+
+
+
+#include <XalanDOM/XalanDOMException.hpp>
+
+
+
+#include <PlatformSupport/DOMStringHelper.hpp>
+#include <PlatformSupport/DOMStringPrintWriter.hpp>
+#include <PlatformSupport/XalanOutputStreamPrintWriter.hpp>
+
+
+
+#include <XPath/XObjectFactoryDefault.hpp>
+#include <XPath/XPathFactoryBlock.hpp>
+#include <XPath/XPathFactoryDefault.hpp>
+
+
+
+#include <XSLT/StylesheetConstructionContextDefault.hpp>
+#include <XSLT/StylesheetExecutionContextDefault.hpp>
+#include <XSLT/StylesheetRoot.hpp>
+#include <XSLT/XSLTEngineImpl.hpp>
+#include <XSLT/XSLTInit.hpp>
+#include <XSLT/XSLTProcessorEnvSupportDefault.hpp>
+
+
+
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+#include <XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
+
+
+
+#include <XalanExtensions/XalanExtensions.hpp>
+
+
+
+//#define XALAN_USE_ICU
+#if defined(XALAN_USE_ICU)
+#include <ICUBridge/ICUBridge.hpp>
+#include <ICUBridge/FunctionICUFormatNumber.hpp>
+#include <ICUBridge/ICUBridgeCollationCompareFunctor.hpp>
+#endif
+
+
+
+#include "XalanCompiledStylesheetDefault.hpp"
+#include "XalanDefaultDocumentBuilder.hpp"
+#include "XalanDefaultParsedSource.hpp"
+#include "XalanTransformerOutputStream.hpp"
+#include "XercesDOMParsedSource.hpp"
+
+
+
+const XSLTInit*		XalanTransformer::s_xsltInit = 0;
+
+#if defined(XALAN_USE_ICU)
+static const ICUBridgeCollationCompareFunctor*	theICUFunctor = 0;
+#endif
+
+
+
+XalanTransformer::XalanTransformer():
+	m_compiledStylesheets(),
+	m_parsedSources(),
+	m_paramPairs(),
+	m_functionPairs(),
+	m_errorMessage(1, '\0'),
+	m_stylesheetExecutionContext(new StylesheetExecutionContextDefault)
+{
+#if defined(XALAN_USE_ICU)
+	m_stylesheetExecutionContext->installCollationCompareFunctor(theICUFunctor);
+#endif
+}
+
+
+
+XalanTransformer::~XalanTransformer()
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	// Clean up all entries in the compliledStylesheets vector.
+	for_each(m_compiledStylesheets.begin(),
+			 m_compiledStylesheets.end(),
+			 DeleteFunctor<XalanCompiledStylesheet>());
+
+	// Clean up all entries in the compliledStylesheets vector.
+	for_each(m_parsedSources.begin(),
+			 m_parsedSources.end(),
+			 DeleteFunctor<XalanParsedSource>());
+
+	for (FunctionParamPairVectorType::size_type i = 0; i < m_functionPairs.size(); ++i)
+	{			
+		delete m_functionPairs[i].second;
+	}
+
+	m_functionPairs.clear();
+
+	delete m_stylesheetExecutionContext;
+}
+
+
+
+void
+XalanTransformer::initialize()
+{
+	// Initialize Xalan. 
+	s_xsltInit = new XSLTInit;
+
+	const XalanDOMString	theXalanNamespace(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("http://xml.apache.org/xalan")));
+
+	XalanTransformer::installExternalFunctionGlobal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("difference")),
+			FunctionDifference());
+
+	XalanTransformer::installExternalFunctionGlobal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("distinct")),
+			FunctionDistinct());
+
+	XalanTransformer::installExternalFunctionGlobal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("evaluate")),
+			FunctionEvaluate());
+
+	XalanTransformer::installExternalFunctionGlobal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("hasSameNodes")),
+			FunctionHasSameNodes());
+
+	XalanTransformer::installExternalFunctionGlobal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("intersection")),
+			FunctionIntersection());
+
+	XalanTransformer::installExternalFunctionGlobal(
+			theXalanNamespace,
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("nodeset")),
+			FunctionNodeSet());
+
+#if defined(XALAN_USE_ICU)
+	theICUFunctor = new ICUBridgeCollationCompareFunctor;
+
+	// Install the ICU version of format-number...
+	XPath::installFunction(
+			StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("format-number")),
+			FunctionICUFormatNumber());
+#endif
+}
+
+
+
+void
+XalanTransformer::terminate()
+{
+	// Terminate Xalan and release memory.
+#if defined(XALAN_CANNOT_DELETE_CONST)
+	(XSLTInit*) s_xsltInit;
+#else
+	delete s_xsltInit;
+#endif
+
+	s_xsltInit = 0;
+
+#if defined(XALAN_USE_ICU)
+#if defined(XALAN_CANNOT_DELETE_CONST)
+	delete (ICUBridgeCollationCompareFunctor*)theICUFunctor;
+#else
+	delete theICUFunctor;
+#endif
+
+	theICUFunctor = 0;
+#endif
+}
+
+
+
+int
+XalanTransformer::transform(
+	const XalanParsedSource&	theParsedXML, 
+	const XSLTInputSource&		theStylesheetSource,
+	const XSLTResultTarget& 	theResultTarget)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	int 	theResult = 0;
+
+	// Clear the error message.
+	m_errorMessage.resize(1, '\0');
+
+	// Store error messages from problem listener.
+	XalanDOMString	theErrorMessage;
+
+	try
+	{
+		XalanDocument* const	theSourceDocument = theParsedXML.getDocument();
+		assert(theSourceDocument != 0);
+
+		// Create the helper object that is necessary for running the processor...
+		XalanAutoPtr<XalanParsedSourceHelper>	theHelper(theParsedXML.createHelper());
+		assert(theHelper.get() != 0);
+
+		DOMSupport& 					theDOMSupport = theHelper->getDOMSupport();
+
+		XMLParserLiaison&				theParserLiaison = theHelper->getParserLiaison();
+
+		// Create some more support objects...
+		XSLTProcessorEnvSupportDefault	theXSLTProcessorEnvSupport;
+
+		XObjectFactoryDefault			theXObjectFactory;
+
+		XPathFactoryDefault 			theXPathFactory;
+
+		// Create a processor...
+		XSLTEngineImpl	theProcessor(
+				theParserLiaison,
+				theXSLTProcessorEnvSupport,
+				theDOMSupport,
+				theXObjectFactory,
+				theXPathFactory);
+
+		theXSLTProcessorEnvSupport.setProcessor(&theProcessor);
+
+		const XalanDOMString&	theSourceURI = theParsedXML.getURI();
+
+		if (length(theSourceURI) > 0)
+		{
+			theXSLTProcessorEnvSupport.setSourceDocument(theSourceURI, theSourceDocument);
+		}
+
+		// Create a problem listener and send output to a XalanDOMString.
+		DOMStringPrintWriter	thePrintWriter(theErrorMessage);
+
+		ProblemListenerDefault	theProblemListener(&thePrintWriter);
+
+		theProcessor.setProblemListener(&theProblemListener);
+
+		theParserLiaison.setExecutionContext(*m_stylesheetExecutionContext);
+
+		// Create a stylesheet construction context, 
+		// using the stylesheet's factory support objects.
+		StylesheetConstructionContextDefault	theStylesheetConstructionContext(
+					theProcessor,
+					theXSLTProcessorEnvSupport,
+					theXPathFactory);
+
+		// Hack used to cast away const.
+		XSLTResultTarget	tempResultTarget(theResultTarget);
+
+		const EnsureReset	theReset(*this);
+
+		// Set up the stylesheet execution context.
+		m_stylesheetExecutionContext->setXPathEnvSupport(&theXSLTProcessorEnvSupport);
+
+		m_stylesheetExecutionContext->setDOMSupport(&theDOMSupport);
+
+		m_stylesheetExecutionContext->setXObjectFactory(&theXObjectFactory);
+
+		m_stylesheetExecutionContext->setXSLTProcessor(&theProcessor);
+
+		// Set the parameters if any.
+		for (ParamPairVectorType::size_type i = 0; i < m_paramPairs.size(); ++i)
+		{
+			theProcessor.setStylesheetParam(
+					m_paramPairs[i].first,
+					m_paramPairs[i].second);
+		}
+
+		// Set the functions if any.
+		for (FunctionParamPairVectorType::size_type f = 0; f < m_functionPairs.size(); ++f)
+		{
+			theXSLTProcessorEnvSupport.installExternalFunctionLocal(
+					m_functionPairs[f].first.getNamespace(),
+					m_functionPairs[f].first.getLocalPart(),
+					*(m_functionPairs[f].second));
+		}
+
+		// Create an input source for the source document...
+		XSLTInputSource		theDocumentInputSource(theSourceDocument);
+
+		// Set the system ID, so relative URIs are resolved properly...
+		theDocumentInputSource.setSystemId(c_wstr(theSourceURI));
+
+		// Do the transformation...
+		theProcessor.process(
+					theDocumentInputSource,
+					theStylesheetSource,
+					tempResultTarget,
+					theStylesheetConstructionContext,
+					*m_stylesheetExecutionContext);
+	}
+	catch (XSLException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -1; 	
+	}
+	catch (SAXException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -2;
+	}
+	catch (XMLException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -3;
+	}
+	catch(const XalanDOMException&	e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			XalanDOMString theMessage("XalanDOMException caught.  The code is ");
+			
+			append(theMessage,	LongToDOMString(long(e.getExceptionCode())));
+			append(theMessage,	XalanDOMString("."));						 
+
+			TranscodeToLocalCodePage(theMessage, m_errorMessage, true);
+		}
+
+		theResult = -4;
+	}
+
+	return theResult;
+}
+
+
+
+int
+XalanTransformer::transform(
+			const XalanParsedSource&		theParsedXML, 
+			const XalanCompiledStylesheet*	theCompiledStylesheet,
+			const XSLTResultTarget& 		theResultTarget)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::for_each;
+#endif
+
+	int 	theResult = 0;
+
+	// Clear the error message.
+	m_errorMessage.resize(1, '\0');
+
+	// Store error messages from problem listener.
+	XalanDOMString	theErrorMessage;
+
+	try
+	{
+		XalanDocument* const	theSourceDocument = theParsedXML.getDocument();
+		assert(theSourceDocument != 0);
+
+		// Create the helper object that is necessary for running the processor...
+		XalanAutoPtr<XalanParsedSourceHelper>	theHelper(theParsedXML.createHelper());
+		assert(theHelper.get() != 0);
+
+		DOMSupport& 					theDOMSupport = theHelper->getDOMSupport();
+
+		XMLParserLiaison&				theParserLiaison = theHelper->getParserLiaison();
+
+		// Create some more support objects...
+		XSLTProcessorEnvSupportDefault	theXSLTProcessorEnvSupport;
+
+		XObjectFactoryDefault			theXObjectFactory;
+
+		XPathFactoryDefault 			theXPathFactory;
+
+		// Create a processor...
+		XSLTEngineImpl	theProcessor(
+				theParserLiaison,
+				theXSLTProcessorEnvSupport,
+				theDOMSupport,
+				theXObjectFactory,
+				theXPathFactory);
+
+		theXSLTProcessorEnvSupport.setProcessor(&theProcessor);
+
+		const XalanDOMString&	theSourceURI = theParsedXML.getURI();
+
+		if (length(theSourceURI) > 0)
+		{
+			theXSLTProcessorEnvSupport.setSourceDocument(theSourceURI, theSourceDocument);
+		}
+
+		// Create a problem listener and send output to a XalanDOMString.
+		DOMStringPrintWriter	thePrintWriter(theErrorMessage);
+		
+		ProblemListenerDefault	theProblemListener(&thePrintWriter);
+
+		theProcessor.setProblemListener(&theProblemListener);
+
+		// Since the result target is not const in our
+		// internal intefaces, we'll pass in a local copy
+		// of the one provided...
+		XSLTResultTarget	tempResultTarget(theResultTarget);
+
+		const EnsureReset	theReset(*this);
+
+		// Set up the stylesheet execution context.
+		m_stylesheetExecutionContext->setXPathEnvSupport(&theXSLTProcessorEnvSupport);
+
+		m_stylesheetExecutionContext->setDOMSupport(&theDOMSupport);
+
+		m_stylesheetExecutionContext->setXObjectFactory(&theXObjectFactory);
+
+		m_stylesheetExecutionContext->setXSLTProcessor(&theProcessor);
+		
+		// Set the compiled stylesheet.
+		m_stylesheetExecutionContext->setStylesheetRoot(theCompiledStylesheet->getStylesheetRoot());
+
+		// Set the parameters if any.
+		for (ParamPairVectorType::size_type i = 0; i < m_paramPairs.size(); ++i)
+		{
+			theProcessor.setStylesheetParam(
+					m_paramPairs[i].first,
+					m_paramPairs[i].second);
+		}
+
+		// Set the functions if any.
+		for (FunctionParamPairVectorType::size_type f = 0; f < m_functionPairs.size(); ++f)
+		{
+			theXSLTProcessorEnvSupport.installExternalFunctionLocal(
+					m_functionPairs[f].first.getNamespace(),
+					m_functionPairs[f].first.getLocalPart(),
+					*(m_functionPairs[f].second));
+		}
+
+		// Create an input source for the source document...
+		XSLTInputSource		theDocumentInputSource(theSourceDocument);
+
+		// Set the system ID, so relative URIs are resolved properly...
+		theDocumentInputSource.setSystemId(c_wstr(theSourceURI));
+
+		// Do the transformation...
+		theProcessor.process(
+					theDocumentInputSource,
+					tempResultTarget,					
+					*m_stylesheetExecutionContext);
+	}
+	catch (XSLException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -1; 	
+	}
+	catch (SAXException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -2;
+	}
+	catch (XMLException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -3;
+	}
+	catch(const XalanDOMException&	e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			XalanDOMString theMessage("XalanDOMException caught.  The code is ");
+			
+			append(theMessage,	LongToDOMString(long(e.getExceptionCode())));
+			append(theMessage,	XalanDOMString("."));						 
+
+			TranscodeToLocalCodePage(theMessage, m_errorMessage, true);
+		}
+
+		theResult = -4;
+	}
+
+	return theResult;
+}
+
+
+
+int
+XalanTransformer::transform(
+			const XSLTInputSource&			theInputSource, 
+			const XalanCompiledStylesheet*	theCompiledStylesheet,
+			const XSLTResultTarget& 		theResultTarget)
+{
+	const XalanParsedSource*	theParsedSource = 0;
+ 
+	const int	theResult = parseSource(theInputSource, theParsedSource);
+ 
+	if (theResult != 0)
+	{
+		return theResult;
+	}
+	else
+	{
+		assert(theParsedSource != 0);
+ 
+		// Make sure the parsed source is destroyed when
+		// the transformation is finished...
+		EnsureDestroyParsedSource	theGuard(*this, theParsedSource);
+
+		// Do the transformation...
+		return transform(
+						*theParsedSource,
+						theCompiledStylesheet,
+						theResultTarget);
+	}
+}
+
+int
+XalanTransformer::transform(
+	const XSLTInputSource&		theInputSource, 
+	const XSLTInputSource&		theStylesheetSource,
+	const XSLTResultTarget& 	theResultTarget)
+{
+	// Parse the source document.
+	const XalanParsedSource*	theParsedSource = 0;
+
+	const int	theResult = parseSource(theInputSource, theParsedSource);
+
+	if (theResult != 0)
+	{
+		return theResult;
+	}
+	else
+	{
+		assert(theParsedSource != 0);
+
+		// Make sure the parsed source is destroyed when
+		// the transformation is finished...
+		EnsureDestroyParsedSource	theGuard(*this, theParsedSource);
+
+		// Do the transformation...
+		return transform(
+						*theParsedSource,
+						theStylesheetSource,
+						theResultTarget);
+	}
+}
+
+
+
+int
+XalanTransformer::transform(
+			const XSLTInputSource&		theInputSource, 		
+			const XSLTResultTarget& 	theResultTarget)
+{
+	// Do the transformation...
+	return transform(
+					theInputSource, 
+					XSLTInputSource(),
+					theResultTarget);
+}
+
+
+
+int
+XalanTransformer::transform(
+			const XSLTInputSource&	theInputSource, 
+			const XSLTInputSource&	theStylesheetSource,
+			void*					theOutputHandle, 
+			XalanOutputHandlerType	theOutputHandler,
+			XalanFlushHandlerType	theFlushHandler)
+{
+	// Set to output target to the callback 
+	XalanTransformerOutputStream	theOutputStream(theOutputHandle, theOutputHandler, theFlushHandler);
+
+	XalanOutputStreamPrintWriter	thePrintWriter(theOutputStream);
+
+	XSLTResultTarget				theResultTarget(&thePrintWriter);
+
+	// Do the transformation...
+	return transform(
+					theInputSource, 
+					theStylesheetSource,
+					theResultTarget);
+}
+
+
+
+int
+XalanTransformer::transform(
+			const XalanParsedSource&		theParsedSource, 
+			const XalanCompiledStylesheet*	theCompiledStylesheet,
+			void*							theOutputHandle, 
+			XalanOutputHandlerType			theOutputHandler,
+			XalanFlushHandlerType			theFlushHandler)
+{
+	// Set to output target to the callback 
+	XalanTransformerOutputStream	theOutputStream(theOutputHandle, theOutputHandler, theFlushHandler);
+
+	XalanOutputStreamPrintWriter	thePrintWriter(theOutputStream);
+
+	XSLTResultTarget				theResultTarget(&thePrintWriter);
+
+	// Do the transformation...
+	return transform(
+					theParsedSource,
+					theCompiledStylesheet,
+					theResultTarget);
+}
+
+
+
+int
+XalanTransformer::transform(
+			const XSLTInputSource&		theInputSource, 		
+			void*						theOutputHandle, 
+			XalanOutputHandlerType		theOutputHandler,
+			XalanFlushHandlerType		theFlushHandler)
+{
+	// Set to output target to the callback 
+	XalanTransformerOutputStream	theOutputStream(theOutputHandle, theOutputHandler, theFlushHandler);
+
+	XalanOutputStreamPrintWriter	thePrintWriter(theOutputStream);
+
+	XSLTResultTarget				theResultTarget(&thePrintWriter);
+
+	// Do the transformation...
+	return transform(
+					theInputSource, 
+					XSLTInputSource(),
+					theResultTarget);
+}
+
+
+
+int
+XalanTransformer::compileStylesheet(
+			const XSLTInputSource&				theStylesheetSource,
+			const XalanCompiledStylesheet*& 	theCompiledStylesheet)
+{
+	// Clear the error message.
+	m_errorMessage.resize(1, '\0');
+
+	// Store error messages from problem listener.
+	XalanDOMString	theErrorMessage;
+
+	int 			theResult = 0;
+
+	try
+	{
+		// Create some support objects that are necessary for running the processor...
+		XalanSourceTreeDOMSupport		theDOMSupport;
+
+		XalanSourceTreeParserLiaison	theParserLiaison(theDOMSupport);
+
+		// Hook the two together...
+		theDOMSupport.setParserLiaison(&theParserLiaison);
+
+		// Create some more support objects...
+		XSLTProcessorEnvSupportDefault	theXSLTProcessorEnvSupport;
+
+		XObjectFactoryDefault			theXObjectFactory;
+
+		XPathFactoryDefault 			theXPathFactory;
+
+		// Create a processor...
+		XSLTEngineImpl	theProcessor(
+				theParserLiaison,
+				theXSLTProcessorEnvSupport,
+				theDOMSupport,
+				theXObjectFactory,
+				theXPathFactory);
+
+		// Create a problem listener and send output to a XalanDOMString.
+		DOMStringPrintWriter	thePrintWriter(theErrorMessage);
+
+		ProblemListenerDefault	theProblemListener(&thePrintWriter);
+
+		theProcessor.setProblemListener(&theProblemListener);
+
+		// Create a new XalanCompiledStylesheet.
+		theCompiledStylesheet =
+			new XalanCompiledStylesheetDefault(
+						theStylesheetSource,
+						theXSLTProcessorEnvSupport,
+						theProcessor);
+
+		// Store it in a vector.
+		m_compiledStylesheets.push_back(theCompiledStylesheet);
+	}
+	catch (XSLException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -1;
+	}
+	catch (SAXException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -2;
+	}
+	catch (XMLException& e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+		}
+
+		theResult = -3;
+	}
+	catch(const XalanDOMException&	e)
+	{
+		if (length(theErrorMessage) != 0)
+		{
+			TranscodeToLocalCodePage(theErrorMessage, m_errorMessage, true);
+		}
+		else
+		{
+			XalanDOMString theMessage("XalanDOMException caught.  The code is ");
+
+			append(theMessage,	LongToDOMString(long(e.getExceptionCode())));
+
+			append(theMessage,	XalanDOMString("."));
+
+			TranscodeToLocalCodePage(theMessage, m_errorMessage, true);
+		}
+
+		theResult = -4;
+	}
+
+	return theResult;
+}
+
+
+
+int
+XalanTransformer::destroyStylesheet(const XalanCompiledStylesheet*	theStylesheet)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::find;
+#endif
+
+	const CompiledStylesheetPtrVectorType::iterator 	i =
+		find(
+			m_compiledStylesheets.begin(),
+			m_compiledStylesheets.end(),
+			theStylesheet);
+
+	if (i == m_compiledStylesheets.end())
+	{
+		const char* const	theStylesheetErrorMessage =
+				"An invalid compiled stylesheet was provided.";
+
+		const unsigned int	theLength =
+			length(theStylesheetErrorMessage);
+
+		m_errorMessage.resize(theLength + 1, '\0');
+
+		strncpy(&*m_errorMessage.begin(), theStylesheetErrorMessage, theLength);
+
+		return -1;
+	}
+	else
+	{
+		m_compiledStylesheets.erase(i);
+
+#if defined(XALAN_CANNOT_DELETE_CONST)
+		delete (XalanCompiledStylesheet*) theStylesheet;
+#else
+		delete theStylesheet;
+#endif
+
+		return 0;
+	}
+}
+
+
+
+int
+XalanTransformer::parseSource(
+			const XSLTInputSource&		theInputSource,
+			const XalanParsedSource*&	theParsedSource,
+			bool						useXercesDOM)
+{
+	// Clear the error message.
+	m_errorMessage.clear();
+	m_errorMessage.push_back(0);
+
+	int theResult = 0;
+
+	try
+	{
+		if(useXercesDOM == true)
+		{
+			theParsedSource = new XercesDOMParsedSource(theInputSource);
+		}
+		else
+		{
+			theParsedSource = new XalanDefaultParsedSource(theInputSource);
+		}
+
+		// Store it in a vector.
+		m_parsedSources.push_back(theParsedSource);
+	}
+	catch (XSLException& e)
+	{
+		TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+
+		theResult = -1;
+	}
+	catch (SAXException& e)
+	{
+		TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+
+		theResult = -2;
+	}
+	catch (XMLException& e)
+	{
+		TranscodeToLocalCodePage(e.getMessage(), m_errorMessage, true);
+
+		theResult = -3;
+	}
+	catch(const XalanDOMException&	e)
+	{
+		XalanDOMString theMessage("XalanDOMException caught.  The code is ");
+			
+		append(theMessage,	LongToDOMString(long(e.getExceptionCode())));
+
+		append(theMessage,	XalanDOMString("."));						 
+
+		TranscodeToLocalCodePage(theMessage, m_errorMessage, true);
+
+		theResult = -3;
+	}
+
+	return theResult;
+}
+
+
+
+int
+XalanTransformer::destroyParsedSource(const XalanParsedSource*	theParsedSource)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+	using std::find;
+#endif
+
+	const ParsedSourcePtrVectorType::iterator	i =
+		find(
+			m_parsedSources.begin(),
+			m_parsedSources.end(),
+			theParsedSource);
+
+	if (i == m_parsedSources.end())
+	{
+		const char* const	theParsedSourceErrorMessage =
+				"An invalid parsed source was provided.";
+
+		const unsigned int	theLength =
+			length(theParsedSourceErrorMessage);
+
+		m_errorMessage.resize(theLength + 1, '\0');
+
+		strncpy(&*m_errorMessage.begin(), theParsedSourceErrorMessage, theLength);
+
+		return -1;
+	}
+	else
+	{
+		m_parsedSources.erase(i);
+
+#if defined(XALAN_CANNOT_DELETE_CONST)
+		delete (XalanCompiledStylesheet*) theParsedSource;
+#else
+		delete theParsedSource;
+#endif
+
+		return 0;
+	}
+}
+
+
+
+void
+XalanTransformer::setStylesheetParam(
+			const XalanDOMString&	key,
+			const XalanDOMString&	expression)
+{
+	// Store the stylesheet parameter in a vector.
+	m_paramPairs.push_back(ParamPairType(key,  expression));
+}
+
+
+
+XalanDocumentBuilder*
+XalanTransformer::createDocumentBuilder()
+{
+	m_parsedSources.reserve(m_parsedSources.size() + 1);
+
+	XalanDocumentBuilder* const 	theNewBuilder = new XalanDefaultDocumentBuilder;
+
+	m_parsedSources.push_back(theNewBuilder);
+
+	return theNewBuilder;
+}
+
+
+
+void
+XalanTransformer::destroyDocumentBuilder(XalanDocumentBuilder*	theDocumentBuilder)
+{
+	destroyParsedSource(theDocumentBuilder);
+}
+
+
+
+void
+XalanTransformer::installExternalFunction(
+			const XalanDOMString&	theNamespace,
+			const XalanDOMString&	functionName,
+			const Function& 		function)
+{
+	m_functionPairs.push_back(FunctionPairType(XalanQNameByValue(theNamespace, functionName), function.clone()));
+}
+
+
+
+void
+XalanTransformer::installExternalFunctionGlobal(
+			const XalanDOMString&	theNamespace,
+			const XalanDOMString&	functionName,
+			const Function& 		function)
+{
+	XSLTProcessorEnvSupportDefault::installExternalFunctionGlobal(
+			theNamespace,
+			functionName,
+			function);
+}
+
+
+
+void
+XalanTransformer::uninstallExternalFunction(
+			const XalanDOMString&	theNamespace,
+			const XalanDOMString&	functionName)
+{
+	for (FunctionParamPairVectorType::size_type i = 0; i < m_functionPairs.size(); ++i)
+	{
+		if(XalanQNameByReference(theNamespace, functionName).equals(m_functionPairs[i].first))
+		{
+			delete m_functionPairs[i].second;
+
+			m_functionPairs.erase(m_functionPairs.begin() + i); 	
+		}
+	}	
+}
+
+
+
+void
+XalanTransformer::uninstallExternalFunctionGlobal(
+			const XalanDOMString&	theNamespace,
+			const XalanDOMString&	functionName)
+{
+	XSLTProcessorEnvSupportDefault::uninstallExternalFunctionGlobal(
+			theNamespace,
+			functionName);
+}
+
+
+
+
+const char*
+XalanTransformer::getLastError() const
+{
+	return &m_errorMessage[0]; 
+}
+
+
+
+void
+XalanTransformer::reset()
+{
+	try
+	{
+		// Reset objects.
+		m_stylesheetExecutionContext->setXPathEnvSupport(0);
+
+		m_stylesheetExecutionContext->setDOMSupport(0);
+		
+		m_stylesheetExecutionContext->setXObjectFactory(0);
+		
+		m_stylesheetExecutionContext->setXSLTProcessor(0);
+
+		m_stylesheetExecutionContext->reset();
+
+		// Clear the ParamPairVectorType.
+		m_paramPairs.clear();
+	}
+	catch(...)
+	{
+	}
+}
+
+
+
+
+XalanTransformer::EnsureReset::~EnsureReset()
+{
+	m_transformer.m_stylesheetExecutionContext->reset();
+
+	m_transformer.reset();
+}
diff --git a/src/XalanTransformer/XercesDOMParsedSource.cpp b/src/XalanTransformer/XercesDOMParsedSource.cpp
new file mode 100644
index 0000000..b00623c
--- /dev/null
+++ b/src/XalanTransformer/XercesDOMParsedSource.cpp
@@ -0,0 +1,146 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#include "XercesDOMParsedSource.hpp"
+
+
+
+#include <XalanDOM/XalanDocument.hpp>
+
+
+
+#include <PlatformSupport/URISupport.hpp>
+
+
+
+class XALAN_TRANSFORMER_EXPORT XercesDOMParsedSourceHelper : public XalanParsedSourceHelper
+{
+public:
+
+	virtual DOMSupport&
+	getDOMSupport()
+	{
+		return m_domSupport;
+	}
+
+	virtual XMLParserLiaison&
+	getParserLiaison()
+	{
+		return m_parserLiaison;
+	}
+
+private:
+
+	XercesDOMSupport		m_domSupport;
+
+	XercesParserLiaison		m_parserLiaison;
+};
+
+
+
+XercesDOMParsedSource::XercesDOMParsedSource(const XSLTInputSource&		theInputSource):
+	XalanParsedSource(),
+	m_parserLiaison(),
+	m_parsedSource(m_parserLiaison.parseXMLStream(theInputSource))
+{
+	const XalanDOMChar* const	theSystemID = theInputSource.getSystemId();
+
+	if (theSystemID != 0)
+	{
+		try
+		{
+			m_uri = URISupport::getURLStringFromString(theSystemID);
+		}
+		catch(const XMLException&)
+		{
+			// Assume that any exception here relates to get the url from
+			// the system ID.  We'll assume that it's just a fake base identifier
+			// since the parser would have thrown an error if the system ID
+			// wasn't resolved.
+			m_uri = theSystemID;
+		}
+	}
+}
+
+
+
+XercesDOMParsedSource::~XercesDOMParsedSource()
+{
+}
+
+
+
+XalanDocument*
+XercesDOMParsedSource::getDocument() const
+{
+	return m_parsedSource;
+}
+
+
+
+XalanParsedSourceHelper*
+XercesDOMParsedSource::createHelper() const
+{
+	return new XercesDOMParsedSourceHelper;
+}
+
+
+
+const XalanDOMString&
+XercesDOMParsedSource::getURI() const
+{
+	return m_uri;
+}
diff --git a/src/XalanTransformer/XercesDOMParsedSource.hpp b/src/XalanTransformer/XercesDOMParsedSource.hpp
new file mode 100644
index 0000000..cd65564
--- /dev/null
+++ b/src/XalanTransformer/XercesDOMParsedSource.hpp
@@ -0,0 +1,116 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2000 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, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+#if !defined(XERCESDOMPARSEDSOURCE_HEADER_GUARD)
+#define XERCESDOMPARSEDSOURCE_HEADER_GUARD
+
+
+
+// Base include file.  Must be first.
+#include <XalanTransformer/XalanTransformerDefinitions.hpp>
+
+
+
+#include <XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+
+
+
+#include <XSLT/XSLTInputSource.hpp>
+
+
+
+#include <XalanTransformer/XalanParsedSource.hpp>
+
+
+
+/**
+ * This is designed to allow a XalanTranfomer object to reuse a parsed
+ * document. 
+ */
+class XALAN_TRANSFORMER_EXPORT XercesDOMParsedSource : public XalanParsedSource
+{
+public:
+	
+	XercesDOMParsedSource(const XSLTInputSource&		theInputSource);
+
+	virtual
+	~XercesDOMParsedSource();
+
+	virtual XalanDocument*
+	getDocument() const;
+
+	virtual XalanParsedSourceHelper*
+	createHelper() const;
+
+	virtual const XalanDOMString&
+	getURI() const;
+
+private:
+
+	XercesParserLiaison		m_parserLiaison;
+
+	XalanDocument* const	m_parsedSource;
+
+	XalanDOMString			m_uri;
+};
+
+
+
+#endif	// XERCESDOMPARSEDSOURCE_HEADER_GUARD
+
+
+