diff --git a/KEYS b/KEYS
deleted file mode 100644
index 8b26bc0..0000000
--- a/KEYS
+++ /dev/null
@@ -1,250 +0,0 @@
-This file contains the PGP keys of xml-commons committers 
-and are used for signing .zip/.tar.gz distributions.
-
-To verify the .sig on a distribution:
-  Using PGP:  pgp xalan-j_version.num.zip.sig
-  Using gpg:  gpg -verify xalan-j_version.num.zip.sig xalan-j_version.num.zip
-
-To import these public keys into your keyring: 
-  Using PGP:  pgp < KEYS    or pgp -ka KEYS
-  Using gpg:  gpg --import < KEYS
-
-Committers: to put your key in here: 
-  Using PGP:  pgp -kxa <your name> and append it to this file.
-  Using gpg:  gpg --export -a <your_name> >>KEYS should do the trick
-
-
-Shane Curcuru  curcuru@apache.org
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGP Personal Privacy 6.5.3
-
-mQGiBDghjNIRBADXB4UY4YfZ2DmbSushlzPZCkY00iDPUB+GkW6FQhgnGCLZovgy
-FhCnCsKdN1xyHFq/Ns3PV3HPrMGxFKgVOfRuxREbF8CoXAa/u0qR1WoAm+rlyC9l
-OVsHdXxyOpZ8e4SPGne8LQYZwr2q+LsHiXOZktkaBo8ua8F4EJYkBMFhZQCg/4Iw
-jXmfpt661Essmf8d05cMdAcEAL0r+PrFxCmrU8Ok+r74+eqyclxVbiDbOf7Uef6N
-fEJmC5ihX7p8k8eEf2XepeAo6N0gdOxYVXVwcoRCmqPy7SSg1jnXqKOnA87ylv16
-lOiJ5WUkiVX96WOWEsbbYKuggmWeDL+6iFc9hp6oEP2sf/geC8AEAEHTPfneJzpo
-3z28A/9iX41r4K0iRx5eIJu2KUrjdpPxhn0JPe9dz2XzWZIciNeki+ThrcarEj9h
-lmfvcGLifXbQfXuFid3btMsBRI8dqAbbXmyfvCYYSHDOkXEmoMW66AWfeF4hgfHF
-SA5lmcpH4mtHU69uC0+cvYlRROP+HaeOepYbriA+9A9Qq4MAW7QiU2hhbmUgQ3Vy
-Y3VydSA8Y3VyY3VydUBhcGFjaGUub3JnPokATgQQEQIADgUCOy5rCAQLAwIBAhkB
-AAoJEDLsF1kwoh1V/nkAoMGf6NVxNmMxpMJ9mQW6pzwWDAF2AKCe05LW35bV/px3
-c1a5mBZf0U8exokARgQQEQIABgUCOy5q+gAKCRAZucGLZELD3ErhAJ95upvPEsLB
-W+GF/Q27gKwJAJWh5ACg9vPu27CELQPkx5x6fhquWlPZWR6JAEYEEBECAAYFAjsu
-bP0ACgkQ1so098tadVyJkACbBhPpRY1usOMqaEoVi8iQvqJTaxMAoJDFZU6+RUTX
-dpyd/BhwgKB32d7TiQBGBBARAgAGBQI7LsU+AAoJEL66K4f1/EtCBKMAoMTRzp2x
-mzR4TjVuLDS1E4jkOAkWAKC4ONEEtQjIuTuDCVhZPQTtvk+0abQnU2hhbmUgQ3Vy
-Y3VydSA8c2hhbmVfY3VyY3VydUBsb3R1cy5jb20+iQBOBBARAgAOBQI7LmsIBAsD
-AgECGQAACgkQMuwXWTCiHVUPBACdHm9xrBcNMoEEgR0l+m/8zpgNqWEAn1CbpI+L
-0JNmBIyppFM1pCcXp5K6iQBOBBARAgAOBQI4IYzSBAsDAgECGQEACgkQMuwXWTCi
-HVXQIQCg1Q1MKkWygIsDGAOhiPaM09pTdlUAniTeCkoOI0+2IgD/NtqnGDaSvNDn
-iQBGBBARAgAGBQI4qZk/AAoJEFHrPvFXdlryVbIAoO/egti1esgRI6GErIhICg3I
-octfAKDlpw6NWq/WTxk1Aa0pN/1b6fmD5IkARgQQEQIABgUCOxPAFAAKCRAZucGL
-ZELD3ElDAJ9dcJ0/3luizN4DiPKeIiMsN4PiAQCfdCDLUWcAs93yj0MfeACJ7F6+
-UcqJAEYEEBECAAYFAjsubTcACgkQ1so098tadVzvZQCfRN3SVna4GEb5IwSm/zRn
-0exFr6MAoLSGnZ1wKQT12W/tNR/y2BueOEY2iQBGBBARAgAGBQI6rusTAAoJEBm5
-wYtkQsPcIsIAn0lLDcnoFp5jfpJqV5FnIgIjJ8HkAJ49bCzhw7U5n9G8XEYDQVE2
-eLyMgIkARgQQEQIABgUCOy7FfwAKCRC+uiuH9fxLQhjTAKDDUMomB1wKbVEhcdoy
-zpjt13tTMgCgiser+HuJ5boYdvtoEfsn0bHQMFS0J1NoYW5lIEN1cmN1cnUgPHNo
-YW5lX2N1cmN1cnVAeWFob28uY29tPokASwQQEQIACwUCPD8X0QQLAwIBAAoJEDLs
-F1kwoh1VSusAnAuo93Gu3IphIzuBQSsFu9YRl5HLAKCH3V71nV+Td9udzwT6RIsn
-WWIPLIkARgQQEQIABgUCPD8Y0gAKCRAZucGLZELD3KwAAJ45UpvBFaNKOa64ujpg
-2dKYVAGIZACg8fNYqXgVuqaB7Xrzyok45ciCfiC5Ag0EOCGM0hAIAPZCV7cIfwgX
-cqK61qlC8wXo+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyD
-vWXpF9Sh01D49Vlf3HZSTz09jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5
-u/2RXscBqtNbno2gpXI61Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98
-iLMcfFstjvbzySPAQ/ClWxiNjrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlA
-GBGNfISnCnLWhsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqr
-ol7DVekyCzsAAgIIAM7v0Dm7spCxsDywqEkBCn3jUhjzq+8Ctl0qfHPA0tQdo61S
-+KB/j2G+sFYXDXd/l7ePj/wX5ZXpkVPNBg+rf0R6ExGYSIaf9/HqwSyXyz6hQ2HY
-yn99BDDIxViIXnIPUJ2Ul1Nn+xCduC/v756LYwM+oWXyb429W9bV9z0NVtnvpUxY
-Us9UWEiseJrBHHs92dMFWpTalpXrd7e/HAmUU+HzzpMjOAuxW7SunLLxVF5CH7t6
-oMeGlZPB1CMF5B2Q9lu14hUj4TLYHD3lAG9wCHmCbP4qj+B+DeKCfAerV8ZqQ5tz
-/OT4QuICThVE4Z2ShpC7VsHVGoKPF0igeVVAP1CJAEYEGBECAAYFAjghjNIACgkQ
-MuwXWTCiHVV0vgCg4cicMdOPPnOwEyDUhn+iMYl0MmEAoOOqSf33NB1VlLx344qA
-0Wi0FCL/
-=QTmn
------END PGP PUBLIC KEY BLOCK-----
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGP 6.5.8
-
-mQGiBDnjTUMRBADGzi7y1XiTty/HZ1QhRQxMkyf7JD/E5dGXCVLRoSQV9/hdKPtF
-OGzjZQt6DssPnisgrW6hSLEs8GrZKHCZE6z8h5Yekg+WJTs3K0LNJ3X/tStVe/fU
-DarLM7u0qwtcsaISWFMRoy1xbrxBkpFBeNkD+FRUk8sXTVXoOGvm3Fw/8wCg/+pg
-Y7XD6ZIA0m/CxrxR+xTBri8D/Rk4/5rzsT42AImJwAweJidzlmmvWcDGjZolDxrH
-TlVpIXFjGFJBj9tg1Xz+3/w9zKyk900gcwlHU7uz28xPylishgd8DyAb/enSXsEy
-NC1EagypAbMpEhTAdBaUNPb6t8yOX3dHUki5yuZ+PryOyKWTaiHyhHLwJ5vZi9xm
-o+/ZBACqjUqAL27JOC1qw1zrWCQQzEJIeIIdGFEGoMBiFC425vh/1dJA1LUICHSZ
-bZvg7VlvAMErnZb/IcVx4LX4R8Uergh0E/4Xi6krTYZvDuI4RmP5Jn/7IaK2c27I
-lCx7I0hj4CQIWVIEVCDAGjJk9E38VahJYHySHzjMdhXSjTbqW7QnTG90dXN4c2wg
-VGVhbSA8TG90dXN4c2xfVGVhbUBsb3R1cy5jb20+iQBOBBARAgAOBQI5401DBAsD
-AgECGQEACgkQGbnBi2RCw9yVZwCgjxC/ie5/GhPLZyQhMSQvJuDJP8kAn17UNfN/
-tRtFfcJDrNcC7P21ut+VuQINBDnjTUMQCAD2Qle3CH8IF3KiutapQvMF6PlTETlP
-tvFuuUs4INoBp1ajFOmPQFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2
-Uk89PY3bzpnhV5JZzf24rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVy
-OtQa8L9GAFgr5fSI/VhOSdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPw
-pVsYjY67VYy4XTjTNP18F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnI
-Byl6ypUM2Zafq9AKUJsCRtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICB/9g
-5aR6mWbvaZAwN/IFwIC9cd54cDAW6pvowo6/gkgLfwULI7iGR8jrHHs9rSu968fV
-3L7ys3pFLR93/22mJR1InTp+qQdUntcnh5fwbAd9Z8NoM2QEuY4c7cVjobazOgPf
-C6XZkS1C3tHcvUedzR8kmf1hiRtILWW2pF7A9JbJB3RHcuBut3cS3eME2+s+dCSl
-SugZKyVFuiDoKO59TD7OIn9dwipVhX7UgG0uLDlZzCd9dHLsrlr75LDxIZyiifDB
-1oa+xM5smFYEqux+3lf/UNGhpxcaGDJM09UUpOVv8yVz+FZQilZ7Bu0XKvnj1p91
-YFVAiQvQHijya+kMy6MCiQBGBBgRAgAGBQI5401DAAoJEBm5wYtkQsPcPlUAoNkm
-fMB0HL71h5QYfB/NRJupWsWUAKCi2UETq9cwA7QtuMyQ1cjvkA1mnQ==
-=lNZ2
------END PGP PUBLIC KEY BLOCK-----
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGPfreeware 6.5.8 for non-commercial use <http://www.pgp.com>
-
-mQGiBDtiOuERBADWqtYvR/wqP9H99bmQ1GNpS8NL7YXmOUEdH9X/7KT3nrFBjacO
-XTJ2/rjnY1ItW6EwnenuFf0okgnf3ZgUai6Ajr4buxCMhpAzm2htOAaSnc3l/FZF
-mcdvpvKkpc4bf2qYC0j4RjKPvXExPdK3DbQnl7Pi5q0qvdaS0JUkYR5X/QCg/7fI
-uJKHVBqIveeAmZKpU8xYd60D/RvTll3dwVCWhs21a/AFFYKpA86A5jyq/yXwIeVr
-IKtKfxnvcjpmZAYIMddsBtVFjW/CyRm6KQZXRdWpXuLymP7+ppT2VlRLM3TqUxum
-4pASJdptk7fj3qzivyfaQ6/fAG3PyJcOe5hS7znLV2a0LX7PQBiPpUwqcjKQ2a2h
-LogQBACalpgAIdN1dfUbgOSm9gdsRb8wYIOKTFGpCWF17rMTMuSYTLAsm6mPdxrl
-FHn2wlROwiDFnzhEDFbPOHdC5XMD+tYdrWJaffJZKW7ZItOEz6OIh7gnmKpBcDsy
-WoJ9J7QRUiETHX3AbKOynSdk5kcgDWymCjSP6rE0M1PAiMVg1LQhU2NvdHQgQm9h
-ZyA8c2NvdHRfYm9hZ0Bsb3R1cy5jb20+iQBOBBARAgAOBQI7YjrhBAsDAgECGQEA
-CgkQQkPbOcGiXuYuqQCgxnuxkA2wfXf/qrhK9FDdhtG67MQAninm2rZVcTHqorBV
-KqUHMeC4VHaEuQINBDtiOuEQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4
-INoBp1ajFOmPQFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3b
-zpnhV5JZzf24rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9G
-AFgr5fSI/VhOSdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67
-VYy4XTjTNP18F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM
-2Zafq9AKUJsCRtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICCADj1YHJzpg7
-J0z0zRmpzhmRfDZtzBZB+bjqXh1lkcJO9P6tqwEe9Jnhm+yMWKtfETeiNxyK7C5f
-qTATo9USqB2+VTfEr0Y+UivUcITB1UvChj02iPj7zhrW6A7ki5UHYzcK6y29Mw6K
-J39nKn7FPaxcqFEzksAGenT+yq0/sSCAydX0GyW6scEkkmdVsUskD5tb83KqNzKK
-wXm/iIkQHS5FyzQ7U/WGAKRMcQf14UkGrfPoeRbMfNmlp/B+Jwpfbn3bH47hgowA
-gdGcKQSAQhUgy6GDpsxWFTVyjiZNEBI2UxkoB7d8HzMRvme6tw51d59MSNK7X/Go
-GtA9P+IqA3UTiQBGBBgRAgAGBQI7YjrhAAoJEEJD2znBol7mw+MAn3pbgcaYV+KZ
-TLJszssOCpQLvJwpAKCOBhKSHNUJR8OXI4VhY2Arvmm33g==
-=genn
------END PGP PUBLIC KEY BLOCK-----
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGPfreeware 6.5.1 for non-commercial use <http://www.pgp.com>
-
-mQGiBDuOlFsRBADT2HtC2QiEuPHzAk6Oa95nupm5zPFdtUasGWnbNhj37JNjhNFA
-/iCAvloRHMG8pR9ltlLZA4ae4X2BhPPqk+Us7zjYY/DkF/+G+cTMwPdoakc5JxL5
-ZRoVntAYRH5bcmv9MdSbY4YDf2iqk8gCaFPjP9EQcw3l38kTbfVvGKIjNwCg/7fU
-aAHIiOYSH+eLMpF4LtuqQP0D/3DhtpvrALSpiF/rw3VnL1rnxcb2IZs9IL1U6bFK
-p0IbqQORSVO2+dYSWo4/Vt7aWBFVPf/yfn/elncVmo12wAzWy7sBnqv8QzfYAvyY
-UuOh2WUD4K1ALOy7VHNM1mMyvH4dDIAoOuqXMQBwJx0A+/zUUaUZZLojsWl366pF
-GHmlBACa5zXSZ0mUf5ScZqZyda7/kUsV+B5tKjEKuOY1d/hnI5e/9Z11EQIfqqxs
-UckzCii+mg8zSpSgWHtsSu5N90teLum98bEuhYNT1tB6Pc7yNWEfq3c3SPw8ZstX
-u1kTQrsQeTiPhmfTQ+RyFiv+ZjonEsETNQK8n7CU+N2diiX5d7QjTXlyaWFtIE1p
-ZHkgPG15cmlhbV9taWR5QGxvdHVzLmNvbT6JAE4EEBECAA4FAjuOlFsECwMCAQIZ
-AQAKCRDeziK2wcV9LzZ/AKCYT4SNAFyQB+tA93nYjRo+NMc12wCaAw6zfJ7j7pI4
-e7L2OA0niSd8vHe5Ag0EO46UWxAIAPZCV7cIfwgXcqK61qlC8wXo+VMROU+28W65
-Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D49Vlf3HZSTz09
-jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNbno2gpXI61Brw
-v0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98iLMcfFstjvbzySPAQ/ClWxiN
-jrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlAGBGNfISnCnLWhsQDGcgHKXrK
-lQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqrol7DVekyCzsAAgIIANxxFjYo
-tUFTQpvEVHu1ZJhyZNySlR5EEDFemG/3AC67Mhv7ygHaeKP/oFzIixKmWllT7iKS
-SLjyS75rq7LpTzhasg2+suQPRnV8y2ATTLnlKWQVmZfVKY1RDiO4MWLik9laFTVY
-kEyFbKgF9w0LyeobsD7SU1J4D9IUOYmslq0m9rac0l+1ovNetdzIm3WSTB/gm/B2
-Nrz1z8urh4mf+RJwuO0to9fkSjE1KUcrE7nTiSD6A3eUaQC6S+Q5wEeiB3QN5f18
-giQuxna9Aet9J8tnMk+5iuh0QYKjNyXlyYD5B9ZF/4SXnQVDi6jAIC/Zzt/Yqzwo
-QX3NAtR8yY0WgASJAEYEGBECAAYFAjuOlFsACgkQ3s4itsHFfS+Q1QCg9ywbxv1n
-32glMqfIb9X7icWxYIEAoOGctrkwfA71hEB0S6zhT4UU3zx7
-=eDC+
------END PGP PUBLIC KEY BLOCK-----
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGP 6.5.8
-
-mQGiBDu47OwRBADe/cmSMZz/V8OF9KlVIij1Y66HuKRf9u8ht0JrVZf40BiA6ZF0
-IhXx44ELI1SWU2SqWQOrVR3RRVhHDbCiHGTGGLy8FgL5mhuC8vKRRkKNSzvgJKpD
-dCqRScL0UBWogvKj8plzuvz73rHDGJDdd4BYjOD02FW8wmBnWZO2FRQDhwCg/wwW
-HvcFM/O9dwoUPjdzc5AOteMEAN7vt3PzYpuhPEA21kGHd/wrn47BKGRiwYXv6b4S
-h6OCOWvj/JB9I/BnoeiDpt//1JRte/14JKf8IykuCQgzcZOvA2uuiMi0oWY7kBWe
-KDKzz63pFhlqncCzbxnOlIGUq82Y6ZGCrUvKErddOEdeHeCf2smgEvbxfED7lfKR
-noVTA/9mjXvtQf5tHlSA6/xErh5WVnvtK1voWQKK5CcRYccqoeD6hbYfwH2wHPte
-Rxvh+l8uyF+KTszM2cThA/BfVec01g3qeI1b4F1Izj9iLERxzvczB9QOQ11Ihhn1
-aC6CGDRT8pbrQddWKZy1mGoSJzRDcAGmHleY24+AK371+rKzlrQtSm9zZXBoIEtl
-c3NlbG1hbiA8am9zZXBoX2tlc3NlbG1hbkBsb3R1cy5jb20+iQBOBBARAgAOBQI7
-uOztBAsDAgECGQEACgkQss3trL7oYN6+QwCeNNwhvSTvw/OXKOAJ0wzpzUKc//AA
-oI+/TdbMVKrBDyEIR3fzS+PDYOq/uQINBDu47O0QCAD2Qle3CH8IF3KiutapQvMF
-6PlTETlPtvFuuUs4INoBp1ajFOmPQFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ
-+PVZX9x2Uk89PY3bzpnhV5JZzf24rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarT
-W56NoKVyOtQa8L9GAFgr5fSI/VhOSdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY72
-88kjwEPwpVsYjY67VYy4XTjTNP18F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy
-1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7
-AAICB/4usO5A+4Z5Zqdv3IE/Ffaw7XD2+94Jjr9VLWBvlNPb8hwYaCQ8Sn8c+Vwq
-lrePG3vHQvwsaTVpLWgk7G/tqasTdecCGrBEc9YlB/9jBqNaUuWdT1RlfxzS96Z1
-ayhNSqHM5gF/6cTBedK95HF0++AdtG4Z+CxhX5COZliPcIeOH1mwYqP/OKcbfOmc
-NqsjEpKA81oMpu6RHlzdbvUEyr8JpwqlQnJBPZ6oRi7SUlsTidYvsTA2+ZXJWftr
-TXe/R4RdaoXnwhESiDAL1pJy1Hnw3N5RJGCA5RS3RLHa0wvF0YTCwdk7PJut7100
-bdLw57nTr1edcFUKrPrXHQaAI4KiiQBGBBgRAgAGBQI7uOztAAoJELLN7ay+6GDe
-6ioAn0mSgIVhoKS1/Umun8Let3+az+SMAJ0aDwtI+TswutMqImiCBg2XsQkOug==
-=FVde
------END PGP PUBLIC KEY BLOCK-----
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGP 6.5.8
-
-mQGiBDu46/8RBADy0Wm57RXcDu6sd+sza7pFOoYgWslo51LuSxoCVWZiBjgOhas0
-JZeN9pOZlW89yFG4b4U+IfHJ6S0jrl9dcY4jZbwGZOBHF/03Z1viZajIZQ8X13HT
-xVASnVFspxj/bvnkpALBaaeI75De9XjDJzJmxWpIMnvXqD6r3jA78h5J2wCg/xbc
-xzkV5R1+g5f0YQ5f6LcLK0kD/RWVFuIvrlxzJXZQ+7jduyZmBJat9CQs0U3hHFXq
-DIxQPfFsEn9B/kc/qRTFITTeu1JVmq9SYXhJ/YRP+5yza/bJy3HBs4X4xUSeSGR9
-lgMQ7CdI2RwCP2FiCt1yEZT0FG7V452P5u4GFsrUo0hzwPuF853OFbNMVA9lud7Q
-pKAdA/wN2J7vDQJzAI/Pnf1ilp3Etq5Mm0jm9F13qXY66a9GtqvcS/lZGwEwYb5J
-WHu2kUjDwRwc4rdVbmJS7r4OpuK4n4HSvkA+H7T2fGeAbSlmi2cf0Zj9PQc6nTTX
-xs9/mW+ducQoAWWqBsjYb9WTmETFI/v7XODgkFc8+4bGO79ysLQmSm9zZXBoIEtl
-c3NlbG1hbiA8amtlc3NlbG1AYXBhY2hlLm9yZz6JAE4EEBECAA4FAju46/8ECwMC
-AQIZAQAKCRBM03UrGv/D/h69AJkB04jEwgpZ3U/A3Vo1dfce8zM4/ACfRm4GEOJS
-8R/nsuNzZ8YoRD52DpK5Ag0EO7jr/xAIAPZCV7cIfwgXcqK61qlC8wXo+VMROU+2
-8W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D49Vlf3HZS
-Tz09jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNbno2gpXI6
-1Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98iLMcfFstjvbzySPAQ/Cl
-WxiNjrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlAGBGNfISnCnLWhsQDGcgH
-KXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqrol7DVekyCzsAAgIIAMhL
-pfkBOHvfRhd/Dusekk1af4fMmH82fVhw82Q2+rY9CUNX1N/w0NLZ/AD1wKPugbDK
-QoVqgYaAP2rf0xETMFeZKlUhnPl0fXtfZSPWC8qIeiphac97g8Y4q/ZJL9jqZWiu
-lqQyArwniUUJ4L6obhZ0EjmSOy4etrWkIEv+1Z8Btw3+hn/XwdWRPzDkicMz7iL4
-scAsSLphu53tUhBdlwBDFdjesaKCRqy8bdR3AQf77Z1czNMLfYA7RS6zuoiblkD6
-GlABJDeQuxnBVJsuYpa+/zxlf4ol7P1rP5WohTN+hZWR9JI+MbqqG8EeyuYjI2Gj
-2/jT1kKqjGgVnqjtcb2JAEYEGBECAAYFAju46/8ACgkQTNN1Kxr/w/4tsACgyWj3
-/gI5CMj0KhDDxRXkxzCRP+AAnjY4cIvvgya56KB0IGmFgdgWZxUK
-=Ipr4
------END PGP PUBLIC KEY BLOCK-----
-
-Type Bits/KeyID    Date       User ID
-pub  2048/1AAC221B 2001/11/09 Joseph Kesselman <joseph_kesselman@lotus.com>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: PGP 6.5.8
-
-mQGhBDvsN+kRBADjapawUAJpEXOp7xNASa4FKdXFx9rLOx45+GP4bdTS9QN/p7Vo
-t4v+Xd8PUhJYHkxyfe39rtWfVTj+JPFotldMaPJUCKixnxnTjehbSoyi5sNraRqj
-WvZFYFDOOmOEy139eBBFXNTGSH+3D8A0PMg9IhUGHYgGZwqhEgd+2yaBlQCg/94k
-idl+3UadWoI4CTOxD+iU0rMD+JUCsUvmFTP1HfJQekMSNN16WSzJF29QOr0JUm9q
-ebnJHvtaQ/GaZrVyVv0bbgC1XAXf36pqWJPldkvOOzxCm0z0JkKdbQ6+r4P3hDMF
-Ppj1kUfz2XmdbkLTROu0PhUwgE4p7IKQspmxcdYGbT8rPtSSxXVF0yvF/NItXcCJ
-KfMEANYbpDzbuzWNtwVTQReFoj5xwYxH1H0CMeXmV+yq0i7DRNU+uAe2DmWOc6om
-bl9K5yk/cf8DP93/0yOaJqmZ1EjhHwKkknucHbjcNcMrG5qozU3bUr4in8IK5XO0
-NDZEw6KZTLCyXWCl9kK/H7vr0ogtSeQo+rnMqM9Ggusl2yMCtC1Kb3NlcGggS2Vz
-c2VsbWFuIDxqb3NlcGhfa2Vzc2VsbWFuQGxvdHVzLmNvbT6JAE4EEBECAA4FAjvs
-N+kECwMCAQIZAQAKCRCVht3BGqwiGxyvAKCOQ+RkwNwxTbrfGj9y3Lm4mYjZ5wCg
-npZjPSr5wXU3YU+yi9TluXrMFWC5Ag0EO+w36RAIAPZCV7cIfwgXcqK61qlC8wXo
-+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D4
-9Vlf3HZSTz09jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNb
-no2gpXI61Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98iLMcfFstjvbz
-ySPAQ/ClWxiNjrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlAGBGNfISnCnLW
-hsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqrol7DVekyCzsA
-AgIIAJJnaUDpUG1btIJUVkHLHOeBkm8uIcixAY1BrsoAm+HKW0DfvGZ0OA9RZawL
-ZwE0sWCuOuzQjbMVFjt3B76kK7YRiha+hlsAvbm5Ojnz5cmn+4JhT6fvh7Eh4xBR
-zCyQTOedNtegy0zkV24ddRqjz/zRDa3KJLagZrQFKU4+LXF5DpaTUVDR5xHxDlWg
-Ht2RDbEWVSYALxRjyHobzVZYr9CuhRy6QKRd5pm/fD+qkDtwHbFkrouH8Txegr3y
-zVVc+vKC0GNr1xaX8f0lUGSz2KHPRgqyMfEKGRYM+IWfr/gHeZnP2SUzGHsfYzoi
-6CJS6hPL/HyrPn+UbOmVo5uKNaqJAEYEGBECAAYFAjvsN+kACgkQlYbdwRqsIhuk
-fgCfco+vxnDUpU8cLscpZsPbk6J9p/MAn0VYo0g51AsO36+JJUak7IDWGFwb
-=pFGX
------END PGP PUBLIC KEY BLOCK-----
diff --git a/License b/License
deleted file mode 100644
index 21156a6..0000000
--- a/License
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
diff --git a/bin/BCEL.jar b/bin/BCEL.jar
deleted file mode 100644
index 3346058..0000000
--- a/bin/BCEL.jar
+++ /dev/null
Binary files differ
diff --git a/bin/JLex.jar b/bin/JLex.jar
deleted file mode 100644
index 1c977f3..0000000
--- a/bin/JLex.jar
+++ /dev/null
Binary files differ
diff --git a/bin/ant.jar b/bin/ant.jar
deleted file mode 100644
index 4942858..0000000
--- a/bin/ant.jar
+++ /dev/null
Binary files differ
diff --git a/bin/antRun b/bin/antRun
deleted file mode 100644
index f0a18f1..0000000
--- a/bin/antRun
+++ /dev/null
@@ -1,9 +0,0 @@
-#! /bin/sh
-
-# Args: DIR command
-cd "$1"
-CMD="$2"
-shift
-shift
-
-exec $CMD "$@"
diff --git a/bin/antRun.bat b/bin/antRun.bat
deleted file mode 100755
index 9168932..0000000
--- a/bin/antRun.bat
+++ /dev/null
@@ -1,20 +0,0 @@
-@echo off
-
-rem Change drive and directory to %1 (Win9X only for NT/2K use "cd /d")
-cd %1
-%1\
-set ANT_RUN_CMD=%2
-shift
-shift
-
-set PARAMS=
-:loop
-if ""%1 == "" goto runCommand
-set PARAMS=%PARAMS% %1
-shift
-goto loop
-
-:runCommand
-rem echo %ANT_RUN_CMD% %PARAMS%
-%ANT_RUN_CMD% %PARAMS%
-
diff --git a/bin/bsf.jar b/bin/bsf.jar
deleted file mode 100644
index 19036c1..0000000
--- a/bin/bsf.jar
+++ /dev/null
Binary files differ
diff --git a/bin/java_cup.jar b/bin/java_cup.jar
deleted file mode 100644
index 2f7b1f7..0000000
--- a/bin/java_cup.jar
+++ /dev/null
Binary files differ
diff --git a/bin/runtime.jar b/bin/runtime.jar
deleted file mode 100644
index 5041cdb..0000000
--- a/bin/runtime.jar
+++ /dev/null
Binary files differ
diff --git a/bin/stylebook-1.0-b3_xalan-2.jar b/bin/stylebook-1.0-b3_xalan-2.jar
deleted file mode 100644
index 85b0f7c..0000000
--- a/bin/stylebook-1.0-b3_xalan-2.jar
+++ /dev/null
Binary files differ
diff --git a/bin/xalan2jdoc.jar b/bin/xalan2jdoc.jar
deleted file mode 100644
index fd4aff8..0000000
--- a/bin/xalan2jdoc.jar
+++ /dev/null
Binary files differ
diff --git a/bin/xerces.jar b/bin/xerces.jar
deleted file mode 100644
index 7410f0c..0000000
--- a/bin/xerces.jar
+++ /dev/null
Binary files differ
diff --git a/bin/xercesImpl.jar b/bin/xercesImpl.jar
deleted file mode 100644
index ff5ffb4..0000000
--- a/bin/xercesImpl.jar
+++ /dev/null
Binary files differ
diff --git a/bin/xml-apis.jar b/bin/xml-apis.jar
deleted file mode 100644
index 2c42757..0000000
--- a/bin/xml-apis.jar
+++ /dev/null
Binary files differ
diff --git a/build.bat b/build.bat
deleted file mode 100755
index ab604ce..0000000
--- a/build.bat
+++ /dev/null
@@ -1,62 +0,0 @@
-@echo off
-rem     build.bat: Build Xalan-J 2.x using Ant 
-rem     Usage: build [ant-options] [targets]
-rem     Setup:
-rem         - you should set JAVA_HOME
-rem         - you can set ANT_HOME if you use your own Ant install
-rem         - JAVA_OPTS is added to the java command line
-rem         - PARSER_JAR may be set to use alternate parser (default:bin\xercesImpl.jar)
-echo.
-echo Xalan-J 2.x Build
-echo -------------
-
-if not "%JAVA_HOME%" == "" goto setant
-:noJavaHome
-rem Default command used to call java.exe; hopefully it's on the path here
-if "%_JAVACMD%" == "" set _JAVACMD=java
-echo.
-echo Warning: JAVA_HOME environment variable is not set.
-echo   If build fails because sun.* classes could not be found
-echo   you will need to set the JAVA_HOME environment variable
-echo   to the installation directory of java.
-echo.
-
-:setant
-rem Default command used to call java.exe or equivalent
-if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java
-
-rem Default _ANT_HOME to Xalan's checked-in copy if not set
-set _ANT_HOME=%ANT_HOME%
-if "%_ANT_HOME%" == "" set _ANT_HOME=.
-
-rem Default locations of jars we depend on to run Ant on our build.xml file
-rem Set our local vars to all start with _underscore
-set _ANT_JAR=%ANT_JAR%
-if "%_ANT_JAR%" == "" set _ANT_JAR=bin\ant.jar
-set _PARSER_JAR=%PARSER_JAR%
-if "%_PARSER_JAR%" == "" set _PARSER_JAR=bin\xercesImpl.jar
-set _XML-APIS_JAR=%XML-APIS_JAR%
-if "%_XML-APIS_JAR%" == "" set _XML-APIS_JAR=bin\xml-apis.jar
-
-rem Attempt to automatically add system classes to _CLASSPATH
-rem Use _underscore prefix to not conflict with user's settings
-set _CLASSPATH=%CLASSPATH%
-if exist "%JAVA_HOME%\lib\tools.jar" set _CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\tools.jar
-if exist "%JAVA_HOME%\lib\classes.zip" set _CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\classes.zip
-set _CLASSPATH=%_ANT_JAR%;%_XML-APIS_JAR%;%_PARSER_JAR%;%_CLASSPATH%
-
-@echo on
-"%_JAVACMD%" -mx64m %JAVA_OPTS% -Dant.home="%ANT_HOME%" -classpath "%_CLASSPATH%" org.apache.tools.ant.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
-@echo off
-
-goto end
-
-:end
-rem Cleanup environment variables
-set _JAVACMD=
-set _CLASSPATH=
-set _ANT_HOME=
-set _ANT_JAR=
-set _PARSER_JAR=
-set _XML-APIS_JAR=
-
diff --git a/build.sh b/build.sh
deleted file mode 100755
index d0979ed..0000000
--- a/build.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/sh
-#	Name:   build.sh Build Xalan-J 2.x using Ant
-#	Author: Shane Curcuru
-
-# Alternatively, you can just call "ant" 
-
-echo "Xalan-J 2.x Build"
-echo "-------------"
-
-_JAVACMD=$JAVA_HOME/bin/java
-if [ "$JAVA_HOME" = "" ] ; then
-    echo "Warning: JAVA_HOME environment variable is not set."
-    _JAVACMD=java
-fi
-
-# Default locations of jars we depend on to run Ant on our build.xml file
-if [ "$ANT_HOME" = "" ] ; then
-    ANT_HOME=.
-fi
-if [ "$ANT_JAR" = "" ] ; then
-    ANT_JAR=./bin/ant.jar
-fi
-if [ "$PARSER_JAR" = "" ] ; then
-    PARSER_JAR=./bin/xercesImpl.jar
-fi
-
-if [ "$XML_APIS_JAR" = "" ] ; then
-    XML_APIS_JAR=./bin/xml-apis.jar
-fi
-
-# Use _underscore prefix to not conflict with user's settings
-# Default to UNIX-style pathing
-CLPATHSEP=:
-# if we're on a Windows box make it ;
-uname | grep WIN && CLPATHSEP=\;
-_CLASSPATH="$ANT_JAR${CLPATHSEP}$XML_APIS_JAR${CLPATHSEP}$PARSER_JAR${CLPATHSEP}$CLASSPATH"
-
-# Attempt to automatically add system classes to _CLASSPATH
-if [ -f $JAVA_HOME/lib/tools.jar ] ; then
-  _CLASSPATH=${_CLASSPATH}${CLPATHSEP}${JAVA_HOME}/lib/tools.jar
-fi
-
-if [ -f $JAVA_HOME/lib/classes.zip ] ; then
-  _CLASSPATH=${_CLASSPATH}${CLPATHSEP}${JAVA_HOME}/lib/classes.zip
-fi
-
-
-echo "Starting Ant with targets: $@"
-echo "        ...with classpath: $_CLASSPATH"
-
-"$_JAVACMD" $JAVA_OPTS -Dant.home=$ANT_HOME -classpath "$_CLASSPATH" org.apache.tools.ant.Main $@
-
-
-
-
diff --git a/build.xml b/build.xml
deleted file mode 100644
index b17fb3a..0000000
--- a/build.xml
+++ /dev/null
@@ -1,993 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- ===================================================================
-
-   Build file for Xalan-J 2.x - for use with the Jakarta Ant java build tool
-   
-Setup instructions: 
-   Before running an Ant build, you must
-   
-     - set the JAVA_HOME environment variable to the JDK root directory
-     - To build 'servlet' sample: Include Servlet SDK in your classpath
-     - To build docs/javadocs/xsltc: use JDK 1.2.x or higher
-   
-Build Instructions:   
-  To build, run
-    build.bat (win32) or build.sh (unix) [antoptions] [targets]
-  in the directory where this file is located; you should also be 
-  able to use an installation of Ant v1.4.1 or later.
-   
-  build -projecthelp  will show a list of supported targets.
-   
-  Developers: include a description="" attribute in all user-callable targets.
-        
-  If you build a target that depends on other targets, those other 
-  targets are *usually* created in the correct order; however a 
-  few of the larger targets like dist do not list all dependencies.
-
-Other Important Notes:
-- 'dist' produces a .tar file that works with GNU compatible tar 
-  programs, because that's what Ant does when it finds a path that's 
-  longer than 100 characters (like in our docs).  Sorry!
-  
-- External build maintainers: look for GUMP: comments; developers 
-  please use great caution when changing these lines!
-
-- Unusual build items: the docs and xsltc.compile targets leave 
-  cruft in the source areas; various clean targets get most of this.
-  
-Authors:
-  Shane Curcuru <shane_curcuru@lotus.com>
-  Don Leslie <donald_leslie@lotus.com>
-
-Copyright:
-  Copyright (c) 1999-2001 The Apache Software Foundation.
-   $Id$
-==================================================================== -->
-
-<project name="Xalan" default="jar" basedir=".">
-  <!-- =================================================================== -->
-  <!-- Defines paths/names of prerequisite jar files we compile against    -->
-  <!-- =================================================================== -->
-  <!-- We keep checked-in known-good .jars here -->
-  <property name="bin.dir" value="./bin"/>
-
-  <!-- GUMP: Allows external build systems to replace .jars Xalan 
-       is dependent on as needed.  Most have separate name and 
-       location properties to make it simpler to reset these values; 
-       please provide feedback if this is useful. 
-  -->
-  <property name="xmlapis.jar.name" value="xml-apis.jar"/>
-  <property name="xmlapis.jar" value="${bin.dir}/${xmlapis.jar.name}"/>
-  <property name="parser.jar.name" value="xercesImpl.jar"/>
-  <property name="parser.jar" value="${bin.dir}/${parser.jar.name}"/>
-  <property name="bsf.jar.name" value="bsf.jar"/>
-  <property name="bsf.jar" value="${bin.dir}/${bsf.jar.name}"/>
-  <property name="stylebook.jar.name" value="stylebook-1.0-b3_xalan-2.jar"/>
-  <property name="stylebook.jar" value="${bin.dir}/${stylebook.jar.name}"/>
-  <property name="doclet.jar.name" value="xalan2jdoc.jar"/>
-  <property name="doclet.jar" value="${bin.dir}/${doclet.jar.name}"/>
-
-  <!-- GUMP: Currently 18-Apr-01 used only for xsltc.compile -->
-  <property name="bcel.jar.name" value="BCEL.jar"/>
-  <property name="bcel.jar" value="${bin.dir}/${bcel.jar.name}"/>
-  <property name="crimson.jar.name" value="crimson.jar"/><!-- Why is this here? 10-Sep-01 -sc -->
-  <property name="crimson.jar" value="${bin.dir}/${crimson.jar.name}"/>
-  <property name="java_cup.jar.name" value="java_cup.jar"/>
-  <property name="java_cup.jar" value="${bin.dir}/${java_cup.jar.name}"/>
-  <property name="jlex.jar.name" value="JLex.jar"/>
-  <property name="jlex.jar" value="${bin.dir}/${jlex.jar.name}"/>
-  <property name="runtime.jar.name" value="runtime.jar"/>
-  <property name="runtime.jar" value="${bin.dir}/${runtime.jar.name}"/>
-
-  <!-- Defines general variables used by the other targets; name controls output xalan.jar  -->
-  <property name="version.VERSION" value="2"/>
-  <property name="version.RELEASE" value="3"/>
-  <property name="version.DEVELOPER" value="D"/><!-- Set this to 'D' if a developer release; blank "" if maintenance release -->
-  <property name="version.MINOR" value="1"/><!-- EITHER the developer release number, or a maintenance release number -->
-  <property name="version" value="${version.VERSION}_${version.RELEASE}_${version.DEVELOPER}${version.MINOR}"/><!-- GUMP: version # of dist file -->
-  <property name="impl.version" value="${version.VERSION}.${version.RELEASE}.${version.DEVELOPER}${version.MINOR}"/><!-- Used in jar task for filtering MANIFEST.MF file -->
-  <property name="name" value="xalan"/><!-- GUMP: base name of jar target's file -->
-  <property name="year" value="2001"/>
-  <property name="build.debug" value="on"/>
-
-  <!-- Relative locations of source directories -->
-  <property name="manifest.mf" value="./src/MANIFEST.MF"/>
-  <property name="manifest.xsltc.mf" value="./src/manifest.xsltc"/>
-  <property name="src.dir" value="./src"/>
-  <property name="apachexml.reldir" value="org/apache/xml"/>
-  <property name="xpath.reldir" value="org/apache/xpath"/>
-  <property name="xalan.reldir" value="org/apache/xalan"/>
-  <property name="xsltc.reldir" value="${xalan.reldir}/xsltc"/>
-  <property name="generated.xpathparser" value="${src.dir}/${xsltc.reldir}/compiler/XPathParser.java"/>
-  <property name="generated.xpathlexer" value="${src.dir}/${xsltc.reldir}/compiler/XPathLexer.java"/>
-  <property name="generated.xpathsym" value="${src.dir}/${xsltc.reldir}/compiler/sym.java"/>
-  
-  <!-- Build and distribution output areas -->
-  <property name="build.dir" value="./build"/><!-- GUMP: root of all normal builds output -->
-  <property name="build.xalan.jar" value="${build.dir}/${name}.jar"/><!-- GUMP: actual path/name of jar target output -->
-  <property name="build.xsltc.jar" value="${build.dir}/xsltc.jar"/>
-  <property name="build.classes" value="${build.dir}/classes"/>
-  <property name="build.docs" value="${build.dir}/docs"/>
-  <property name="build.samples" value="${build.dir}/samples"/>
-  <property name="build.apidocs" value="${build.docs}/apidocs"/>
-  <property name="dist.file" value="${name}-j_${version}"/><!-- GUMP: actual path/name of dist target .tar.gz/.zip-->
-  <property name="dist.dir" value="${build.dir}/${dist.file}"/>
-  
-  <!-- Xalan-J1 compatability stuff.  -->
-  <!-- TO BE REMOVED: 'skipcompat' flag allows you to optionally 
-       skip 1.x compat layer; default to true, so we can  
-       switch to Xerces 2.x which compat won't compile with -->
-  <property name="skipcompat" value="true"/>
-  <property name="compat.jar" value="xalanj1compat.jar"/>
-  <property name="compat.src.dir" value="./compat_src"/>
-  <property name="build.compat.classes" value="${build.dir}/compat_classes"/>
-  <property name="build.compat.jar" value="${build.dir}/${compat.jar}"/>
-  <property name="build.compat.apidocs" value="${build.docs}/compat_apidocs"/>        
-
-   <!-- xml-commons sources (for Javadoc) -->                                                                        
-   <property name="xml-commons-srcs.tar.gz" value="${src.dir}/xml-commons-src.tar.gz"/>                                                                         
-   <property name="xml-commons-srcs.tar" value="${build.dir}/xml-commons-src.tar"/>
- 
-  <!-- Documentation and samples information  -->
-  <property name="Name-in-docs" value="Xalan-Java"/>
-  <property name="version.file" value="${xalan.reldir}/processor/XSLProcessorVersion.java"/>
-  <property name="samples.dir" value="./samples"/>
-  <property name="build.samples.jar" value="${build.dir}/xalansamples.jar"/>
-  <property name="build.servlet.jar" value="${build.dir}/xalanservlet.jar"/>
-  <property name="xdocs.dir" value="./xdocs"/>
-  <property name="xdocs.book" value="${xdocs.dir}/sources/xalan-jlocal.xml"/>
-  <property name="xdocs.style" value="${xdocs.dir}/style"/>
-  <property name="xalanonly-styledocs"
-            value="dtd/xsl-html40s.dtd,dtd/spec.dtd,stylesheets/patterns.xsl,stylesheets/notice.xsl,stylesheets/spec.xsl,stylesheets/done.xsl,loaderdesign.xml,stylesheets/design2project.xsl,stylesheets/designdoc2html.xsl,stylesheets/xml2fo.xsl"/>
-  <property name="xalan.cmdline.class" value="org.apache.xalan.xslt.Process"/>
-  <property name="doc.generator" value="org.apache.stylebook.StyleBook"/>
-  <property name="doc.generator.styletargz" value="${xdocs.dir}/xml-site-style.tar.gz"/>
-  <property name="doc.generator.styletar" value="${xdocs.dir}/xml-site-style.tar"/>
-  <property name="site.root" value="./xml-site"/>
-  <property name="site.dir" value="${site.root}/target/xalan-j"/>
-  <property name="site.book" value="${xdocs.dir}/sources/xalan-jsite.xml"/>
-  <property name="xdocs.DONE.file" value="${xdocs.dir}/sources/xalan/DONE"/>
-  <property name="xdocs.XSLTCDONE.file" value="XSLTCDONE"/>
-  <property name="xdocs.XSLTCDONE.location" value="${xdocs.dir}/sources/xalan/${xdocs.XSLTCDONE.file}"/>    
-  <path id="docs.class.path">
-    <pathelement location="${xmlapis.jar}" />
-    <pathelement location="${parser.jar}" />
-    <pathelement location="${bsf.jar}" />
-    <pathelement location="${stylebook.jar}" />
-    <pathelement location="${doclet.jar}" />
-    <pathelement location="${build.xalan.jar}" />
-    <pathelement path="${java.class.path}" />
-  </path>
-  <path id="samples.class.path">
-    <pathelement location="${xmlapis.jar}" />
-    <pathelement location="${parser.jar}" />
-    <pathelement location="${build.xalan.jar}" />
-    <pathelement path="${java.class.path}" />
-  </path>
-  <path id="compile.class.path">
-    <!-- Ensure the selected parser.jar file is used to compile against -->
-    <pathelement location="${build.classes}" />
-    <pathelement location="${xmlapis.jar}" />
-    <pathelement location="${parser.jar}" />
-    <pathelement path="${java.class.path}" />
-  </path>
-  <path id="xslt.boot.class.path">
-    <!-- Put this version of xalan in front of the jdk's for JDK 1.4+ -->
-    <pathelement location="${build.classes}" />
-    <pathelement path="${sun.boot.class.path}" />
-  </path>
-
-  <!-- =================================================================== -->
-  <!-- Creates output build directories and doc prerequistes               -->
-  <!-- =================================================================== -->
-  <target name="prepare">
-    <echo message="Project:${Name-in-docs} version:${version} build.xml $Revision$"/>
-    <mkdir dir="${build.dir}"/>
-    <mkdir dir="${build.classes}"/>
-    <!-- Note that all testing-related targets *must* depend on 
-         this target, either directly or indirectly, to get 
-         the tests-available property set for them.
-    -->
-    <available file="${test.relpath}" property="tests-available" />
-    <available property="xerces.present" 
-      classname="org.apache.xerces.parsers.SAXParser"/>
-  </target>
-
-  <!-- Must depend on jar since we use Xalan to process xml files -->
-  <target name="prepare.docs" depends="jar">
-    <mkdir dir="${build.docs}"/> 
-    <mkdir dir="${build.apidocs}"/>
-
-    <gunzip src="${doc.generator.styletargz}"/>
-    <untar src="${doc.generator.styletar}" dest="${xdocs.dir}"/>
-    <delete file="${doc.generator.styletar}"/>
-
-    <!-- We use a Notes agent to periodically extract Xalan-Java 2 commits from our team database into commits.xml.  The following operation 
-    transforms commits.xml (just including source code commits) and puts the result in xdocs/sources/xalan for inclusion in the 
-    readme.xml -->      
-    <echo message="Transform commits.xml and put the result in ${xdocs.dir}"/>
-    <java fork="yes" classname="${xalan.cmdline.class}" >
-      <classpath refid="docs.class.path" />
-      <arg line="-in commits.xml -xsl ${xdocs.style}/stylesheets/done.xsl -out ${xdocs.DONE.file} -param xsltcdone ${xdocs.XSLTCDONE.file}"/>
-    </java>
-    <echo message="Generate Xalan-J 2.x design document"/>
-    <java fork="yes" classname="${doc.generator}" >
-      <classpath refid="docs.class.path" />
-      <arg line="loaderConfig=sbk:/style/loaderdesign.xml targetDirectory=./build/docs/design/
-                 ./xdocs/sources/xalandesign.xml ./xdocs/style"/>
-    </java>
-  </target>
-
-  <!-- =================================================================== -->
-  <!-- Compile entire source tree                                          -->
-  <!-- =================================================================== -->
-  <target name="compile" depends="prepare"
-    description="Compile Xalan-J 2.x (skips 1.x compat and XSLTC)" >
-    <echo message="compile entire source tree and copy .properties and .res files to build tree."/>
-    <!-- Note: split compile into separate javac steps to avoid JDK 1.1.8 bug reported at:
-         http://developer.java.sun.com/developer/bugParade/bugs/4043508.html
-         which causes an error like:
-         [javac] E:\builds\xml-xalan\java\src\org\apache\xalan\templates\ElemTemplate.java:108: Cyclic class inheritance or scoping.
-    --> 
-    <!-- Compile XPath engine and some common utilities -->
-    <javac srcdir="${src.dir}" 
-           destdir="${build.classes}"
-           debug="${build.debug}" >
-      <!-- Also compile version info classes here -->
-      <include name="${xalan.reldir}/Version.java" />
-      <include name="${xalan.reldir}/processor/XSLProcessorVersion.java" />
-      <include name="${apachexml.reldir}/**/*.java" />
-      <!-- But exclude unused synthetic* files; should be obsoleted from CVS -->
-      <exclude name="${apachexml.reldir}/utils/synthetic/**/*.java" />
-      <include name="${xpath.reldir}/**/*.java" />
-      <exclude name="**/CoroutineSAXFilterTest.java" 
-        unless="xerces.present"	 />
-      <exclude name="**/CoroutineSAXParser_Xerces.java" 
-        unless="xerces.present"	 />
-      <exclude name="**/IncrementalSAXSource_Xerces.java" 
-        unless="xerces.present"	 />
-      <classpath refid="compile.class.path" />
-      <bootclasspath refid="xslt.boot.class.path" />
-    </javac>
-    <!-- Compile Xalan main engine (but not xsltc package yet) -->
-    <javac srcdir="${src.dir}" 
-           destdir="${build.classes}"
-           includes="${xalan.reldir}/**/*.java"
-           excludes="${xsltc.reldir}/**/*.java,${xalan.reldir}/lib/**/*.java,${xalan.reldir}/xslt/**/*.java"
-           debug="${build.debug}" >
-      <classpath refid="compile.class.path" />
-      <bootclasspath refid="xslt.boot.class.path" />
-    </javac>
-    <!-- Compile various Xalan-specific extensions and command line class -->
-    <javac srcdir="${src.dir}" 
-           destdir="${build.classes}"
-           includes="${xalan.reldir}/lib/**/*.java,${xalan.reldir}/xslt/**/*.java"
-           debug="${build.debug}" >
-      <classpath refid="compile.class.path" />
-      <bootclasspath refid="xslt.boot.class.path" />
-    </javac>
-    <!-- Copy needed properties, resource, etc. files to be put into .jar file -->
-    <copy todir="${build.classes}">
-      <fileset dir="${src.dir}" includes="**/*.properties,**/*.res,META-INF/services/javax.xml.transform.*"/>
-    </copy>  
-  </target>
-
-  <!-- =================================================================== -->
-  <!-- Compile just the XSLTC compiler portion (to be integrated soon!) -->
-  <!-- =================================================================== -->
-  <path id="xsltc.class.path">
-    <pathelement location="${bcel.jar}" />
-    <pathelement location="${jlex.jar}" />
-    <pathelement location="${java_cup.jar}" />
-    <pathelement location="${runtime.jar}" />
-    <pathelement location="${crimson.jar}" />
-    <!-- build.classes needed for 
-         org.apache.xalan.xsltc.util.JavaCupRedirect -->
-    <pathelement location="${build.classes}" />
-    <pathelement path="${java.class.path}" />
-  </path>
-
-  <!-- Attempt to determine dependency info for generated sources -->
-  <target name="xsltc.prepare" depends="prepare" >
-    <!-- The first step compiles the utils directory, which includes 
-         a special wrapper for the xsltc.codegen / java_cup step next. -->
-    <echo message="Compiling XSLTC utilities"/>
-    <javac srcdir="${src.dir}" 
-           destdir="${build.classes}"
-           includes="${xsltc.reldir}/util/**/*.java"
-           debug="${build.debug}">
-      <classpath refid="xsltc.class.path" />
-      <bootclasspath refid="xslt.boot.class.path" />
-    </javac>
-    <!-- These tricky uptodate statements hopefully determine if we 
-         actually need to generate the java_cup and jlex files 
-         in the two sub-targets below
-    -->
-    <!-- NOTE: The two uptodate tasks below do not yet work! 28-Nov-01 -sc -->
-    <uptodate property="xsltc.java_cup.needed"  >
-      <srcfiles dir= "${src.dir}/${xsltc.reldir}/compiler" includes="xpath.cup"/>
-      <mapper type="merge" to="${generated.xpathparser}"/>
-    </uptodate>
-    <uptodate property="xsltc.jlex.needed"  >
-      <srcfiles dir= "${src.dir}/${xsltc.reldir}/compiler" includes="xpath.lex"/>
-      <mapper type="merge" to="${generated.xpathlexer}"/>
-    </uptodate>
-  </target>
-
-  <!-- Generate code sources for xsltc if needed -->
-  <target name="xsltc.java_cup" depends="xsltc.prepare" > <!-- if="xsltc.java_cup.needed" -->
-    <!-- The second step generates sym.java and XPathParser.java. -->
-    <echo message="java_cup preparsing"/>
-    <java fork="yes" failonerror="true" 
-       classname="org.apache.xalan.xsltc.util.JavaCupRedirect" >
-      <classpath refid="xsltc.class.path" />
-      <!-- We're using JavaCupRedirect to call the java_cup application -->
-      <arg line="-parser XPathParser -expect 0 
-         -stdin ${src.dir}/${xsltc.reldir}/compiler/xpath.cup"/>
-    </java>
-    <echo message="java_cup move output files"/>
-    <move file="XPathParser.java" tofile="${generated.xpathparser}"/>
-    <move file="sym.java" tofile="${generated.xpathsym}"/>
-
-  </target>
-  <target name="xsltc.jlex" depends="xsltc.java_cup" ><!--if="xsltc.jlex.needed" -->
-    <!-- The third step generates XPathLexer.java. The lexiographical analyser
-    has to be generated after sym.java, so order is important. -->
-    <echo message="JLex preparsing"/>
-    <java fork="yes" failonerror="true" classname="JLex.Main" >
-      <classpath refid="xsltc.class.path" />
-      <arg line="-static ${src.dir}/${xsltc.reldir}/compiler/xpath.lex"/>
-    </java>
-    <echo message="JLex move output file"/>
-    <move file="${src.dir}/${xsltc.reldir}/compiler/xpath.lex.java" tofile="${generated.xpathlexer}"/>
-  </target>
-
-  <!-- The xsltc.compile target should be rewritten to properly 
-       do dependencies on the generated sources: right now, it 
-       will always regenerate the sources, even if it's not needed
-       (which forces all later steps to re-run as well) -->
-  <target name="xsltc.compile" depends="xsltc.java_cup,xsltc.jlex"
-    description="Compile just the XSLTC classes" >
-    <echo message="Compiling remaining XSLTC classes"/>
-    <javac srcdir="${src.dir}" 
-           destdir="${build.classes}"
-           includes="${xsltc.reldir}/**/*.java"
-           debug="${build.debug}">
-      <classpath refid="xsltc.class.path" />
-      <bootclasspath refid="xslt.boot.class.path" />
-    </javac>
-  </target>
-
-  <target name="xsltc.jar" depends="xsltc.compile"
-    description="Jar just the xsltc.jar file" >
-    <!-- Copy over the manifest, with filtering (for version number) -->
-    <filter token="impl.version" value="${impl.version}"/>
-    <copy todir="${build.dir}" file="${manifest.xsltc.mf}" filtering="true"/>
-    <jar jarfile="${build.xsltc.jar}" manifest="${build.dir}/manifest.xsltc" basedir="${build.classes}" >
-      <patternset><!-- relative to jar/@basedir -->
-        <include name="${xsltc.reldir}/**/*" />
-      </patternset>
-    </jar>
-  </target>
-
-
-  <target name="xsltc.bundledjar" depends="xsltc.compile"
-     description="Jar xsltc, BCEL.jar, JLex.jar, java_cup.jar, runtime.jar">
-    <!-- make a tmp directory to work in -->
-    <delete dir="${build.dir}/xsltctmp" includeEmptyDirs="true" quiet="true"/>
-    <mkdir  dir="${build.dir}/xsltctmp" />
-
-    <!-- create jar of xsltc classes in the tmp directory -->
-    <jar jarfile="${build.dir}/xsltctmp/xsltc.jar"
-        basedir="${build.dir}/classes"
-        includes="org/apache/xalan/xsltc/**" />
-
-    <!-- copy the xsltc 3rd party support jar files to tmp dist dir -->
-    <copy todir="${build.dir}/xsltctmp"
-      file="${bin.dir}/BCEL.jar"/>
-    <copy todir="${build.dir}/xsltctmp"
-      file="${bin.dir}/JLex.jar"/>
-    <copy todir="${build.dir}/xsltctmp"
-      file="${bin.dir}/java_cup.jar"/>
-    <copy todir="${build.dir}/xsltctmp"
-      file="${bin.dir}/runtime.jar"/>
-
-    <!-- unjar all jars -->
-    <unjar src="${build.dir}/xsltctmp/xsltc.jar"
-           dest="${build.dir}/xsltctmp" />
-    <unjar src="${build.dir}/xsltctmp/BCEL.jar"
-           dest="${build.dir}/xsltctmp" />
-    <unjar src="${build.dir}/xsltctmp/JLex.jar"
-           dest="${build.dir}/xsltctmp" />
-    <unjar src="${build.dir}/xsltctmp/java_cup.jar"
-           dest="${build.dir}/xsltctmp" />
-    <unjar src="${build.dir}/xsltctmp/runtime.jar"
-           dest="${build.dir}/xsltctmp" />
-
-    <!-- remove jar files -->
-    <delete file="${build.dir}/xsltctmp/xsltc.jar" />
-    <delete file="${build.dir}/xsltctmp/BCEL.jar" />
-    <delete file="${build.dir}/xsltctmp/JLex.jar" />
-    <delete file="${build.dir}/xsltctmp/java_cup.jar" />
-    <delete file="${build.dir}/xsltctmp/runtime.jar" />
-
-    <!-- remove old META-INF dir -->
-    <delete dir="${build.dir}/xsltctmp/META-INF"
-        includeEmptyDirs="true" quiet="true"/>
-
-    <!-- make bundled jar named xsltc.jar -->
-    <jar jarfile="${build.dir}/xsltc.jar"
-         basedir="${build.dir}/xsltctmp" />
-
-    <!-- clean up tmp directory -->
-    <delete dir="${build.dir}/xsltctmp" includeEmptyDirs="true" quiet="true"/>
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Creates the xalan JAR                                               -->
-  <!-- =================================================================== -->
-  <target name="jar" depends="compile"
-    description="Jar up xalan.jar, plus the ${xmlapis.jar.name}" >
-    <!-- Copy over the manifest, with filtering (for version number) -->
-    <filter token="impl.version" value="${impl.version}"/>
-    <copy todir="${build.dir}" file="${manifest.mf}" filtering="true"/>
-    <jar jarfile="${build.xalan.jar}" manifest="${build.dir}/MANIFEST.MF" basedir="${build.classes}" >
-      <patternset><!-- relative to jar/@basedir -->
-        <exclude name="${xsltc.reldir}/**/*" />
-      </patternset>
-    </jar>
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Default all target simply Creates the xalan JAR                     -->
-  <!-- =================================================================== -->
-  <target name="all" depends="jar"><!-- 'Standardizing build.xml files' <bloritsch@apache.org> -->
-    <echo message="Redirect to jar target; please provide input on desired functionality of this target"/>
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Creates the Xalan-J1 compatability JAR: being removed               -->
-  <!-- =================================================================== -->
-  <target name="compat.jar" depends="jar"
-    description="UNSUPPORTED:Compile and jar Xalan-J 1.x backwards compat classes" 
-    unless="skipcompat" >
-    <echo message="UNSUPPORTED:Compile and jar just the Xalan-J 1 compability API"/>
-    <mkdir dir="${build.compat.classes}"/>
-    <javac srcdir="${compat.src.dir}" 
-           destdir="${build.compat.classes}"
-           includes="**/*.java"
-           debug="${build.debug}"
-           bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="docs.class.path" />
-    </javac>           
-    <copy todir="${build.compat.classes}">
-          <fileset dir="${compat.src.dir}" includes="**/*.properties,**/*.res"/>
-    </copy>  
-    <jar jarfile="${build.compat.jar}" manifest="${manifest.mf}" basedir="${build.compat.classes}"/>
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Creates the Xalan-J1 compatability javadoc: being removed           -->
-  <!-- =================================================================== -->
-  <target name="compat.javadocs" depends="jar"
-    description="UNSUPPORTED:Build javadocs for Xalan-J 1.x backwards compat classes" 
-    unless="skipcompat" >
-    <mkdir dir="${build.compat.apidocs}"/>
-    <javadoc
-         public="true"
-         sourcepath="${compat.src.dir}"
-         overview="${compat.src.dir}/compatOverview.html"         
-         packagenames="org.apache.xalan.xslt,org.apache.xalan.xpath,org.apache.xalan.xpath.xml"
-         author="true"
-         version="true"
-         use="true"
-         destdir="${build.compat.apidocs}"
-         windowtitle="${Name-in-docs} 1 Compatability" 
-         doctitle="${Name-in-docs} 1 Compatability"
-         bottom="Copyright &#169; ${year} Apache XML Project. All Rights Reserved.">
-      <classpath refid="docs.class.path" />
-    </javadoc>
-  </target>
-    
-
-  <!-- =================================================================== -->
-  <!-- Compiles the samples (servlet excluded) and jars the class files    -->  
-  <!-- =================================================================== -->
-  <target name="samples" depends="jar"
-    description="Compile and jar the samples (except servlet)" >
-    <property name="exclude" value="*.xml,*.xsl,*.txt,*.html,*.properties,*.out"/>
-    <mkdir dir="${build.samples}"/>
-    <!-- Since the samples are packageless, they must be compiled separately. -->   
-    <javac srcdir="${samples.dir}/SimpleTransform" 
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/UseStylesheetPI"   
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/UseStylesheetParam" 
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/SAX2SAX"  
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/DOM2DOM"  
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/Pipe"  
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/UseXMLFilters"  
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/Trace"   
-           destdir="${build.samples}"  excludes="${exclude}"
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/ApplyXPath"  
-           destdir="${build.samples}" excludes="${exclude}" 
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/trax"  
-           destdir="${build.samples}" excludes="${exclude}" 
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/extensions"  
-           destdir="${build.samples}" excludes="${exclude}" 
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <javac srcdir="${samples.dir}/Validate"  
-           destdir="${build.samples}" excludes="${exclude}" 
-           debug="${build.debug}" bootclasspathref="xslt.boot.class.path" >
-      <classpath refid="samples.class.path" />
-    </javac>           
-    <jar jarfile="${build.samples.jar}" basedir="${build.samples}"
-         includes="*.class"/>                   
-  </target>
-   
-  <!-- =================================================================== -->
-  <!-- Compiles the sample servlet and jars the class files.                -->  
-  <!-- The javax.servlet and javax.servlet.http packages                    -->
-  <!-- must be on the classpath                                             -->
-  <!-- =================================================================== -->
- <target name="servlet" depends="jar"
-    description="Compile and jar the servlet samples" >
-     <echo message="To compile the sample servlets, javax.servlet and javax.servlet.http must be on the classpath"/>   
-     <mkdir dir="${build.samples}/servlet"/>
-     <javac srcdir="${samples.dir}/servlet"
-            destdir="${build.samples}"
-            debug="${build.debug}"
-            bootclasspathref="xslt.boot.class.path" >
-       <classpath refid="samples.class.path" />
-     </javac>           
-      <copy todir="${build.samples}/servlet">
-        <fileset dir="${samples.dir}/servlet" 
-          includes="media.properties,default.xsl,default2.xsl"/>
-      </copy>  		         
-    <jar jarfile="${build.servlet.jar}" 
-         basedir="${build.samples}" 
-         includes="servlet/**"/>
- </target>
- 
-  <!-- =================================================================== -->
-  <!-- Compiles (does not jar) the translet samples in translets.          -->
-  <!-- For time being, classes are generated in place.                     -->
-  <!-- To run these samples, add xsltc.jar, runtime.jar, bcel.jar,         -->
-  <!-- and java_cup.jar (all in the bin directory) to the classpath        --> 
-  <!--                                                                     -->
-  <!-- When we have straightened out classpath issues,                     -->
-  <!-- add samples in CompiledApplet, CompiledBrazil, and CompiledServlet  -->
-  <!-- =================================================================== -->
-  <target name="xsltc.samples" depends="jar,xsltc.jar">
-    <javac srcdir="${samples.dir}/translets" classpath="${java.class.path}:${build.xsltc.jar}" 
-           destdir="${samples.dir}/translets" excludes="${exclude}" 
-           debug="${build.debug}"
-           bootclasspathref="xslt.boot.class.path" />
-  </target>
- 
- 
-  <!-- =================================================================== -->
-  <!-- Generate HTML docs                                                  -->
-  <!-- =================================================================== -->
-  <target name="docs" depends="jar,prepare.docs,autodocs"
-    description="Build the documentation (overview, readme, etc.)" >
-    <echo message="docs is human-usable target with dependencies"/>  
-  </target>
-  
-  <target name="autodocs">
-    <echo message="autodocs is for automated build process, without dependencies"/>   
-    <java fork="yes" 
-          classname="${doc.generator}" 
-          classpathref="docs.class.path" >
-       <arg line="targetDirectory=${build.docs} ${xdocs.book} ${xdocs.style}"/>
-    </java>	 
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Creates the API documentation                                       -->
-  <!-- =================================================================== -->
-  <target name="javadocs" depends="jar,prepare.docs,autojavadocs"
-    description="Build the Javadocs for Xalan 2.x and xml-commons sources" >
-    <echo message="javadocs is human-usable target with dependencies"/>  
-  </target>
-
-  <target name="autojavadocs">
-    <echo message="autojavadocs is for automated build process, without dependencies"/>
-    
-      <!-- Expand xml-commons sources (JAXP 1.1, DOM 2, and SAX 2) into source tree for 
-           inclusion in the Javadoc. -->                                            
-     <gunzip src="${xml-commons-srcs.tar.gz}" dest="${build.dir}" />                                                                         
-     <untar src="${xml-commons-srcs.tar}" dest="${src.dir}" /><!-- Note this is into the src area.-->                                                                         
-     <delete file="${xml-commons-srcs.tar}"/>
-      
-    <!-- Ant ignores destdir arg if doclet is set, so must send to doclet in doclet subelement-->
-    <javadoc
-         public="true"
-         sourcepath="${src.dir}"
-         overview="${src.dir}/javadocOverview.html"
-         packagenames="org.apache.*,org.xml.*,org.w3c.*,javax.xml.*"
-         author="true"
-         version="true"
-         use="true"
-         windowtitle="${Name-in-docs} 2" 
-         doctitle="${Name-in-docs} 2"
-         bottom="Copyright &#169; ${year} Apache XML Project. All Rights Reserved.">
-          <classpath refid="docs.class.path" />
-          <doclet name="xalanjdoc.Standard" path="${doclet.jar}">
-            <param name="-d" value="${build.apidocs}"/>
-          </doclet>
-          <group title="Transformations API for XML (TrAX)" packages="javax.xml.transform*"/>
-          <group title="Java API for XML Parsing" packages="javax.xml.parsers"/>
-          <group title="Xalan Core"
-                 packages="org.apache.xalan.processor:org.apache.xalan.templates:org.apache.xalan.transformer"/>
-          <group title="XPath" packages="org.apache.xpath*"/>
-          <group title="Document Table Model (DTM)" packages="org.apache.xml.dtm*"/>          
-          <group title="Utilities" packages="org.apache.xml.utils*"/>
-          <group title="Xalan Other" packages="org.apache.xalan.client:org:org.apache.xalan.extensions:org.apache.xalan.res:org.apache.xalan.stree:org.apache.xalan.trace:org.apache.xalan.xslt"/>
-          <group title="Xalan Extensions" packages="org.apache.xalan.lib*"/>
-          <group title="Serializers" packages="org.apache.xalan.serialize"/>
-          <group title="SAX 2" packages="org.xml.sax*"/>
-          <group title="DOM 2" packages="org.w3c.dom*"/>
-          <group title="XSLTC Core"
-                 packages="org.apache.xalan.xsltc*"/>
-    </javadoc>
-    
-  </target>
-
-  <!-- =================================================================== -->
-  <!-- Various targets to clean the build tree                             -->
-  <!-- =================================================================== -->
-  <target name="distclean" depends="clean"
-    description="Clean everything, including dist/jar/docs/xsltc.*" >
-    <delete dir="${dist.dir}"/>
-  </target>
-
-  <target name="clean" depends="xsltc.clean"
-    description="Clean the ${build.dir} tree and doc outputs" >
-    <delete dir="${build.dir}"/>
-    <delete dir="${site.root}"/>
-    <delete>
-      <fileset dir="${xdocs.style}" excludes="${xalanonly-styledocs}"/>
-    </delete>
-    <delete file="${xdocs.DONE.file}"/>
-    <delete file="${xdocs.XSLTCDONE.location}"/>
-    <!-- Also delete files expanded from ${xml-commons-srcs.tar.gz}-->
-  </target>
- 
-  <target name="xsltc.clean"
-    description="Clean miscellaneous generated sources from xsltc.compile" >
-    <delete file="${generated.xpathparser}" />
-    <delete file="${generated.xpathsym}" />
-    <delete file="${generated.xpathlexer}" />
-  </target>
-
-  <!-- =================================================================== -->
-  <!-- Install/Uninstall targets - not currently applicable                -->
-  <!-- =================================================================== -->
-  <target name="install"><!-- 'Standardizing build.xml files' <bloritsch@apache.org> -->
-    <echo message="install target currently not supported in ${Name-in-docs}; try jar or dist instead"/>
-  </target>
-  <target name="uninstall"><!-- 'Standardizing build.xml files' <bloritsch@apache.org> -->
-    <echo message="uninstall target currently not supported in ${Name-in-docs}; try distclean instead"/>
-  </target>
-
-  <!-- =================================================================== -->
-  <!-- Creates the distribution                                            -->
-  <!-- =================================================================== -->
-  <target name="dist" depends="jar,docs,javadocs,samples,servlet,xsltc.jar,xsltc.docs,autodist"
-    description="Create a .zip/.tar.gz distribution module" >
-    <echo message="dist is human-useable target for distribution, with all dependencies"/>
-  </target>
-  <target name="autodist">
-    <echo message="autodist is for automated build processes, without dependencies"/>
-    <mkdir dir="${dist.dir}"/>
-    <mkdir dir="${dist.dir}/bin"/>    
-    <mkdir dir="${dist.dir}/src"/>
-    <mkdir dir="${dist.dir}/xdocs"/>
-    <mkdir dir="${dist.dir}/docs"/>
-    <mkdir dir="${dist.dir}/docs/apidocs"/>
-    <mkdir dir="${dist.dir}/samples"/>
-        
-    <!-- Copy bin directory, which includes preexisting checked-in .jar files -->
-    <copy todir="${dist.dir}/bin">
-      <!-- But skip copying old xerces.jar, which will be removed soon -->
-      <fileset dir="${bin.dir}" excludes="xerces.jar" />
-    </copy>  
-
-    <!-- Copy sources and source documentation -->
-    <copy todir="${dist.dir}/src">
-      <fileset dir="${src.dir}"/>
-    </copy>
-    <copy todir="${dist.dir}/xdocs">
-      <fileset dir="${xdocs.dir}"/>
-    </copy>
-    
-    <!-- Copy built documentation and javadoc, and samples src and jars -->
-    <copy todir="${dist.dir}/docs">
-      <fileset dir="${build.docs}"/>
-    </copy>  
-    <copy todir="${dist.dir}/samples">
-      <fileset dir="${samples.dir}"/>
-    </copy>   
-    <copy file="${build.dir}/xalansamples.jar" todir="${dist.dir}/bin"/>
-    <copy file="${build.dir}/xalanservlet.jar" todir="${dist.dir}/bin"/>
-
-    <!-- Copy various built product .jars into the bin directory 
-         of the distro, note that changes to what .jars we ship 
-         must also be duplicated in the appropriate patternsets 
-         below that actually define the contents of our two 
-         *-bin.zip/tar.gz and *-src.zip/tar.gz files.
-    -->
-    <copy file="${build.xalan.jar}" todir="${dist.dir}/bin" />
-    <copy file="${build.xsltc.jar}" todir="${dist.dir}/bin"/>
-
-    <copy todir="${dist.dir}">
-      <fileset dir="." includes="readme.html,KEYS,License,build.xml,build.sh,build.bat,xsltc_todo.xml,todo.xsl,commits.xml"/>
-    </copy>
-          
-    <!-- Build separate -src and -bin distros for both .zip and .tar.gz -->
-    <!-- Explicitly list xercesImpl.jar in patternsets since we 
-         always want Xerces in distros, immaterial of parser 
-         used to compile (at least for official builds) -->
-    <patternset id="bin-distro" >
-      <include name="${dist.file}/readme.html"/>
-      <include name="${dist.file}/License"/>
-      <include name="${dist.file}/KEYS"/>
-      <include name="${dist.file}/bin/${name}.jar"/>
-      <include name="${dist.file}/bin/${xmlapis.jar.name}"/>
-      <include name="${dist.file}/bin/xsltc.jar"/>
-      <include name="${dist.file}/bin/xercesImpl.jar"/>
-      <include name="${dist.file}/bin/${bsf.jar.name}"/>
-      <include name="${dist.file}/bin/xalansamples.jar"/>
-      <include name="${dist.file}/bin/xalanservlet.jar"/>
-      <include name="${dist.file}/samples/"/>
-      <include name="${dist.file}/docs/"/>
-    </patternset>
-    <patternset id="src-distro" >
-      <include name="${dist.file}/*"/>
-      <include name="${dist.file}/bin/ant*"/>
-      <include name="${dist.file}/bin/xercesImpl.jar"/>
-      <include name="${dist.file}/bin/${xmlapis.jar.name}"/>
-      <include name="${dist.file}/bin/${bsf.jar.name}"/>
-      <include name="${dist.file}/bin/${stylebook.jar.name}"/>
-      <include name="${dist.file}/bin/${doclet.jar.name}"/>
-      <include name="${dist.file}/samples/"/>
-      <include name="${dist.file}/src/"/>
-      <include name="${dist.file}/xdocs/"/>
-    </patternset>
-    <!-- For convenience, list the assorted XSLTC engine dependency
-         .jar files separately, since they go in both -bin and -src.
-    -->
-    <patternset id="xsltc-deps-jars" >
-      <include name="${dist.file}/bin/${bcel.jar.name}"/>
-      <include name="${dist.file}/bin/${java_cup.jar.name}"/>
-      <include name="${dist.file}/bin/${jlex.jar.name}"/>
-      <include name="${dist.file}/bin/${runtime.jar.name}"/>
-    </patternset>
-
-    <tar tarfile="${build.dir}/${dist.file}-bin.tar" >
-      <tarfileset dir="${build.dir}">
-        <patternset refid="bin-distro"/>
-        <patternset refid="xsltc-deps-jars"/>
-      </tarfileset>
-    </tar>
-    <gzip src="${build.dir}/${dist.file}-bin.tar" zipfile="${build.dir}/${dist.file}-bin.tar.gz"/>
-    <delete file="${build.dir}/${dist.file}-bin.tar" />
-
-    <tar tarfile="${build.dir}/${dist.file}-src.tar" >
-      <tarfileset dir="${build.dir}">
-        <patternset refid="src-distro"/>
-        <patternset refid="xsltc-deps-jars"/>
-      </tarfileset>
-    </tar>
-    <gzip src="${build.dir}/${dist.file}-src.tar" zipfile="${build.dir}/${dist.file}-src.tar.gz"/>
-    <delete file="${build.dir}/${dist.file}-src.tar" />
-
-    <zip zipfile="${build.dir}/${dist.file}-bin.zip" >
-      <fileset dir="${build.dir}">
-        <patternset refid="bin-distro"/>
-        <patternset refid="xsltc-deps-jars"/>
-      </fileset>
-    </zip>
-    <zip zipfile="${build.dir}/${dist.file}-src.zip" >
-      <fileset dir="${build.dir}">
-        <patternset refid="src-distro"/>
-        <patternset refid="xsltc-deps-jars"/>
-      </fileset>
-    </zip>
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Creates the documentation tree for the org.apache.xml website       -->
-  <!-- =================================================================== -->
-  <target name="site" depends="prepare.docs"
-    description="Build documentation for posting to the website" >
- 
-    <mkdir dir="${site.dir}/apidocs"/>
-    <mkdir dir="${site.dir}/compat_apidocs"/>
-    <mkdir dir="${site.dir}/design"/>
-    <java fork="yes" 
-          classname="${doc.generator}" 
-          classpathref="docs.class.path" >
-       <arg line="targetDirectory=${site.dir} ${site.book} ${xdocs.style}"/>
-    </java>
-
-    <!-- put todo.html in the site directory -->     
-    <copy file="${build.docs}/todo.html" todir="${site.dir}"/>
-    <!-- put xalan design doc in the site design subdir -->
-    <copy todir="${site.dir}/design">
-      <fileset dir="${build.docs}/design"/>
-    </copy>
-    <!-- put xsltc design doc in the site xsltc subdir -->
-    <copy todir="${site.dir}/xsltc">
-      <fileset dir="${build.docs}/xsltc"/>
-    </copy>  
-    
-    <!-- put in the javadoc -->
-    <copy todir="${site.dir}/apidocs">
-      <fileset dir="${build.apidocs}"/>
-    </copy>
-    <copy todir="${site.dir}/compat_apidocs">
-      <fileset dir="${build.compat.apidocs}"/>
-    </copy>  
-      
-  </target>
-   
-  <!-- =================================================================== -->
-  <!-- Compiles and runs mini/smoketest from xml-xalan\test, if present    -->
-  <!-- =================================================================== -->
-  <property name="test.relpath" value="../test"/>
-
-  <target name="minitest" depends="prepare,minitest-run,tests-not-available" 
-    description="Run the Minitest from xml-xalan/test" >
-    <!-- This target simply asks the minitest-run worker target to 
-         actually have the Minitest run (by the test/build.xml file);
-         we then also call the tests-not-available target in case 
-         the user never checked out the tests.
-    -->
-  </target>
-  <target name="minitest-run" if="tests-available" depends="jar" >
-    <echo message=" [minitest] Calling ${test.relpath}/build.xml to run the Minitest" />
-    <ant dir="${test.relpath}" antfile="build.xml" target="minitest.gump" >
-    </ant>
-  </target>
-
-  <target name="smoketest" depends="prepare,smoketest-run,tests-not-available" 
-    description="Run Smoketests (Minitest, conf, harness) from xml-xalan/test" >
-  </target>
-  <target name="smoketest-run" if="tests-available" depends="jar" >
-    <echo message=" [minitest] Calling ${test.relpath}/build.xml to run the Smoketest" />
-    <ant dir="${test.relpath}" antfile="build.xml" target="smoketest.dev" >
-    </ant>
-  </target>
-
-  <target name="check" depends="smoketest"><!-- 'Standardizing build.xml files' <bloritsch@apache.org> -->
-    <echo message="Redirect to smoketest target"/>
-  </target>
-
-  <!-- Called from various testing targets if the test dir doesn't exist. -->
-  <target name="tests-not-available" unless="tests-available" >
-    <echo message=" [tests] The tests do not seem to be present in ${test.relpath}" />
-    <echo message=" [tests] You must have checked out from CVS to run the tests," />
-    <echo message=" [tests]   it is not included in binary distributions." />
-    <echo message=" [tests] See http://xml.apache.org/xalan-j/test/ for more info." />
-  </target>
-
-  <!-- =================================================================== -->
-  <!-- Creates the xalan design document                                   -->
-  <!-- =================================================================== -->
-    <target name="xalan-j2-design">
-    <java fork="yes" 
-          classname="${doc.generator}" 
-          classpathref="docs.class.path" >
-      <arg line="loaderConfig=sbk:/style/loaderdesign.xml targetDirectory=${build.dir}/docs/design/
-      ${xdocs.dir}/sources/xalandesign.xml ${xdocs.style}"/>
-    </java>
-  </target>
-  
-  <!-- =================================================================== -->
-  <!-- Use FOP to create preliminary print (pdf) doc                       -->
-  <!-- Note: fop.jar and xml.jar (from xml-fop) must be on classpath       -->
-  <!-- This is VERY preliminary, not yet for inclusion in distribution     -->
-  <!-- =================================================================== -->
-  <!--Collate the xml sources into a single xml source with a litle extra structure -->
-  <target name="printerdocs" depends="prepare.docs">
-    <echo message="NOTICE: requires fop.jar and xml.jar on the classpath"/>
-    <java fork="yes" 
-          classname="${xalan.cmdline.class}"
-          classpathref="docs.class.path" >
-      <arg line="-xsl ${xdocs.dir}/sources/xalan-collate.xsl 
-                 -out xdocs/sources/xalan/xalan-collate.xml"/>
-    </java>
-    
-    <!-- Transform collation into Formatting Objects 
-         (with a little work on links along the way) -->    
-    <java fork="yes" 
-          classname="${xalan.cmdline.class}"
-          classpathref="docs.class.path" >
-      <arg line="-in  ${xdocs.dir}/sources/xalan/xalan-collate.xml
-                 -param resourceFile '../../sources/xalan/resources.xml'
-                 -param project ${Name-in-docs}      
-                 -xsl ${xdocs.style}/stylesheets/xml2fo.xsl 
-                 -out build/docs/xalan-collate.fo"/>
-    </java>
-    
-    <!-- Use FOP to generate a pdf file (classpath may need updating! -sc 18-Apr-01)-->
-    <java fork="yes" 
-          classname="org.apache.fop.apps.CommandLine"
-      classpath="${java.class.path}:${build.xalan.jar}:${bin.dir}/fop.jar:${bin.dir}/w3c.jar">
-      <arg line="${build.docs}/xalan-collate.fo build/docs/xalan.pdf"/>
-    </java>
-  </target>
-
- 
-  <!-- =================================================================== -->
-  <!-- Build XSLTC design documentation. Eventually intend to incorporate -->
-  <!-- XSLTC into the Xalan book.                                         -->
-  <!-- =================================================================== -->
-
-
-  <target name="xsltc.prepare.docs" depends="prepare.docs">
-      <echo message="Transform xsltc_todo.xml and put the result in ${build.docs}/xsltc"/>
-   <mkdir dir="${build.docs}/xsltc"/>
-    <java fork="yes" classname="${xalan.cmdline.class}">
-      <classpath refid="docs.class.path" />
-      <arg line="-in xsltc_todo.xml -xsl todo.xsl -out build/docs/xsltc/todo.html"/>
-    </java>
-  </target>  
- 
- <target name="xsltc.docs" depends="xsltc.prepare.docs">
-   <echo message="Build the XSLTC Architectural documentation"/>
-   <java fork="yes" 
-         classname="${doc.generator}" 
-         classpathref="docs.class.path" >
-      <arg line="targetDirectory=${build.docs}/xsltc ${xdocs.dir}/sources/xsltc.xml ${xdocs.style}"/>
-    </java>	 
- </target>
- 
-   <!-- pack all doc for transfer to website -->
- <target name="pack.docs">
-    <!--tar tarfile="./build/xalan-j-docs.tar" basedir="./xml-site/target/xalan-j" includes="**"/>
-    <gzip src="./build/xalan-j-docs.tar" zipfile="./build/xalan-j-docs.tar.gz"/-->
-    <zip zipfile="./build/xalan-j-docs.zip" basedir="./xml-site/target/xalan-j" includes="**"/>
-  </target>
-
- 
-</project>
diff --git a/commits.xml b/commits.xml
deleted file mode 100644
index c12e0e8..0000000
--- a/commits.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0"?>
-<Commits>
-<Commit category="core">
-<Who>johng@apache.org</Who>
-<DateCommitted>01/17/2002</DateCommitted>
-<Modified>java/src/org/apache/xalan/lib/sql XConnection.java</Modified>
-<Log>Fixed second connection problem</Log>
-</Commit>
-<Commit category="core">
-<Who>johng@apache.org</Who>
-<DateCommitted>01/17/2002</DateCommitted>
-<Modified>java/src/org/apache/xalan/lib/sql SQLDocument.java</Modified>
-<Log>Update for new DTM Model</Log>
-</Commit>
-<Commit category="core">
-<Who>johng@apache.org</Who>
-<DateCommitted>01/17/2002</DateCommitted>
-<Modified>java/src/org/apache/xalan/lib/sql DTMDocument.java</Modified>
-<Log>Update for new DTM Model</Log>
-</Commit>
-<Commit category="core">
-<Who>johng@apache.org</Who>
-<DateCommitted>01/17/2002</DateCommitted>
-<Modified>java/src/org/apache/xalan/lib/sql SQLDocument.java
- DTMDocument.java</Modified>
-<Log>Removed Debug</Log>
-</Commit>
-<Commit category="core">
-<Who>jkesselm@apache.org</Who>
-<DateCommitted>01/18/2002</DateCommitted>
-<Modified>java/src/org/apache/xml/utils FastStringBuffer.java</Modified>
-<Log>Whups. There's a possible reentrancy problem when data
- is being serialized from an FSB, thru Sax, back into a new
- chunk of the same FSB; if the append causes a rechunking,
- the serialize loop may break.
-
- TEMPORARY PATCH; permanant fix to follow. See comments.</Log>
-</Commit>
-<Commit category="core">
-<Who>jkesselm@apache.org</Who>
-<DateCommitted>01/18/2002</DateCommitted>
-<Modified>java/src/org/apache/xml/utils SuballocatedIntVector.java</Modified>
-<Log>&lt;blush&gt;Wrong side of the fencepost...&lt;/blush></Log>
-</Commit>
-</Commits>
diff --git a/compat_src/compatOverview.html b/compat_src/compatOverview.html
deleted file mode 100644
index cf64817..0000000
--- a/compat_src/compatOverview.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<HTML><HEAD></HEAD><BODY>
-    <P>This compatibility API supports limited use of the Xalan-Java 1 API in the Xalan-Java 2 environment. For the Xalan-Java 2 API, see <A href="../apidocs/index.html" target="_top">Xalan-Java 2 API</A>.</P>
-  
-     <P><B>Basic procedure for performing transformations:</B></P>
-    <OL>
-      <LI>Use one of the {@link org.apache.xalan.xslt.XSLTProcessorFactory} static getProcessor methods to
-      instantiate an {@link org.apache.xalan.xslt.XSLTProcessor}.<BR><BR>
-       The XSLT and XPath engines are independent from any given DOM or XML implementation. All parser-dependent
-       calls are funneled through the {@link org.apache.xalan.xpath.xml.XMLParserLiaison}.<BR><BR></LI>     
-       <LI>Set up {@link org.apache.xalan.xslt.XSLTInputSource} objects for the XML input and XSL stylesheet. 
-       You can use a file name or URL, character stream, byte stream, or SAX input stream to instantiate an
-       XSLTInputSource object.<BR><BR>
-       If the XML document contains a stylesheet Processing Instruction (PI), you do not need to create a separate
-       XSLTInputSource object for an XSL stylesheet.<BR><BR>
-       <B>Note:</B> For improved performance with a series of transformations, use the XSLTProcessor
-       processStylesheet method to compile the XSL stylesheet. The result is a 
-       {@link org.apache.xalan.xslt.StylesheetRoot} object with its own process() method for performing transformations.
-        Compiling the stylesheet is also useful when you need to get information from the
-       stylesheet before the transformation occurs. You also must compile the stylesheet if you are using the
-        XSLTProcessor as a SAX document handler.<BR><BR></LI>
-       <LI>Set up an {@link org.apache.xalan.xslt.XSLTResultTarget} for the transformation output. You can use a
-       file name or URL, character stream, byte stream, or SAX document handler to instantiate an XSLTResultTarget
-       object.<BR><BR></LI>
-       <LI>Use the XSLTProcessor or (if you have compiled the stylesheet) the(@link org.apache.xalan.xslt.StylesheetRoot}
-       process method to perform the transformation.<BR><BR>
-        Xalan-Java is thread-safe for one instance per thread. If you are using the same instance of XSLTProcessor to
-         perform more than one transformation, call the reset method between transformations.</LI>
-    </OL>
-  </BODY></HTML>
\ No newline at end of file
diff --git a/compat_src/org/apache/xalan/xpath/XBoolean.java b/compat_src/org/apache/xalan/xpath/XBoolean.java
deleted file mode 100644
index 00e72ed..0000000
--- a/compat_src/org/apache/xalan/xpath/XBoolean.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-
-/**
- * <meta name="usage" content="advanced"/>
- * This class represents an XPath boolean object, and is capable of 
- * converting the boolean to other types, such as a string.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XBoolean extends XObject
-{
-  org.apache.xpath.objects.XBoolean m_xboolean;
-  
-  /**
-   * Construct a XBoolean object.
-   */
-  public XBoolean(boolean b)
-  {
-    super(); 
-     m_xboolean = new org.apache.xpath.objects.XBoolean(b);
-  }
-  
-  /**
-   * Tell that this is a CLASS_BOOLEAN.
-   */
-  public int getType()
-  {
-    return m_xboolean.getType();
-  }
-  
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  public String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return m_xboolean.getTypeString();
-  }
-  
-  /**
-   * Cast result object to a number.
-   */
-  public double num()
-  {
-    return m_xboolean.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-  {
-    return m_xboolean.bool();
-  }
-
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xboolean.str();
-  }
-  
-  /**
-   * Return a java object that's closes to the represenation 
-   * that should be handed to an extension.
-   */
-  public Object object()
-  {
-    return m_xboolean.object();
-  }
-
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {    
-    return m_xboolean.equals(obj2);
-  }
-  
-  
-}
-
diff --git a/compat_src/org/apache/xalan/xpath/XBooleanStatic.java b/compat_src/org/apache/xalan/xpath/XBooleanStatic.java
deleted file mode 100644
index 4669bca..0000000
--- a/compat_src/org/apache/xalan/xpath/XBooleanStatic.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-
-/**
- * <meta name="usage" content="internal"/>
- * This class doesn't have any XPathSupport, so override 
- * whatever to ensure it works OK.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XBooleanStatic extends XBoolean
-{
-  org.apache.xpath.objects.XBooleanStatic m_xboolean;
-  
-  /**
-   * Construct a XNodeSet object.
-   */
-  public XBooleanStatic(boolean b)
-  {
-    super(b); 
-    m_xboolean = new org.apache.xpath.objects.XBooleanStatic(b);
-  } 
-  
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {
-    return m_xboolean.equals(obj2);
-  }
-
-}
-
diff --git a/compat_src/org/apache/xalan/xpath/XNodeSet.java b/compat_src/org/apache/xalan/xpath/XNodeSet.java
deleted file mode 100644
index 819690c..0000000
--- a/compat_src/org/apache/xalan/xpath/XNodeSet.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-import org.w3c.dom.Text;
-import org.w3c.dom.traversal.NodeIterator;
-import org.w3c.dom.traversal.NodeFilter;
-import java.text.*;
-
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.NodeSet;
-import org.apache.xpath.DOMHelper;
-import org.apache.xml.dtm.ref.DTMNodeIterator;
-import org.apache.xml.dtm.ref.DTMNodeList;
-import org.apache.xml.dtm.ref.DTMManagerDefault;
-import org.apache.xml.dtm.DTM;
-
-/**
- * <meta name="usage" content="general"/>
- * This class represents an XPath nodeset object, and is capable of 
- * converting the nodeset to other types, such as a string.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XNodeSet extends XObject  
-{
-  org.apache.xpath.objects.XNodeSet m_xnodeset;
-  DTMManagerDefault dtmMgr = new DTMManagerDefault(); 
-  
-  /**
-   * Construct a XNodeSet object.
-   */
-  public XNodeSet(NodeList val)
-  {
-    super();
-    int node = dtmMgr.getDTMHandleFromNode(val.item(0));
-    m_xnodeset = new org.apache.xpath.objects.XNodeSet(dtmMgr.createDTMIterator(node)) ;
-  }
-  
-  /**
-   * Construct an empty XNodeSet object.
-   */
-  public XNodeSet()
-  {
-    super();
-    m_xnodeset = new org.apache.xpath.objects.XNodeSet(dtmMgr);
-  }
-
-  /**
-   * Construct a XNodeSet object for one node.
-   */
-  public XNodeSet(Node n)
-  {
-    super(n);    
-    m_xnodeset = new org.apache.xpath.objects.XNodeSet(dtmMgr.getDTMHandleFromNode(n), dtmMgr);
-  }
-  
-  
-  /**
-   * Tell that this is a CLASS_NODESET.
-   */
-  public int getType()
-  {
-    return m_xnodeset.getType();
-  }
-  
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  public String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return m_xnodeset.getTypeString();
-  }
-  
-  /**
-   * Get the string conversion from a single node.
-   */
-  double getNumberFromNode(Node n)
-  {
-    return m_xnodeset.getNumberFromNode(dtmMgr.getDTMHandleFromNode(n));
-  }
-
-  /**
-   * Cast result object to a number.
-   */
-  public double num()
-  {
-    return m_xnodeset.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-  {
-    return m_xnodeset.bool();
-  }
-  
-
-  /**
-   * Get the string conversion from a single node.
-   */
-  static String getStringFromNode(Node n)
-  {
-    switch (n.getNodeType())
-    {
-    case Node.ELEMENT_NODE :
-    case Node.DOCUMENT_NODE :
-      return DOMHelper.getNodeData(n);
-    case Node.CDATA_SECTION_NODE :
-    case Node.TEXT_NODE :
-      return ((Text) n).getData();
-    case Node.COMMENT_NODE :
-    case Node.PROCESSING_INSTRUCTION_NODE :
-    case Node.ATTRIBUTE_NODE :
-      return n.getNodeValue();
-    default :
-      return DOMHelper.getNodeData(n);
-    }
-  }
-  
-
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xnodeset.str();
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   */
-  public DocumentFragment rtree(XPathSupport support)
-  {    
-    return rtree((XPathContext) support);
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   *
-   * @param support The XPath context to use for the conversion 
-   *
-   * @return the nodeset as a result tree fragment.
-   */
-  public DocumentFragment rtree(XPathContext support)
-  {
-    org.apache.xpath.XPathContext context = (org.apache.xpath.XPathContext)support;
-    return m_xnodeset.rtree(context);
-    //return (DocumentFragment)context.getDTMManager().getDTM(result).getNode(result);    
-  }
-
-  /**
-   * Cast result object to a nodelist.
-   */
-  public NodeList nodeset() throws javax.xml.transform.TransformerException
-  {
-    return new DTMNodeList(m_xnodeset.iter());
-  }  
-
-  /**
-   * Cast result object to a nodelist.
-   */
-  public NodeList mutableNodeset()
-  {
-   return new DTMNodeList(m_xnodeset.mutableNodeset());
-  }  
-  
-  /**
-   * Tell if one object is less than the other.
-   */
-  public boolean lessThan(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xnodeset.lessThan(obj2.m_xObject);
-  }
-  
-  /**
-   * Tell if one object is less than or equal to the other.
-   */
-  public boolean lessThanOrEqual(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xnodeset.lessThanOrEqual(obj2.m_xObject);
-  }
-  
-  /**
-   * Tell if one object is greater than the other.
-   */
-  public boolean greaterThan(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xnodeset.greaterThan(obj2.m_xObject);
-  }
-  
-  /**
-   * Tell if one object is greater than the other.
-   */
-  public boolean greaterThanOrEqual(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xnodeset.greaterThanOrEqual(obj2.m_xObject);
-  }   
-  
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {
-    return m_xnodeset.equals(obj2);
-  }  
-  
-  /**
-   * Tell if two objects are functionally not equal.
-   */
-  public boolean notEquals(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xnodeset.notEquals(obj2.m_xObject);
-  }  
- 
- static class NodeIteratorWrapper extends org.apache.xpath.NodeSetDTM
-  {
-
-    /** Position of next node          */
-    private int m_pos = 0;
-
-    /** Document fragment instance this will wrap         */
-    private NodeList m_list;
-    private org.apache.xml.dtm.DTMManager dtmManager; 
-
-    /**
-     * Constructor NodeIteratorWrapper
-     *
-     *
-     * @param df Document fragment instance this will wrap
-     */
-    NodeIteratorWrapper(NodeList list)
-    {
-      super(new org.apache.xml.dtm.ref.DTMManagerDefault());
-      m_list = list;
-      dtmManager = getDTMManager(); 
-    }
-
-  
-    /**
-     *  Returns the next node in the set and advances the position of the
-     * iterator in the set. After a NodeIterator is created, the first call
-     * to nextNode() returns the first node in the set.
-     * @return  The next <code>Node</code> in the set being iterated over, or
-     *   <code>null</code> if there are no more members in that set.
-     * @throws DOMException
-     *    INVALID_STATE_ERR: Raised if this method is called after the
-     *   <code>detach</code> method was invoked.
-     */
-    public int nextNode() throws DOMException
-    {
-
-      Node n;
-      if (m_pos < m_list.getLength())
-      {
-       n = m_list.item(m_pos++);
-       return dtmManager.getDTMHandleFromNode(n);
-      }
-      
-      else
-        return DTM.NULL;
-    }
-
-    /**
-     *  Returns the previous node in the set and moves the position of the
-     * iterator backwards in the set.
-     * @return  The previous <code>Node</code> in the set being iterated over,
-     *   or<code>null</code> if there are no more members in that set.
-     * @throws DOMException
-     *    INVALID_STATE_ERR: Raised if this method is called after the
-     *   <code>detach</code> method was invoked.
-     */
-    public int previousNode() throws DOMException
-    {
-
-      Node n;
-      if (m_pos >0)
-      {
-        n = m_list.item(m_pos-1);
-        return dtmManager.getDTMHandleFromNode(n);
-      }
-      else
-        return DTM.NULL;
-    }
-
-    /**
-     *  Detaches the iterator from the set which it iterated over, releasing
-     * any computational resources and placing the iterator in the INVALID
-     * state. After<code>detach</code> has been invoked, calls to
-     * <code>nextNode</code> or<code>previousNode</code> will raise the
-     * exception INVALID_STATE_ERR.
-     */
-    public void detach(){}
-  }
-  
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/XNull.java b/compat_src/org/apache/xalan/xpath/XNull.java
deleted file mode 100644
index d7e46b6..0000000
--- a/compat_src/org/apache/xalan/xpath/XNull.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-import org.w3c.dom.traversal.NodeIterator;
-
-import org.apache.xpath.XPathContext;
-
-/**
- * <meta name="usage" content="general"/>
- * This class represents an XPath null object, and is capable of 
- * converting the null to other types, such as a string.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XNull extends XObject
-{
-  org.apache.xpath.objects.XNull m_xnull;
-  /**
-   * Create an XObject.
-   */
-  public XNull()
-  {
-    super();
-    m_xnull = new org.apache.xpath.objects.XNull() ;
-  }
-  
-  /**
-   * Tell what kind of class this is.
-   */
-  public int getType()
-  {
-    return m_xnull.getType();
-  }
-
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  public String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return m_xnull.getTypeString();
-  }
-  
-  /**
-   * Cast result object to a number.
-   */
-  public double num()
-  {
-    return m_xnull.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-  {
-    return m_xnull.bool();
-  }
-
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xnull.str();
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   */
-  public DocumentFragment rtree(XPathSupport support)
-  {
-    return rtree((XPathContext)support);
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   *
-   * @param support XPath context to use for the conversion
-   *
-   * @return The object as a result tree fragment.
-   */
-  public DocumentFragment rtree(XPathContext support)
-  {
-    org.apache.xpath.XPathContext context = (org.apache.xpath.XPathContext)support;
-    return m_xnull.rtree(context);
-    //return (DocumentFragment)context.getDTMManager().getDTM(result).getNode(result);    
-  } 
-
-  /**
-   * Cast result object to a nodelist.
-   */
-  public NodeList nodeset()
-  {
-    return null;
-  }  
-   
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-  {
-    return m_xnull.equals(obj2);
-  }
-
-  
-}
diff --git a/compat_src/org/apache/xalan/xpath/XNumber.java b/compat_src/org/apache/xalan/xpath/XNumber.java
deleted file mode 100644
index 79e1b0d..0000000
--- a/compat_src/org/apache/xalan/xpath/XNumber.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-import java.text.DecimalFormat;
-
-/**
- * <meta name="usage" content="general"/>
- * This class represents an XPath number, and is capable of 
- * converting the number to other types, such as a string.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XNumber extends XObject
-{
-  
-  org.apache.xpath.objects.XNumber m_xnumber;
-  /**
-   * Construct a XNodeSet object.
-   */
-  public XNumber(double d)
-  {
-    super();
-    m_xnumber = new org.apache.xpath.objects.XNumber(d);
-  }
-  
-  /**
-   * Tell that this is a CLASS_NUMBER.
-   */
-  public int getType()
-  {
-    return m_xnumber.getType();
-  }
-  
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  public String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return m_xnumber.getTypeString();
-  }
-  
-  /**
-   * Cast result object to a number.
-   */
-  public double num()
-  {
-    return m_xnumber.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-  {
-    return m_xnumber.bool();
-  }
-  
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xnumber.str();
-  }
-  
-  /**
-   * Return a java object that's closes to the represenation 
-   * that should be handed to an extension.
-   */
-  public Object object()
-  {
-    return m_xnumber.object();
-  }
-
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {
-    return m_xnumber.equals(obj2);
-  }
-  
-  
-}
-
diff --git a/compat_src/org/apache/xalan/xpath/XObject.java b/compat_src/org/apache/xalan/xpath/XObject.java
deleted file mode 100644
index 12639bb..0000000
--- a/compat_src/org/apache/xalan/xpath/XObject.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * The Apache Software License, Version 1.1 
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>. 
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-import java.io.Serializable;
-import org.apache.xpath.res.XPATHErrorResources;
-import org.apache.xalan.res.XSLMessages;
-
-
-/**
- * <meta name="usage" content="general"/>
- * This class represents an XPath object, and is capable of 
- * converting the object to various types, such as a string.
- * This class acts as the base class to other XPath type objects, 
- * such as XString, and provides polymorphic casting capabilities.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XObject extends Object implements Serializable    
-{
-  org.apache.xpath.objects.XObject m_xObject;
-  
-  /**
-   * Create an XObject.
-   */
-  public XObject()
-  {
-    m_xObject = new org.apache.xpath.objects.XObject() ;
-  }
-
-  /**
-   * Create an XObject.
-   */
-  public XObject(Object obj)
-  {
-    m_xObject = new org.apache.xpath.objects.XObject(obj) ;
-  }
-  
-    /**
-   * Tell what kind of class this is.
-   */
-  public int getType()
-  {
-    return m_xObject.getType();
-  }
-
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  protected String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return "#UNKNOWN";
-  }
-  
-  /**
-   * Cast result object to a number.
-   */
-  public double num()
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-	  return m_xObject.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xObject.bool();
-  }
-
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xObject.str();
-  }
-  
-  public String toString()
-  {
-    return m_xObject.toString();
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   */
-  public DocumentFragment rtree(XPathSupport support)
-  {
-    org.apache.xpath.XPathContext context = (org.apache.xpath.XPathContext)support;
-    return m_xObject.rtree(context);
-    //return  (DocumentFragment)context.getDTMManager().getDTM(result).getNode(result);         
-  }
-  
-  /**
-   * For functions to override.
-   */
-  public DocumentFragment rtree()
-  {
-    return null;
-  }
-  
-  /**
-   * Return a java object that's closes to the represenation 
-   * that should be handed to an extension.
-   */
-  public Object object()
-  {
-    return m_xObject.object();
-  }
-
-  /**
-   * Cast result object to a nodelist.
-   */
-  public NodeList nodeset()
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    error(XPATHErrorResources.ER_CANT_CONVERT_TO_NODELIST, new Object[] {getTypeString()}); //"Can not convert "+getTypeString()+" to a NodeList!");
-    return null;
-  }  
-  
-  /**
-   * Cast result object to a nodelist.
-   */
-  public NodeList mutableNodeset()
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return new org.apache.xml.dtm.ref.DTMNodeList(m_xObject.mutableNodeset());
-  }  
- 
-  /**
-   * Cast object to type t.
-   */
-  public Object castToType(int t, XPathSupport support)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {   
-    return m_xObject.castToType(t, (org.apache.xpath.XPathContext) support);
-  }
-
-  /**
-   * Tell if one object is less than the other.
-   */
-  public boolean lessThan(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-   
-    return m_xObject.lessThan(obj2.m_xObject);
-  }
-
-  /**
-   * Tell if one object is less than or equal to the other.
-   */
-  public boolean lessThanOrEqual(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xObject.lessThanOrEqual(obj2.m_xObject);
-  }
-
-  /**
-   * Tell if one object is less than the other.
-   */
-  public boolean greaterThan(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xObject.greaterThan(obj2.m_xObject);
-  }
-
-  /**
-   * Tell if one object is less than the other.
-   */
-  public boolean greaterThanOrEqual(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xObject.greaterThanOrEqual(obj2.m_xObject);
-  }
-
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {
-    return m_xObject.equals(obj2.m_xObject);
-  }
-  
-  /**
-   * Tell if two objects are functionally not equal.
-   */
-  public boolean notEquals(XObject obj2)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    return m_xObject.notEquals(obj2.m_xObject);
-  }
-
-  /**
-   * Tell the user of an error, and probably throw an 
-   * exception.
-   */
-  protected void error(int msg)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-	  error (msg, null);
-  }	   
-
-  /**
-   * Tell the user of an error, and probably throw an 
-   * exception.
-   */
-  protected void error(int msg, Object[] args)
-    throws org.xml.sax.SAXException, javax.xml.transform.TransformerException
-  {
-    String fmsg = XSLMessages.createXPATHMessage(msg, args);
-
-    
-    throw new org.xml.sax.SAXException(fmsg);
-  }
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/XPathSupport.java b/compat_src/org/apache/xalan/xpath/XPathSupport.java
deleted file mode 100644
index cfb19f3..0000000
--- a/compat_src/org/apache/xalan/xpath/XPathSupport.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-import java.util.*;
-import java.net.URL;
-import org.xml.sax.*;
-
-
-
-
-/**
- * <meta name="usage" content="advanced"/>
- * Provides basic support for independent use of XPath.  This interface 
- * is used in order that there may be loose coupling between the 
- * XPath package and the support services, such as the variable store, 
- * parser services, DOM implementation, etc.  Most if all implementations
- * of this should derive from XPathSupportDefault (hence, it should 
- * probably be an abstract class instead of an interface).
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public interface XPathSupport 
-{
-  
-}
diff --git a/compat_src/org/apache/xalan/xpath/XPathSupportDefault.java b/compat_src/org/apache/xalan/xpath/XPathSupportDefault.java
deleted file mode 100644
index b898b32..0000000
--- a/compat_src/org/apache/xalan/xpath/XPathSupportDefault.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import java.util.*;
-import org.w3c.dom.*;
-
-
-
-/**
- * <meta name="usage" content="advanced"/>
- * Default class for execution context when XPath is used by itself. Many 
- * of the functions in this class need to be overridden in order to 
- * perform correct execution of the XPath (for instance, variable 
- * execution).  This class will likely eventually replace XMLParserLiaisons.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XPathSupportDefault extends org.apache.xpath.XPathContext implements XPathSupport 
-{
-  
-}
diff --git a/compat_src/org/apache/xalan/xpath/XRTreeFrag.java b/compat_src/org/apache/xalan/xpath/XRTreeFrag.java
deleted file mode 100644
index b9a2984..0000000
--- a/compat_src/org/apache/xalan/xpath/XRTreeFrag.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-import org.w3c.dom.*;
-
-/**
- * <meta name="usage" content="general"/>
- * This class represents an XPath result tree fragment object, and is capable of 
- * converting the RTF to other types, such as a string.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XRTreeFrag extends XObject 
-{ 
-  
-  org.apache.xpath.objects.XRTreeFrag m_xrtreefrag;
-  org.apache.xpath.XPathContext context = new org.apache.xpath.XPathContext();
-    
-  
-  /**
-   * Create an XObject.
-   */
-  public XRTreeFrag(DocumentFragment frag)
-  {
-    super(frag);   
-    m_xrtreefrag = new org.apache.xpath.objects.XRTreeFrag(context.getDTMHandleFromNode(frag), context); 
-  }
-  
-  /**
-   * Tell what kind of class this is.
-   */
-  public int getType()
-  {
-    return m_xrtreefrag.getType();
-  }
-
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  public String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return m_xrtreefrag.getTypeString();
-  }
-  
-  /**
-   * Cast result object to a number.
-   */
-  public double num() throws javax.xml.transform.TransformerException
-  {    
-    return m_xrtreefrag.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-  {
-    return m_xrtreefrag.bool();
-  }
-
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xrtreefrag.str();
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   */
-  public DocumentFragment rtree()
-  {
-    return m_xrtreefrag.rtree(context);
-    //return  (DocumentFragment)context.getDTMManager().getDTM(result).getNode(result);    
-  }  
-  
-  /**
-   * Cast result object to a nodelist. (special function).
-   */
-  public NodeList convertToNodeset()
-  {
-    return ((DocumentFragment)this.object()).getChildNodes();    
-  }  
-  
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {   
-      return m_xrtreefrag.equals(obj2);    
-  }
-  
-  
-}
diff --git a/compat_src/org/apache/xalan/xpath/XString.java b/compat_src/org/apache/xalan/xpath/XString.java
deleted file mode 100644
index b0e79ae..0000000
--- a/compat_src/org/apache/xalan/xpath/XString.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath;
-
-
-import org.w3c.dom.*;
-
-import org.apache.xpath.XPathContext;
-/**
- * <meta name="usage" content="general"/>
- * This class represents an XPath string object, and is capable of 
- * converting the string to other types, such as a number.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XString extends XObject
-{
-  
-  org.apache.xpath.objects.XString m_xstring;
-  
-  /**
-   * Construct a XString object.
-   */
-  public XString(String val)
-  {
-    super(val);
-    m_xstring = new org.apache.xpath.objects.XString(val);
-  }
-  
-   /**
-   * Tell that this is a CLASS_STRING.
-   */
-  public int getType()
-  {
-    return m_xstring.getType();
-  }
-  
-  /**
-   * Given a request type, return the equivalent string. 
-   * For diagnostic purposes.
-   */
-  public String getTypeString() // PR:DMAN4MBJ4D Submitted by:<garyp@firstech.com> change to protected
-  {
-    return m_xstring.getTypeString();
-  }
-  
-  /**
-   * Cast a string to a number.
-   */
-  public static double castToNum(String s)
-  {  
-    double result;
-
-    if (null == s)
-      result = 0.0;
-    else
-    {
-      try
-      {
-
-        /**
-         * TODO: Adjust this for locale. Need to take into
-         * account the lang parameter on the xsl:sort
-         */
-
-        // It seems we can not use this as it just parses the 
-        // start of the string until it finds a non-number char, 
-        // which is not what we want according to the XSLT spec.  
-        // Also, I *think* this is a local-specific
-        // parse, which is also not what we want according to the 
-        // XSLT spec (see below).
-        // NumberFormat formatter = NumberFormat.getNumberInstance();
-        // result = formatter.parse(s.trim()).doubleValue();
-        // The dumb XSLT spec says: "The number function should 
-        // not be used for conversion of numeric data occurring 
-        // in an element in an XML document unless the element 
-        // is of a type that represents numeric data in a 
-        // language-neutral format (which would typically be 
-        // transformed into a language-specific format for 
-        // presentation to a user). In addition, the number 
-        // function cannot be used unless the language-neutral 
-        // format used by the element is consistent with the 
-        // XPath syntax for a Number."
-        // So I guess we need to check, if the default local 
-        // is french, does Double.valueOf use the local specific 
-        // parse?  Or does it use the ieee parse?
-        result = Double.valueOf(s.trim()).doubleValue();
-      }
-
-      // catch (ParseException e) 
-      catch (NumberFormatException nfe)
-      {
-        result = Double.NaN;
-      }
-    }
-
-    return result;  
-  }
-  
-  /**
-   * Cast result object to a number.
-   */
-  public double num()
-  {
-    return m_xstring.num();
-  }
-
-  /**
-   * Cast result object to a boolean.
-   */
-  public boolean bool()
-  {
-    return m_xstring.bool();
-  }
-
-  /**
-   * Cast result object to a string.
-   */
-  public String str()
-  {
-    return m_xstring.str();
-  }
-  
-  /**
-   * Cast result object to a result tree fragment.
-   */
-  public DocumentFragment rtree(XPathSupport support)
-  {  
-    org.apache.xpath.XPathContext context = (org.apache.xpath.XPathContext)support;
-    return m_xstring.rtree(context);
-    //return (DocumentFragment)context.getDTMManager().getDTM(result).getNode(result);    
-  }
-  
-  
-  /**
-   * Cast result object to a result tree fragment.
-   *
-   * @param support Xpath context to use for the conversion 
-   *
-   * @return A document fragment with this string as a child node
-   */
-  public DocumentFragment rtree(XPathContext support)
-  {
-    org.apache.xpath.XPathContext context = (org.apache.xpath.XPathContext)support;
-    return m_xstring.rtree(context);
-    //return (DocumentFragment)context.getDTMManager().getDTM(result).getNode(result);    
-  } 
-  
-  
-  /**
-   * Tell if two objects are functionally equal.
-   */
-  public boolean equals(XObject obj2)
-    throws org.xml.sax.SAXException
-  {
-    return m_xstring.equals(obj2);
-  }
-
-  
-}
diff --git a/compat_src/org/apache/xalan/xpath/package.html b/compat_src/org/apache/xalan/xpath/package.html
deleted file mode 100644
index 29a55da..0000000
--- a/compat_src/org/apache/xalan/xpath/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<HTML><HEAD></HEAD><BODY>
-     <P>Infrastructure for processing XPATH expressions</P>
-   
-     <P></P>
-   </BODY></HTML>
\ No newline at end of file
diff --git a/compat_src/org/apache/xalan/xpath/xdom/XercesLiaison.java b/compat_src/org/apache/xalan/xpath/xdom/XercesLiaison.java
deleted file mode 100644
index 8c4478b..0000000
--- a/compat_src/org/apache/xalan/xpath/xdom/XercesLiaison.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xdom;
-
-import java.net.*;
-import java.io.*;
-import java.util.*;
-import org.apache.xerces.dom.*;
-import org.apache.xerces.parsers.*;
-import org.apache.xerces.framework.*;
-import org.xml.sax.*;
-import org.w3c.dom.*;
-import org.apache.xalan.xpath.xml.*;
-import org.apache.xalan.xpath.*;
-import org.apache.xpath.res.XPATHErrorResources;
-import org.apache.xalan.res.XSLMessages;
-
-import javax.xml.transform.TransformerException;
-import javax.xml.parsers.*;
-
-
-/**
- * <meta name="usage" content="general"/>
- * Provides XSLTProcessor an interface to the Xerces XML parser.  This 
- * liaison should be used if Xerces DOM nodes are being process as 
- * the source tree or as the result tree.
- * @see org.apache.xalan.xslt.XSLTProcessor
- * @see org.apache.xml.parsers
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XercesLiaison extends XMLParserLiaisonDefault //implements XPathSupport
-{
-  /**
-   * Return a string suitible for telling the user what parser is being used.
-   */
-  public String getParserDescription()
-  {
-    return "XML4J Version "+ getXML4JVersionString();
-  }
-
-	private org.xml.sax.ErrorHandler m_errorHandler;
-  /**
-   * Constructor that takes SAX ErrorHandler as an argument. The error handler
-   * is registered with the XML Parser. Any XML-related errors will be reported
-   * to the calling application using this error handler.
-   *
-   * @param	errorHandler SAX ErrorHandler instance.
-   */
-  public XercesLiaison(org.xml.sax.ErrorHandler errorHandler)
-  {
-    m_errorHandler = errorHandler;
-  }
-
-  /**
-   * Construct an instance.
-   *
-  public XercesLiaison(XPathEnvSupport envSupport)
-  {
-    m_envSupport = envSupport;
-  }*/
-
-  /**
-   * Construct an instance.
-   */
-  public XercesLiaison()
-  {
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Check node to see if it matches this liaison.
-   */
-  public void checkNode(Node node)
-    throws TransformerException
-  {
-    if(!(node instanceof org.apache.xerces.dom.NodeImpl))
-      throw new TransformerException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_XERCES_CANNOT_HANDLE_NODES, new Object[]{((Object)node).getClass()})); //"XercesLiaison can not handle nodes of type"
-        //+((Object)node).getClass());
-  }
-
-  /**
-   * Returns true that this implementation does support
-   * the SAX DocumentHandler interface.
-   */
-  public boolean supportsSAX()
-  {
-    return true;
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Get Xerces version field... we have to do this 'cause
-   * the "public static final" fields seem to get bound
-   * at compile time otherwise.
-   */
-  private String getXML4JVersionString()
-  {
-    // return Version.fVersion;
-    String version = "";
-    try
-    {
-      java.lang.reflect.Field versionField = Version.class.getField("fVersion");
-      version = (String)versionField.get(null);
-    }
-    catch(Exception e)
-    {
-    }
-    return version;
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Get one of the Xerces version numbers...
-   * we have to do this 'cause the "public static final"
-   * fields seem to get bound at compile time otherwise.
-   */
-  private int getXML4JVersionNum(int field)
-  {
-    int versionNum = 0;
-    String ver = getXML4JVersionString();
-    StringTokenizer tokenizer = new StringTokenizer(ver, " .");
-    for(int i = 0; tokenizer.hasMoreTokens(); i++)
-    {
-      String tok = tokenizer.nextToken();
-      if(field == i)
-      {
-        versionNum = Integer.parseInt(tok);
-      }
-    }
-    return versionNum;
-  }
-  
-  /**
-   * Pool the DOM parsers for reuse.
-   *
-  private ObjectPool m_domParserPool = new ObjectPool(DOMParser.class);
-  
-  /**
-   * Pool the SAX parsers for reuse.
-   *
-  private ObjectPool m_saxParserPool = new ObjectPool(SAXParser.class);
- 
-  /**
-   * Count the parses since the last garbage collection.  GC every 
-   * 10 parses or so.  (This might be a bad idea, but it seems to 
-   * help...)
-   *
-  protected int m_parseCountSinceGC = 0;
-*/
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Parse an XML document.
-   *
-   * <p>The application can use this method to instruct the SAX parser
-   * to begin parsing an XML document from any valid input
-   * source (a character stream, a byte stream, or a URI).</p>
-   *
-   * <p>Applications may not invoke this method while a parse is in
-   * progress (they should create a new Parser instead for each
-   * additional XML document).  Once a parse is complete, an
-   * application may reuse the same Parser object, possibly with a
-   * different input source.</p>
-   *
-   * @param source The input source for the top-level of the
-   *        XML document.
-   * @exception org.xml.sax.SAXException Any SAX exception, possibly
-   *            wrapping another exception.
-   * @exception java.io.IOException An IO exception from the parser,
-   *            possibly from a byte stream or character stream
-   *            supplied by the application.
-   * @see org.xml.sax.InputSource
-   * @see #parse(java.lang.String)
-   * @see #setEntityResolver
-   * @see #setDTDHandler
-   * @see #setDocumentHandler
-   * @see #setErrorHandler
-   */
-  public void parse (InputSource source)
-    throws javax.xml.transform.TransformerException
-  {
-   try
-    {
-
-      // I guess I should use JAXP factory here... when it's legal.
-      // org.apache.xerces.parsers.DOMParser parser 
-      //  = new org.apache.xerces.parsers.DOMParser();
-      DocumentBuilderFactory builderFactory =
-        DocumentBuilderFactory.newInstance();
-
-      builderFactory.setNamespaceAware(true);      
-
-      DocumentBuilder parser = builderFactory.newDocumentBuilder();
-			if (m_errorHandler == null)
-				parser.setErrorHandler(new org.apache.xml.utils.DefaultErrorHandler());
-			else
-				parser.setErrorHandler(m_errorHandler);
-
-      // if(null != m_entityResolver)
-      // {
-      // System.out.println("Setting the entity resolver.");
-      //  parser.setEntityResolver(m_entityResolver);
-      // }
-      setDocument(parser.parse(source));
-    }
-    catch (org.xml.sax.SAXException se)
-    {
-      throw new TransformerException(se);
-    }
-    catch (ParserConfigurationException pce)
-    {
-      throw new TransformerException(pce);
-    }
-    catch (IOException ioe)
-    {
-      throw new TransformerException(ioe);
-    }
-  }
-  
-  public void copyFromOtherLiaison(XMLParserLiaisonDefault from)
-    throws SAXException
-  {
-    //super.copyFromOtherLiaison(from);
-    if(null != from) // defensive
-    {
-      if(from instanceof XercesLiaison)
-        this.m_useDOM2getNamespaceURI = ((XercesLiaison)from).m_useDOM2getNamespaceURI;
-    }
- }
-
-
-  /**
-   * Create an empty DOM Document.  Mainly used for creating an
-   * output document.  Implementation of XMLParserLiaison
-   * interface method.
-   */
-  static public Document createDocument()
-  {
-    org.apache.xerces.dom.DocumentImpl doc = new org.apache.xerces.dom.DocumentImpl();
-    return doc;
-  }
-
-  /**
-   * Given an ID, return the element.
-   */
-  public Element getElementByID(String id, Document doc)
-  {
-    return ((DocumentImpl)doc).getIdentifier(id);
-  }
-
-  /**
-   * Tell if the node is ignorable whitespace.
-   * @deprecated
-   */
-  public boolean isIgnorableWhitespace(Text node)
-  {
-    boolean isIgnorable;
-    if( node instanceof org.apache.xerces.dom.TextImpl)
-    {
-      isIgnorable = ((org.apache.xerces.dom.TextImpl)node).isIgnorableWhitespace();
-    }
-    else
-    {
-      isIgnorable = false;
-    }
-    return isIgnorable;
-  }
-  
-  protected boolean m_useDOM2getNamespaceURI = true;
-  
-  /**
-   * Set whether or not getNamespaceOfNode should use the Xerces/DOM2
-   * getNamespaceURI.  This has to be set to true if the 
-   * http://xml.org/sax/features/namespaces is set to false, or if 
-   * the tree is mutated.
-   */
-  public void setUseDOM2getNamespaceURI(boolean b)
-  {
-    m_useDOM2getNamespaceURI = b;
-  }
-
-  
-  /**
-   * Get the namespace of the node.  Calls org.apache.xerces.dom.NodeImpl's
-   * getNamespaceURI() if setUseDOM2getNamespaceURI(true) has been called.
-   */
-  public String getNamespaceOfNode(Node n)
-  {
-    return(m_useDOM2getNamespaceURI) ?
-          ((org.apache.xerces.dom.NodeImpl)n).getNamespaceURI()
-          : super.getNamespaceOfNode(n);
-  }
-  
-
-  /**
-  * Returns the local name of the given node.
-  */
-  // public String getLocalNameOfNode(Node n)
-  // {
-  //   return ((org.apache.xerces.dom.NodeImpl)n).getLocalName();
-  // }
-
-  /**
-  * Returns the element name with the namespace expanded.
-  */
-  // public String getExpandedElementName(Element elem)
-  // {
-  //  String namespace = getNamespaceOfNode(elem);
-  //   return (null != namespace) ? namespace+":"+ getLocalNameOfNode(elem)
-  //                                : getLocalNameOfNode(elem);
-  // }
-
-  /**
-  * Returns the attribute name with the namespace expanded.
-  */
-  // public String getExpandedAttributeName(Attr attr)
-  // {
-  //  String namespace = getNamespaceOfNode(attr);
-  //   return (null != namespace) ? namespace+":"+ getLocalNameOfNode(attr)
-  //                               : getLocalNameOfNode(attr);
-  // }
-
-  /**
-   * Get the parent of a node.
-   */
-  static public Node getParentOfNode(Node node)
-    throws RuntimeException
-  {
-    return (Node.ATTRIBUTE_NODE == node.getNodeType())
-           ? ((Attr)node).getOwnerElement() : node.getParentNode();
-  }
-
-}
-
-
diff --git a/compat_src/org/apache/xalan/xpath/xml/FormatterToDOM.java b/compat_src/org/apache/xalan/xpath/xml/FormatterToDOM.java
deleted file mode 100644
index 490c968..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/FormatterToDOM.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import org.w3c.dom.*;
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-//import org.apache.xml.serialize.BaseMarkupSerializer;
-import org.apache.xalan.serialize.DOMSerializer;
-import org.apache.xalan.serialize.SerializerToXML;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.SAXException;
-
-
-/**
- * <meta name="usage" content="general"/>
- * This class takes SAX events (in addition to some extra events 
- * that SAX doesn't handle yet) and adds the result to a document 
- * or document fragment.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class FormatterToDOM extends ParserAdapter
-{ 
-  DOMSerializer m_serializer;
-    
-  /**
-   * FormatterToDOM instance constructor... it will add the DOM nodes 
-   * to the document fragment.
-   */
-  public FormatterToDOM(Document doc, Element elem) throws SAXException
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    try{
-      m_serializer = (new SerializerToXML()).asDOMSerializer();
-      this.setContentHandler((SerializerToXML)m_serializer);
-    }
-    catch (java.io.IOException ioe)
-    {}
-  }
-
-  /**
-   * FormatterToDOM instance constructor... it will add the DOM nodes 
-   * to the document fragment.
-   */
-  public FormatterToDOM(Document doc, DocumentFragment docFrag) throws SAXException
-  {
-    super(new org.apache.xerces.parsers.SAXParser()); 
-    try{
-      m_serializer = (new SerializerToXML()).asDOMSerializer();
-      this.setContentHandler((SerializerToXML)m_serializer);
-    }
-    catch (java.io.IOException ioe)
-    {}
-  }
-
-  /**
-   * FormatterToDOM instance constructor... it will add the DOM nodes 
-   * to the document.
-   */
-  public FormatterToDOM(Document doc) throws SAXException
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    try{
-      m_serializer = (new SerializerToXML()).asDOMSerializer();
-      this.setContentHandler((SerializerToXML)m_serializer);
-    }
-    catch (java.io.IOException ioe)
-    {}
-  }
-  
-  public SerializerToXML getSerializerObject()
-  {
-    return (SerializerToXML)m_serializer;
-  }
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/xml/FormatterToHTML.java b/compat_src/org/apache/xalan/xpath/xml/FormatterToHTML.java
deleted file mode 100644
index 5f8411b..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/FormatterToHTML.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import java.io.Writer;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-import org.apache.xalan.serialize.SerializerToHTML;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.SAXException;
-//import org.apache.xml.serialize.OutputFormat;
-
-/**
- * <meta name="usage" content="general"/>
- * FormatterToHTML formats SAX-style events into XML.
- * Warning: this class will be replaced by the Xerces Serializer classes.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class FormatterToHTML extends ParserAdapter
-{ 
-  
-  SerializerToHTML m_serializer;
-  
-  public FormatterToHTML() throws SAXException 
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToHTML();
-    this.setContentHandler(m_serializer);  
-  }
-  
-  /**
-   * Constructor using a writer.
-   * @param writer        The character output stream to use.
-   */
-  public FormatterToHTML(Writer writer) throws SAXException  
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToHTML();
-    m_serializer.setWriter(writer);
-    this.setContentHandler(m_serializer);    
-  }
-  
-  /**
-   * Constructor using an output stream, and a simple OutputFormat.
-   * @param writer        The character output stream to use.
-   */
-  public FormatterToHTML(java.io.OutputStream os)  
-    throws UnsupportedEncodingException, SAXException 
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToHTML();
-    m_serializer.setOutputStream(os);
-    this.setContentHandler(m_serializer);
-    
-  }
-  
-  /**
-   * Constructor using a writer.
-   * @param writer        The character output stream to use.
-   */
-  public FormatterToHTML(FormatterToXML xmlListener) throws SAXException 
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToHTML();
-    m_serializer.CopyFrom(xmlListener.m_serializer);
-    this.setContentHandler(m_serializer);
-  }
-  
-  public SerializerToHTML getSerializerObject()
-  {
-    return m_serializer;
-  }
-  
-}
-
diff --git a/compat_src/org/apache/xalan/xpath/xml/FormatterToText.java b/compat_src/org/apache/xalan/xpath/xml/FormatterToText.java
deleted file mode 100644
index 889eda0..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/FormatterToText.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import java.io.Writer;
-
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-import org.apache.xalan.serialize.SerializerToText;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.SAXException;
-
-/**
- * <meta name="usage" content="general"/>
- * This class takes SAX events (in addition to some extra events 
- * that SAX doesn't handle yet) and produces simple text only.
- * Warning: this class will be replaced by the Xerces Serializer classes.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class FormatterToText extends ParserAdapter
-{
-  
-  private SerializerToText m_serializer;
-  /**
-   * FormatterToText instance constructor... it will add the DOM nodes 
-   * to the document fragment.
-   */
-  public FormatterToText(Writer pw) throws SAXException
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToText(); 
-    m_serializer.setWriter(pw);
-    this.setContentHandler(m_serializer);
-  }
-  
-  public SerializerToText getSerializerObject()
-  {
-    return m_serializer;
-  }
-
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/xml/FormatterToXML.java b/compat_src/org/apache/xalan/xpath/xml/FormatterToXML.java
deleted file mode 100644
index 70eaade..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/FormatterToXML.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import java.io.Writer;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-import org.apache.xalan.serialize.SerializerToXML;
-//import org.apache.xml.serialize.BaseMarkupSerializer;
-import org.apache.xalan.serialize.Method;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.SAXException;
-
-
-/**
- * <meta name="usage" content="general"/>
- * FormatterToXML formats SAX-style events into XML.
- * Warning: this class will be replaced by the Xerces Serializer classes.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class FormatterToXML extends ParserAdapter
-{
-  SerializerToXML m_serializer;
-  
-  public FormatterToXML()
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToXML();
-    this.setContentHandler(m_serializer);
-    //super( new OutputFormat( Method.XML, null, false ) );     
-  }
-  
-  /**
-   * Constructor using a writer.
-   * @param writer        The character output stream to use.
-   */
-  public FormatterToXML(Writer writer) throws SAXException 
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToXML();
-   // super( format != null ? format : new OutputFormat( Method.XML, null, false ) );
-    //_format.setMethod( Method.XML );
-    m_serializer.setWriter( writer );
-    this.setContentHandler(m_serializer);
-  }
-  
-  /**
-   * Constructor using an output stream, and a simple OutputFormat.
-   * @param writer        The character output stream to use.
-   */
-  public FormatterToXML(java.io.OutputStream os) 
-    throws UnsupportedEncodingException , SAXException 
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToXML();
-    //super( format != null ? format : new OutputFormat( Method.XML, null, false ) );
-    //_format.setMethod( Method.XML );
-    m_serializer.setOutputStream( os );
-    this.setContentHandler(m_serializer);
-  }
-  
-  /**
-   * Constructor using a writer.
-   * @param writer        The character output stream to use.
-   */
-  public FormatterToXML(FormatterToXML xmlListener) throws SAXException 
-  {
-    super(new org.apache.xerces.parsers.SAXParser());
-    m_serializer = new SerializerToXML();
-    m_serializer.CopyFrom(xmlListener.m_serializer);
-    //super( new OutputFormat( Method.XML, null, false ) );
-    this.setContentHandler(m_serializer);
-  }
-  
-  public SerializerToXML getSerializerObject()
-  {
-    return m_serializer;
-  }
-  
-
-}  //ToXMLStringVisitor
diff --git a/compat_src/org/apache/xalan/xpath/xml/ProblemListener.java b/compat_src/org/apache/xalan/xpath/xml/ProblemListener.java
deleted file mode 100644
index feaf996..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/ProblemListener.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import org.w3c.dom.*;
-
-/**
- * <meta name="usage" content="general"/>
- * This is the interface that the XSL processor calls when it 
- * has a problem of some kind, either an error or a warning.
- * Users should ass the XSLTEngineImpl class to setProblemListener
- * if they wish an object instance to be called when a problem
- * event occurs.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public interface ProblemListener
-{
-  public static final short    WARNING         = 1;
-  public static final short    ERROR           = 2;
-  public static final short    MESSAGE         = 3;
-
-  public static final short    XMLPARSER       = 1;
-  public static final short    XSLPROCESSOR    = 2;
-  public static final short    QUERYENGINE     = 3;
-  public static final short    XPATHPROCESSOR  = 4;
-  public static final short    XPATHPARSER  = 5;
-
-  /**
-   * Function that is called when a problem event occurs.
-   * 
-   * @param   where             Either and XMLPARSER, XSLPROCESSOR, or QUERYENGINE.
-   * @param   classification    Either ERROR or WARNING.
-   * @param   styleNode         The style tree node where the problem
-   *                            occurred.  May be null.
-   * @param   sourceNode        The source tree node where the problem
-   *                            occurred.  May be null.
-   * @param   msg               A string message explaining the problem.
-   * @param   lineNo            The line number where the problem occurred,  
-   *                            if it is known. May be zero.
-   * @param   charOffset        The character offset where the problem,  
-   *                            occurred if it is known. May be zero.
-   * 
-   * @return  true if the return is an ERROR, in which case
-   *          exception will be thrown.  Otherwise the processor will 
-   *          continue to process.
-   */
-  public boolean problem(short where, short classification, 
-                       Object styleNode, Node sourceNode,
-                       String msg, String id, int lineNo, int charOffset)
-    throws org.xml.sax.SAXException  ;
-  
-  /**
-   * Function that is called to issue a message.
-   * @param   msg               A string message to output.
-   */
-  public boolean message(String msg);
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/xml/ProblemListenerDefault.java b/compat_src/org/apache/xalan/xpath/xml/ProblemListenerDefault.java
deleted file mode 100644
index f1a7ba2..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/ProblemListenerDefault.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import org.w3c.dom.*;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.SAXException;
-import javax.xml.transform.TransformerException;
-
-/**
- * <meta name="usage" content="general"/>
- * This is the interface that the XSL processor calls when it 
- * has a problem of some kind, either an error or a warning.
- * Users should ass the XSLTEngineImpl class to setProblemListener
- * if they wish an object instance to be called when a problem
- * event occurs.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class ProblemListenerDefault extends org.apache.xml.utils.DefaultErrorHandler implements ProblemListener 
-{
-  //ErrorHandler m_errorHandler = null;
-  ProblemListener m_problemListener = null;
-  
-  public ProblemListenerDefault()
-  {
-    super();    
-  }
-  
-  public ProblemListenerDefault(ProblemListener l)
-  { 
-    //m_errorHandler = handler;
-    m_problemListener = l;
-  }
-  /*
-  public void setErrorHandler (ErrorHandler handler)
-  {
-    m_errorHandler = handler;
-  }
-  */
-  public void setProblemListener (ProblemListener l)
-  {
-    m_problemListener = l;
-  }
-  
-  public ErrorHandler getErrorHandler ()
-  {
-    return this; // m_errorHandler;
-  }
-  
-  public ProblemListener getProblemListener ()
-  {
-    if (m_problemListener != null)
-      return m_problemListener;
-    else
-      return this;
-  }
-  
-  /**
-   * Function that is called to issue a message.
-   * @param   msg               A string message to output.
-   */
-  public boolean message(String msg)
-  {
-      if (m_problemListener != null)
-        m_problemListener.message(msg);
-      synchronized (this)
-      {  
-        new java.io.PrintWriter(  System.err, true ).println( msg );
-      } 
-   
-    return false;                    // we don't know this is an error 
-  }
-  
-  public boolean problem(short where, short classification, 
-                       Object styleNode, Node sourceNode,
-                       String msg, String id, int lineNo, int charOffset)
-  throws org.xml.sax.SAXException   
-  {
-    if (m_problemListener != null)
-      return m_problemListener.problem(where, classification, styleNode, sourceNode, msg, id, lineNo, charOffset);
-    else
-    {  
-      this.error(new SAXParseException(msg, null, id, lineNo, charOffset));
-      return false;   
-    }
-  } 
-  
-  public void warning(SAXParseException exception) throws SAXException
-  {
-    if (m_problemListener == null)
-    {
-      super.warning(exception);    
-    }
-    else
-    {
-      boolean shouldthrow = m_problemListener.problem(XSLPROCESSOR, WARNING,
-                                null, null,
-                                exception.getMessage(),
-                                exception.getSystemId(),
-                                exception.getLineNumber(),  
-                                exception.getColumnNumber()); 
-      if (shouldthrow)
-        throw new SAXException(exception);
-    }
-  }
-  
-  public void error(SAXParseException exception) throws SAXException
-  {
-    if (m_problemListener == null)
-    {
-      super.error(exception);    
-    }
-    else
-    {
-      boolean shouldthrow = m_problemListener.problem(XSLPROCESSOR, ERROR,
-                                null, null,
-                                exception.getMessage(),
-                                exception.getSystemId(),
-                                exception.getLineNumber(),  
-                                exception.getColumnNumber()); 
-      if (shouldthrow)
-        throw new SAXException(exception);
-    }
-  }
-  
-  public void fatalError(SAXParseException exception) throws SAXException
-  {
-    if (m_problemListener == null)
-    {
-      super.fatalError(exception);    
-    }
-    else
-    {
-      boolean shouldthrow = m_problemListener.problem(XSLPROCESSOR, ERROR,
-                                null, null,
-                                exception.getMessage(),
-                                exception.getSystemId(),
-                                exception.getLineNumber(),  
-                                exception.getColumnNumber()); 
-      if (shouldthrow)
-        throw new SAXException(exception);
-    }
-  }
-  
-  public void warning(TransformerException exception) throws TransformerException
-  {
-    if (m_problemListener == null)
-    {
-      super.warning(exception);    
-    }
-    else
-    {
-      boolean shouldthrow = true;
-      try{
-        javax.xml.transform.SourceLocator locator = exception.getLocator();
-        if (locator != null)
-        {
-          shouldthrow = m_problemListener.problem(XSLPROCESSOR, WARNING,
-                                                  null, null,
-                                                  exception.getMessage(),
-                                                  locator.getSystemId(),
-                                                  locator.getLineNumber(),  
-                                                  locator.getColumnNumber());
-        }
-        else 
-        {
-          shouldthrow = m_problemListener.problem(XSLPROCESSOR, MESSAGE,
-                                                  null, null,
-                                                  exception.getMessage(),
-                                                  null,
-                                                  0,  
-                                                  0);
-        }
-      }
-      catch (SAXException se)
-      {
-        throw new TransformerException(se);
-      }
-      if (shouldthrow)
-        throw new TransformerException(exception);
-    }
-  }
-  
-  public void error(TransformerException exception) throws TransformerException
-  {
-    if (m_problemListener == null)
-    {
-      super.error(exception);    
-    }
-    else
-    {
-      boolean shouldthrow = true;
-      try{
-        javax.xml.transform.SourceLocator locator = exception.getLocator();
-        if (locator != null)
-        {
-          shouldthrow = m_problemListener.problem(XSLPROCESSOR, ERROR,
-                                                  null, null,
-                                                  exception.getMessage(),
-                                                  locator.getSystemId(),
-                                                  locator.getLineNumber(),  
-                                                  locator.getColumnNumber());
-        }
-        else 
-        {
-          shouldthrow = m_problemListener.problem(XSLPROCESSOR, ERROR,
-                                                  null, null,
-                                                  exception.getMessage(),
-                                                  null,
-                                                  0,  
-                                                  0);
-        }
-      }
-      catch (SAXException se)
-      {
-        throw new TransformerException(se);
-      }
-      if (shouldthrow)
-        throw new TransformerException(exception);
-    }
-  }
-  
-  public void fatalError(TransformerException exception) throws TransformerException
-  {
-    if (m_problemListener == null)
-    {
-      super.fatalError(exception);    
-    }
-    else
-    {
-      boolean shouldthrow = true;
-      try{
-        javax.xml.transform.SourceLocator locator = exception.getLocator();
-        if (locator != null)
-        {
-          shouldthrow = m_problemListener.problem(XSLPROCESSOR, ERROR,
-                                                  null, null,
-                                                  exception.getMessage(),
-                                                  locator.getSystemId(),
-                                                  locator.getLineNumber(),  
-                                                  locator.getColumnNumber());
-        }
-        else 
-        {
-          shouldthrow = m_problemListener.problem(XSLPROCESSOR, ERROR,
-                                                  null, null,
-                                                  exception.getMessage(),
-                                                  null,
-                                                  0,  
-                                                  0);
-        }
-      }
-      catch (SAXException se)
-      {
-        throw new TransformerException(se);
-      }
-      if (shouldthrow)
-        throw new TransformerException(exception);
-    }
-  }
-  /*
-  private class MessageMgr extends org.apache.xalan.transformer.MsgMgr 
-  {
-    void MessageMgr()
-    {}
-  }*/
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/xml/TreeWalker.java b/compat_src/org/apache/xalan/xpath/xml/TreeWalker.java
deleted file mode 100644
index 0bc4701..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/TreeWalker.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * The Apache Software License, Version 1.1 
- * 
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import org.w3c.dom.*;
-import org.xml.sax.*;
-import org.xml.sax.ext.LexicalHandler;
-
-import org.apache.xml.utils.AttList;
-
-/**
- * <meta name="usage" content="advanced"/>
- * This class does a pre-order walk of the DOM tree, calling the FormatterListener
- * interface as it goes.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class TreeWalker //extends org.apache.xml.utils.TreeWalker
-{
-  
-  org.apache.xml.utils.TreeWalker m_walker; 
-  
-  /**
-   * Constructor.
-   * @param   formatterListener The implemention of the 
-   * FormatterListener operation (toXMLString, digest, ...)
-   */
-  public TreeWalker(DocumentHandler formatterListener) 
-  {
-    if(formatterListener instanceof FormatterToXML)
-      m_walker = new org.apache.xml.utils.TreeWalker(((FormatterToXML)formatterListener).getSerializerObject(), new org.apache.xpath.DOM2Helper());
-    //super(formatterListener);
-  } 
- 
-  /**
-   * Perform a pre-order traversal non-recursive style.
-   */
-  public void traverse(Node pos) throws SAXException 
-  {
-    m_walker.traverse(pos);
-  }
-  
-  /**
-   * Perform a pre-order traversal non-recursive style.
-   */
-  public void traverse(Node pos, Node top) throws SAXException 
-  {
-    m_walker.traverse(pos, top);
-  }
-  
-  
-  
-}  //TreeWalker
diff --git a/compat_src/org/apache/xalan/xpath/xml/XMLParserLiaison.java b/compat_src/org/apache/xalan/xpath/xml/XMLParserLiaison.java
deleted file mode 100644
index 822b46b..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/XMLParserLiaison.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import org.w3c.dom.*;
-import org.apache.xpath.DOM2Helper;
-
-/**
- * <meta name="usage" content="general"/>
- * This is the interface that the XSL processor calls when it 
- * has a problem of some kind, either an error or a warning.
- * Users should ass the XSLTEngineImpl class to setProblemListener
- * if they wish an object instance to be called when a problem
- * event occurs.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XMLParserLiaison extends DOM2Helper
-{
-  
-
-}
diff --git a/compat_src/org/apache/xalan/xpath/xml/XMLParserLiaisonDefault.java b/compat_src/org/apache/xalan/xpath/xml/XMLParserLiaisonDefault.java
deleted file mode 100644
index f3ade6c..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/XMLParserLiaisonDefault.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xpath.xml;
-
-import javax.xml.parsers.*;
-import java.net.*;
-import java.io.*;
-import java.util.*;
-import org.xml.sax.*;
-import org.w3c.dom.*;
-
-import org.apache.xalan.xpath.*;
-import org.apache.xpath.*;
-import org.apache.xalan.xpath.xml.XMLParserLiaison;
-
-/**
- * A class that handles interfacing IBM's XML4J2 to the 
- * Lotus XSL Processor.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XMLParserLiaisonDefault extends XMLParserLiaison 
-{
-  
-}
-
-
diff --git a/compat_src/org/apache/xalan/xpath/xml/package.html b/compat_src/org/apache/xalan/xpath/xml/package.html
deleted file mode 100644
index 57ee7d1..0000000
--- a/compat_src/org/apache/xalan/xpath/xml/package.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<HTML><HEAD></HEAD><BODY>
-     <P>Infrastructure for working with an XML parser.</P>
-   
-      <P>An implementation of the {@link org.apache.xalan.xpath.xml.XMLParserLiaison} interface provides a liaison
-     between the XSLT processor and an XML parser. Unless you specify an XML parser and your own implementation of 
-     the XMLParserLiaison interface, Xalan-Java uses the 
-     {@link org.apache.xalan.xpath.xml.XMLParserLiaisonDefault}:</P>
-     <P>This package also includes four implementations of the <A href="http://www.megginson.com/SAX/sax.html" target="_top">SAX</A> <A href="http://www.megginson.com/SAX/javadoc/org.xml.sax.DocumentHandler.html#_top" target="_top">org.xml.sax.DocumentHandler</A> interface:</P>
-     <UL>
-     <LI>{@link org.apache.xalan.xpath.xml.FormatterToDOM}</LI>
-     <LI>{@link org.apache.xalan.xpath.xml.FormatterToXML}</LI>
-     <LI>{@link org.apache.xalan.xpath.xml.FormatterToHTML} (an extension of FormatterToXML)</LI>
-     <LI>{@link org.apache.xalan.xpath.xml.FormatterToText}</LI>
-     </UL>
-   </BODY></HTML>
\ No newline at end of file
diff --git a/compat_src/org/apache/xalan/xslt/Stylesheet.java b/compat_src/org/apache/xalan/xslt/Stylesheet.java
deleted file mode 100644
index 1a4243b..0000000
--- a/compat_src/org/apache/xalan/xslt/Stylesheet.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-package org.apache.xalan.xslt;
-
-import java.net.*;
-import java.io.*;
-import org.xml.sax.*;
-
-
-/**
- * Represents the base stylesheet or an
- * "import" stylesheet; "include" stylesheets are
- * combined with the including stylesheet.
- * At the moment these stylesheets can not be reused within the
- * stylesheet tree or between trees.  This needs to be fixed
- * in the future.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class Stylesheet  extends org.apache.xalan.templates.Stylesheet
-{ 
-	
-	 /**
-   * Constructor for a Stylesheet needs a Document.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public Stylesheet(StylesheetRoot root,
-                    XSLTEngineImpl processor,
-                    String baseIdentifier)
-    throws XSLProcessorException,
-           MalformedURLException,
-           FileNotFoundException,
-           IOException,
-           SAXException
-  {
-		super(root.getObject());    
-  }
-	
-	/**
-   * Constructor using an org.apache.xalan.templates.StylesheetRoot.
-   * 
-   * @param s an org.apache.xalan.templates.Stylesheet object
-   */
-  public Stylesheet(org.apache.xalan.templates.Stylesheet s)    
-  { 
-		super(s);
-       
-  }
-	
-}
diff --git a/compat_src/org/apache/xalan/xslt/StylesheetHandler.java b/compat_src/org/apache/xalan/xslt/StylesheetHandler.java
deleted file mode 100644
index 3bc29af..0000000
--- a/compat_src/org/apache/xalan/xslt/StylesheetHandler.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import java.util.*;
-import org.xml.sax.*;
-import org.xml.sax.helpers.AttributesImpl;
-import org.xml.sax.helpers.ParserAdapter;
-import org.w3c.dom.*;
-import java.util.Vector;
-import java.io.*;
-import java.net.*;
-
-import org.apache.xalan.templates.Stylesheet; 
-
-/**
- * <meta name="usage" content="advanced"/>
- * Initializes and processes a stylesheet via SAX events.
- * If you need to alter the code in here,
- * it is not for the faint-of-heart, due to the state tracking
- * that has to be done due to the SAX event model.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class StylesheetHandler extends ParserAdapter
-  
-{
-  
-  /**
-   * Instance constructor... 
-   * @param processor  The XSLTProcessor implementation.
-   * @param stylesheet The root stylesheet.
-   *    
-   */
-  public StylesheetHandler(XSLTEngineImpl processor, Stylesheet stylesheetTree)    
-    throws javax.xml.transform.TransformerConfigurationException, SAXException 
-  {
-    
-      super(new org.apache.xerces.parsers.SAXParser());
-      //try{
-      org.apache.xalan.processor.StylesheetHandler handler = 
-            new org.apache.xalan.processor.StylesheetHandler(processor.getTransformerFactory());
-      handler.pushStylesheet(stylesheetTree);
-      this.setContentHandler(handler);
-    //}
-    //catch (javax.xml.transform.TransformerConfigurationException tce)
-    //{}
-  } 
-  
-  /**
-   * Instance constructor... 
-   * @param processor  The XSLTProcessor implementation.
-   * @param stylesheet The root stylesheet. 
-   * @exception TransformerConfigurationException  
-   */
-  public StylesheetHandler(XSLTEngineImpl processor, StylesheetRoot stylesheetTree)    
-    throws javax.xml.transform.TransformerConfigurationException, SAXException 
-  {
-    //try{
-      super(new org.apache.xerces.parsers.SAXParser());
-      org.apache.xalan.processor.StylesheetHandler handler = 
-            new org.apache.xalan.processor.StylesheetHandler(processor.getTransformerFactory());
-      handler.pushStylesheet(stylesheetTree.getObject());
-      this.setContentHandler(handler);
-    //}
-    //catch (javax.xml.transform.TransformerConfigurationException tce)
-    //{}
-  } 
-  
-  
-}
diff --git a/compat_src/org/apache/xalan/xslt/StylesheetRoot.java b/compat_src/org/apache/xalan/xslt/StylesheetRoot.java
deleted file mode 100644
index 88c2f94..0000000
--- a/compat_src/org/apache/xalan/xslt/StylesheetRoot.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.w3c.dom.*;
-import java.util.*;
-import java.net.*;
-import java.io.*;
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import org.apache.xml.serialize.*;
-import org.apache.xalan.serialize.*;
-import org.apache.xalan.templates.ElemTemplate;
-import org.apache.xalan.templates.OutputProperties;
-import javax.xml.transform.OutputKeys;
-import org.apache.xalan.xpath.xml.FormatterToXML;
-import org.apache.xalan.xpath.xml.FormatterToHTML;
-import org.apache.xalan.xpath.xml.FormatterToText;
-import org.apache.xalan.xpath.xml.FormatterToDOM;
-import org.apache.xalan.res.XSLTErrorResources;
-
-/**
- * <meta name="usage" content="general"/> 
- * Binary representation of a stylesheet -- use the {@link org.apache.xalan.xslt.XSLTProcessor} ProcessStylesheet
- * method to create a StylesheetRoot and improve performance for a stylesheet performing multiple transformations.
- * Also required for XSLTProcessor to function as SAX DocumentHandler.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class StylesheetRoot extends Stylesheet
-{
-  
-  private String m_liaisonClassUsedToCreate = null;
-  private org.apache.xalan.templates.StylesheetRoot m_sRootObject;
-  
-  /**
-   * Uses an XSL stylesheet document.
-   * @param processor  The XSLTProcessor implementation.
-   * @param baseIdentifier The file name or URL for the XSL stylesheet.
-   * @exception TransformerConfigurationException thrown 
-   */
-  public StylesheetRoot(XSLTEngineImpl processor,
-                        String baseIdentifier)
-    throws TransformerConfigurationException
-  { 
-		super(null);
-    m_sRootObject = new org.apache.xalan.templates.StylesheetRoot(processor.getTransformerFactory().getErrorListener()); 
-    if (processor.getXMLProcessorLiaison()!= null)
-      m_liaisonClassUsedToCreate = ((Object)processor.getXMLProcessorLiaison()).getClass().getName();
-    
-  }  
-
-
-  /**
-   * Constructor using an org.apache.xalan.templates.StylesheetRoot.
-   * 
-   * @param s an org.apache.xalan.templates.StylesheetRoot object
-   */
-  public StylesheetRoot(org.apache.xalan.templates.StylesheetRoot s)    
-  { 
-		super(null);
-    m_sRootObject = s;     
-  }
-  
-  /**
-   * Return the org.apache.xalan.templates.StylesheetRoot object
-   * associated with this stylesheet root.
-   *  
-   * @return an org.apache.xalan.templates.StylesheetRoot object
-   */
-  public org.apache.xalan.templates.StylesheetRoot getObject()
-  {
-    return m_sRootObject;
-  }  
-  
-  /**
-   * Transform the XML source tree and place the output in the result tree target.
-   * This method uses a new XSLTProcessor instance to track the running state.
-   * @param xmlSource  The XML input source tree.
-   * @param outputTarget The output result tree.
-   * @exception SAXException
-   * @see org.apache.xalan.xslt.XSLTProcessor#process(org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTResultTarget)
-   */
-  public void process( XSLTInputSource xmlSource,
-                       XSLTResultTarget outputTarget)
-    throws SAXException,
-           MalformedURLException,
-           FileNotFoundException,
-           IOException
-  {
-    XSLTProcessor iprocessor =
-                              (null != m_liaisonClassUsedToCreate) ?
-                              new XSLTProcessorFactory().getProcessorUsingLiaisonName(m_liaisonClassUsedToCreate)
-                              : new XSLTProcessorFactory().getProcessor();
-    process(iprocessor, xmlSource, outputTarget);
-    
-  }
-
-  /**
-   * Transform the XML source tree and place the output in the result tree target.
-   * Use this version of the StylesheetRoot process() method if you have used an
-   * XSLTProcessor object to set a stylesheet parameter. That object is now the iprocessor parameter.
-   * @param iprocessor  The XSLTProcessor that will track the running state.
-   * @param xmlSource  The XML input source tree.
-   * @param outputTarget The output result tree.
-   * @exception SAXException
-   * @see org.apache.xalan.xslt.XSLTProcessor#process(org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTResultTarget)
-   */
-  public void process( XSLTProcessor iprocessor, XSLTInputSource xmlSource,
-                       XSLTResultTarget outputTarget)
-    throws SAXException,
-           MalformedURLException,
-           FileNotFoundException,
-           IOException
-  {
-    //process(iprocessor, iprocessor.getSourceTreeFromInput(xmlSource), outputTarget);
-		XSLTEngineImpl processor = (XSLTEngineImpl)iprocessor; // TODO: Check for class cast exception
-		
-    synchronized(processor)
-    {      
-      processor.setStylesheet(this);
-
-      try
-      {
-				processor.getTransformer().transform(xmlSource.getSourceObject(),
-																						 outputTarget.getResultObject());
-			}
-      catch (TransformerException te)
-      {
-        throw new SAXException(te); 
-      }             
-    }
-       
-  }
-
-  /**
-   * Transform the XML source tree (a DOM Node) and place the output in the result tree target.
-   * This is a convenience method. You can also use a DOM Node to instantiate an XSLTInputSource object,
-   * and call {@link #process(org.apache.xalan.xslt.XSLTProcessor, org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTResultTarget)} or
-   * {@link org.apache.xalan.xslt.XSLTProcessor#process(org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTResultTarget)}.
-   * @param iprocessor  The processor that will track the running state.
-   * @param sourceTree  The input source tree in the form of a DOM Node.
-   * @param outputTarget The output result tree.
-   * @exception SAXException
-   */
-  public void process( XSLTProcessor iprocessor, Node sourceTree,
-                       XSLTResultTarget outputTarget)
-    throws SAXException,
-           MalformedURLException,
-           FileNotFoundException,
-           IOException
-  {
-		
-    XSLTEngineImpl processor = (XSLTEngineImpl)iprocessor; // TODO: Check for class cast exception
-		//checkInit(processor);
-    synchronized(processor)
-    {
-      //processor.switchLiaisonsIfNeeded(sourceTree, outputTarget.getNode());
-
-      processor.setStylesheet(this);
-
-      OutputStream ostream = null;
-
-      try
-      {
-				processor.getTransformer().transform(new javax.xml.transform.dom.DOMSource(sourceTree),
-																						 outputTarget.getResultObject());
-       
-      }
-      catch (TransformerException te)
-      {
-        throw new SAXException(te); 
-      }
-       
-      finally
-      {
-        if (null != ostream)
-        {
-          ostream.close();
-        }
-      }
-    }
-
-  }
-  
-  /**
-   * Creates a compatible SAX serializer for the specified writer
-   * and output format. If the output format is missing, the default
-   * is an XML format with UTF8 encoding.
-   *
-   * @param writer The writer
-   * @param format The output format
-   * @return A compatible SAX serializer
-   */
-  public DocumentHandler makeSAXSerializer( Writer writer, OutputFormat format )
-    throws IOException, SAXException 
-  {
-    DocumentHandler handler;
-    if ( format == null )
-    {
-      format = new OutputFormat( "xml", "UTF-8", false );
-      handler = null;
-    }
-    else 
-    {
-      handler = new ParserAdapter(new org.apache.xerces.parsers.SAXParser());
-      OutputProperties props = m_sRootObject.getOutputComposed();
-      
-      if ( format.getMethod().equalsIgnoreCase( "html" ) )
-      {
-        FormatterToHTML serializer = new FormatterToHTML(writer);
-        serializer.getSerializerObject().setOutputFormat(props.getProperties());
-        ((ParserAdapter)handler).setContentHandler(serializer.getSerializerObject());
-      }
-      else if ( format.getMethod().equalsIgnoreCase( "xml" ) )
-      {
-        FormatterToXML serializer = new FormatterToXML(writer);
-        serializer.getSerializerObject().setOutputFormat(props.getProperties());
-        ((ParserAdapter)handler).setContentHandler(serializer.getSerializerObject());
-      }
-      else if ( format.getMethod().equalsIgnoreCase( "text" ) )
-      {
-        FormatterToText serializer = new FormatterToText(writer); 
-        ((ParserAdapter)handler).setContentHandler(serializer.getSerializerObject());
-      }
-      else
-      {
-        handler = null;
-      }
-    }
-    
-    if(null == handler)
-    {
-      String method = format.getMethod();
-      org.apache.xml.serialize.SerializerFactory factory = org.apache.xml.serialize.SerializerFactory.getSerializerFactory(method);
-      org.apache.xml.serialize.Serializer serializer = factory.makeSerializer(writer, format);
-      handler = serializer.asDocumentHandler();
-    }
-
-    return handler;
-  }
-  
-  /**
-   * Creates a compatible SAX serializer for the specified output stream
-   * and output format. If the output format is missing, the default
-   * is an XML format with UTF8 encoding.
-   *
-   * @param ostream The output stream.
-   * @param format The output format
-   * @return A compatible SAX serializer
-   */
-  public DocumentHandler makeSAXSerializer( OutputStream ostream, OutputFormat format )
-    throws UnsupportedEncodingException, IOException, SAXException
-  {
-    DocumentHandler handler;
-    OutputProperties props;
-        
-    if ( format == null )
-    {
-      props = new OutputProperties();
-      handler = null;
-    }
-    else
-    { 
-      handler = new ParserAdapter(new org.apache.xerces.parsers.SAXParser());
-      props = m_sRootObject.getOutputComposed();
-      if ( format.getMethod().equalsIgnoreCase( "html" ) )
-      {
-        FormatterToHTML serializer = new FormatterToHTML(ostream);
-        serializer.getSerializerObject().setOutputFormat(props.getProperties());
-        ((ParserAdapter)handler).setContentHandler(serializer.getSerializerObject());
-      }
-      else if ( format.getMethod().equalsIgnoreCase( "xml" ) )
-      {
-        FormatterToXML serializer = new FormatterToXML(ostream);
-        serializer.getSerializerObject().setOutputFormat(props.getProperties());
-        ((ParserAdapter)handler).setContentHandler(serializer.getSerializerObject());
-      }
-      else if ( format.getMethod().equalsIgnoreCase( "text" ) )
-      {
-        String encoding = format.getEncoding();
-        if(null == encoding)
-        {
-          try
-          {
-            encoding = System.getProperty("file.encoding");
-            encoding = (null != encoding) ?
-                       org.apache.xalan.serialize.Encodings.convertJava2MimeEncoding( encoding ) : "ASCII";
-            if(null == encoding)
-            {
-              encoding = "ASCII";
-            }
-          }
-          catch(SecurityException se)
-          {
-            encoding = "ASCII";
-          }
-        }
-
-        //this.m_encoding =   encoding;
-
-        String javaEncoding = org.apache.xalan.serialize.Encodings.convertMime2JavaEncoding(encoding);
-
-        Writer w = new OutputStreamWriter( ostream, javaEncoding );
-        ((ParserAdapter)handler).setContentHandler(new FormatterToText(w).getSerializerObject());
-      }
-      else if ( format.getMethod().equalsIgnoreCase( "xhtml" ) )
-      {
-        handler = new XMLSerializer(ostream, format);
-        //handler = Serializer.makeSAXSerializer(ostream, format);
-      }
-      else
-      {
-        handler = new XMLSerializer(ostream, format);
-        //handler = Serializer.makeSAXSerializer(ostream, format);
-      }
-    }
-    if(null == handler)
-    {
-      String method = props.getProperty(OutputKeys.METHOD);
-      org.apache.xml.serialize.SerializerFactory factory = org.apache.xml.serialize.SerializerFactory.getSerializerFactory(method);
-      org.apache.xml.serialize.Serializer serializer = factory.makeSerializer(ostream, format);
-      handler = serializer.asDocumentHandler();
-    }
-
-    return handler;
-  }
-
-  /**
-   * Creates a compatible SAX serializer for the specified output stream
-   * and output format. If the output format is missing, the default
-   * is an XML format with UTF8 encoding.
-   *
-   * @param ostream The output stream.
-   * @return A compatible SAX serializer
-   */
-  public DocumentHandler getSAXSerializer( OutputStream ostream )
-    throws UnsupportedEncodingException, IOException, SAXException
-  {
-   return makeSAXSerializer(ostream, getOutputFormat());
-  }
-  
-  /**
-   * Get a new OutputFormat object according to the xsl:output attributes.
-   */
-  public OutputFormat getOutputFormat()
-  {
-    OutputProperties outputFormat = m_sRootObject.getOutputComposed();
-    if (outputFormat == null)
-      return null;
-    OutputFormat formatter = new OutputFormat(outputFormat.getProperty(OutputKeys.METHOD),
-                                              outputFormat.getProperty(OutputKeys.ENCODING),
-                                              OutputProperties.getBooleanProperty(OutputKeys.INDENT, outputFormat.getProperties()));
-    formatter.setDoctype(outputFormat.getProperty(OutputKeys.DOCTYPE_PUBLIC), 
-                         outputFormat.getProperty(OutputKeys.DOCTYPE_SYSTEM));
-    formatter.setOmitXMLDeclaration(OutputProperties.getBooleanProperty(OutputKeys.OMIT_XML_DECLARATION, outputFormat.getProperties()));
-    formatter.setStandalone(OutputProperties.getBooleanProperty(OutputKeys.STANDALONE, outputFormat.getProperties()));
-    formatter.setMediaType(outputFormat.getProperty(OutputKeys.MEDIA_TYPE));
-    formatter.setVersion(outputFormat.getProperty(OutputKeys.VERSION));
-    // This is to get around differences between Xalan and Xerces.
-    // Xalan uses -1 as default for no indenting, Xerces uses 0.
-    // So we just bump up the indent value here because we will
-    // subtract from it at output time (FormatterToXML.init());
-   // if (getOutputIndent())
-   //   formatter.setIndent(formatter.getIndent()+1);
-
-    
-    return formatter;
-  }
-  
-  /** 
-   * Get the encoding string that was specified in the stylesheet. 
-   */
-  public String getOutputEncoding()
-  {
-    return m_sRootObject.getOutputComposed().getProperty(OutputKeys.ENCODING);
-  }
-
-  /** 
-   * Get the media-type string that was specified in the stylesheet. 
-   */
-  public String getOutputMediaType() 
-  { 
-    return m_sRootObject.getOutputComposed().getProperty(OutputKeys.MEDIA_TYPE); 
-  }
-  
-  /** 
-   * Get the output method that was specified in the stylesheet. 
-   */
-  public String getOutputMethod() 
-  { 
-    return m_sRootObject.getOutputComposed().getProperty(OutputKeys.METHOD); 
-  }
-  
-  /**
-   * Get the base identifier with which this stylesheet is associated.
-   */
-  public String getBaseIdentifier()
-  {
-    return m_sRootObject.getBaseIdentifier();
-  }
-
-  /**
-   * Get the base identifier with which this stylesheet is associated.
-   */
-  public void setBaseIdentifier(String baseIdent)
-  {
-    m_sRootObject.setHref(baseIdent);
-  }
-  
-}
diff --git a/compat_src/org/apache/xalan/xslt/StylesheetSpec.java b/compat_src/org/apache/xalan/xslt/StylesheetSpec.java
deleted file mode 100644
index dad1527..0000000
--- a/compat_src/org/apache/xalan/xslt/StylesheetSpec.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import javax.xml.transform.stream.StreamSource;
-
-/**
- * <meta name="usage" content="general"/>
- * This class implements the representation of a stylesheet 
- * specification via xml-stylesheet in an XML document.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class StylesheetSpec extends StreamSource
-{
-  String type; // CDATA #REQUIRED
-  String title; // CDATA #IMPLIED
-  String media; // CDATA #IMPLIED
-  String encoding; // CDATA #IMPLIED
-  boolean alternate; // (yes|no) "no"
-  
-  /**
-   * Create a StylesheetSpec object.
-   */
-  public StylesheetSpec(String href, String type, String title, 
-                        String media, boolean alternate,
-                        String encoding)
-  {
-    this.setSystemId(href);
-    this.encoding = encoding;
-    this.type = type;
-    this.title = title;
-    this.media = media;
-    this.alternate = alternate;
-  }
-  
-  /**
-   * Get the encoding of the stylesheet.
-   */
-  public String       getEncoding()
-  {
-    return encoding;
-  }
-
-  /**
-   * Get the type of the stylesheet, i.e. "text/xsl".
-   */
-  public String       getType()
-  {
-    return type;
-  }
-  
-  /**
-   * Get the title of the element (in other words, the 
-   * item to be presented to the user agent).
-   */
-  public String       getTitle()
-  {
-    return title;
-  }
-  
-  /**
-   * Get the media attribute of the stylesheet.
-   */
-  public String       getMedia()
-  {
-    return media;
-  }
-  /**
-   * Get whether or not the stylesheet is specified as 
-   * an alternate.
-   */
-  public boolean    getIsAlternate()
-  {
-    return alternate;
-  }
-}
diff --git a/compat_src/org/apache/xalan/xslt/XSLProcessorContext.java b/compat_src/org/apache/xalan/xslt/XSLProcessorContext.java
deleted file mode 100644
index ffe7d92..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLProcessorContext.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.w3c.dom.*;
-import org.apache.xalan.templates.Stylesheet;
-import org.apache.xml.utils.QName;
-import org.apache.xalan.transformer.TransformerImpl;
-
-// import org.apache.xalan.xslt.*;
-
-/**
- * <meta name="usage" content="general"/>
- * Captures processor context to be
- * passed to an extension element.
- *
- * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XSLProcessorContext extends org.apache.xalan.extensions.XSLProcessorContext
-{ 
-  public XSLProcessorContext (XSLTEngineImpl processor,
-			      Stylesheet stylesheetTree,
-			      Node sourceTree, Node sourceNode, QName mode) 
-    
-  {
-    super((TransformerImpl)(processor.getTransformer()),
-          stylesheetTree);
-  }
-
-  
-}
diff --git a/compat_src/org/apache/xalan/xslt/XSLProcessorException.java b/compat_src/org/apache/xalan/xslt/XSLProcessorException.java
deleted file mode 100644
index baab5a0..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLProcessorException.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.xml.sax.SAXException;
-import org.apache.xalan.res.XSLTErrorResources;
-import org.apache.xalan.res.XSLMessages;
-
-
-/**
- * <meta name="usage" content="general"/>
- * The exception used for most XSLT errors.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XSLProcessorException extends SAXException
-{
-  private Exception m_exception;
-  
-  /**
-   * Create an XSLProcessorException object that holds 
-   * an error message.
-   * @param message The error message.
-   */
-  public XSLProcessorException(String message) 
-  {
-     super((null == message) ? XSLMessages.createMessage(XSLTErrorResources.ER_XSLT_ERROR, null) : message);
-     m_exception = null;
-  }
-  
-  /**
-   * Create an XSLProcessorException object that holds 
-   * an error message, and another exception 
-   * that caused this exception.
-   * @param message The error message.
-   * @param e The exception that caused this exception.
-   */
-  public XSLProcessorException (String message, Exception e)
-  {
-    super((null == message) ? XSLMessages.createMessage(XSLTErrorResources.ER_XSLT_ERROR, null) : message);
-    this.m_exception = e;
-  }
-  
-  /**
-   * Create an XSLProcessorException object that holds 
-   * another exception that caused this exception.
-   * @param e The exception that caused this exception.
-   */
-  public XSLProcessorException (Exception e)
-  {
-    super((null == e.getMessage()) ? XSLMessages.createMessage(XSLTErrorResources.ER_XSLT_ERROR, null) : e.getMessage());
-    this.m_exception = e;
-  }
-    
-}
diff --git a/compat_src/org/apache/xalan/xslt/XSLTEngineImpl.java b/compat_src/org/apache/xalan/xslt/XSLTEngineImpl.java
deleted file mode 100644
index d6fbc2c..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLTEngineImpl.java
+++ /dev/null
@@ -1,2426 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.apache.xpath.*;
-import org.apache.xpath.compiler.XPathParser;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xalan.xpath.XObject;
-import org.apache.xalan.xpath.XString;
-import org.apache.xalan.xpath.XNodeSet;
-import org.apache.xalan.xpath.XBoolean;
-import org.apache.xalan.xpath.XNumber;
-import org.apache.xalan.xpath.XNull;
-
-import org.w3c.dom.*;
-import org.w3c.dom.traversal.NodeIterator;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-import org.xml.sax.ext.*;
-import org.xml.sax.helpers.ParserAdapter;
-import org.apache.xml.serialize.XMLSerializer;
-
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.Templates;
-import javax.xml.transform.Source;
-import javax.xml.transform.SourceLocator;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.ErrorListener;
-
-import java.util.*;
-import java.net.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-import org.apache.xalan.templates.Stylesheet;
-//import org.apache.xalan.templates.StylesheetRoot;
-import org.apache.xalan.xpath.xml.XMLParserLiaison;
-import org.apache.xalan.xpath.xml.ProblemListenerDefault;
-import org.apache.xalan.xpath.xml.ProblemListener;
-import org.apache.xalan.templates.StylesheetComposed;
-import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.processor.StylesheetHandler;
-import org.apache.xalan.processor.TransformerFactoryImpl;
-//import org.apache.xalan.processor.ProcessorStylesheet;
-//import org.apache.xalan.xslt.StylesheetSpec;
-import org.apache.xalan.trace.*;
-import org.apache.xalan.res.XSLTErrorResources;
-import org.apache.xalan.res.XSLMessages;
-import org.apache.xml.utils.PrefixResolverDefault;
-import org.apache.xml.utils.TreeWalker;
-import org.apache.xml.utils.QName;
-import org.apache.xml.utils.DefaultErrorHandler;
-import org.apache.xalan.transformer.TransformerHandlerImpl;
-
-// Imported JAVA API for XML Parsing 1.0 classes
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-
-/**
- * <meta name="usage" content="advanced"/>
- * The Xalan workhorse -- Collaborates with the XML parser liaison, the DOM,
- * and the XPath engine, to transform a source tree of nodes into a result tree
- * according to instructions and templates specified by a stylesheet tree.
- * We suggest you use one of the
- * static XSLTProcessorFactory getProcessor() methods to instantiate the processor
- * and return an interface that greatly simplifies the process of manipulating
- * XSLTEngineImpl.
- *
- * <p>The methods <code>process(...)</code> are the primary public entry points.
- * The best way to perform transformations is to use the
- * {@link org.apache.xalan.xslt.XSLTProcessor#process(org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTResultTarget)} method,
- * but you may use any of process methods defined in XSLTEngineImpl.</p>
- * 
- * <p>Please note that this class is not safe per instance over multiple 
- * threads.  If you are in a multithreaded environment, you should 
- * keep a pool of these objects, or create a new one each time.  In a 
- * multithreaded environment, the right way to do things is to create a 
- * StylesheetRoot via processStylesheet, and then reuse this object 
- * over multiple threads.</p>
- *
- * <p>If you reuse the processor instance, you should call reset() between transformations.</p>
- * @see XSLTProcessorFactory
- * @see XSLTProcessor
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XSLTEngineImpl implements  XSLTProcessor
-{
-  //private Processor m_processor;
-  private TransformerFactory m_tfactory;
-  private TransformerImpl m_transformerImpl;
-  private DOM2Helper m_liaison;
-  private String m_outputFileName;
-  private DocumentHandler m_documentHandler = null;
-  private ProblemListenerDefault m_problemListener;
-  private Hashtable m_stylesheetParams;
-  StylesheetRoot m_stylesheetRoot = null;
-  
-  Vector m_evalList = null;
-  boolean m_needToEval = false;
-  
-  /*
-  * If this is true, then the diag function will
-  * be called.
-  */
-  private boolean m_traceTemplateChildren = false;
-
-  /*
-  * If this is true, then the simple tracing of templates
-  * will be performed.
-  */
-  private boolean m_traceTemplates = false;
-  
-  /*
-  * If this is true, then diagnostics of each select
-  * will be performed.
-  */
-  boolean m_traceSelects = false;
-
-  /*
-  * A stream to print diagnostics to.
-  */
-  java.io.PrintWriter m_diagnosticsPrintWriter = null;
-
-  /* For diagnostics */
-  Hashtable m_durationsTable = new Hashtable();
-  
-  /**
-   * A XSLMessages instance capable of producing user messages.
-   */
-  private static XSLMessages m_XSLMessages = new XSLMessages();
-  
-    
- /**
-   * Construct an XSLT processor that uses the default DTM (Document Table Model) liaison
-   * and XML parser. As a general rule, you should use XSLTProcessorFactory to create an
-   * instance of this class and provide access to the instance via the XSLTProcessor interface.
-   *
-   * @see XSLTProcessorFactory
-   * @see XSLTProcessor
-   */
-  protected XSLTEngineImpl()
-    throws org.xml.sax.SAXException
-  {    
-    m_tfactory = TransformerFactory.newInstance();
-    m_problemListener = new ProblemListenerDefault();
-    //m_liaison =  (DOM2Helper)createLiaison();
-  }
-
-  /**
-   * Construct an XSLT processor that uses the the given parser liaison.
-   * As a general rule, you should use XSLTProcessorFactory to create an
-   * instance of this class and provide access to the instance via the XSLTProcessor interface.
-   *
-   * @see XSLTProcessorFactory
-   * @see XSLTProcessor
-   */
-  public XSLTEngineImpl(String liaisonClassName)
-    throws SAXException 
-  {   
-    m_tfactory = TransformerFactory.newInstance();
-    m_problemListener = new ProblemListenerDefault();
-    
-    try 
-      {
-        m_liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
-        //org.apache.xpath.XPathContext xctxt = this.getTransformer().getXPathContext();
-
-        //xctxt.setDOMHelper(m_liaison);        
-      } 
-      catch (ClassNotFoundException e1) 
-      {
-        throw new SAXException("XML Liaison class " + liaisonClassName +
-          " specified but not found", e1);
-      } 
-      catch (IllegalAccessException e2) 
-      {
-          throw new SAXException("XML Liaison class " + liaisonClassName +
-            " found but cannot be loaded", e2);
-      } 
-      catch (InstantiationException e3) 
-      {
-          throw new SAXException("XML Liaison class " + liaisonClassName +
-            " loaded but cannot be instantiated (no empty public constructor?)",
-            e3);
-      } 
-      catch (ClassCastException e4) 
-      {
-          throw new SAXException("XML Liaison class " + liaisonClassName +
-            " does not implement DOM2Helper", e4);
-      }
-   
-  }
-    
-    
-
-  /**
-   * Construct an XSL processor that uses the the given parser liaison.
-   * As a general rule, you should use XSLTProcessorFactory to create an
-   * instance of this class and provide access to the instance via the XSLTProcessor interface.
-   *
-   * @param XMLParserLiaison A liaison to an XML parser.
-   *
-   * @see org.apache.xalan.xpath.xml.XMLParserLiaison
-   * @see XSLTProcessorFactory
-   * @see XSLTProcessor
-   */
-  public XSLTEngineImpl(XMLParserLiaison parserLiaison)
-    throws org.xml.sax.SAXException
-  {
-    m_tfactory = TransformerFactory.newInstance();
-    m_problemListener = new ProblemListenerDefault();
-    
-    m_liaison =  (DOM2Helper)parserLiaison;
-   // org.apache.xpath.XPathContext xctxt = this.getTransformer().getXPathContext();
-
-    //xctxt.setDOMHelper(m_liaison);    
-  }
-
-  /**
-   * Construct an XSLT processor that can call back to the XML parser, in order to handle
-   * included files and the like.
-   *
-   * @param XMLParserLiaison A liaison to an XML parser.
-   *
-   * @see org.apache.xalan.xpath.xml.XMLParserLiaison
-   * @see XSLTProcessorFactory
-   * @see XSLTProcessor
-   */
-  XSLTEngineImpl(XMLParserLiaison parserLiaison, XPathFactory xpathFactory)    
-    throws SAXException
-  {   
-    m_tfactory = TransformerFactory.newInstance();
-    m_problemListener = new ProblemListenerDefault();
-    
-    m_liaison =  (DOM2Helper)parserLiaison;
-   // org.apache.xpath.XPathContext xctxt = this.getTransformer().getXPathContext();
-
-    //xctxt.setDOMHelper(m_liaison);    
-  }
-  
-  /** 
-   * Get a Liaison class
-   */
-  public XMLParserLiaison createLiaison()
-    throws org.xml.sax.SAXException
-  {
-    return new org.apache.xalan.xpath.xml.XMLParserLiaisonDefault();    
-  }
- 
-  /**
-   * Reset the state.  This needs to be called after a process() call
-   * is invoked, if the processor is to be used again.
-   */
-  public void reset()
-  {
-    if (m_transformerImpl != null)
-      m_transformerImpl.reset(); 
-    m_stylesheetParams = null;
-  }
-  
- 
-
-  /**
-   * Transform the source tree to the output in the given
-   * result tree target. As a general rule, we recommend you use the
-   * {@link org.apache.xalan.xslt.XSLTProcessor#process(org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTInputSource, org.apache.xalan.xslt.XSLTResultTarget)} method.
-   * @param inputSource  The input source.
-   * @param stylesheetSource  The stylesheet source.  May be null if source has a xml-stylesheet PI.
-   * @param outputTarget The output source tree.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void process( XSLTInputSource inputSource,
-                       XSLTInputSource stylesheetSource,
-                       XSLTResultTarget outputTarget)
-    throws SAXException
-  {
-    try
-    {
-      Boolean totalTimeID = new Boolean(true);
-      pushTime(totalTimeID);
-      Node sourceTree = null;
-      
-      Templates templates = null;
-      if (m_needToEval)
-      {
-        Node node = null;
-        if (null != stylesheetSource)
-        {
-          Source ssSource = stylesheetSource.getSourceObject();
-          if(ssSource instanceof DOMSource)
-          {
-            node = ((DOMSource)ssSource).getNode();
-          }
-        }
-        if (null == node)
-        {
-          node = new DOM2Helper().createDocument() ; 
-        }
-        for (int i=0; i< m_evalList.size(); i++)
-        {
-          String name = (String)m_evalList.elementAt(i);
-          String expression = (String)m_stylesheetParams.get(name);
-          try{
-            org.apache.xpath.objects.XObject val = org.apache.xpath.XPathAPI.eval(node, expression);
-            
-            m_stylesheetParams.put(name, val);
-          }
-          catch(TransformerException te)
-          {
-            throw new SAXException(te);
-          }
-        }
-        m_needToEval = false;
-        m_evalList = null;
-      }
-      
-      sourceTree = getSourceTreeFromInput(inputSource);
-      
-      if(null != stylesheetSource)
-      {
-        try{
-        templates = m_tfactory.newTemplates(stylesheetSource.getSourceObject());
-        }
-        catch (TransformerConfigurationException tce)
-        {
-          throw new SAXException(tce);
-        }  
-        
-      }      
-      else if( null != inputSource)
-      { 
-        if(null != sourceTree)
-        {
-          String stylesheetURI = null;
-          Stack hrefs = new Stack();
-          for(Node child=sourceTree.getFirstChild(); null != child; child=child.getNextSibling())
-          {
-            if(Node.PROCESSING_INSTRUCTION_NODE == child.getNodeType())
-            {
-              ProcessingInstruction pi = (ProcessingInstruction)child;
-              if(pi.getNodeName().equals("xml-stylesheet")
-                 || pi.getNodeName().equals("xml:stylesheet"))
-              {
-                boolean isOK = true;
-                StringTokenizer tokenizer = new StringTokenizer(pi.getNodeValue(), " \t=");
-                while(tokenizer.hasMoreTokens())
-                {
-                  if(tokenizer.nextToken().equals("type"))
-                  {
-                    String typeVal = tokenizer.nextToken();
-                    typeVal = typeVal.substring(1, typeVal.length()-1);
-                    if(!typeVal.equals("text/xsl") && !typeVal.equals("text/xml") && !typeVal.equals("application/xml+xslt"))
-                    {
-                      isOK = false;
-                    }
-                  }
-                }
-
-                if(isOK)
-                {
-                  tokenizer = new StringTokenizer(pi.getNodeValue(), " \t=");
-                  while(tokenizer.hasMoreTokens())
-                  {
-                    if(tokenizer.nextToken().equals("href"))
-                    {
-                      stylesheetURI = tokenizer.nextToken();
-                      stylesheetURI = stylesheetURI.substring(1, stylesheetURI.length()-1);
-                      hrefs.push(stylesheetURI);
-                    }
-                  }                
-                }
-              }
-            }
-          } // end for(int i = 0; i < nNodes; i++)
-          boolean isRoot = true;
-          Stylesheet prevStylesheet = null;
-          while(!hrefs.isEmpty())
-          {
-            Stylesheet stylesheet = getStylesheetFromPIURL((String)hrefs.pop(), sourceTree,
-                                                           (null != inputSource)
-                                                           ? inputSource.getSystemId() : null,
-                                                           isRoot);
-            if(false == isRoot)
-            {
-              prevStylesheet.setImport((StylesheetComposed)stylesheet);
-            }
-            prevStylesheet = stylesheet;
-            isRoot = false;
-          }
-        }        
-      }
-      else
-      {
-        error(XSLTErrorResources.ER_NO_INPUT_STYLESHEET); //"Stylesheet input was not specified!");
-      }
-      
-     
-      if(null == templates)
-      {
-        if (m_stylesheetRoot != null)
-          templates = m_stylesheetRoot.getObject();
-        else
-        {  
-          error(XSLTErrorResources.ER_FAILED_PROCESS_STYLESHEET); //"Failed to process stylesheet!");
-          return;
-        }  
-      }
-
-      if(null != templates)
-      {
-        try{
-          m_transformerImpl = (TransformerImpl)templates.newTransformer(); 
-          if (m_problemListener != null)
-            m_transformerImpl.setErrorListener(m_problemListener);
-        //  if (m_liaison != null)
-        //    m_transformerImpl.getXPathContext().setDOMHelper(m_liaison);
-   
-        }
-        catch (TransformerConfigurationException tce)
-        {
-          throw new SAXException(tce);
-        }  
-        
-        if (m_stylesheetParams != null)
-        {
-          Enumeration keys = m_stylesheetParams.keys();
-          while (keys.hasMoreElements())
-          {
-            String name = (String)keys.nextElement();
-            Object value = m_stylesheetParams.get(name); 
-            m_transformerImpl.setParameter(name, null, value);
-          } 
-        }  
-        
-        try{
-          m_transformerImpl.transform(new DOMSource(sourceTree),
-                    outputTarget.getResultObject());
-        }
-        catch (TransformerException te)
-        {
-          throw new SAXException(te);
-        }  
-        if(null != m_diagnosticsPrintWriter)
-        {
-          displayDuration("Total time", totalTimeID);
-        }
-      }
-    }
-    catch(MalformedURLException mue)
-    {
-      error(XSLTErrorResources.ERROR0000, new Object[] {mue.getMessage()}, mue);
-      // throw se;
-    }
-    catch(FileNotFoundException fnfe)
-    {
-      error(XSLTErrorResources.ERROR0000, new Object[] {fnfe.getMessage()}, fnfe);
-      // throw se;
-    }
-    catch(IOException ioe)
-    {
-      error(XSLTErrorResources.ERROR0000, new Object[] {ioe.getMessage()}, ioe);
-      // throw se;
-    }
-    catch(SAXException se)
-    {
-      error(XSLTErrorResources.ER_SAX_EXCEPTION, se); //"SAX Exception", se);
-      // throw se;
-    }
-  }
-
-  /**
-   * Bottleneck the creation of the stylesheet for derivation purposes.
-   */
-  public StylesheetRoot createStylesheetRoot(String baseIdentifier)
-    throws MalformedURLException, FileNotFoundException,
-           IOException, SAXException
-  {
-    try{
-      if (baseIdentifier == null)
-        return new StylesheetRoot(this, baseIdentifier); 
-      
-      Source inSource = new XSLTInputSource(baseIdentifier).getSourceObject();
-      Templates templates = m_tfactory.newTemplates(inSource);
-      StylesheetRoot stylesheet = new StylesheetRoot((org.apache.xalan.templates.StylesheetRoot)templates);      
-      return stylesheet;      
-    }
-    catch (TransformerConfigurationException tce)
-    {
-      throw new SAXException(tce);
-    }
-  }
-  
-  /**
-   * Bottleneck the creation of the stylesheet for derivation purposes.
-   */
-  StylesheetRoot createStylesheetRoot(String baseIdentifier, XSLTInputSource source)
-    throws MalformedURLException, FileNotFoundException,
-           IOException, SAXException
-  {
-    try{
-      Source inSource = source.getSourceObject();
-      Templates templates = m_tfactory.newTemplates(inSource);
-      StylesheetRoot stylesheet = new StylesheetRoot((org.apache.xalan.templates.StylesheetRoot)templates);      
-      return stylesheet;      
-    }
-    catch (TransformerConfigurationException tce)
-    {
-      throw new SAXException(tce);
-    }
-  }
-
-  /**
-   * Given a URI to an XSL stylesheet,
-   * Compile the stylesheet into an internal representation.
-   * This calls reset() before processing if the stylesheet root has been set
-   * to non-null.
-   * @param xmldocURLString  The URL to the input XML document.
-   * @return The compiled stylesheet object.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public StylesheetRoot processStylesheet(XSLTInputSource stylesheetSource)
-    throws SAXException
-  {
-    try{
-      if(null != ((TransformerFactoryImpl)m_tfactory).newTemplatesHandler().getTemplates())
-        reset();
-    }
-    catch (TransformerConfigurationException tce)
-    {
-      throw new SAXException(tce);
-    }
-
-    String xslIdentifier = ((null == stylesheetSource) ||
-                            (null == stylesheetSource.getSystemId()))
-                           ? "Input XSL" : stylesheetSource.getSystemId();
-
-    // In case we have a fragment identifier, go ahead and
-    // try and parse the XML here.
-    m_stylesheetRoot = null;
-    try
-    {
-      StylesheetHandler stylesheetProcessor
-          = new StylesheetHandler((TransformerFactoryImpl)m_tfactory); //this, m_stylesheetRoot); 
-        
-      Source ssSource = stylesheetSource.getSourceObject();
-      if(ssSource instanceof DOMSource)
-      {
-        if(((DOMSource)ssSource).getNode() instanceof StylesheetRoot)
-        {
-          m_stylesheetRoot = (StylesheetRoot)((DOMSource)ssSource).getNode();
-        }
-        else
-        {
-          stylesheetProcessor.setSystemId(stylesheetSource.getSystemId());
-          TreeWalker tw = new TreeWalker(stylesheetProcessor, new org.apache.xpath.DOM2Helper());
-          tw.traverse(((DOMSource)ssSource).getNode());
-          m_stylesheetRoot = new StylesheetRoot(stylesheetProcessor.getStylesheetRoot());
-        }
-      }
-      else
-      {
-				if(null != m_liaison)
-        {
-         // DOM2Helper liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
-          m_liaison.parse(SAXSource.sourceToInputSource(ssSource));
-					DOMSource source = new DOMSource(m_liaison.getDocument());
-					Templates templates = m_tfactory.newTemplates(source);
-					m_stylesheetRoot = new StylesheetRoot(
-																(org.apache.xalan.templates.StylesheetRoot)templates);																 
-        }  
-				else
-				{
-					m_stylesheetRoot = createStylesheetRoot(stylesheetSource.getSystemId(), stylesheetSource);
-				}
-        addTraceListenersToStylesheet();
-        
-        
-        stylesheetProcessor.pushStylesheet(m_stylesheetRoot.getObject());      
-        diag("========= Parsing "+xslIdentifier+" ==========");
-        pushTime(xslIdentifier);
-        //String liaisonClassName = System.getProperty("org.apache.xalan.source.liaison");
-
-        
-        if(null != m_diagnosticsPrintWriter)
-          displayDuration("Parse of "+xslIdentifier, xslIdentifier);
-      }
-    }
-    catch(Exception e)
-    {
-      error(XSLTErrorResources.ER_COULDNT_PARSE_DOC, new Object[] {xslIdentifier}, e); //"Could not parse "+xslIdentifier+" document!", e);
-    }
-    return m_stylesheetRoot;
-  }
-
-  /**
-   * Given a URI to an XSL stylesheet,
-   * Compile the stylesheet into an internal representation.
-   * This calls reset() before processing if the stylesheet root has been set
-   * to non-null.
-   * @param xmldocURLString  The URL to the input XML document.
-   * @return The compiled stylesheet object.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public StylesheetRoot processStylesheet(String xsldocURLString)
-    throws SAXException
-  {
-    try
-    {
-      XSLTInputSource input = new XSLTInputSource(getURLFromString(xsldocURLString, null).toString());
-      return processStylesheet(input);
-    }
-    catch(SAXException se)
-    {
-      error(XSLTErrorResources.ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL, se); //"processStylesheet not succesfull!", se);
-      return null; // shut up compiler
-    }
-  }
-
-  /**
-   * Set the stylesheet for this processor.  If this is set, then the
-   * process calls that take only the input .xml will use
-   * this instead of looking for a stylesheet PI.  Also,
-   * setting the stylesheet is needed if you are going
-   * to use the processor as a SAX DocumentHandler.
-   */
-  public void setStylesheet(StylesheetRoot stylesheetRoot)
-  {
-    m_stylesheetRoot = stylesheetRoot;
-    org.apache.xalan.templates.StylesheetRoot sr = stylesheetRoot.getObject();
-    if (m_transformerImpl == null)
-      m_transformerImpl = (TransformerImpl)sr.newTransformer();
-    m_transformerImpl.setStylesheet(sr);
-    if (m_problemListener != null)
-      m_transformerImpl.setErrorListener(m_problemListener);
-  }
-
-  /**
-   * Get the current stylesheet for this processor.
-   */
-  public StylesheetRoot getStylesheet()    
-  {
-    return m_stylesheetRoot;
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Get the filename of the output document, if it was set.
-   * This is for use by multiple output documents, to determine
-   * the base directory for the output document.  It needs to
-   * be set by the caller.
-   */
-  public String getOutputFileName()
-  {
-    return m_outputFileName;
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Set the filename of the output document.
-   * This is for use by multiple output documents, to determine
-   * the base directory for the output document.  It needs to
-   * be set by the caller.
-   */
-  public void setOutputFileName(String filename)
-  {
-    m_outputFileName = filename;
-  }
-
-  
-
-  /**
-   * Given an input source, get the source tree.
-   */
-  public Node getSourceTreeFromInput(XSLTInputSource inputSource)
-    throws org.xml.sax.SAXException
-  {
-    Node sourceTree = null;
-    String xmlIdentifier = ((null == inputSource) ||
-                            (null == inputSource.getSystemId()))
-                           ? "Input XML" : inputSource.getSystemId();
-    
-    Source iSource = inputSource.getSourceObject(); 
-
-    if(iSource instanceof DOMSource)
-    {
-      //if(getXMLProcessorLiaison() instanceof org.apache.xalan.xpath.dtm.DTMLiaison)
-       // error(XSLTErrorResources.ER_CANT_USE_DTM_FOR_INPUT);
-
-      sourceTree = ((DOMSource)iSource).getNode();
-    }
-    else
-    {
-      // In case we have a fragment identifier, go ahead and
-      // try and parse the XML here.
-      try
-      {
-        diag("========= Parsing "+xmlIdentifier+" ==========");
-        pushTime(xmlIdentifier);
-        
-        //String liaisonClassName = System.getProperty("org.apache.xalan.source.liaison");
-
-        if(null != m_liaison)
-        {
-          //DOM2Helper liaison =  (DOM2Helper)(Class.forName(liaisonClassName).newInstance());
-          m_liaison.parse(SAXSource.sourceToInputSource(iSource));
-          if(null != m_diagnosticsPrintWriter)
-            displayDuration("Parse of "+xmlIdentifier, xmlIdentifier);
-          sourceTree = m_liaison.getDocument();
-        }
-				else
-				{
-					try
-					{
-
-						// Use an implementation of the JAVA API for XML Parsing 1.0 to
-						// create a DOM Document node to contain the result.
-						DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-
-						dfactory.setNamespaceAware(true);
-						dfactory.setValidating(false);
-
-						DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-						sourceTree = docBuilder.parse(xmlIdentifier);
-
-					}
-					catch (ParserConfigurationException pce)
-					{
-						error(XSLTErrorResources.ER_COULDNT_PARSE_DOC, new Object[] {xmlIdentifier}, pce); 
-					}
-				}							
-      }
-      catch(Exception e)
-      {
-        // Unwrap exception
-        if((e instanceof SAXException) && (null != ((SAXException)e).getException()))
-        {
-          // ((SAXException)e).getException().printStackTrace();
-          e = ((SAXException)e).getException();
-        }
-        sourceTree = null; // shutup compiler
-        error(XSLTErrorResources.ER_COULDNT_PARSE_DOC, new Object[] {xmlIdentifier}, e); //"Could not parse "+xmlIdentifier+" document!", e);
-      }
-    }
-
-    return sourceTree;
-  }
-
-  /**
-   * Get Stylesheet from PI URL
-   * 
-   * @param xslURLString a valid URI to an XSL stylesheet.
-   * @param fragbase Document fragment Node.
-   * @param xmlBaseIdent Base URI to resolve stylesheet URL 
-   * @param isRoot Flag indicating if root node
-   */
-  Stylesheet getStylesheetFromPIURL(String xslURLString, Node fragBase,
-                                    String xmlBaseIdent, boolean isRoot)
-    throws SAXException,
-    MalformedURLException,
-    FileNotFoundException,
-    IOException
-  {
-    Stylesheet stylesheet = null;
-    String[] stringHolder =
-    {
-      null};
-    xslURLString = xslURLString.trim();
-    int fragIndex = xslURLString.indexOf('#');
-    String fragID = null;
-    Document stylesheetDoc;
-    if(fragIndex == 0)
-    {
-      diag("Locating stylesheet from fragment identifier...");
-      fragID = xslURLString.substring(1);
-      
-      // Try a bunch of really ugly stuff to find the fragment.
-      // What's the right way to do this?
-
-      // Create a XPath parser.
-      XPathParser parser = new XPathParser((ErrorListener)m_problemListener.getErrorHandler(), null);
-      XPathContext xpathContext = new XPathContext();
-      PrefixResolverDefault nsNode = new PrefixResolverDefault(fragBase); //xpathContext.getNamespaceContext();
-
-      NodeIterator nl = null;
-      // Create the XPath object.
-      try{
-      XPath xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
-      Compiler compiler = new Compiler();
-      // Parse the xpath
-      parser.initXPath(compiler, "id("+fragID+")", nsNode);
-      org.apache.xpath.objects.XObject xobj = xpath.execute(xpathContext, fragBase, nsNode);
-
-      nl = new org.apache.xml.dtm.ref.DTMNodeIterator(xobj.iter());
-      if(nl.nextNode() == null)
-      {
-        // xobj = Stylesheet.evalXPathStr(getExecContext(), "//*[@id='"+fragID+"']", fragBase, nsNode);
-        // Create the XPath object.
-        xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
-
-        // Parse the xpath
-        parser.initXPath(compiler, "//*[@id='"+fragID+"']", nsNode);
-        xobj = xpath.execute(xpathContext, fragBase, nsNode);
-
-        nl = new org.apache.xml.dtm.ref.DTMNodeIterator(xobj.iter());
-        if(nl.nextNode() == null)
-        {
-          // xobj = Stylesheet.evalXPathStr(getExecContext(), "//*[@name='"+fragID+"']", fragBase, nsNode);
-          // Create the XPath object.
-          xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
-
-          // Parse the xpath
-          parser.initXPath(compiler, "//*[@name='"+fragID+"']", nsNode);
-          xobj = xpath.execute(xpathContext, fragBase, nsNode);
-          nl = new org.apache.xml.dtm.ref.DTMNodeIterator(xobj.iter());
-          if(nl.nextNode() == null)
-          {
-            // Well, hell, maybe it's an XPath...
-            // xobj = Stylesheet.evalXPathStr(getExecContext(), fragID, fragBase, nsNode);
-            // Create the XPath object.
-            //((StylesheetHandler)( m_processor.getTemplatesBuilder())).getLocator()
-            xpath = new XPath(fragID, null, nsNode, XPath.MATCH);
-
-            // Parse the xpath
-            parser.initXPath(compiler, fragID, nsNode);
-            xobj = xpath.execute(xpathContext, fragBase, nsNode);
-            nl = new org.apache.xml.dtm.ref.DTMNodeIterator(xobj.iter());
-          }
-        }
-      }
-      }
-      catch (TransformerException te)
-      {
-        throw new SAXException(te);
-      }
-      if(nl.nextNode() == null)
-      {
-        error(XSLTErrorResources.ER_COULDNT_FIND_FRAGMENT, new Object[] {fragID}); //"Could not find fragment: "+fragID);
-      }
-      // Use previous because the previous call moved the pointer.
-      // or should we use getRoot??
-      Node frag = nl.previousNode(); //.item(0);
-
-      if(Node.ELEMENT_NODE == frag.getNodeType())
-      {
-        pushTime(frag);
-        if(isRoot)
-        {
-          m_stylesheetRoot = createStylesheetRoot(stringHolder[0]);
-          stylesheet = m_stylesheetRoot.getObject();
-        }
-        else
-        {
-          //stylesheet = new Stylesheet(m_stylesheetRoot);
-          // stylesheet = ((StylesheetHandler)(m_processor.getTemplatesBuilder())).getStylesheetRoot();
-          try{
-            Source source = new XSLTInputSource(fragID).getSourceObject(); 
-            Templates templates = m_tfactory.newTemplates(source);
-            stylesheet = (org.apache.xalan.templates.StylesheetRoot)templates;
-          }
-          catch (TransformerConfigurationException tce)
-          {
-            throw new SAXException(tce);
-          }
-        }
-        addTraceListenersToStylesheet();
-
-        try{
-        StylesheetHandler stylesheetProcessor
-          = new StylesheetHandler((TransformerFactoryImpl)m_tfactory);
-           
-        stylesheetProcessor.pushStylesheet(stylesheet);
-        TreeWalker tw = new TreeWalker(stylesheetProcessor, new org.apache.xpath.DOM2Helper());
-        tw.traverse(frag);
-
-        displayDuration("Setup of "+xslURLString, frag);
-        }
-        catch (TransformerConfigurationException tce)
-        {
-          throw new SAXException(tce);
-        }
-      }
-      else
-      {
-        stylesheetDoc = null;
-        error(XSLTErrorResources.ER_NODE_NOT_ELEMENT, new Object[] {fragID}); //"Node pointed to by fragment identifier was not an element: "+fragID);
-      }
-    }
-    else
-    {
-      // TODO: Use Reader here??
-      // hmmm.. for now I'll rely on the XML parser to handle
-      // fragment URLs.
-      diag(XSLMessages.createMessage(XSLTErrorResources.WG_PARSING_AND_PREPARING, new Object[] {xslURLString})); //"========= Parsing and preparing "+xslURLString+" ==========");
-      pushTime(xslURLString);
-
-			URL xslURL = getURLFromString(xslURLString, xmlBaseIdent);
-
-      XSLTInputSource inputSource = new XSLTInputSource(xslURL.toString());
-      
-			if(isRoot)
-			{				
-				if(null != m_liaison)
-				{
-					try{
-						m_liaison.parse(SAXSource.sourceToInputSource(inputSource.getSourceObject()));
-						DOMSource source = new DOMSource(m_liaison.getDocument());
-						Templates templates = m_tfactory.newTemplates(source);
-						m_stylesheetRoot = new StylesheetRoot(
-																		(org.apache.xalan.templates.StylesheetRoot)templates);
-					}					
-					catch (TransformerException tce)
-					{
-						throw new SAXException(tce);
-					}
-				}
-				else
-				{
-					m_stylesheetRoot = createStylesheetRoot(xslURLString);
-				}
-				stylesheet = m_stylesheetRoot.getObject();
-			}
-      else
-      {
-        stylesheet = new Stylesheet(m_stylesheetRoot.getObject());
-      }
-      addTraceListenersToStylesheet();
-
-      try{
-      org.apache.xalan.processor.StylesheetHandler stylesheetProcessor
-        = new StylesheetHandler((TransformerFactoryImpl)m_tfactory); //this, stylesheet); 
-      stylesheetProcessor.pushStylesheet(stylesheet);
-         // new StylesheetHandler(this, stylesheet);
-      }
-      catch (TransformerConfigurationException tce)
-      {
-        throw new SAXException(tce);
-      }
-      
-       
-      //m_parserLiaison.setDocumentHandler(stylesheetProcessor);
-      //m_parserLiaison.parse(inputSource);
-
-      displayDuration("Parsing and init of "+xslURLString, xslURLString);
-    }
-    return stylesheet;
-  }
-
-        
-  /**
-   * Take a user string and try and parse XML, and also return 
-   * the url.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XPathContext decide 
-   * the error condition is severe enough to halt processing.
-   */
-  public static URL getURLFromString(String urlString, String base)
-    throws SAXException 
-  {
-    String origURLString = urlString;
-    String origBase = base;
-    
-    // System.out.println("getURLFromString - urlString: "+urlString+", base: "+base);
-    Object doc;
-    URL url = null;
-    int fileStartType = 0;
-    try
-    {
-      
-      if(null != base)
-      {
-        if(base.toLowerCase().startsWith("file:/"))
-        {
-          fileStartType = 1;
-        }
-        else if(base.toLowerCase().startsWith("file:"))
-        {
-          fileStartType = 2;
-        }
-      }
-      
-      boolean isAbsoluteURL;
-      
-      // From http://www.ics.uci.edu/pub/ietf/uri/rfc1630.txt
-      // A partial form can be distinguished from an absolute form in that the
-      // latter must have a colon and that colon must occur before any slash
-      // characters. Systems not requiring partial forms should not use any
-      // unencoded slashes in their naming schemes.  If they do, absolute URIs
-      // will still work, but confusion may result.
-      int indexOfColon = urlString.indexOf(':');
-      int indexOfSlash = urlString.indexOf('/');
-      if((indexOfColon != -1) && (indexOfSlash != -1) && (indexOfColon < indexOfSlash))
-      {
-        // The url (or filename, for that matter) is absolute.
-        isAbsoluteURL = true;
-      }
-      else
-      {
-        isAbsoluteURL = false;
-      }
-      
-      if(isAbsoluteURL || (null == base) || (base.length() == 0))
-      {
-        try 
-        {
-          url = new URL(urlString);
-        }
-        catch (MalformedURLException e) {}
-      }
-      // The Java URL handling doesn't seem to handle relative file names.
-      else if(!((urlString.charAt(0) == '.') || (fileStartType > 0)))
-      {
-        try 
-        {
-          URL baseUrl = new URL(base);
-          url = new URL(baseUrl, urlString);
-        }
-        catch (MalformedURLException e) 
-        {
-        }
-      }
-      
-      if(null == url)
-      {
-        // Then we're going to try and make a file URL below, so strip 
-        // off the protocol header.
-        if(urlString.toLowerCase().startsWith("file:/"))
-        {
-          urlString = urlString.substring(6);
-        }
-        else if(urlString.toLowerCase().startsWith("file:"))
-        {
-          urlString = urlString.substring(5);
-        }
-      }
-      
-      if((null == url) && ((null == base) || (fileStartType > 0)))
-      {
-        if(1 == fileStartType)
-        {
-          if(null != base)
-            base = base.substring(6);
-          fileStartType = 1;
-        }
-        else if(2 == fileStartType)
-        {
-          if(null != base)
-            base = base.substring(5);
-          fileStartType = 2;
-        }
-        
-        File f = new File(urlString);
-        
-        if(!f.isAbsolute() && (null != base))
-        {
-          // String dir = f.isDirectory() ? f.getAbsolutePath() : f.getParent();
-          // System.out.println("prebuiltUrlString (1): "+base);
-          StringTokenizer tokenizer = new StringTokenizer(base, "\\/");
-          String fixedBase = null;
-          while(tokenizer.hasMoreTokens())
-          {
-            String token = tokenizer.nextToken();
-            if (null == fixedBase) 
-            {
-              // Thanks to Rick Maddy for the bug fix for UNIX here.
-              if (base.charAt(0) == '\\' || base.charAt(0) == '/') 
-              {
-                fixedBase = File.separator + token;
-              }
-              else 
-              {
-                fixedBase = token;
-              }
-            }
-            else 
-            {
-              fixedBase+= File.separator + token;
-            }
-          }
-          // System.out.println("rebuiltUrlString (1): "+fixedBase);
-          f = new File(fixedBase);
-          String dir = f.isDirectory() ? f.getAbsolutePath() : f.getParent();
-          // System.out.println("dir: "+dir);
-          // System.out.println("urlString: "+urlString);
-          // f = new File(dir, urlString);
-          // System.out.println("f (1): "+f.toString());
-          // urlString = f.getAbsolutePath();
-          f = new File(urlString); 
-          boolean isAbsolute =  f.isAbsolute() 
-                                || (urlString.charAt( 0 ) == '\\')
-                                || (urlString.charAt( 0 ) == '/');
-          if(!isAbsolute)
-          {
-            // Getting more and more ugly...
-            if(dir.charAt( dir.length()-1 ) != File.separator.charAt(0) && 
-               urlString.charAt( 0 ) != File.separator.charAt(0))
-            {
-              urlString = dir + File.separator + urlString;
-            }
-            else
-            {
-              urlString = dir + urlString;
-            }
-
-            // System.out.println("prebuiltUrlString (2): "+urlString);
-            tokenizer = new StringTokenizer(urlString, "\\/");
-            String rebuiltUrlString = null;
-            while(tokenizer.hasMoreTokens())
-            {
-              String token = tokenizer.nextToken();
-              if (null == rebuiltUrlString) 
-              {
-                // Thanks to Rick Maddy for the bug fix for UNIX here.
-                if (urlString.charAt(0) == '\\' || urlString.charAt(0) == '/') 
-                {
-                  rebuiltUrlString = File.separator + token;
-                }
-                else 
-                {
-                  rebuiltUrlString = token;
-                }
-              }
-              else 
-              {
-                rebuiltUrlString+= File.separator + token;
-              }
-            }
-            // System.out.println("rebuiltUrlString (2): "+rebuiltUrlString);
-            if(null != rebuiltUrlString)
-              urlString = rebuiltUrlString;
-          }
-          // System.out.println("fileStartType: "+fileStartType);
-          if(1 == fileStartType)
-          {
-            if (urlString.charAt(0) == '/') 
-            {
-              urlString = "file://"+urlString;
-            }
-            else
-            {
-              urlString = "file:/"+urlString;
-            }
-          }
-          else if(2 == fileStartType)
-          {
-            urlString = "file:"+urlString;
-          }
-          try 
-          {
-            // System.out.println("Final before try: "+urlString);
-            url = new URL(urlString);
-          }
-          catch (MalformedURLException e) 
-          {
-            // System.out.println("Error trying to make URL from "+urlString);
-          }
-        }
-      }
-      if(null == url)
-      {
-        // The sun java VM doesn't do this correctly, but I'll 
-        // try it here as a second-to-last resort.
-        if((null != origBase) && (origBase.length() > 0))
-        {
-          try 
-          {
-            URL baseURL = new URL(origBase);
-            // System.out.println("Trying to make URL from "+origBase+" and "+origURLString);
-            url = new URL(baseURL, origURLString);
-            // System.out.println("Success! New URL is: "+url.toString());
-          }
-          catch (MalformedURLException e) 
-          {
-            // System.out.println("Error trying to make URL from "+origBase+" and "+origURLString);
-          }
-        }
-        
-        if(null == url)
-        {
-          try 
-          {
-            String lastPart;
-            if(null != origBase)
-            {
-              File baseFile = new File(origBase);
-              if(baseFile.isDirectory())
-              {
-                lastPart = new File(baseFile, urlString).getAbsolutePath ();
-              }
-              else
-              {
-                String parentDir = baseFile.getParent();
-                lastPart = new File(parentDir, urlString).getAbsolutePath ();
-              }
-            }
-            else
-            {
-              lastPart = new File (urlString).getAbsolutePath ();
-            }
-            // Hack
-            // if((lastPart.charAt(0) == '/') && (lastPart.charAt(2) == ':'))
-            //   lastPart = lastPart.substring(1, lastPart.length() - 1);
-            
-            String fullpath;
-            if (lastPart.charAt(0) == '\\' || lastPart.charAt(0) == '/') 
-            {
-              fullpath = "file://" + lastPart;
-            }
-            else
-            {
-              fullpath = "file:" + lastPart;
-            }
-            url = new URL(fullpath);
-          }
-          catch (MalformedURLException e2)
-          {
-            throw new SAXException("Cannot create url for: " + urlString, e2 ); 
-              //XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_CREATE_URL, new Object[]{urlString}),e2); //"Cannot create url for: " + urlString, e2 );
-          }
-        }
-      }
-    }
-    catch(SecurityException se)
-    {
-      try
-      {
-        url = new URL("http://xml.apache.org/xslt/"+java.lang.Math.random()); // dummy
-      }
-      catch (MalformedURLException e2)
-      {
-        // I give up
-      }
-    }
-    // System.out.println("url: "+url.toString());
-    return url;
-  }
-
-   /**
-   * Add a trace listener for the purposes of debugging and diagnosis.
-   * @param tl Trace listener to be added.
-   */
-  void addTraceListenersToStylesheet()
-    throws SAXException
-  {
-    /*try
-    {
-      TraceManager tm = m_transformerImpl.getTraceManager();
-      if(tm.hasTraceListeners)
-      {
-        int nListeners = tm.size();
-        for(int i = 0; i < nListeners; i++)
-        {
-          TraceListener tl = (TraceListener)m_traceListeners.elementAt(i);
-          if(null != m_stylesheetRoot)
-            m_stylesheetRoot.addTraceListener(tl);
-        }
-      }
-    }
-    catch(TooManyListenersException tmle)
-    {
-      throw new SAXException(XSLMessages.createMessage(XSLTErrorResources.ER_TOO_MANY_LISTENERS, null),tmle ); //"addTraceListenersToStylesheet - TooManyListenersException", tmle);
-    }*/
-  }
-  
-  /**
-   * Warn the user of an problem.
-   * This is public for access by extensions.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void message(String msg)
-    throws SAXException
-  {
-    message(null, null, msg);
-  }
-
-
-
-  /**
-   * Warn the user of an problem.
-   * This is public for access by extensions.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void message(Node styleNode, Node sourceNode, String msg)
-    throws SAXException
-  {
-    m_problemListener.message(msg);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Warn the user of an problem.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void warn(int msg)
-    throws SAXException
-  {
-    warn(null, null, msg, null);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Warn the user of an problem.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void warn(int msg, Object[] args)
-    throws SAXException
-  {
-    warn(null, null, msg, args);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Warn the user of an problem.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void warn(Node styleNode, Node sourceNode, int msg)
-    throws SAXException
-  {
-    warn(styleNode, sourceNode, msg, null);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Warn the user of an problem.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void warn(Node styleNode, Node sourceNode, int msg, Object args[])
-    throws SAXException
-  {
-    Exception e = null;
-    String fmsg = m_XSLMessages.createWarning(msg, args);
-    SourceLocator locator = null;
-    try{
-     locator = ((StylesheetHandler)(((TransformerFactoryImpl)this.m_tfactory).newTemplatesHandler())).getLocator();
-    }
-    catch (TransformerConfigurationException tce)
-    {
-    }
-    
-    DefaultErrorHandler handler;
-    if (m_problemListener == null)
-      handler = (DefaultErrorHandler)m_tfactory.getErrorListener();
-    else
-      handler = (DefaultErrorHandler)m_problemListener.getErrorHandler();
-    TransformerException te = (null == e) ? new TransformerException(fmsg, locator) :
-                                          new TransformerException(fmsg, locator, e);
-    if(null != handler)
-    {
-      try{
-      handler.warning(te);
-      }
-      catch (TransformerException te2)
-      {
-        throw new SAXException(te2);
-      } 
-    }
-    else
-      throw new SAXException(te);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(String msg)
-    throws SAXException
-  {
-    Exception e = null;
-    SourceLocator locator = null;
-    try{
-    locator = ((StylesheetHandler)(((TransformerFactoryImpl)this.m_tfactory).newTemplatesHandler())).getLocator();
-    }
-    catch (TransformerConfigurationException tce)
-    {
-    }
-    DefaultErrorHandler handler;
-    if (m_problemListener == null)
-      handler = (DefaultErrorHandler)m_tfactory.getErrorListener();
-    else
-      handler = (DefaultErrorHandler)m_problemListener.getErrorHandler();
-    TransformerException te = (null == e) ? new TransformerException(msg, locator) :
-                                          new TransformerException(msg, locator, e);
-    if(null != handler)
-    {  
-      try{
-      handler.fatalError(te);
-    }
-      catch (TransformerException te2)
-      {
-        throw new SAXException(te2);
-      } 
-    }
-    else
-      throw new SAXException(te);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(int msg)
-    throws SAXException
-  {
-    error(null, null, msg, null);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(int msg, Object[] args)
-    throws SAXException
-  {
-    error(null, null, msg, args);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(int msg, Exception e)
-    throws SAXException
-  {
-    error(msg, null, e);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(int msg, Object args[], Exception e)
-    throws SAXException
-  {
-    String fmsg = m_XSLMessages.createMessage(msg, args);
-    SourceLocator locator = null;
-    try{
-      locator = ((StylesheetHandler)(((TransformerFactoryImpl)this.m_tfactory).newTemplatesHandler())).getLocator();
-    }
-    catch (TransformerConfigurationException tce)
-    {
-    }
-    DefaultErrorHandler handler;
-    if (m_problemListener == null)
-      handler = (DefaultErrorHandler)m_tfactory.getErrorListener();
-    else
-      handler = (DefaultErrorHandler)m_problemListener.getErrorHandler();
-    TransformerException te = (null == e) ? new TransformerException(fmsg, locator) :
-                                          new TransformerException(fmsg, locator, e);
-    if(null != handler)
-    {
-      try{
-      handler.fatalError(te);
-    }
-      catch (TransformerException te2)
-      {
-        throw new SAXException(te2);
-      } 
-    }
-    else
-      throw new SAXException(te);
-  }
-
-  /**
-    * <meta name="usage" content="internal"/>
-  * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(Node styleNode, Node sourceNode, int msg)
-    throws SAXException
-  {
-    error(styleNode, sourceNode, msg, null);
-  }
-
-  /**
-   * <meta name="usage" content="internal"/>
-   * Tell the user of an error, and probably throw an
-   * exception.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void error(Node styleNode, Node sourceNode, int msg, Object args[])
-    throws SAXException
-  {
-    Exception e = null;
-    String fmsg = m_XSLMessages.createMessage(msg, args);
-    SourceLocator locator = null;
-    try{
-     locator = ((StylesheetHandler)(((TransformerFactoryImpl)this.m_tfactory).newTemplatesHandler())).getLocator();
-    }
-    catch (TransformerConfigurationException tce)
-    {
-    }
-    DefaultErrorHandler handler;
-    if (m_problemListener == null)
-      handler = (DefaultErrorHandler)m_tfactory.getErrorListener();
-    else
-      handler = (DefaultErrorHandler)m_problemListener.getErrorHandler();
-    TransformerException te = (null == e) ? new TransformerException(fmsg, locator) :
-                                          new TransformerException(fmsg, locator, e);
-    if(null != handler)
-    {  
-      try{
-       handler.fatalError(te);
-      }
-      catch (TransformerException te2)
-      {
-        throw new SAXException(te2);
-      }
-    }
-    else
-      throw new SAXException(te);
-    
-   
-  }
-  
-  /**
-   * Mark the time, so that displayDuration can later
-   * display the elapse.
-   */
-  void pushTime(Object key)
-  {
-    if(null != key)
-    {
-      m_durationsTable.put(key, new Long(System.currentTimeMillis()));
-    }
-  }
-
-  /**
-   * Returns the duration since pushTime was called,
-   * in milliseconds.
-   */
-  long popDuration(Object key)
-  {
-    long millisecondsDuration = 0;
-    if(null != key)
-    {
-      long start = ((Long)m_durationsTable.get(key)).longValue();
-      long stop = System.currentTimeMillis();
-      millisecondsDuration = stop - start;
-      m_durationsTable.remove(key);
-    }
-    return millisecondsDuration;
-  }
-  
-   /**
-   * Display the duration since pushTime was called.
-   */
-  protected void displayDuration(String info, Object key)
-  {
-    long millisecondsDuration = 0;
-    if(null != key)
-    {
-      long start = ((Long)m_durationsTable.get(key)).longValue();
-      long stop = System.currentTimeMillis();
-      millisecondsDuration = stop - start;
-      if(null != m_diagnosticsPrintWriter)
-      {
-        m_diagnosticsPrintWriter.println(info + " took " + millisecondsDuration + " milliseconds");
-      }
-      m_durationsTable.remove(key);
-    }
-  }
-  
-  /**
-   * If this is set, diagnostics will be
-   * written to the m_diagnosticsPrintWriter stream. If
-   * the value is null, then diagnostics will be turned
-   * off.
-   */
-  public void setDiagnosticsOutput(java.io.OutputStream out)
-  {
-    setDiagnosticsOutput(new PrintWriter(out));
-  }
-
-  /**
-   * If this is set, diagnostics will be
-   * written to the m_diagnosticsPrintWriter stream. If
-   * the value is null, then diagnostics will be turned
-   * off.
-   */
-  public void setDiagnosticsOutput(java.io.PrintWriter pw)
-  {
-    m_diagnosticsPrintWriter = pw;
-   /* if(getProblemListener() instanceof ProblemListenerDefault)
-    {
-      ((ProblemListenerDefault)getProblemListener()).setDiagnosticsOutput(pw);
-    }*/
-  }
-
-  /**
-   * Bottleneck output of diagnostics.
-   */
-  protected void diag(String s)
-  {
-    if(null != m_diagnosticsPrintWriter)
-    {
-      m_diagnosticsPrintWriter.println(s);
-    }
-  }
-
-  /**
-   * If this is set to true, simple traces of
-   * template calls are made.
-   */
-  public void setTraceTemplates(boolean b)
-  {
-    m_traceTemplates = b;
-  }
-
-  /**
-   * If this is set to true, simple traces of
-   * template calls are made.
-   */
-  public void setTraceSelect(boolean b)
-  {
-    m_traceSelects = b;
-  }
-
-  /**
-   * If this is set to true, debug diagnostics about
-   * template children as they are being constructed
-   * will be written to the m_diagnosticsPrintWriter
-   * stream.  diagnoseTemplateChildren is false by
-   * default.
-   */
-  public void setTraceTemplateChildren(boolean b)
-  {
-    m_traceTemplateChildren = b;
-  }
-  
-  //
-  // Lexical handler interface
-  //
-
-    /**
-     * Report the start of DTD declarations, if any.
-     *
-     * <p>Any declarations are assumed to be in the internal subset
-     * unless otherwise indicated by a {@link #startEntity startEntity}
-     * event.</p>
-     *
-     * <p>Note that the start/endDTD events will appear within
-     * the start/endDocument events from ContentHandler and
-     * before the first startElement event.</p>
-     *
-     * @param name The document type name.
-     * @param publicId The declared public identifier for the
-     *        external DTD subset, or null if none was declared.
-     * @param systemId The declared system identifier for the
-     *        external DTD subset, or null if none was declared.
-     * @exception SAXException The application may raise an
-     *            exception.
-     * @see #endDTD
-     * @see #startEntity
-     */
-    public void startDTD (String name, String publicId, String systemId)
-	throws SAXException
-    {
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().startDTD(name, publicId, systemId);
-    }
-
-
-    /**
-     * Report the end of DTD declarations.
-     *
-     * @exception SAXException The application may raise an exception.
-     * @see #startDTD
-     */
-    public void endDTD ()
-	throws SAXException
-    {
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().endDTD();
-    }
-    
-    public void startEntity (String name)
-	throws SAXException
-    {
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().startEntity (name);
-    }
-
-
-    /**
-     * Report the end of an entity.
-     *
-     * @param name The name of the entity that is ending.
-     * @exception SAXException The application may raise an exception.
-     * @see #startEntity
-     */
-    public void endEntity (String name)
-	throws SAXException
-      {
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().endEntity (name);
-    }
-
-
-    /**
-     * Report the start of a CDATA section.
-     *
-     * <p>The contents of the CDATA section will be reported through
-     * the regular {@link org.xml.sax.ContentHandler#characters
-     * characters} event.</p>
-     *
-     * @exception SAXException The application may raise an exception.
-     * @see #endCDATA
-     */
-    public  void startCDATA ()
-	throws SAXException
-    { 
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().startCDATA();
-    }
-
-
-    /**
-     * Report the end of a CDATA section.
-     *
-     * @exception SAXException The application may raise an exception.
-     * @see #startCDATA
-     */
-    public void endCDATA ()
-	throws SAXException
-    {
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().endCDATA();
-    }
-
-
-    /**
-     * Report an XML comment anywhere in the document.
-     *
-     * <p>This callback will be used for comments inside or outside the
-     * document element, including comments in the external DTD
-     * subset (if read).</p>
-     *
-     * @param ch An array holding the characters in the comment.
-     * @param start The starting position in the array.
-     * @param length The number of characters to use from the array.
-     * @exception SAXException The application may raise an exception.
-     */
-    public  void comment (char ch[], int start, int length)
-	throws SAXException
-      {
-      if (m_transformerImpl != null && m_transformerImpl.getInputLexicalHandler() != null)
-        m_transformerImpl.getInputLexicalHandler().comment (ch, start, length);
-    }
-    
-    // DocumentHandler interface
-    
-        /**
-     * Receive an object for locating the origin of SAX document events.
-     *
-     * <p>SAX parsers are strongly encouraged (though not absolutely
-     * required) to supply a locator: if it does so, it must supply
-     * the locator to the application by invoking this method before
-     * invoking any of the other methods in the DocumentHandler
-     * interface.</p>
-     *
-     * <p>The locator allows the application to determine the end
-     * position of any document-related event, even if the parser is
-     * not reporting an error.  Typically, the application will
-     * use this information for reporting its own errors (such as
-     * character content that does not match an application's
-     * business rules).  The information returned by the locator
-     * is probably not sufficient for use with a search engine.</p>
-     *
-     * <p>Note that the locator will return correct information only
-     * during the invocation of the events in this interface.  The
-     * application should not attempt to use it at any other time.</p>
-     *
-     * @param locator An object that can return the location of
-     *                any SAX document event.
-     * @see org.xml.sax.Locator
-     */
-    public void setDocumentLocator (Locator locator)
-    {}
-    
-    
-    /**
-     * Receive notification of the beginning of a document.
-     *
-     * <p>The SAX parser will invoke this method only once, before any
-     * other methods in this interface or in DTDHandler (except for
-     * setDocumentLocator).</p>
-     *
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     */
-    public void startDocument ()
-	throws SAXException
-    {
-      if (m_documentHandler != null)
-        m_documentHandler.startDocument();
-      else if (m_transformerImpl != null)
-        m_transformerImpl.getInputContentHandler().startDocument();
-      //m_transformerImpl.getResultTreeHandler().startDocument();
-      
-    }
-    
-    
-    /**
-     * Receive notification of the end of a document.
-     *
-     * <p>The SAX parser will invoke this method only once, and it will
-     * be the last method invoked during the parse.  The parser shall
-     * not invoke this method until it has either abandoned parsing
-     * (because of an unrecoverable error) or reached the end of
-     * input.</p>
-     *
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     */
-    public void endDocument ()
-	throws SAXException
-    {
-      if (m_documentHandler != null)
-        m_documentHandler.endDocument();
-      else if (m_transformerImpl != null)
-        m_transformerImpl.getInputContentHandler().endDocument();
-      //m_transformerImpl.getResultTreeHandler().endDocument();
-    }
-    
-    
-    /**
-     * Receive notification of the beginning of an element.
-     *
-     * <p>The Parser will invoke this method at the beginning of every
-     * element in the XML document; there will be a corresponding
-     * endElement() event for every startElement() event (even when the
-     * element is empty). All of the element's content will be
-     * reported, in order, before the corresponding endElement()
-     * event.</p>
-     *
-     * <p>If the element name has a namespace prefix, the prefix will
-     * still be attached.  Note that the attribute list provided will
-     * contain only attributes with explicit values (specified or
-     * defaulted): #IMPLIED attributes will be omitted.</p>
-     *
-     * @param name The element type name.
-     * @param atts The attributes attached to the element, if any.
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     * @see #endElement
-     * @see org.xml.sax.AttributeList 
-     */
-    public void startElement (String name, AttributeList atts)
-	throws SAXException
-    {
-      if (m_documentHandler == null)       
-      { 
-        m_documentHandler = new ParserAdapter(new org.apache.xerces.parsers.SAXParser());
-        if (m_transformerImpl != null)
-        {  
-          ((ParserAdapter)m_documentHandler).setContentHandler(m_transformerImpl.getInputContentHandler());
-        }
-        /* else if (m_transformerImpl != null)
-        {
-        int index = name.indexOf(":");
-        if (index < 0 )
-        m_transformerImpl.getInputContentHandler().startElement(null, name, name, (Attributes)atts);
-        //getResultTreeHandler().startElement(null, name, name, (Attributes)atts);
-        else
-        m_transformerImpl.getInputContentHandler().startElement(name.substring(0,index), name.substring(index+1), name, (Attributes)atts);        
-        //m_transformerImpl.getResultTreeHandler().startElement(name.substring(0,index), name.substring(index+1), name, (Attributes)atts);
-        */ 
-      } 
-      m_documentHandler.startElement(name, atts);
-    }   
-    
-    /**
-     * Receive notification of the end of an element.
-     *
-     * <p>The SAX parser will invoke this method at the end of every
-     * element in the XML document; there will be a corresponding
-     * startElement() event for every endElement() event (even when the
-     * element is empty).</p>
-     *
-     * <p>If the element name has a namespace prefix, the prefix will
-     * still be attached to the name.</p>
-     *
-     * @param name The element type name
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     */
-    public void endElement (String name)
-	throws SAXException
-    {
-      if (m_documentHandler == null)        
-      {         
-        m_documentHandler = new ParserAdapter(new org.apache.xerces.parsers.SAXParser());
-        if (m_transformerImpl != null)
-        {
-          ((ParserAdapter)m_documentHandler).setContentHandler(m_transformerImpl.getInputContentHandler());
-        }
-     /* else if (m_transformerImpl != null)
-      {
-        int index = name.indexOf(":");
-        if (index < 0 )
-          m_transformerImpl.getInputContentHandler().endElement(null, name, name);
-          //m_transformerImpl.getResultTreeHandler().endElement(null, name, name);        
-        else
-          m_transformerImpl.getInputContentHandler().endElement(name.substring(0,index), name.substring(index+1), name);
-          //m_transformerImpl.getResultTreeHandler().endElement(name.substring(0,index), name.substring(index+1), name);
-        */
-      } 
-      m_documentHandler.endElement(name);      
-    }     
-    
-    
-    /**
-     * Receive notification of character data.
-     *
-     * <p>The Parser will call this method to report each chunk of
-     * character data.  SAX parsers may return all contiguous character
-     * data in a single chunk, or they may split it into several
-     * chunks; however, all of the characters in any single event
-     * must come from the same external entity, so that the Locator
-     * provides useful information.</p>
-     *
-     * <p>The application must not attempt to read from the array
-     * outside of the specified range.</p>
-     *
-     * <p>Note that some parsers will report whitespace using the
-     * ignorableWhitespace() method rather than this one (validating
-     * parsers must do so).</p>
-     *
-     * @param ch The characters from the XML document.
-     * @param start The start position in the array.
-     * @param length The number of characters to read from the array.
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     * @see #ignorableWhitespace 
-     * @see org.xml.sax.Locator
-     */
-    public void characters (char ch[], int start, int length)
-	throws SAXException
-    {
-      if (m_documentHandler != null)
-        m_documentHandler.characters(ch, start, length);
-      else if (m_transformerImpl != null)
-      m_transformerImpl.getInputContentHandler().characters(ch, start, length);
-      //m_transformerImpl.getResultTreeHandler().characters(ch, start, length);
-    }  
-    
-    
-    /**
-     * Receive notification of ignorable whitespace in element content.
-     *
-     * <p>Validating Parsers must use this method to report each chunk
-     * of ignorable whitespace (see the W3C XML 1.0 recommendation,
-     * section 2.10): non-validating parsers may also use this method
-     * if they are capable of parsing and using content models.</p>
-     *
-     * <p>SAX parsers may return all contiguous whitespace in a single
-     * chunk, or they may split it into several chunks; however, all of
-     * the characters in any single event must come from the same
-     * external entity, so that the Locator provides useful
-     * information.</p>
-     *
-     * <p>The application must not attempt to read from the array
-     * outside of the specified range.</p>
-     *
-     * @param ch The characters from the XML document.
-     * @param start The start position in the array.
-     * @param length The number of characters to read from the array.
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     * @see #characters
-     */
-    public void ignorableWhitespace (char ch[], int start, int length)
-	throws SAXException
-    {
-      if (m_documentHandler != null)
-        m_documentHandler.ignorableWhitespace(ch, start, length);
-      else if (m_transformerImpl != null)
-      m_transformerImpl.getInputContentHandler().ignorableWhitespace(ch, start, length);
-      //m_transformerImpl.getResultTreeHandler().ignorableWhitespace(ch, start, length);
-    }
-    
-    
-    /**
-     * Receive notification of a processing instruction.
-     *
-     * <p>The Parser will invoke this method once for each processing
-     * instruction found: note that processing instructions may occur
-     * before or after the main document element.</p>
-     *
-     * <p>A SAX parser should never report an XML declaration (XML 1.0,
-     * section 2.8) or a text declaration (XML 1.0, section 4.3.1)
-     * using this method.</p>
-     *
-     * @param target The processing instruction target.
-     * @param data The processing instruction data, or null if
-     *        none was supplied.
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     */
-    public  void processingInstruction (String target, String data)
-	throws SAXException
-    {
-      if (m_documentHandler != null)
-        m_documentHandler.processingInstruction(target, data);
-      else if (m_transformerImpl != null)
-      m_transformerImpl.getInputContentHandler().processingInstruction(target, data);
-      //m_transformerImpl.getResultTreeHandler().processingInstruction(target, data);
-    }
-    
-    // Implement XSLTProcessor
-    
-    /**
-   * Set the output stream. Required when the XSLTProcessor is being used
-   * as a SAX DocumentHandler.
-   */
-  public void setOutputStream(java.io.OutputStream os)
-  {
-    TransformerHandlerImpl handler = new TransformerHandlerImpl(m_transformerImpl, false, null);
-    handler.setResult(new StreamResult(os));   
-  }
-  
-  /**
-   * Convenience function to create an XString.
-   * @param s A valid string.
-   * @return An XString object.
-   */
-  public XString createXString(String s)
-  {
-    return new XString(s);
-  }
-
-  /**
-   * Convenience function to create an XObject.
-   * @param o Any java object.
-   * @return An XObject object.
-   */
-  public XObject createXObject(Object o)
-  {
-    return new XObject(o);
-  }
-
-  /**
-   * Convenience function to create an XNumber.
-   * @param d Any double number.
-   * @return An XNumber object.
-   */
-  public XNumber createXNumber(double d)
-  {
-    return new XNumber(d);
-  }
-
-  /**
-   * Convenience function to create an XBoolean.
-   * @param b boolean value.
-   * @return An XBoolean object.
-   */
-  public XBoolean createXBoolean(boolean b)
-  {
-    return new XBoolean(b);
-  }
-
-  /**
-   * Convenience function to create an XNodeSet.
-   * @param nl A NodeList object.
-   * @return An XNodeSet object.
-   */
-  public XNodeSet createXNodeSet(NodeList nl)
-  {
-    return new XNodeSet(nl);
-  }
-
-  /**
-   * Convenience function to create an XNodeSet from a node.
-   * @param n A DOM node.
-   * @return An XNodeSet object.
-   */
-  public XNodeSet createXNodeSet(Node n)
-  {
-    return new XNodeSet(n);
-  }
-
-  /**
-   * Convenience function to create an XNull.
-   * @return An XNull object.
-   */
-  public XNull createXNull()
-  {
-    return new XNull();
-  }
-  
-  /**
-   * Get the XMLParserLiaison that this processor uses.
-   */
-  public XMLParserLiaison getXMLProcessorLiaison()
-  {
-    return (XMLParserLiaison)m_liaison;
-  }
-
-  /**
-   * Get the preferred stylesheet for the XSLTInputSource XML document,
-   * as identified by the xml-stylesheet PI, and matching the media and
-   * charset criteria. See <a href="http://www.w3.org/TR/xml-stylesheet/">
-   * Associating Style Sheets with XML documents</a>.
-   * Does not yet handle the LINK REL="stylesheet" syntax.
-   *
-   * @param media The media attribute to be matched.  May be null, in which
-   *              case the prefered stylesheet will be used (i.e., alternate = no).
-   * @param title The value of the title attribute to match.  May be null.
-   * @param charset The value of the charset attribute to match.  May be null.
-   * @returns StylesheetSpec extends XSLTInputSource extedns SAX InputSource; the return value
-   * can be passed to the processStylesheet method.
-   */
-  public StylesheetSpec getAssociatedStylesheet(XSLTInputSource source,
-                                                      String media,
-                                                      String charset)
-    throws SAXException
-  {
-    /*InputSource[]in = m_processor.getAssociatedStylesheets(source, media, null, charset);
-    if (in.length >0)
-      return (StylesheetSpec)in[0];
-    else 
-      return null; */
-    try{
-    Source s = m_tfactory.getAssociatedStylesheet(source.getSourceObject(), media, null, charset);
-    return (StylesheetSpec)s; 
-    }
-    catch (TransformerConfigurationException tce) 
-    {
-      throw new SAXException(tce); 
-    }
-  }
-
-  /**
-   * Get a list of stylesheet specifications for the XSLTInputSource XML document,
-   * as identified by the xml-stylesheet PI, and matching the media and
-   * charset criteria. See <a href="http://www.w3.org/TR/xml-stylesheet/">
-   * Associating Style Sheets with XML documents</a>.
-   * Does not yet handle the LINK REL="stylesheet" syntax.
-   *
-   * @param media The media attribute to be matched.  May be null, in which
-   *              case the prefered stylesheet will be used (i.e., alternate = no).
-   * @param title The value of the title attribute to match.  May be null.
-   * @param charset The value of the charset attribute to match.  May be null.
-   * @returns list of StylesheetSpecs (extend XSLTInputSources extend SAX InputSources; a
-   * list member may be passsed to the processStylesheet method.
-   */
-  public Vector getAssociatedStylesheets(XSLTInputSource source,
-                                                      String media,
-                                                      String charset)
-    throws SAXException
-  {
-    try{
-      Source s = m_tfactory.getAssociatedStylesheet(source.getSourceObject(), media, null, charset);
-      Vector v = new Vector();
-      //for (int i = 0; i< in.length; i++)
-      v.addElement((StylesheetSpec)s);
-      return v;
-    }
-    catch (TransformerConfigurationException tce)
-    {
-      throw new SAXException(tce);
-    }                                              
-  }
-  
-  /**
-   * Submit a top-level stylesheet parameter.  This value can
-   * be evaluated in the stylesheet via xsl:param-variable.
-   * @param key The name of the param.
-   * @param value An XObject that will be used.
-   */
-  public void setStylesheetParam(String key, XObject value)
-  {
-    setParameter(key, value.object());
-  }
-
-  /**
-   * Set a top-level stylesheet parameter.  This value can
-   * be evaluated via xsl:param-variable.  Note that the value
-   * passed is an expression, and not a string.  This means that
-   * setStylesheetParam("foo", "hello"); will look for the
-   * element "hello".  If you want to pass a string, you'll
-   * need to put quotes around it:
-   * setStylesheetParam("foo", "'hello'"); will look for the
-   * @param key The name of the param.
-   * @param expression An expression that will be evaluated.
-   */
-  public void setStylesheetParam(String key, String expression)
-  {    
-    if (m_evalList == null)
-      m_evalList = new Vector();
-    if (!m_evalList.contains(key))
-      m_evalList.addElement(key);
-    setParameter(key, expression);
-    m_needToEval = true;
-  }
-  
-  /**
-   * Set a top-level stylesheet parameter.  This value can
-   * be evaluated via xsl:param-variable.  Note that the value
-   * passed is an expression, and not a string.  This means that
-   * setStylesheetParam("foo", "hello"); will look for the
-   * element "hello".  If you want to pass a string, you'll
-   * need to put quotes around it:
-   * setStylesheetParam("foo", "'hello'"); will look for the
-   * @param key The name of the param.
-   * @param expression An expression that will be evaluated.
-   */
-  public void setParameter(String key,  Object value)
-  {
-    if (m_stylesheetParams == null)
-      m_stylesheetParams = new Hashtable();
-    m_stylesheetParams.put(key, value); 
-  }
-
-  /**
-   * Get the current FormatterListener (SAX DocumentHandler), or null if none has been set.
-   */
-  public DocumentHandler getFormatterListener()
-  {
-    return m_documentHandler;
-    
-  }
-
-  /**
-   * Set the FormatterListener (the SAX DocumentHandler).
-   */
-  public void setFormatterListener(DocumentHandler flistener)
-  {
-    m_documentHandler = flistener;
-  }
-
-  /**
-   * Get the current SAX DocumentHandler (the same object as the FormatterListener), or null if none has been set.
-   */
-  public DocumentHandler getDocumentHandler()
-  {
-    return m_documentHandler;
-  }
-
-  /**
-   * Set the current SAX DocumentHandler (the same
-   * object as the FormatterListener).
-   */
-  public void setDocumentHandler(DocumentHandler listener)
-  {
-    if (listener instanceof ParserAdapter)      
-      m_transformerImpl.setContentHandler(((ParserAdapter)listener).getContentHandler());
-    else if (listener instanceof XSLTEngineImpl)
-      m_transformerImpl.setContentHandler(((XSLTEngineImpl)listener).getTransformer().getContentHandler());
-    else if (listener instanceof XMLSerializer)
-    {
-      try{
-        m_transformerImpl.setContentHandler(((XMLSerializer)listener).asContentHandler());
-      }
-      catch (IOException ioe)
-      {}
-    }
-    m_documentHandler = listener;
-  }
-
-  /**
-   * Add a trace listener for the purposes of debugging and diagnosis.
-   * @param tl Trace listener to be added.
-   */
-  public void addTraceListener(TraceListener tl)
-    throws TooManyListenersException
-  {
-    if (m_transformerImpl != null)
-      m_transformerImpl.getTraceManager().addTraceListener(tl);
-  }
-  
-  /**
-   * If set to true (the default), pattern conflict warnings are not printed to the diagnostics stream.
-   * @param b true if conflict warnings should be suppressed.
-   */
-  public void setQuietConflictWarnings(boolean b)
-  {
-    if (m_transformerImpl != null)
-      m_transformerImpl.setQuietConflictWarnings(b);
-  }
-
-  /**
-   * Remove a trace listener.
-   * @param tl Trace listener to be removed.
-   */
-  public void removeTraceListener(TraceListener tl)
-  {
-    if (m_transformerImpl != null)
-      m_transformerImpl.getTraceManager().removeTraceListener(tl);
-  }
-  
-  /**
-   * Set the problem listener property.
-   * The XSL class can have a single listener to be informed
-   * of errors and warnings. The problem listener normally controls whether an exception
-   * is thrown or not (or the problem listeners can throw its own RuntimeException).
-   * @param l A ProblemListener interface.
-   */
-  public void setProblemListener(ProblemListener l)
-  {
-    if (l instanceof ProblemListenerDefault)
-      m_problemListener = (ProblemListenerDefault)l;
-    else
-      m_problemListener = new ProblemListenerDefault(l); 
-    if (m_transformerImpl != null)
-      m_transformerImpl.setErrorListener(m_problemListener);
-    m_tfactory.setErrorListener(m_problemListener);
-  }
-
-  /**
-   * Get the problem listener property.
-   * The XSL class can have a single listener to be informed
-   * of errors and warnings. The problem listener normally controls whether an exception
-   * is thrown or not (or the problem listener can throw its own RuntimeException).
-   * @return A ProblemListener interface.
-   */
-  public ProblemListener getProblemListener()
-  {
-    if (m_problemListener.getProblemListener() != null)
-      return m_problemListener.getProblemListener();
-    else
-      return m_problemListener;
-  }
-  
-  public TransformerImpl getTransformer()
-  {
-    return m_transformerImpl;  
-    //return (StylesheetProcessor)m_processor;
-  }  
-
-  public TransformerFactoryImpl getTransformerFactory()
-  {
-    return (TransformerFactoryImpl)m_tfactory;    
-  } 
-
-  
-} // end XSLTEngineImpl class
diff --git a/compat_src/org/apache/xalan/xslt/XSLTInputSource.java b/compat_src/org/apache/xalan/xslt/XSLTInputSource.java
deleted file mode 100644
index 4b0c780..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLTInputSource.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-import javax.xml.transform.Source;
-import org.w3c.dom.Node;
-import java.io.InputStream;
-import java.io.Reader;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.dom.DOMSource;
-
-/**
- * <meta name="usage" content="general"/>
- * Represents an XML source document or XSL stylesheet.
- * Use XSLTInputSource objects to provide input to the XSLTProcessor process() method
- * for a transformation. This class extends the SAX input source to handle
- * DOM nodes as input as well as files, character streams, byte streams and SAX DocumentHandlers.
- *
- * @see XSLTProcessor#process(XSLTInputSource, XSLTInputSource, XSLTResultTarget)
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XSLTInputSource //extends SAXSource 
-{
-  
-  private StreamSource streamSource = null;
-  private SAXSource saxSource = null;
-  private DOMSource domSource = null;
-  
-  /**
-    * Zero-argument default constructor -- Before you can use the new XSLTInputSource object in a transformation,
-    * you must define the document source with setSystemId(), setNode(), setInputStream(), or setCharacterStream().
-    *
-    * @see #setSystemId(String)
-    * @see #setNode(Node)
-    * @see #setInputStream
-    * @see #setCharacterStream
-    * @see #setEncoding(String)
-    */
-  public XSLTInputSource ()
-  {
-    saxSource = new SAXSource();
-  }
-
-  /**
-    * Create a new input source with a system identifier (for a URL or file name) --
-    * the equivalent of creating an input source with the zero-argument
-    * constructor and setting the new object's SystemId property.
-
-    * If the system identifier is a URL, it must be fully resolved.
-    *
-    * If the system identifier is a URL, it must be fully resolved.
-    *
-    * @param systemId The system identifier (URI).
-    * @see #setSystemId(String)
-    * @see #setNode(Node)
-    * @see #setInputStream
-    * @see #setEncoding(String)
-    * @see #setCharacterStream
-    */
-  public XSLTInputSource (String systemId)
-  {
-    saxSource = new SAXSource();
-    this.setSystemId(systemId);
-  }
-
-
-  /**
-    * Create a new input source with a byte stream -- the equivalent of creating an input source
-    * with the zero-argument constructor and setting the new object's ByteStream property.
-    *
-    * @param byteStream The raw byte stream containing the document.
-    * @see #setInputStream
-    * @see #setSystemId(String)
-    * @see #setNode(Node)
-    * @see #setEncoding(String)
-    * @see #setCharacterStream
-    */
-  public XSLTInputSource (InputStream byteStream)
-  {
-    streamSource = new StreamSource();
-    streamSource.setInputStream(byteStream);
-  }
-
-  /**
-    * Create a new input source with a character stream -- the equivalent of creating an input source
-    * with the zero-argument constructor and setting the new object's CharacterStream property.
-    * <p>The character stream shall not include a byte order mark.</p>
-    *
-    * @param characterStream The character stream containing the document.
-    * @see #setCharacterStream
-    * @see #setInputStream
-    * @see #setSystemId(String)
-    * @see #setNode(Node)
-    * @see #setEncoding(String)
-    */
-  public XSLTInputSource (Reader characterStream)
-  {
-    streamSource = new StreamSource();
-    streamSource.setReader(characterStream);
-  }
-
-  /**
-    * Create a new input source with a DOM Node -- the equivalent of creating an input source
-    * with the zero-argument constructor and setting the new object's Node property.
-    *
-    * @param node The DOM Node containing the document.
-    * @see #setNode(Node)
-    * @see #setCharacterStream
-    * @see #setInputStream
-    * @see #setSystemId(String)
-    * @see #setEncoding(String)
-    */
-  public XSLTInputSource (Node node)
-  {
-    domSource = new DOMSource();
-    domSource.setNode(node);
-  }
-
-  /**
-    * Create a new XSLTInputSource source from a SAX input source.
-    * This operation sets the ByteStream, CharacterStream, SystemId, PublicID, and Encoding properties.
-    *
-   * @param isource The SAX input source.
-    * @see #setCharacterStream
-    * @see #setInputStream
-    * @see #setSystemId(String)
-    * @see #setEncoding(String)
-    * @see #setNode(Node)
-    */
-  public XSLTInputSource (InputSource isource)
-  {
-    saxSource = new SAXSource();
-    saxSource.setInputSource(isource);
-    //saxSource.setXMLReader(isource.getCharacterStream());
-    this.setEncoding(isource.getEncoding());
-    this.setSystemId(isource.getSystemId());
-  }
-
-  /**
-    * Set the DOM Node for this input source.
-    *
-    * @param node The DOM node containing the
-    *        XML document or XSL stylesheet.
-    * @see #XSLTInputSource(Node)
-    * @see #getCharacterStream()    * 
-    * @see java.io.Reader
-    */
-  public void setNode (Node node)
-  {
-    if (domSource == null)
-      domSource = new DOMSource();
-    domSource.setNode(node);
-  }
-
-  /**
-    * Get the DOM Node for this input source.
-    *
-    * @return The DOM node containing the document, or null if none was supplied.
-    * @see #XSLTInputSource(Node)
-    * @see #setNode(Node)
-    */
-  public Node getNode ()
-  {
-    if (domSource != null)
-      return domSource.getNode();
-    else
-      return null;
-  }
-
-  
-  
-   /** 
-     * Set the character encoding, if known.
-     *
-     * <p>The encoding must be a string acceptable for an
-     * XML encoding declaration (see section 4.3.3 of the XML 1.0
-     * recommendation).</p>
-     *
-     * <p>This method has no effect when the application provides a
-     * character stream.</p>
-     *
-     * @param encoding A string describing the character encoding.
-     * @see #setSystemId
-     * @see #getEncoding
-     */
-    public void setEncoding (String encoding)
-    {
-	this.encoding = encoding;
-    }
-    
-    
-    /**
-     * Get the character encoding for a byte stream or URI.
-     *
-     * @return The encoding, or null if none was supplied.
-     * @see #getSystemId
-     */
-    public String getEncoding ()
-    {
-	return encoding;
-    }
-    
-    private String encoding = null;
-    
-    /**
-     * Set the character stream for this input source.
-     *
-     * <p>If there is a character stream specified, the SAX parser
-     * will ignore any byte stream and will not attempt to open
-     * a URI connection to the system identifier.</p>
-     *
-     * @param characterStream The character stream containing the
-     *        XML document or other entity.
-     * @see java.io.Reader
-     */
-    public void setCharacterStream (Reader characterStream)
-    {
-      if (streamSource == null)
-	      streamSource = new StreamSource();
-      streamSource.setReader(characterStream);
-    }
-    
-    
-    /**
-     * Get the character stream for this input source.
-     *
-     * @return The character stream, or null if none was supplied.
-     */
-    public Reader getCharacterStream ()
-    {
-      if (streamSource != null)
-        return streamSource.getReader();
-      else
-        return null;
-    }
-    
-    
-    
-    /**
-     * Set the base ID (URL or system ID) from where URLs
-     * will be resolved.
-     *
-     * @param baseID Base URL for this.
-     */
-    public void setSystemId(String baseID) 
-    {
-      this.baseID = baseID;
-      
-      if (saxSource != null)
-        saxSource.setSystemId(baseID);
-      else if (domSource != null)
-        domSource.setSystemId(baseID);
-      else if (streamSource != null)
-        streamSource.setSystemId(baseID);      
-    }
-
-    /**
-     * Get the base ID (URL or system ID) from where URLs
-     * will be resolved.
-     *
-     * @return Base URL for this.
-     */
-    public String getSystemId() {
-        return this.baseID;
-    }
-    
-    private String baseID = null;
-
-    
-    /**
-     * Set the byte stream to be used as input.  Normally,
-     * a stream should be used rather than a reader, so that
-     * the XML parser can resolve character encoding specified
-     * by the XML declaration.
-     *
-     * <p>If this Source object is used to process a stylesheet, normally
-     * setSystemId should also be called, so that relative URL references
-     * can be resolved.</p>
-     *
-     * @param inputStream A valid InputStream reference to an XML stream.
-     */
-    public void setInputStream(InputStream inputStream) 
-    {
-      if (streamSource == null)
-        streamSource = new StreamSource();
-      streamSource.setInputStream(inputStream);
-    }
-
-    /**
-     * Get the byte stream that was set with setInputStream.
-     *
-     * @return The byte stream that was set with setInputStream, or null
-     * if setByteStream or the ByteStream constructor was not called.
-     */
-    public InputStream getInputStream() {
-      if (streamSource != null)
-        return streamSource.getInputStream();
-      else
-        return null;
-    }
-    
-    
-     /**
-     * Get the Result object associated with this XSLTResultTarget object .
-     *
-     * @return The Result object associated with this XSLTResultTarget object
-     * 
-     */
-    public Source getSourceObject() 
-    {
-      if (streamSource != null)        
-        return streamSource;
-      else if (domSource != null)
-        return domSource;
-      else 
-        return saxSource;
-    } 
-}
diff --git a/compat_src/org/apache/xalan/xslt/XSLTProcessor.java b/compat_src/org/apache/xalan/xslt/XSLTProcessor.java
deleted file mode 100644
index d60f371..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLTProcessor.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import java.util.TooManyListenersException;
-import java.util.Vector;
-
-import org.apache.xalan.xpath.XObject;
-import org.apache.xalan.xpath.XNodeSet;
-import org.apache.xalan.xpath.XBoolean;
-import org.apache.xalan.xpath.XNumber;
-import org.apache.xalan.xpath.XNull;
-import org.apache.xalan.xpath.XString;
-import org.apache.xalan.xpath.xml.XMLParserLiaison;
-import org.apache.xalan.xpath.xml.ProblemListener;
-
-import org.apache.xalan.templates.Stylesheet;
-//import org.apache.xalan.templates.StylesheetRoot;
-//import org.apache.xalan.xslt.StylesheetSpec;
-import org.apache.xalan.trace.*;
-
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Node;
-import org.xml.sax.DocumentHandler;
-import org.xml.sax.SAXException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import org.apache.xml.serialize.OutputFormat;
-import org.xml.sax.ext.LexicalHandler;
-
-/**
- * <meta name="usage" content="general"/>
- * The transformation processor -- use {@link org.apache.xalan.xslt.XSLTProcessorFactory} to instantiate an implementation of this interface.
- * It's the responsibility of the implementation (XSLTEngineImpl),
- * collaborating with a XMLParserLiaison, the DOM,
- * and the XPath engine, to transform a source tree
- * of nodes into a result tree according to instructions
- * and templates specified by a stylesheet tree.
- * Use the <code>process(...)</code> are the primary
- * public entry points.
- *
- * Look at the Process class main() method for
- * for an advanced usage example.
- *
- * <p>If you reuse the processor instance, you should call reset() between transformations.</p>
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public interface XSLTProcessor extends DocumentHandler, LexicalHandler
-{
-  /**
-   * Use the XSL stylesheet to transform the XML input, placing the result in the result tree.
-   * @param xmlSource  The XML input to be transformed.
-   * @param xslStylesheet  The XSL stylesheet to be used for the transformation.  May be null if XML input
-   * has an XSL stylesheet PI.
-   * @param resultTree The tree where the result of the transformation is placed.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public void process( XSLTInputSource xmlSource,
-                       XSLTInputSource xslStylesheet,
-                       XSLTResultTarget resultTree)
-    throws SAXException;
-
-  /**
-   * Compile the XSL stylesheet represented by an XSLTInputSource object into an internal representation,
-   * and use it to set the XSLTProcessor Stylesheet property.
-   * This operation is required if the XSLTProcessor is to function as a
-   * SAX DocumentHandler.
-   * If the Stylesheet property has already been set to non-null, this operation
-   * calls reset() before a transformation is performed.
-   *
-   * @param stylesheetSource  The XSL stylesheet.
-   * @return The compiled stylesheet object.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public StylesheetRoot processStylesheet(XSLTInputSource stylesheetSource)
-    throws SAXException;
-
-  /**
-   * Given a URL to (or file name of) an XSL stylesheet,
-   * Compile the stylesheet into an internal representation, and use it to
-   * set the XSLTProcessor Stylesheet property.
-   * This operation is required if the XSLTProcessor is to function as a
-   * SAX DocumentHandler.
-   * If the Stylesheet property has already been set to non-null, this operation
-   * calls reset() before a transformation is performed.
-   *
-   * @param xsldocURLString  The URL to the XSL stylesheet.
-   * @return The compiled stylesheet object.
-   * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
-   * the error condition is severe enough to halt processing.
-   */
-  public StylesheetRoot processStylesheet(String xsldocURLString)
-    throws SAXException;
-
-  /**
-   * Set the output stream. Required when the XSLTProcessor is being used
-   * as a SAX DocumentHandler.
-   */
-  public void setOutputStream(java.io.OutputStream os);
-
-  /**
-   * Reset the XSLTProcessor state.  Must be used after a process() call
-   * if the XSLTProcessor instance is to be used again.
-   */
-  public void reset();
-
-  /**
-   * Get the DOM Node from the XSLTInputSource object. Returns null if the XSLTInputSource
-   * object does not contain a Node (it may, for example, contain an input stream).
-   */
-  public Node getSourceTreeFromInput(XSLTInputSource inputSource)
-    throws org.xml.sax.SAXException;
-
-  /**
-   * Use a compiled stylesheet to set the Stylesheet property for this processor.
-   * When this property is set, the process method uses this stylesheet rather than
-   * looking for a stylesheet PI if the stylesheet parameter is null.  Also required
-   * if you are going to use the XSLTProcessor as a SAX DocumentHandler.
-   */
-  public void setStylesheet(StylesheetRoot stylesheetRoot);
-
-  /**
-   * Get the current Stylesheet setting for this XSLTProcessor.
-   */
-  public StylesheetRoot getStylesheet();
-
-  /**
-   * Get the XMLParserLiaison that this processor uses.
-   */
-  public XMLParserLiaison getXMLProcessorLiaison();
-
-  /**
-   * Get the preferred stylesheet for the XSLTInputSource XML document,
-   * as identified by the xml-stylesheet PI, and matching the media and
-   * charset criteria. See <a href="http://www.w3.org/TR/xml-stylesheet/">
-   * Associating Style Sheets with XML documents</a>.
-   * Does not yet handle the LINK REL="stylesheet" syntax.
-   *
-   * @param media The media attribute to be matched.  May be null, in which
-   *              case the prefered stylesheet will be used (i.e., alternate = no).
-   * @param title The value of the title attribute to match.  May be null.
-   * @param charset The value of the charset attribute to match.  May be null.
-   * @returns StylesheetSpec extends XSLTInputSource extends SAX InputSource; the return value
-   * can be passed to the processStylesheet method.
-   */
-  public StylesheetSpec getAssociatedStylesheet(XSLTInputSource source,
-                                                      String media,
-                                                      String charset)
-    throws SAXException;
-
-  /**
-   * Get a list of stylesheet specifications for the XSLTInputSource XML document,
-   * as identified by the xml-stylesheet PI, and matching the media and
-   * charset criteria. See <a href="http://www.w3.org/TR/xml-stylesheet/">
-   * Associating Style Sheets with XML documents</a>.
-   * Does not yet handle the LINK REL="stylesheet" syntax.
-   *
-   * @param media The media attribute to be matched.  May be null, in which
-   *              case the prefered stylesheet will be used (i.e., alternate = no).
-   * @param title The value of the title attribute to match.  May be null.
-   * @param charset The value of the charset attribute to match.  May be null.
-   * @returns list of StylesheetSpecs (extend XSLTInputSources extend SAX InputSources; a
-   * list member may be passsed to the processStylesheet method.
-   */
-  public Vector getAssociatedStylesheets(XSLTInputSource source,
-                                                      String media,
-                                                      String charset)
-    throws SAXException;
-
-
-  /**
-   * Convenience function to create an XString.
-   * @param s A valid string.
-   * @return An XString object.
-   */
-  public XString createXString(String s);
-
-  /**
-   * Convenience function to create an XObject.
-   * @param o Any java object.
-   * @return An XObject object.
-   */
-  public XObject createXObject(Object o);
-
-  /**
-   * Convenience function to create an XNumber.
-   * @param d Any double number.
-   * @return An XNumber object.
-   */
-  public XNumber createXNumber(double d);
-
-  /**
-   * Convenience function to create an XBoolean.
-   * @param b boolean value.
-   * @return An XBoolean object.
-   */
-  public XBoolean createXBoolean(boolean b);
-
-  /**
-   * Convenience function to create an XNodeSet.
-   * @param nl A NodeList object.
-   * @return An XNodeSet object.
-   */
-  public XNodeSet createXNodeSet(NodeList nl);
-
-  /**
-   * Convenience function to create an XNodeSet from a node.
-   * @param n A DOM node.
-   * @return An XNodeSet object.
-   */
-  public XNodeSet createXNodeSet(Node n);
-
-  /**
-   * Convenience function to create an XNull.
-   * @return An XNull object.
-   */
-  public XNull createXNull();
-
-  /**
-   * Submit a top-level stylesheet parameter.  This value can
-   * be evaluated in the stylesheet via xsl:param-variable.
-   * @param key The name of the param.
-   * @param value An XObject that will be used.
-   */
-  public void setStylesheetParam(String key, XObject value);
-
-  /**
-   * Set a top-level stylesheet parameter.  This value can
-   * be evaluated via xsl:param-variable.  Note that the value
-   * passed is an expression, and not a string.  This means that
-   * setStylesheetParam("foo", "hello"); will look for the
-   * element "hello".  If you want to pass a string, you'll
-   * need to put quotes around it:
-   * setStylesheetParam("foo", "'hello'"); will look for the
-   * @param key The name of the param.
-   * @param expression An expression that will be evaluated.
-   */
-  public void setStylesheetParam(String key, String expression);
-
-  /**
-   * Get the current FormatterListener (SAX DocumentHandler), or null if none has been set.
-   */
-  public DocumentHandler getFormatterListener();
-
-  /**
-   * Set the FormatterListener (the SAX DocumentHandler).
-   */
-  public void setFormatterListener(DocumentHandler flistener);
-
-  /**
-   * Get the current SAX DocumentHandler (the same object as the FormatterListener), or null if none has been set.
-   */
-  public DocumentHandler getDocumentHandler();
-
-  /**
-   * Set the current SAX DocumentHandler (the same
-   * object as the FormatterListener).
-   */
-  public void setDocumentHandler(DocumentHandler listener);
-
-  /**
-   * Add a trace listener for the purposes of debugging and diagnosis.
-   * @param tl Trace listener to be added.
-   */
-  public void addTraceListener(TraceListener tl)
-    throws TooManyListenersException;
-
-  /**
-   * If set to true, template calls are traced.
-   */
-  public void setTraceTemplates(boolean b);
-
-  /**
-   * If set to true, selection events are traced.
-   */
-  public void setTraceSelect(boolean b);
-
-  /**
-   * If set to true (the default is false), as template children are being constructed, debug diagnostics
-   * are written to the m_diagnosticsPrintWriter
-   * stream.
-   */
-  public void setTraceTemplateChildren(boolean b);
-
-  /**
-   * If set to true (the default), pattern conflict warnings are not printed to the diagnostics stream.
-   * @param b true if conflict warnings should be suppressed.
-   */
-  public void setQuietConflictWarnings(boolean b);
-
-  /**
-   * Remove a trace listener.
-   * @param tl Trace listener to be removed.
-   */
-  public void removeTraceListener(TraceListener tl);
-
-  /**
-   * If set, diagnostics will be
-   * written to the m_diagnosticsPrintWriter stream. If
-   * null, diagnostics are turned off. This convenience method calls
-   * {@link #setDiagnosticsOutput(java.io.PrintWriter)}.
-   */
-  public void setDiagnosticsOutput(java.io.OutputStream out);
-
-  /**
-   * If set, diagnostics will be
-   * written to the m_diagnosticsPrintWriter stream. If
-   * null, diagnostics are turned off.
-   */
-  public void setDiagnosticsOutput(java.io.PrintWriter pw);
-
-  /**
-   * Set the problem listener property.
-   * The XSL class can have a single listener to be informed
-   * of errors and warnings. The problem listener normally controls whether an exception
-   * is thrown or not (or the problem listeners can throw its own RuntimeException).
-   * @param l A ProblemListener interface.
-   */
-  public void setProblemListener(ProblemListener l);
-
-  /**
-   * Get the problem listener property.
-   * The XSL class can have a single listener to be informed
-   * of errors and warnings. The problem listener normally controls whether an exception
-   * is thrown or not (or the problem listener can throw its own RuntimeException).
-   * @return A ProblemListener interface.
-   */
-  public ProblemListener getProblemListener();
-
-}
diff --git a/compat_src/org/apache/xalan/xslt/XSLTProcessorFactory.java b/compat_src/org/apache/xalan/xslt/XSLTProcessorFactory.java
deleted file mode 100644
index 785cb4b..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLTProcessorFactory.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.apache.xalan.xpath.xml.XMLParserLiaison;
-import org.apache.xpath.XPathFactory;
-//import javax.xml.transform.Processor;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.Templates;
-import org.apache.xml.utils.TreeWalker;
-
-/**
- * <meta name="usage" content="general"/>
- * Manufactures the processor for performing transformations. Use one of the static getProcessor methods
- * to create an XSLTProcessor object.
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XSLTProcessorFactory
-{
-  /**
-   * Get a new XSLTProcessor.
-   */
-  public static XSLTProcessor getProcessor()
-    throws org.xml.sax.SAXException
-  {
-    //Processor processor = Processor.newInstance("xslt"); 
-    return new XSLTEngineImpl();
-  }
-
-  /**
-   * Get a new XSLTProcessor (parserLiaisonClassName no longre used).
-   * *
-   * @see #getProcessor()
-   * @see org.apache.xalan.xpath.xml.XMLParserLiaison
-   */
-  public static XSLTProcessor getProcessorUsingLiaisonName(String parserLiaisonClassName)
-    throws org.xml.sax.SAXException
-  {
-    //return new XSLTEngineImpl(parserLiaisonClassName);
-    //Processor processor = Processor.newInstance("xslt"); 
-    return new XSLTEngineImpl();
-  }
-
-  /**
-   * Get a new XSLTProcessor (XMLParserLiaison no longer used).
-   *
-   * @param parserLiaison the XMLParserLiaison set up to interact with a given XML parser.
-   * @return An implementation of the XSLTProcessor interface with which you can perform transformations.
-   *
-   * @see #getProcessor()
-   * @see org.apache.xalan.xpath.xml.XMLParserLiaison
-   */
-  public static XSLTProcessor getProcessor(XMLParserLiaison parserLiaison)
-  {
-    //return new XSLTEngineImpl(parserLiaison);
-    try{
-      //Processor processor = Processor.newInstance("xslt"); 
-      return new XSLTEngineImpl();
-    }
-   /* catch (TransformerConfigurationException tce)
-    {
-      return null;
-    }*/
-    catch (org.xml.sax.SAXException e)
-    {
-      return null;
-    }
-    
-  }
-
-  /**
-   * Get a new XSLTProcessor (XMLParserLiaison and XPathFactory no longer used).
-   *
-   * @param parserLiaison the XMLParserLiaison set up to interact with a given XML parser.
-   * @param xpathFactory A custom XPathFactory.
-   * @return An implentation of the XSLTProcessor interface with which you
-   * can perform transformations.
-   *
-   * @see #getProcessor()
-   * @see org.apache.xalan.xpath.xml.XMLParserLiaison
-   */
-  public static XSLTProcessor getProcessor(XMLParserLiaison parserLiaison,
-                                                  XPathFactory xpathFactory)
-  {
-    //return new XSLTEngineImpl(parserLiaison, xpathFactory);
-    try{
-      //Processor processor = Processor.newInstance("xslt"); 
-      return new XSLTEngineImpl();
-    }
-  /*  catch (TransformerConfigurationException pe)
-    {
-      return null;
-    }*/
-    catch (org.xml.sax.SAXException e)
-    {
-      return null;
-    }
-  }
-}
diff --git a/compat_src/org/apache/xalan/xslt/XSLTResultTarget.java b/compat_src/org/apache/xalan/xslt/XSLTResultTarget.java
deleted file mode 100644
index 0810595..0000000
--- a/compat_src/org/apache/xalan/xslt/XSLTResultTarget.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * The Apache Software License, Version 1.1  
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.xalan.xslt;
-
-import org.w3c.dom.Node;
-import java.io.OutputStream;
-import java.io.Writer;
-import org.xml.sax.DocumentHandler;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.helpers.ParserAdapter;
-import javax.xml.transform.Result;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.sax.SAXResult;
-
-
-/**
- * <meta name="usage" content="general"/>
- * Contains the result of a transformation that you perform with the
- * XSLTProcessor process() method or one of the StylesheetRoot process() methods.
- * Create an instance of this class to provide the process() method a container
- * for the transformation result tree.
- * You can use a file name or URL, character stream, byte stream, DOM Node, or SAX DocumentHandler
- * to instantiate an XSLTResultTarget object.
- *
- * @see XSLTProcessor#process(XSLTInputSource, XSLTInputSource, XSLTResultTarget)
- * @see StylesheetRoot
- * @deprecated This compatibility layer will be removed in later releases. 
- */
-public class XSLTResultTarget //implements Result //extends StreamResult
-{
-  
-  private StreamResult sr = null;
-  private SAXResult saxResult = null;
-  private DOMResult dr = null;
-  
-  
-  /**
-    * Zero-argument default constructor  -- Before you can use the new XSLTResultTarget object in a transformation,
-    * you must define the output container by setting its FileName, CharacterStrea, ByteStream, or Node property.
-    *
-    * @see #setFileName(String)
-    * @see #setCharacterStream(Writer)
-    * @see #setByteStream(OutputStream)
-    * @see #setNode(Node)
-    * @see #setDocumentHandler(DocumentHandler)
-    * @see #setEncoding(String)
-    */
-  public XSLTResultTarget ()
-  {
-     sr = new StreamResult();
-  }
-
-  /**
-   * Create a new output target with a file name -- the equivalent of creating an output target
-   * with the zero-argument constructor and setting the new object's FileName property.
-   *
-   * @param fileName Identifies the file that will contain the transformation result (must be a valid system file name).
-   *
-   * @see #setFileName(String)
-   * @see #setCharacterStream(Writer)
-   * @see #setByteStream(OutputStream)
-   * @see #setNode(Node)
-   * @see #setDocumentHandler(DocumentHandler)
-   * @see #setEncoding(String)
-   */
-  public XSLTResultTarget (String fileName) // File?
-  {
-    sr = new StreamResult();
-    sr.setSystemId(fileName);
-  }
-
-
-  /**
-   * Create a new output target with a byte stream -- the equivalent of creating an output target
-   * with the zero-argument constructor and setting the new object's ByteStream property.
-   *
-   * @param byteStream The raw byte stream that will contain the transformation result.
-   *
-   * @see #setByteStream(OutputStream)
-   * @see #setFileName(String)
-   * @see #setCharacterStream(Writer)
-   * @see #setNode(Node)
-   * @see #setDocumentHandler(DocumentHandler)
-   * @see #setEncoding(String)
-   */
-
-  public XSLTResultTarget (OutputStream byteStream)
-  {
-    sr = new StreamResult();
-    sr.setOutputStream(byteStream);
-  }
-
-
-  /**
-   * Create a new output target with a character stream -- the equivalent of creating an output target
-   * with the zero-argument constructor and setting the new object's CharacterStream property.
-   *
-   * @param characterStream The character stream where the transformation result is written.
-   *
-   * @see #setCharacterStream(Writer)
-   * @see #setByteStream(OutputStream)
-   * @see #setFileName(String)
-   * @see #setNode(Node)
-   * @see #setDocumentHandler(DocumentHandler)
-   * @see #setEncoding(String)
-   */
-  public XSLTResultTarget (Writer characterStream)
-  {
-    sr = new StreamResult();
-    sr.setWriter(characterStream);
-  }    
-
-  /**
-   * Create a new output target with a DOM Node -- the equivalent of creating an output target
-   * with the zero-argument constructor and setting the new object's Node property.
-   *
-   * @param node The DOM Node that will contain the transformation result.
-   *
-  * @see #setNode(Node)
-   * @see #setCharacterStream(Writer)
-   * @see #setByteStream(OutputStream)
-   * @see #setFileName(String)
-   * @see #setDocumentHandler(DocumentHandler)
-   * @see #setEncoding(String)
-   */
-  public XSLTResultTarget (Node n)
-  {
-    dr = new DOMResult();
-    dr.setNode(n);
-  }    
-
-  /**
-   * Create a new output target with a SAX Document handler, which
-   * will handle result events -- the equivalent of creating an output target with the
-   * zero-argument constructor and setting the new object's DocyumentHandler property.
-   *
-   * @param handler The SAX Document handler to which the result is written.
-   *
-  * @see #setDocumentHandler(DocumentHandler)
-   * @see #setNode(Node)
-   * @see #setCharacterStream(Writer)
-   * @see #setByteStream(OutputStream)
-   * @see #setFileName(String)
-   * @see #setEncoding(String)
-   */
-  public XSLTResultTarget(DocumentHandler handler)
-  { 
-    saxResult = new SAXResult();    
-    setDocumentHandler(handler);
-  }
-    
-
-  /**
-   * Set the file name or URL where the transformation result will be written.
-   *
-   * @param fileName The system identifier as a string.
-   *
-   * @see #XSLTResultTarget(String)
-   * @see #getFileName
-   */
-  public void setFileName (String fileName) // File?
-  {
-    if (sr == null)
-      sr = new StreamResult();
-    sr.setSystemId(fileName);
-  }
-
-
-  /**
-   * Get the file name where the results are or will be written, or null if none was supplied.
-   *
-   * @return The file name or URL.
-   *
-   * @see #XSLTResultTarget(String)
-   * @see #setFileName(String)
-   */
-  public String getFileName ()
-  {
-    if (sr != null)
-      return sr.getSystemId();
-    else
-      return null;
-  } 
-
-
-
-  /**
-   * Set the character encoding, if known.
-   *
-   * @param encoding The character encoding.
-   */
-  public void setEncoding (String encoding)
-  {
-    this.encoding = encoding;
-  }
-
-
-  /**
-   * Get the character encoding that was used.
-   *
-   * @return The encoding, or null if none was supplied.
-   */
-  public String getEncoding ()
-  {
-    return encoding;
-  }
-  
-  private String encoding;
-
-
-  /**
-   * Set a SAX DocumentHandler to process the result tree events.
-   * You can process events as they occur
-   * rather than waiting for the transformation to be completed.
-   *
-   * @param handler The SAX DocumentHandler to process result tree events.
-   *
-   * @see #XSLTResultTarget(DocumentHandler)
-   * @see #getDocumentHandler()
-   */
-  public void setDocumentHandler (DocumentHandler handler)
-  {
-    this.formatterListener = handler;
-		if (handler instanceof XSLTEngineImpl)
-			saxResult.setHandler(((XSLTEngineImpl)handler).getTransformer().getContentHandler());
-    if (handler instanceof ParserAdapter)
-    {
-      if (saxResult == null)
-        saxResult = new SAXResult();
-      saxResult.setHandler(((ParserAdapter)handler).getContentHandler());
-    }  
-  }
-
-  /**
-   * Get the SAX DocumentHandler that processes the result tree events.
-   * You can use the DocumentHandler to process events as they occur
-   * rather than waiting for the transformation to be completed.
-   *
-   * @return The SAX DocumentHandler that processes result tree events.
-   *
-   * @see #XSLTResultTarget(DocumentHandler)
-   * @see #setDocumentHandler(DocumentHandler)
-   */
-  public DocumentHandler getDocumentHandler ()
-  {
-    return formatterListener;
-  }
-  
-  private DocumentHandler formatterListener = null;
-  
-  /**
-     * Set the node that will contain the result DOM tree.  In practice,
-     * the node should be a {@link org.w3c.dom.Document} node,
-     * a {@link org.w3c.dom.DocumentFragment} node, or a
-     * {@link org.w3c.dom.Element} node.  In other words, a node
-     * that accepts children.
-     *
-     * @param node The node to which the transformation
-     * will be appended.
-     */
-    public void setNode(Node node) {
-      if (dr == null)
-        dr = new DOMResult();
-      dr.setNode(node);
-    }
-
-    /**
-     * Get the node that will contain the result DOM tree.
-     * If no node was set via setNode, the node will be
-     * set by the transformation, and may be obtained from
-     * this method once the transformation is complete.
-     *
-     * @return The node to which the transformation
-     * will be appended.
-     */
-    public Node getNode() {
-      if (dr != null)
-        return dr.getNode();
-      else
-        return null;
-    }
-    
- /**
-   * Set the byte stream to contain the transformation result.
-   *
-   * @param byteStream A byte stream that will contain the transformation result.
-   *
-   * @see #XSLTResultTarget(OutputStream)
-   * @see #setByteStream(OutputStream)
-   */
-    public void setByteStream(OutputStream byteStrm) {
-        if (sr == null)
-          sr = new StreamResult();
-        sr.setOutputStream(byteStrm);
-    }
-
- /**
-   * Get the byte stream that contains or will contain the transformation result.
-   *
-   * @return The byte stream, or null if none was supplied.
-   *
-   * @see #XSLTResultTarget(OutputStream)
-   * @see #setByteStream(OutputStream)
-   */
-    public OutputStream getByteStream() {
-      if (sr != null)
-        return sr.getOutputStream();
-      else
-        return null;
-    }
-    
-    /**
-     * Set the system identifier for this Result.
-     *
-     * <p>If the Result is not to be written to a file, the system identifier is optional.
-     * The application may still want to provide one, however, for use in error messages
-     * and warnings, or to resolve relative output identifiers.</p>
-     *
-     * @param systemId The system identifier as a URI string.
-     */
-    public void setSystemId(String systemID)
-    {
-      if (sr != null)
-        sr.setSystemId(systemID);
-      else if (dr != null)
-        dr.setSystemId(systemID);
-      else if (saxResult != null)
-        saxResult.setSystemId(systemID);
-    }
-
-    /**
-     * Get the system identifier that was set with setSystemId.
-     *
-     * @return The system identifier that was set with setSystemId,
-     * or null if setSystemId was not called.
-     */
-    public String getSystemId()
-    {
-      if (sr != null)
-        return sr.getSystemId();
-      else if (dr != null)
-        dr.getSystemId();
-      else if (saxResult != null)
-        saxResult.getSystemId();
-      
-      return null;
-    }
-    
-     /**
-     * Set the writer that is to receive the result.  Normally,
-     * a stream should be used rather than a writer, so that
-     * the transformer may use instructions contained in the
-     * transformation instructions to control the encoding.  However,
-     * there are times when it is useful to write to a writer,
-     * such as when using a StringWriter.
-     *
-     * @param writer  A valid Writer reference.
-     */
-    public void setCharacterStream(Writer writer) {      
-      if (sr == null)
-        sr = new StreamResult();
-      sr.setWriter(writer);
-    }
-
-    /**
-     * Get the character stream that was set with setWriter.
-     *
-     * @return The character stream that was set with setWriter, or null
-     * if setWriter or the Writer constructor was not called.
-     */
-    public Writer getCharacterStream() {
-      if (sr != null)
-        return sr.getWriter();
-      else
-        return null;
-    }
-  
-  
-    /**
-     * Get the Result object associated with this XSLTResultTarget object .
-     *
-     * @return The Result object associated with this XSLTResultTarget object
-     * 
-     */
-    public Result getResultObject() 
-    {
-      if (sr != null)        
-        return sr;
-      else if (dr != null)
-        return dr;
-      else 
-        return saxResult;
-    } 
-    
-}
diff --git a/compat_src/org/apache/xalan/xslt/package.html b/compat_src/org/apache/xalan/xslt/package.html
deleted file mode 100644
index 76e39f2..0000000
--- a/compat_src/org/apache/xalan/xslt/package.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<HTML><HEAD></HEAD><BODY>
-     <P><B>The main Xalan-Java 1 compatability package</B> -- facilities for setting up and performing XSL transformations.</P>
-   
-     <P>Use one of the {@link org.apache.xalan.xslt.XSLTProcessorFactory} static getProcessor methods to
-      instantiate an {@link org.apache.xalan.xslt.XSLTProcessor}. The XSLTProcessor interface defines the 
-      XSLT processor API. You should never need to call the underlying implementation 
-      ({@link org.apache.xalan.xslt.XSLTEngineImpl}) directly.</P>
-      
-      <P>Instantiate {@link org.apache.xalan.xslt.XSLTInputSource} objects for the XML input and the XSL
-      stylesheet, and an {@link org.apache.xalan.xslt.XSLTResultTarget} object for the transformation output. 
-      You may construct these objects with a variety of containers/formats, including files or URLs, character
-      streams,byte streams, SAX input streams or document handlers, and a DOM tree.</P>
-      <P>As a general rule, use the XSLTProcessor process method to perform a transformation, thereby filling the
-      XSLTResultTarget object. For repeated transformations, to gather information from the stylesheet before you
-      perform the transformation, or to set up the processor to function as a SAX document handler, use the
-       XSLTProcessor processStylesheet method to compile the XSL stylesheet, which returns a 
-       {@link org.apache.xalan.xslt.StylesheetRoot} object with its own process method.</P>
-   </BODY></HTML>
\ No newline at end of file
diff --git a/readme.html b/readme.html
deleted file mode 100644
index dae48ad..0000000
--- a/readme.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-<html>
-<head>
-<title>
-</title>
-</head>
-<body>
-<meta content="0; URL=docs/whatsnew.html" http-equiv="Refresh">
-      Redirecting to <a href="docs/whatsnew.html">What's New in Xalan_Java 2</a>
-</body>
-</html>
-
-
-
-
-            
-            
-
-
-
-
-            
-   
diff --git a/samples/AppletXMLtoHTML/README.html b/samples/AppletXMLtoHTML/README.html
deleted file mode 100644
index c0b584d..0000000
--- a/samples/AppletXMLtoHTML/README.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title></title>Xalan Sample Applets</title>
-</head>
-<body bgcolor="#808080" text="#ffffff">
-  <table>
-    <tr>
-      <td><img border="0" hspace="0" vspace="0" align="left" src="rabbitwhorn.jpg"></td>
-      <td><h2>&nbsp;Running the Xalan sample applets</h2></td>
-    </tr>
-  </table>
-  <hr>
-  <ul>
-  <li>appletXMLtoHTML.html transforms XML into HTML, and displays the XML document and XSL stylesheet as well as the HTML transformation result.<br/><br/></li>
-  <li>get-todo-list.html uses todo.xsl to transform todo.xml and display the transformation result. The XML source is a snapshot of todo.xml in the xml-xalan CVS repository, an ongoing list of tasks and task completions for the Xalan-Java 2 development project.</li>
-  <p>Both applets look for xalan.jar and xerces.jar in the bin directory. If the JAR files are elsewhere, you must move them or adjust the applet archive setting in client.html and get-todo-list.html.</p>
-</ul>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/AppletXMLtoHTML/appletXMLtoHTML.html b/samples/AppletXMLtoHTML/appletXMLtoHTML.html
deleted file mode 100644
index 0aaa900..0000000
--- a/samples/AppletXMLtoHTML/appletXMLtoHTML.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Using an applet to perform XSL transformations</title>
-</head>
-  <FRAMESET ROWS="125,*" >
-    <FRAME NAME="processor" SRC="client.html" SCROLLING="auto" >
-      <frameset cols="33%, 33%, *">
-        <FRAME NAME="targetArea0" SRC="target.html" >
-        <FRAME NAME="targetArea1" SRC="target.html" >
-        <FRAME NAME="targetArea2" SRC="target.html" >        
-      </frameset>
-  </FRAMESET>
-
-</html>
diff --git a/samples/AppletXMLtoHTML/client.html b/samples/AppletXMLtoHTML/client.html
deleted file mode 100644
index 612fa9f..0000000
--- a/samples/AppletXMLtoHTML/client.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-  <head>
-	  <title>Untitled</title>
-  </head>
-  <script language="JavaScript">
-
-    
-    function writeSource(sourceString)
-    {
-
-      var escString=document.xslControl.escapeString(sourceString);
-      var title="XML Source Doc";
-      var doc=top.frames[1].document;      
-      doc.open();
-      doc.write("<h3>" + title + "</h3>");
-      doc.write("<PRE>");
-      doc.write(escString);
-      doc.write("</PRE>");
-      doc.close();    
-    }
-  
-    function writeStylesheet(styleString)
-    {
-      var escString=document.xslControl.escapeString(styleString);
-      var title="XSL Stylesheet";
-      var doc=top.frames[2].document;          
-      doc.open();
-      doc.write("<h3>" + title + "</h3>");
-      doc.write("<PRE>");
-      doc.write(escString);
-      doc.write("</PRE>");
-      doc.close();     
-    } 
-
-    function writeTarget(targetString)
-    {
-      var doc=top.frames[3].document;
-      doc.open();
-      var title="HTML Output";      
-      doc.write("<h3>" + title + "</h3>");
-      if (document.xmlTransform.displayMode[0].checked) //display HTML
-      {
-        doc.write(targetString);
-      }
-      else // display source
-      {
-        var escString=document.xslControl.escapeString(targetString);
-        doc.write("<PRE>");
-        doc.write(escString);
-        doc.write("</PRE>");
-      }
-      doc.close();    
-    }
-  
-    function clearFrames()
-    {
-      document.xslControl.freeCache();
-      for (i=1; i<4; i++)
-        {
-        var doc=top.frames[i].document;
-        doc.open();
-        doc.clear();
-        doc.close();
-        }
-    }
-  
-    function transform()
-    {  
-      clearFrames();
-      var xmlSource=document.xmlTransform.xmlSourceList.options[document.xmlTransform.xmlSourceList.selectedIndex].value;
-      document.xslControl.setDocumentURL(xmlSource);
-      var sourceString=document.xslControl.getSourceTreeAsText();
-      var styleString=document.xslControl.getStyleTreeAsText();
-      var targetString=document.xslControl.getHtmlText();      
-      writeSource(sourceString);
-      writeStylesheet(styleString);
-      writeTarget(targetString);
-    }
-  </script>
-  <body onLoad="clearFrames();" bgcolor="#808080" text="#ffffff">
-    <form name="xmlTransform" action="" method="POST">
-      <h2><img border="0" hspace="0" vspace="0" align="left" src="rabbitwhorn.jpg">&nbsp;Transform XML Document</h2>
-        <table>
-          <tr>
-            <td width="50"></td>
-            <td align="center"><i>Document to transform</i></td>
-            <td align="center"><i>Display output as</i></td>
-          </tr>
-          <tr>
-          <td></td>
-          <td align="center">
-            <select name="xmlSourceList">
-              <option value="xalanApplets.xml" selected>&nbsp;xalanApplets.xml&nbsp;
-              <option value="foo-s1.xml">&nbsp;foo-s1.xml&nbsp;
-            </select>
-          </td>
-          <td align="center">
-            <input type="radio" name="displayMode" checked>HTML&nbsp;&nbsp;
-            <input type="radio" name="displayMode">HTML Source
-          </td>
-          <td>&nbsp;&nbsp;&nbsp;&nbsp;
-            <input type="button" name="transformButton" value="Transform" 
-            onClick="transform();">
-          </td>
-        </tr>
-      </table>
-    </form>
-    <!-- Be sure you have applet archive attribute set
-         so the applet can find xalan.jar,xml-apis.jar, and xercesImpl.jar (for Xerces-J2) 
-         or xerces.jar (for Xerces-J1)-->  
-    <applet  
-      name="xslControl"
-      code="org.apache.xalan.client.XSLTProcessorApplet.class"
-      archive="../../bin/xalan.jar,../../bin/xml-apis.jar,../../bin/xercesImpl.jar,../../bin/xerces.jar"
-      height="0"
-      width"0">
-      <param name="documentURL" value="xalanApplets.xml"/>  <!--default setting-->
-      <param name="styleURL" value="s1ToHTML.xsl"/> <!--doesn't change-->
-    </applet>
-  </body>
-</html>
diff --git a/samples/AppletXMLtoHTML/foo-s1.xml b/samples/AppletXMLtoHTML/foo-s1.xml
deleted file mode 100644
index e8ce033..0000000
--- a/samples/AppletXMLtoHTML/foo-s1.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<s1 title="s1 foo">
-  <s2 title="Foo">
-    <p>Hello</p>
-  </s2>
-</s1>
\ No newline at end of file
diff --git a/samples/AppletXMLtoHTML/get-trax.html b/samples/AppletXMLtoHTML/get-trax.html
deleted file mode 100644
index b86179b..0000000
--- a/samples/AppletXMLtoHTML/get-trax.html
+++ /dev/null
@@ -1,27 +0,0 @@
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-  <head>
-	<title>Draft of Xalan-Java 2 TrAX Spec</title>
-  </head>
-  <script language="JavaScript"> 
-    function transform()
-    { 
-      var traxspec = xslControl.getHtmlText();
-      document.write(traxspec);
-    }
-  </script>
-  <body onLoad="transform();">
-  <!-- The applet archive attribute is set to include xalan.jar, xml-apis.jar, and 
-       xercesImpl.jar (for Xerces-J2) or xerces.jar (for Xerces-J1). -->
-    <applet  
-      name="xslControl"
-      code="org.apache.xalan.client.XSLTProcessorApplet.class"
-      archive="../../bin/xalan.jar,../../bin/xml-apis.jar,../../bin/xercesImpl.jar,../../bin/xerces.jar"
-      height="0"
-      width="0">
-      <param name="documentURL" value="trax.xml"/> 
-      <param name="styleURL" value="spec.xsl"/>
-    </applet>
-  </body>
-</html>
\ No newline at end of file
diff --git a/samples/AppletXMLtoHTML/lts3611beac.jpg b/samples/AppletXMLtoHTML/lts3611beac.jpg
deleted file mode 100644
index c249149..0000000
--- a/samples/AppletXMLtoHTML/lts3611beac.jpg
+++ /dev/null
@@ -1 +0,0 @@
-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
\ No newline at end of file
diff --git a/samples/AppletXMLtoHTML/rabbitwhorn.jpg b/samples/AppletXMLtoHTML/rabbitwhorn.jpg
deleted file mode 100644
index 4544a38..0000000
--- a/samples/AppletXMLtoHTML/rabbitwhorn.jpg
+++ /dev/null
Binary files differ
diff --git a/samples/AppletXMLtoHTML/s1ToHTML.xsl b/samples/AppletXMLtoHTML/s1ToHTML.xsl
deleted file mode 100644
index 2605e6f..0000000
--- a/samples/AppletXMLtoHTML/s1ToHTML.xsl
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0"?>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:output method="html" indent="yes"/>
-    
-  <xsl:template match="/">
-    <xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="s1">
-    <html>
-      <head><title><xsl:value-of select="@title"/></title></head>
-      <body  bgcolor="#ffffff" text="#000000">
-        <xsl:apply-templates select="s2"/>
-      </body>
-    </html>
-  </xsl:template>
-
-  <xsl:template match="s2">
-    <table width="100%" border="0" cellspacing="0" cellpadding="4">
-      <tr>
-        <td bgcolor="#006699">
-          <font color="#ffffff" size="+1">
-            <b><xsl:value-of select="@title"/></b>
-          </font>
-        </td>
-      </tr>
-    </table>
-    <xsl:apply-templates/>
-    <br/>
-  </xsl:template>
-
-  <xsl:template match="p">
-    <p><xsl:apply-templates/></p>
-  </xsl:template>
-
-  <xsl:template match="note">
-    <table border="0" width="100%">
-      <tr>
-        <td width="20">&#160;</td>
-        <td bgcolor="#88aacc">
-          <font size="-1"><i>NOTE: <xsl:apply-templates/></i></font>
-        </td>
-        <td width="20">&#160;</td>
-      </tr>
-    </table>
-  </xsl:template>
-  
-  <xsl:template match="ul">
-    <ul><xsl:apply-templates/></ul>
-  </xsl:template>
-
-  <xsl:template match="ol">
-    <ol><xsl:apply-templates/></ol>
-  </xsl:template>
-  
-  <xsl:template match="gloss">
-    <dl><xsl:apply-templates/></dl>
-  </xsl:template>
-   <!-- <term> contains a single-word, multi-word or symbolic 
-       designation which is regarded as a technical term. --> 
-  <xsl:template match="term">
-    <dfn><xsl:apply-templates/></dfn>
-  </xsl:template>
-
-  <xsl:template match="label" priority="1">
-    <dt><xsl:apply-templates/></dt>
-  </xsl:template>
-
-  <xsl:template match="item" priority="2">
-    <dd>
-      <xsl:apply-templates/>
-    </dd>
-  </xsl:template>
-
-  <xsl:template match="table">
-    <p align="center"><table border="0"><xsl:apply-templates/></table></p>
-  </xsl:template>
-
-  <xsl:template match="source">
-    <table border="0" width="100%">
-      <tr>
-        <td width="20">&#160;</td>
-        <td bgcolor="#88aacc"><pre><xsl:apply-templates/></pre></td>
-        <td width="20">&#160;</td>
-      </tr>
-    </table>
-  </xsl:template>
-
-  <xsl:template match="li">
-    <li><xsl:apply-templates/></li>
-  </xsl:template>
-
-  <xsl:template match="tr">
-    <tr><xsl:apply-templates/></tr>
-  </xsl:template>
-
-  <xsl:template match="th">
-    <td bgcolor="#006699" align="center">
-      <font color="#ffffff"><b><xsl:apply-templates/></b></font>
-    </td>
-  </xsl:template>
-
-  <xsl:template match="td">
-    <td bgcolor="#88aacc"><xsl:apply-templates/>&#160;</td>
-  </xsl:template>
-
-  <xsl:template match="tn">
-    <td>&#160;</td>
-  </xsl:template>
-
-  <xsl:template match="em">
-    <b><xsl:apply-templates/></b>
-  </xsl:template>
-
-  <xsl:template match="ref">
-    <i><xsl:apply-templates/></i>
-  </xsl:template>
-
-  <xsl:template match="code">
-    <code><xsl:apply-templates/></code>
-  </xsl:template>
-
-  <xsl:template match="br">
-    <br/>
-  </xsl:template>
-
-
-  <xsl:template match="jump">
-    <a href="{@href}" target="_top"><xsl:apply-templates/></a>
-  </xsl:template>  
-
-  <xsl:template match="anchor">
-    <a name="{@id}"> </a>
-  </xsl:template>
-
-  <xsl:template match="img">
-    <img src="{@src}" align="right" border="0" vspace="4" hspace="4"/>
-  </xsl:template>
-  
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/AppletXMLtoHTML/spec.xsl b/samples/AppletXMLtoHTML/spec.xsl
deleted file mode 100644
index df3bf70..0000000
--- a/samples/AppletXMLtoHTML/spec.xsl
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN"/>
-  
-  <xsl:template match="spec">
-    <html>
-      <head>
-        <title>
-          <xsl:value-of select="title"/>
-        </title>
-      </head>
-      <body>
-        <xsl:apply-templates/>
-      </body>
-    </html>
-  </xsl:template>
-  
-  <xsl:template match="spec/title">
-    <h1><xsl:apply-templates/></h1>
-  </xsl:template>
-
-  <xsl:template match="frontmatter">
-    <p><b>Edit Date: </b><xsl:value-of select="./pubdate"/></p>
-    <p><b>Author: </b>
-      <xsl:element name="a">
-        <xsl:attribute name="href">
-          <xsl:value-of select="concat('mailto:', author/address/email)"/>
-        </xsl:attribute>
-        <xsl:value-of select="concat(author/firstname,' ', author/surname, ', ', ./author/orgname)"/>
-      </xsl:element>
-    </p>    
-  </xsl:template>
-  
-  <xsl:template match="spec/*/title">
-    <h2>
-      <xsl:choose>
-        <xsl:when test="@id">
-          <a name="@id">
-            <xsl:apply-templates/>
-          </a>
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:apply-templates/>
-        </xsl:otherwise>
-      </xsl:choose>
-    </h2>
-  </xsl:template>
-  
-  <xsl:template name="apply-id-templates">
-    <xsl:choose>
-      <xsl:when test="@id">
-        <a name="{@id}">
-          <xsl:apply-templates/>
-        </a>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:apply-templates/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-  
-  <xsl:template match="spec/*/*/title">
-    <h3>
-      <xsl:call-template name="apply-id-templates"/>
-    </h3>
-  </xsl:template>
-  
-  <xsl:template match="para">
-    <p><xsl:apply-templates/></p>
-  </xsl:template>
-
-  <xsl:template match="variablelist">
-    <ul>
-    <xsl:for-each select="varlistentry">
-      <li>
-        <p><b><xsl:apply-templates select="term"/></b><br/>
-        <xsl:apply-templates select="listitem"/></p>
-      </li>
-    </xsl:for-each>
-    </ul>
-  </xsl:template>
-
-  <xsl:template match="orderedlist">
-    <ol>
-    <xsl:for-each select="listitem">
-      <li><xsl:apply-templates/></li>
-    </xsl:for-each>
-    </ol>
-  </xsl:template>
-
-  <xsl:template match="patterns">
-    <h2><xsl:value-of select="@module"/><xsl:text> </xsl:text>Patterns</h2>
-    <ul>
-      <xsl:for-each select="pattern">
-        <p>
-          <b>
-            <xsl:for-each select="pattern-name">
-              <xsl:call-template name="apply-id-templates"/>
-            </xsl:for-each>
-          </b>
-          <br/>
-        <xsl:apply-templates select="*[name() != 'pattern-name']"/></p>
-      </xsl:for-each>
-    </ul>
-  </xsl:template>
-  
-  <xsl:template match="pattern/intent">
-    <br/><i>Intent: </i><xsl:apply-templates/>
-  </xsl:template>
-  
-  <xsl:template match="pattern/responsibilities">
-    <br/><i>Responsibilities: </i><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="pattern/potential-alternate-name">
-    <br/><i>Potential alternate name: </i><xsl:apply-templates/>
-  </xsl:template>
-  
-  <xsl:template match="pattern/thread-safety">
-    <br/><i>Thread safety: </i><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="pattern/notes">
-    <br/><i>Notes: </i><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="programlisting">
-    <code>
-    <pre>
-      <xsl:apply-templates/>
-    </pre>
-    </code>
-  </xsl:template>
-  
-  <xsl:template match="link">
-    <A href="#{@linkend}">
-      <xsl:apply-templates/>
-    </A>
-  </xsl:template>
-  <xsl:template match="ulink">
-    <A href="{@url}">
-      <xsl:apply-templates/>
-    </A>
-  </xsl:template>
-
-  <xsl:template match="termref">
-    <xsl:choose>
-      <xsl:when test="@link-url">
-        <A href="#{@link-url}">
-          <xsl:value-of select="."/>
-        </A>
-      </xsl:when>
-      <xsl:otherwise>
-        <U><xsl:value-of select="."/></U>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-  
-</xsl:stylesheet>
-
diff --git a/samples/AppletXMLtoHTML/target.html b/samples/AppletXMLtoHTML/target.html
deleted file mode 100644
index ea8545c..0000000
--- a/samples/AppletXMLtoHTML/target.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-  <head>
-    <title>Untitled</title>
-  </head>
-  <body>&nbsp;</body>
-</html>
diff --git a/samples/AppletXMLtoHTML/trax.xml b/samples/AppletXMLtoHTML/trax.xml
deleted file mode 100644
index 8fa92c5..0000000
--- a/samples/AppletXMLtoHTML/trax.xml
+++ /dev/null
@@ -1,260 +0,0 @@
-<?xml version="1.0"?>
-
-<spec> 
-  <title>Transformation API For XML (TrAX)</title>
-  <frontmatter> 
-  <pubdate>November 12, 2000</pubdate> 
-  <author><firstname>Scott</firstname> 
-         <surname>Boag</surname> 
-         <orgname>IBM Research</orgname> 
-         <address> 
-                <email>Scott_Boag@us.ibm.com</email> 
-         </address> 
-  </author></frontmatter> 
-  <introduction> 
-  <title>Introduction</title> 
-  <para>This overview describes the set of APIs contained in
-         <ulink url="http://xml.apache.org/xalan-j/apidocs/javax/xml/transform/package-summary.html">javax.xml.transform</ulink>, <ulink url="http://xml.apache.org/xalan-j/apidocs/javax/xml/transform/stream/package-summary.html">javax.xml.transform.stream</ulink>, <ulink url="http://xml.apache.org/xalan-j/apidocs/javax/xml/transform/dom/package-summary.html">javax.xml.transform.dom</ulink>, and <ulink url="http://xml.apache.org/xalan-j/apidocs/javax/xml/transform/sax/package-summary.html">javax.xml.transform.sax</ulink>. For the sake of brevity, these interfaces are referred to
-         as TrAX (Transformation API for XML). </para> 
-  <para>There is a broad need for Java applications to be able to transform XML
-         and related tree-shaped data structures. In fact, XML is not normally very
-         useful to an application without going through some sort of transformation,
-         unless the semantic structure is used directly as data. Almost all XML-related
-         applications need to perform transformations. Transformations may be described
-         by Java code, Perl code, <ulink url="http://www.w3.org/TR/xslt">XSLT</ulink>
-         Stylesheets, other types of script, or by proprietary formats. The inputs, one
-         or multiple, to a transformation, may be a URL, XML stream, a DOM tree, SAX
-         Events, or a proprietary format or data structure. The output types are the
-         pretty much the same types as the inputs, but different inputs may need to be
-         combined with different outputs.</para> 
-  <para>The great challenge of a transformation API is how to deal with all the
-         possible combinations of inputs and outputs, without becoming specialized for
-         any of the given types.</para> 
-  <para>The Java community will greatly benefit from a common API that will
-         allow them to understand and apply a single model, write to consistent
-         interfaces, and apply the transformations polymorphically. TrAX attempts to
-         define a model that is clean and generic, yet fills general application
-         requirements across a wide variety of uses. </para> 
-  <terminology> 
-         <title>General Terminology</title> 
-         <para>This section will explain some general terminology used in this
-                document. Technical terminology will be explained in the Model section. In many
-                cases, the general terminology overlaps with the technical terminology.</para> 
-         <variablelist> 
-                <varlistentry> 
-                  <term>Tree</term> 
-                  <listitem>This term, as used within this document, describes an
-                         abstract structure that consists of nodes or events that may be produced by
-                         XML. A Tree physically may be a DOM tree, a series of well balanced parse
-                         events (such as those coming from a SAX2 ContentHander), a series of requests
-                         (the result of which can describe a tree), or a stream of marked-up
-                         characters.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Source Tree(s)</term> 
-                  <listitem>One or more trees that are the inputs to the
-                         transformation.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Result Tree(s)</term> 
-                  <listitem>One or more trees that are the output of the
-                         transformation.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Transformation</term> 
-                  <listitem>The process of consuming a stream or tree to produce
-                         another stream or tree.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Identity (or Copy) Transformation</term> 
-                  <listitem>The process of transformation from a source to a result,
-                         making as few structural changes as possible and no informational changes. The
-                         term is somewhat loosely used, as the process is really a copy. from one
-                         "format" (such as a DOM tree, stream, or set of SAX events) to
-                         another.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Serialization</term> 
-                  <listitem>The process of taking a tree and turning it into a stream. In
-                         some sense, a serialization is a specialized transformation.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Parsing</term> 
-                  <listitem>The process of taking a stream and turning it into a tree. In
-                         some sense, parsing is a specialized transformation.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Transformer</term> 
-                  <listitem>A Transformer is the object that executes the transformation.
-                         </listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Transformation instructions</term> 
-                  <listitem>Describes the transformation. A form of code, script, or
-                         simply a declaration or series of declarations.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Stylesheet</term> 
-                  <listitem>The same as "transformation instructions," except it is
-                         likely to be used in conjunction with <ulink
-                         url="http://www.w3.org/TR/xslt">XSLT</ulink>.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Templates</term> 
-                  <listitem>Another form of "transformation instructions." In the TrAX
-                         interface, this term is used to describe processed or compiled transformation
-                         instructions. The Source flows through a Templates object to be formed into the
-                         Result.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>Processor</term> 
-                  <listitem>A general term for the thing that may both process the
-                         transformation instructions, and perform the transformation.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>DOM</term> 
-                  <listitem>Document Object Model, specifically referring to the
-                         <termref link-url="http://www.w3.org/TR/DOM-Level-2 ">Document Object Model
-                         (DOM) Level 2 Specification</termref>.</listitem> 
-                </varlistentry> 
-                <varlistentry> 
-                  <term>SAX</term> 
-                  <listitem>Simple API for XML, specifically referring to the
-                         <termref link-url="http://www.megginson.com/SAX/SAX2">SAX 2.0
-                         release</termref>.</listitem> 
-                </varlistentry> 
-         </variablelist> 
-  </terminology></introduction>
-  <requirements> 
-  <title>Requirements</title> 
-  <para>The following requirements have been determined from broad experience
-         with XML projects from the various members participating on the JCP.</para> 
-  <orderedlist> 
-         <listitem id="requirement-simple">TrAX must provide a clean, simple
-                interface for simple uses.</listitem> 
-         <listitem id="requirement-general">TrAX must be powerful enough to be
-                applied to a wide range of uses, such as, e-commerce, content management,
-                server content delivery, and client applications.</listitem> 
-         <listitem id="requirement-optimizeable">A processor that implements a TrAX
-                interface must be optimizeable. Performance is a critical issue for most
-                transformation use cases.</listitem> 
-         <listitem id="requirement-compiled-model">As a specialization of the above
-                requirement, a TrAX processor must be able to support a compiled model, so that
-                a single set of transformation instructions can be compiled, optimized, and
-                applied to a large set of input sources.</listitem> 
-         <listitem id="requirement-independence">TrAX must not be dependent an any
-                given type of transformation instructions. For instance, it must remain
-                independent of <ulink url="http://www.w3.org/TR/xslt">XSLT</ulink>.</listitem> 
-         <listitem id="requirement-from-dom">TrAX must be able to allow processors
-                to transform DOM trees.</listitem> 
-         <listitem id="requirement-to-dom">TrAX must be able to allow processors to
-                produce DOM trees.</listitem> 
-         <listitem id="requirement-from-sax">TrAX must allow processors to transform
-                SAX events.</listitem> 
-         <listitem id="requirement-to-sax">TrAX must allow processors to produce SAX
-                events.</listitem> 
-         <listitem id="requirement-from-stream">TrAX must allow processors to
-                transform streams of XML.</listitem> 
-         <listitem id="requirement-to-stream">TrAX must allow processors to produce
-                XML, HTML, and other types of streams.</listitem> 
-         <listitem id="requirement-combo-input-output">TrAX must allow processors to
-                implement the various combinations of inputs and outputs within a single
-                processor.</listitem> 
-         <listitem id="requirement-limited-input-output">TrAX must allow processors
-                to implement only a limited set of inputs. For instance, it should be possible
-                to write a processor that implements the TrAX interfaces and that only
-                processes DOM trees, not streams or SAX events.</listitem> 
-         <listitem id="requirement-proprietary-data-structures">TrAX should allow a
-                processor to implement transformations of proprietary data structures. For
-                instance, it should be possible to implement a processor that provides TrAX
-                interfaces that performs transformation of JDOM trees.</listitem> 
-         <listitem id="requirement-serialization-props">TrAX must allow the setting
-                of serialization properties, without constraint as to what the details of those
-                properties are.</listitem> 
-         <listitem id="requirement-setting-parameters">TrAX must allow the setting
-                of parameters to the transformation instructions.</listitem> 
-         <listitem id="requirement-namespaced-properties">TrAX must support the
-                setting of parameters and properties as XML Namespaced items (i.e., qualified
-                names).</listitem> 
-         <listitem id="requirement-relative-url-resolution">TrAX must support URL
-                resolution from within the transformation, and have it return the needed data
-                structure.</listitem> 
-         <listitem id="requirement-error-reporting">TrAX must have a mechanism for
-                reporting errors and warnings to the calling application.</listitem> 
-  </orderedlist> </requirements> 
-  <model> 
-  <title>Model</title> 
-  <para>The section defines the abstract model for TrAX, apart from the details
-         of the interfaces.</para> 
-  <para>A TRaX <termref
-         link-url="pattern-TransformerFactory">TransformerFactory</termref> is an object
-         that processes transformation instructions, and produces
-         <termref link-url="pattern-Templates">Templates</termref> (in the technical
-         terminology). A <termref link-url="pattern-Templates">Templates</termref>
-         object provides a <termref
-         link-url="pattern-Transformer">Transformer</termref>, which transforms one or
-         more <termref link-url="pattern-Source">Source</termref>s into one or more
-         <termref link-url="pattern-Result">Result</termref>s.</para> 
-  <para>To use the TRaX interface, you create a
-         <termref link-url="pattern-TransformerFactory">TransformerFactory</termref>,
-         which may directly provide a <termref
-         link-url="pattern-Transformers">Transformers</termref>, or which can provide
-         <termref link-url="pattern-Templates">Templates</termref> from a variety of
-         <termref link-url="pattern-Source">Source</termref>s. The
-         <termref link-url="pattern-Templates">Templates</termref> object is a processed
-         or compiled representation of the transformation instructions, and provides a
-         <termref link-url="pattern-Transformer">Transformer</termref>. The
-         <termref link-url="pattern-Transformer">Transformer</termref> processes a
-         <termref link-url="pattern-Transformer">Source</termref> according to the
-         instructions found in the <termref
-         link-url="pattern-Templates">Templates</termref>, and produces a
-         <termref link-url="pattern-Result">Result</termref>.</para> 
-  <para>The process of transformation from a tree, either in the form of an
-         object model, or in the form of parse events, into a stream, is known as
-         <termref>serialization</termref>. We believe this is the most suitable term for
-         this process, despite the overlap with Java object serialization.</para> 
-  <patterns module="TRaX"> <pattern><pattern-name
-  id="pattern-Processor">Processor</pattern-name><intent>Generic concept for the
-  set of objects that implement the TrAX interfaces.</intent>
-  <responsibilities>Create compiled transformation instructions, transform
-  sources, and manage transformation parameters and
-  properties.</responsibilities><thread-safety>Only the Templates object can be
-  used concurrently in multiple threads. The rest of the processor does not do
-  synchronized blocking, and so may not be used to perform multiple concurrent
-  operations.</thread-safety></pattern><pattern> 
-  <pattern-name id="pattern-TransformerFactory">TransformerFactory</pattern-name>
-  <intent>Serve as a vendor-neutral Processor interface for
-  <ulink url="http://www.w3.org/TR/xslt">XSLT</ulink> and similar
-  processors.</intent> <responsibilities>Serve as a factory for a concrete
-  implementation of an TransformerFactory, serve as a direct factory for
-  Transformer objects, serve as a factory for Templates objects, and manage
-  processor specific features.</responsibilities> <thread-safety>A
-  TransformerFactory may not perform mulitple concurrent
-  operations.</thread-safety> </pattern> <pattern> 
-  <pattern-name id="pattern-Templates">Templates</pattern-name> <intent>The
-  runtime representation of the transformation instructions.</intent> 
-  <responsibilities>A data bag for transformation instructions; act as a factory
-  for Transformers.</responsibilities> <thread-safety>Threadsafe for concurrent
-  usage over multiple threads once construction is complete.</thread-safety>
-  </pattern> <pattern> <pattern-name
-  id="pattern-Transformer">Transformer</pattern-name> <intent>Act as a per-thread
-  execution context for transformations, act as an interface for performing the
-  transformation.</intent><responsibilities>Perform the
-  transformation.</responsibilities> <thread-safety>Only one instance per thread
-  is safe.</thread-safety> <notes>The Transformer is bound to the Templates
-  object that created it.</notes> </pattern> <pattern> 
-  <pattern-name id="pattern-Source">Source</pattern-name> <intent>Serve as a
-  single vendor-neutral object for multiple types of input.</intent> 
-  <responsibilities>Act as simple data holder for System IDs, DOM nodes, streams,
-  etc.</responsibilities> <thread-safety>Threadsafe concurrently over multiple
-  threads for read-only operations; must be synchronized for edit
-  operations.</thread-safety> </pattern><pattern> 
-  <pattern-name id="pattern-Result">Result</pattern-name> 
-  <potential-alternate-name>ResultTarget</potential-alternate-name> <intent>Serve
-  as a single object for multiple types of output, so there can be simple process
-  method signatures.</intent> <responsibilities>Act as simple data holder for
-  output stream, DOM node, ContentHandler, etc.</responsibilities> 
-  <thread-safety>Threadsafe concurrently over multiple threads for read-only,
-  must be synchronized for edit.</thread-safety> </pattern> </patterns>
- </model>
-</spec>
\ No newline at end of file
diff --git a/samples/AppletXMLtoHTML/xalanApplets.xml b/samples/AppletXMLtoHTML/xalanApplets.xml
deleted file mode 100644
index ef86fc1..0000000
--- a/samples/AppletXMLtoHTML/xalanApplets.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?> 
-<s1 title="About Xalan Applets">
-  <s2 title="Transforming XML to HTML in an Applet">
-    <ol> 
-      <li>
-        <p>Include
-        org.apache.xalan.xslt.client.XSLTProcessorApplet
-        in an HTML client.</p>
-      </li>
-      <li>
-        <p>Specify the XML source document and XSL
-        stylesheet.</p>
-        <p>You can use the DocumentURL and StyleURL PARAM tags 
-        or the setDocumentURL() and setStyleURL() methods. 
-        If the XML document contains a stylesheet Processing
-        Instruction (PI), you do not need to specify an XSL
-        stylesheet.</p>
-      </li>
-      <li>
-        <p>Call the getHtmlText() method, which performs
-        the transformation and returns the new document as a
-        String.</p>
-      </li>
-    </ol>
-  </s2>
-</s1>
\ No newline at end of file
diff --git a/samples/ApplyXPath/ApplyXPath.java b/samples/ApplyXPath/ApplyXPath.java
deleted file mode 100644
index cf6d8f1..0000000
--- a/samples/ApplyXPath/ApplyXPath.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-// This file uses 4 space indents, no tabs.
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.util.Properties;
-import org.apache.xerces.parsers.DOMParser;
-import org.apache.xpath.XPathAPI;
-import org.apache.xml.utils.TreeWalker;
-import org.apache.xml.utils.DOMBuilder;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.traversal.NodeIterator;
-import org.xml.sax.SAXException;
-import org.xml.sax.InputSource;
-
-// Imported JAVA API for XML Parsing 1.0 classes
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException; 
-
-// Imported Serializer classes
-import javax.xml.transform.*;
-import javax.xml.transform.stream.*;
-import javax.xml.transform.dom.*;
-
-/**
- *  Very basic utility for applying an XPath epxression to an xml file and printing information
- /  about the execution of the XPath object and the nodes it finds.
- *  Takes 2 arguments:
- *     (1) an xml filename
- *     (2) an XPath expression to apply to the file
- *  Examples:
- *     java ApplyXPath foo.xml /
- *     java ApplyXPath foo.xml /doc/name[1]/@last
- * @see XPathAPI
- */
-public class ApplyXPath
-{
-  protected String filename = null;
-  protected String xpath = null;
-
-  /** Process input args and execute the XPath.  */
-  public void doMain(String[] args)
-    throws Exception
-  {
-    filename = args[0];
-    xpath = args[1];
-
-    if ((filename != null) && (filename.length() > 0)
-        && (xpath != null) && (xpath.length() > 0))
-    {
-      // Tell that we're loading classes and parsing, so the time it 
-      // takes to do this doesn't get confused with the time to do 
-      // the actual query and serialization.
-      System.out.println("Loading classes, parsing "+filename+", and setting up serializer");
-      
-      // Set up a DOM tree to query.
-      InputSource in = new InputSource(new FileInputStream(filename));
-      DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-      dfactory.setNamespaceAware(true);
-      Document doc = dfactory.newDocumentBuilder().parse(in);
-      
-      // Set up an identity transformer to use as serializer.
-      Transformer serializer = TransformerFactory.newInstance().newTransformer();
-      serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-
-      // Use the simple XPath API to select a nodeIterator.
-      System.out.println("Querying DOM using "+xpath);
-      NodeIterator nl = XPathAPI.selectNodeIterator(doc, xpath);
-
-      // Serialize the found nodes to System.out.
-      System.out.println("<output>");
-                  
-      Node n;
-      while ((n = nl.nextNode())!= null)
-      {         
-	if (isTextNode(n)) {
-	    // DOM may have more than one node corresponding to a 
-	    // single XPath text node.  Coalesce all contiguous text nodes
-	    // at this level
-	    StringBuffer sb = new StringBuffer(n.getNodeValue());
-	    for (
-	      Node nn = n.getNextSibling(); 
-	      isTextNode(nn);
-	      nn = nn.getNextSibling()
-	    ) {
-	      sb.append(nn.getNodeValue());
-	    }
-	    System.out.print(sb);
-	}
-	else {
-	  serializer.transform(new DOMSource(n), new StreamResult(System.out));
-	}
-        System.out.println();
-      }
-      System.out.println("</output>");
-    }
-    else
-    {
-      System.out.println("Bad input args: " + filename + ", " + xpath);
-    }
-  }
-  
-  /** Decide if the node is text, and so must be handled specially */
-  static boolean isTextNode(Node n) {
-    if (n == null)
-      return false;
-    short nodeType = n.getNodeType();
-    return nodeType == Node.CDATA_SECTION_NODE || nodeType == Node.TEXT_NODE;
-  }
-
-  /** Main method to run from the command line.    */
-  public static void main (String[] args)
-    throws Exception
-  {
-    if (args.length != 2)
-    {
-      System.out.println("java ApplyXPath filename.xml xpath\n"
-                         + "Reads filename.xml and applies the xpath; prints the nodelist found.");
-      return;
-    }
-        
-    ApplyXPath app = new ApplyXPath();
-    app.doMain(args);
-  }	
-  
-} // end of class ApplyXPath
-
diff --git a/samples/ApplyXPath/foo.xml b/samples/ApplyXPath/foo.xml
deleted file mode 100644
index 0423708..0000000
--- a/samples/ApplyXPath/foo.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<doc>
-  <name first="David" last="Marston"/>
-  <name first="David" last="Bertoni"/>
-  <name first="Donald" last="Leslie"/>
-  <name first="Emily" last="Farmer"/>
-  <name first="Joseph" last="Kesselman"/>
-  <name first="Myriam" last="Midy"/>
-  <name first="Paul" last="Dick"/>
-  <name first="Stephen" last="Auriemma"/>
-  <name first="Scott" last="Boag"/>
-  <name first="Shane" last="Curcuru"/>
-</doc>
\ No newline at end of file
diff --git a/samples/ApplyXPath/readme.html b/samples/ApplyXPath/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/ApplyXPath/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/CompiledApplet/README.applet b/samples/CompiledApplet/README.applet
deleted file mode 100644
index 0f43ba3..0000000
--- a/samples/CompiledApplet/README.applet
+++ /dev/null
@@ -1,91 +0,0 @@
-======================================================================
-The Sun XSLT Compiler (XSLTC) is a Java-based tool for compiling XSL
-stylesheets into extremely lightweight and portable Java byte code.
-The XSLTC Java Runtime environment can then process XML files against
-these compiled stylesheets (Translets) to generate any manner of
-output per the stylesheet instructions.
-
-This Applet Demo shows you how translets can be run in a client 
-browser as Java applets to perform XSLT transformations on XML 
-source documents residing on a Web server. Because of XSLTC's small 
-footprint, it is possible to download the compiled stylesheets 
-(translets) and the runtime classes in the applet. Whereas, this
-would not be easy with a fullsize Java-based XSLT processor. 
-
-There are two important advatages of this approach: 
-
-  1) It offloads XSLT processing from the server
-  2) It enables browsers, such as Netscape 4.x, that do not have native 
-     XSLT support to perform XSLT transformations today!
-
------------------------------------------------------------------------
-DEMO CONTENTS
------------------------------------------------------------------------
-The applet demo is very generic. It will let you run any pre-compiled
-translet through an applet, and it lets you use that on any XML file
-you can refer to using an URL. The contents of this demo are:
-
-  TransformApplet.java -  The applet that wraps the XSLTC runtime 
-      classes and your translet(s).
-
-  index.html - Your main HTML document (displays two frames)
-
-  menu.html  - The HTML document for your dialog frame. This is the
-      document that invokes the TransformApplet
-
------------------------------------------------------------------------
-HOW TO SET UP THE DEMO ON YOUR SITE
------------------------------------------------------------------------
-1. Install and configure Xalan with XSLTC
-
-2. Compile the stylesheets you want to export. This will result in one
-   or more small Java classes (translets).
-
-3. Create a JAR file with your the applet class (compile it first, of
-   cource), your translet classes and these classes from the xalan/xsltc
-   package:
-
-     org/apache/xalan/xsltc/*.class
-     org/apache/xalan/xsltc/dom/*.class
-     org/apache/xalan/xsltc/runtime/*.class
-     org/apache/xalan/xsltc/util/*.class
-
-   Be sure to make the JAR file world readable!
-
-4. Make your XML source documents readable through a URL (either place
-   them behind a web server or make them readable for your browser as
-   a file).
-
-5. Open the supplied index.html and try out the demo!
-
-----------------------------------------------------------------------
-KNOW PROBLEMS
-----------------------------------------------------------------------
-The following problems are specific to the Netscape 4.x browser.
-
-Class Already Loaded - If you start up the Netscape client browser on 
-a Unix system where you have been running XSLTC, and consequently 
-have a CLASSPATH that includes xml.jar, and xlstcrt.jar, the applet 
-demo fails. You'll see a message saying a class has already been 
-loaded in the Javascript console. To bring up the Javascript console,
-you type
-
-    javascript:
-
-in the location/URL field of the browser. To work around this problem, 
-unset your CLASSPATH before starting Netscape from a terminal window.
-This still may not resolve the problem if Netscape is started from 
-a wrapper that sets your environment from your startup file (e.g., 
-your .cshrc file for the C-shell).
-
-Parser Exception - This problem only applies to Netscape on the 
-Windows platform with XML documents that have an external DTD.
-If you see the following message:
-
-    org.xml.sax.SAXParseException: 
-    External parameter entity "%(DOCTYPE);"
-    has characters after markup.
-
-try removing the reference to an external DTD in your XML source.
-----------------------------------------------------------------------
-END OF README
diff --git a/samples/CompiledApplet/TransformApplet.java b/samples/CompiledApplet/TransformApplet.java
deleted file mode 100644
index 8b24fe7..0000000
--- a/samples/CompiledApplet/TransformApplet.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- * @author Jacek Ambroziak
- *
- */
-
-import java.io.*;
-import java.applet.*;
-import java.awt.*;
-import java.awt.event.*;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-
-import org.apache.xalan.xsltc.*;
-import org.apache.xalan.xsltc.runtime.*;
-import org.apache.xalan.xsltc.dom.*;
-
-/**
- * This applet demonstrates how XSL transformations can be made run in
- * browsers without native XSLT support.
- *
- * Note that the XSLTC transformation engine is invoked through its native
- * interface and not the javax.xml.transform (JAXP) interface. This because
- * XSLTC still does not offer precompiled transformations through JAXP.
- */
-public final class TransformApplet extends Applet {
-
-    // Single document cache
-    private String _documentUrl = "";
-    private DOMImpl _dom = null;
-    private DTDMonitor _dtdMonitor = null;
-
-    private static final String NAMESPACE_FEATURE =
-	"http://xml.org/sax/features/namespaces";
-
-    /**
-     * This class implements a dialog box used for XSL messages/comments
-     */
-    public class MessageFrame extends Frame {
-
-	public Frame frame;
-
-        public class ButtonHandler implements ActionListener {
-	    public void actionPerformed(ActionEvent e) {
-	        frame.setVisible(false);
-	    }
-	}
-
-	/**
-	 * This method handles xml:message and xsl:comment by displaying
-	 * the message/comment in a dialog box.
-	 */
-	public MessageFrame(String title, String message) {
-	    super(title);
-	    frame = this; // Make visible to ButtonHandler
-	    setSize(320,200);
-
-	    // Create a panel for the message itself
-	    Panel center = new Panel();
-	    center.add(new Label(message));
-
-	    // Create a panel for the 'OK' button
-	    Panel bottom = new Panel();
-	    Button okButton = new Button("   OK   ");
-	    okButton.addActionListener(new ButtonHandler());
-	    bottom.add(okButton);
-	    
-	    // Add the two panels to the window/frame
-	    add(center, BorderLayout.CENTER);
-	    add(bottom,BorderLayout.SOUTH);
-
-	    // Show the fecking thing
-	    setVisible(true);
-	}
-
-    }
-
-    /**
-     * The appled uses this method to display messages and comments
-     * generated by xsl:message and xsl:comment elements.
-     */
-    public class AppletMessageHandler extends MessageHandler {
-	public void displayMessage(String msg) {
-	    MessageFrame z = new MessageFrame("XSL transformation alert",msg);
-	}
-    }
-
-    /**
-     * Reads the input document from the supplied URL and builds the
-     * internal "DOM" tree.
-     */
-    private DOM getDOM(String url) throws Exception {
-	// Check if the document is already in the 1-document cache
-	if (url.equals(_documentUrl) == false) {
-
-	    // Create a SAX parser and get the XMLReader object it uses
-	    final SAXParserFactory factory = SAXParserFactory.newInstance();
-	    try {
-		factory.setFeature(NAMESPACE_FEATURE,true);
-	    }
-	    catch (Exception e) {
-		factory.setNamespaceAware(true);
-	    }
-	    final SAXParser parser = factory.newSAXParser();
-	    final XMLReader reader = parser.getXMLReader();
-
-	    // Set the DOM's builder as the XMLReader's SAX2 content handler
-	    _dom = new DOMImpl();
-	    reader.setContentHandler(_dom.getBuilder());
-
-	    // Create a DTD monitor and pass it to the XMLReader object
-	    _dtdMonitor = new DTDMonitor();
-	    _dtdMonitor.handleDTD(reader);
-
-	    // Parse the input document
-	    reader.parse(url);
-
-	    // Update the 1-document cahce with this DOM
-	    _documentUrl = url;
-	}
-	return _dom;
-    }
-
-    /**
-     * This method is the main body of the applet. The method is called
-     * by some JavaScript code in an HTML document.
-     */ 
-    public String transform(Object arg1, Object arg2) {
-
-	// Convert the two arguments to strings.
-	final String transletName = (String)arg1;
-	final String documentUrl = (String)arg2;
-
-	// Initialise the output stream
-	final StringWriter sout = new StringWriter();
-	final PrintWriter out = new PrintWriter(sout);
-
-	try {
-	    // Check that the parameters are valid
-	    if (transletName == null || documentUrl == null) {
-		out.println("<h1>Transformation error</h1>");
-		out.println("The parameters <b><tt>class</tt></b> "+
-			    "and <b><tt>source</tt></b> must be specified");
-	    }
-	    else {
-		// Instanciate a message handler for xsl:message/xsl:comment
-		AppletMessageHandler msgHandler = new AppletMessageHandler();
-
-		// Get a refenrence to the translet class
-		final Class tc = Class.forName(transletName);
-
-		// Instanciate and initialise the tranlet object
-		AbstractTranslet translet = (AbstractTranslet)tc.newInstance();
-		((AbstractTranslet)translet).setMessageHandler(msgHandler);
-
-		// Initialise the translet's output handler
-		DefaultSAXOutputHandler saxHandler = 
-		    new DefaultSAXOutputHandler(out);
-		TextOutput textOutput = new TextOutput(saxHandler);
-
-		getDOM(documentUrl);
-
-		final long start = System.currentTimeMillis();
-
-		// Set size of key/id indices
-		translet.setIndexSize(_dom.getSize());
-		// If there are any elements with ID attributes, build an index
-
-		_dtdMonitor.buildIdIndex(_dom, 0, translet);
-		// Pass unparsed entities to translet
-		translet.setUnparsedEntityURIs(_dtdMonitor.
-					       getUnparsedEntityURIs());
-		// Do the actual transformation
-		translet.transform(_dom, textOutput);
-
-		final long done = System.currentTimeMillis() - start;
-		out.println("<!-- transformed by XSLTC in "+done+"msecs -->");
-	    }
-	    // Now close up the sink, and return the HTML output in the
-	    // StringWrite object as a string.
-	    out.close();
-	    System.err.println("Transformation complete!");
-	    System.err.println(sout.toString());
-	    return sout.toString();
-	}
-	catch (RuntimeException e) {
-	    out.close();
-	    return sout.toString();
-	}
-	catch (Exception e) {
-	    out.println("<h1>exception</h1>");
-	    out.println(e.toString());
-	    out.close();
-	    return sout.toString();
-	}
-    }
-}
diff --git a/samples/CompiledApplet/index.html b/samples/CompiledApplet/index.html
deleted file mode 100755
index bde5656..0000000
--- a/samples/CompiledApplet/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<html>
-<head><title>XSLT Applet Demonstration</title></head>
-
-<backgroundcolor=#ffffff>
-
-<frameset border="1" cols="25%,*">
-<frame src="menu.html" name="demo_ctrl">
-<frame src="about:blank" name="demo_output">
-</frameset>
-
-</html>
diff --git a/samples/CompiledApplet/menu.html b/samples/CompiledApplet/menu.html
deleted file mode 100755
index 265501a..0000000
--- a/samples/CompiledApplet/menu.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<html>
-<head></head>
-<body bgcolor=#ffffff>
-<hr>
-
-<center><h3>Xalan/XSLTC Applet Demo</h3></center>
-Each of these examples illustrate the use of translets
-within a Java applet:
-<p>
-
-  <script language="JavaScript">
-
-    function run_transform(form) {
-      /* Get the input document and translet class name from input form */
-      var translet = form.translet;
-      var document = form.document;
-
-      /* Get the frame to output to */
-      var output_frame = parent.frames.demo_output.document;
-
-      /* Display the output in this frame */
-      output_frame.clear();
-      output_frame.writeln(document.TransformApplet.transform(translet, document));
-      output_frame.close();
-      return(true);
-    }
-
-  </script>
-
-  <form name="xslt_form" onSubmit="run_transform(this.form)">
-    <p>Select translet:</p>
-    <p><input name="translet" width="64"></p>
-    <p>Select XML source document:</p>
-    <p><input name="document" width="64"></p>
-    <p><input type="button" value="Run" onClick="run_transform(this.form)"></p>
-
-  </form>
-
-  <!--
-    The xsltc.jar file must contain the XSLTC runtime classes and your
-    pre-compiled translets, as described in the README.applet file.
-  -->
-  <applet archive="xsltc.jar"
-          code="TransformApplet"
-          name="TransformApplet"
-          width="10"
-          height="10">
-  </applet>
-
-</body>
diff --git a/samples/CompiledBrazil/README.brazil b/samples/CompiledBrazil/README.brazil
deleted file mode 100644
index 39890e0..0000000
--- a/samples/CompiledBrazil/README.brazil
+++ /dev/null
@@ -1,161 +0,0 @@
-============================================================
-CONTENTS OF THIS DOCUMENT:
-
-  o) HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
-  o) HOW TO INVOKE TRANSLETS FROM A BRAZIL HANDLER
-  o) BUILDING YOUR OWN DOM CACHE
-
-------------------------------------------------------------
-HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
-
-This sample code illustrates how Xalan/XSLTC can be used to
-offer XSL transformations as a web service without using a
-full web server. We have chosen to use the Brazil prototype
-for the web interface, available from Sunlabs:
-    http://www.sun.com/research/brazil/
-but we could easily have used some other web interface such
-as Tomcat. The supplied Java code implements a Brazil
-"handler", which very much resembles a servlet.
-
-The CompiledEJB and CompiledServlet sample code
-demonstrate other aproaches to providing XSL transformations
-as a web service.
-
-------------------------------------------------------------
-HOW TO INVOKE TRANSLETS FROM A BRAZIL HANDLER
-
-The .CompiledBrazil directory contains the example source code:
-
-    TransformHandler.java
-
-This file contains a minimal implementation of an XSL
-transformation handler. The handler performs the same basic
-steps as the class implementing the XSLTC command-line tool:
-
-    // Obtain a reference to the translet class
-    Class cls = Class.forName(transletName);
-    // Instanciate a translet object (inherits AbstractTranslet)
-    AbstractTranslet translet = (AbstractTranslet)cls.newInstance();
-
-    // Prepare the internal DOM tree
-    final DOMImpl dom = new DOMImpl();
-    dom.setDocumentURI(inputURI);
-
-    // Create a parser for the input document
-    // org.apache.xalan.xsltc.runtime.Constants sets NAMESPACE_FEATURE
-    final SAXParserFactory facory = SAXFactory.newInstance();
-    try {
-      factory.setFeature(NAMESPACE_FEATURE,true);
-    }
-    catch (Exception e) {
-      factory.setNamespaceAware(true);
-    }
-    parser = factory.newSAXParser();
-    reader = parser.getXMLReader();
-    reader.setContentHandler(dom.getBuilder());
-
-    // Create a DTDMonitor for handling ID references in the DTD
-    DTDMonitor dtdMonitor = new DTDMonitor();
-    dtdMonitor.handleDTD(reader);
-
-    // Create output handler (you can plug in your own)
-    DefaultSAXOutputHandler saxHandler;
-    saxHandler = new DefaultSAXOutputHandler(out);
-
-    // Parse the document and build the internal DOM
-    reader.parse(inputURI);
-
-    // Pass information on id/key indicies to the translet
-    translet.setIndexSize(dom.getSize());
-    dtdMonitor.buildIdIndex(dom, 0, translet);
-    translet.setUnparsedEntityURIs(dtdMonitor.getUnparsedEntityURIs());
-
-    // Start the transformation
-    translet.transform(dom, new TextOutput(saxHandler));
-
-Alternatively the handler can use a cache for storing
-frequently accessed XML documents. This is not only a matter
-of reading the initial input document from the cache, as
-the translet may load other XML input documents as runtime.
-(If the xsl:document() function was used in the stylesheet.)
-
-    // Get a reference to the translet class
-    Class cls = Class.forName(transletName);
-
-    // Instanciate a translet object (inherits AbstractTranslet)
-    AbstractTranslet translet = (AbstractTranslet)cls.newInstance();
-
-    // The translet needs a reference to the cache in case
-    // in needs to load additional XML documents.
-    translet.setDOMCache(cache);
-
-    // Get the DOM from the DOM cache
-    DOMImpl dom = cache.retrieveDocument(documentURI, 0, translet);
-
-    // Create output handler (you can plug in your own)
-    DefaultSAXOutputHandler saxHandler;
-    saxHandler = new DefaultSAXOutputHandler(out);
-
-    // Start the transformation
-    translet.transform(dom, new TextOutput(saxHandler));
-
-------------------------------------------------------------
-BUILDING YOUR OWN DOM CACHE
-
-The interface for the DOM cache consists of a single method,
-and its definition can be found in:
-
-    org/apache/xalan/xsltc/DOMCache.java
-
-The method contained in the interface is:
-
-    public DOMImpl retrieveDocument(String uri,
-                                    int mask,
-                                    Translet translet);
-
-The responsibilities of this method are:
-
- A) Build new a DOMImpl and DTDMonitor for XML documents
-    that are not already in the cache:
-
-        // Instanciate a DOMImpl object
-        Parser  parser = new Parser();
-        DOMImpl dom = new DOMImpl();
-        dom.setDocumentURI(uri);
-        parser.setDocumentHandler(dom.getBuilder());
-
-        // Use a DTDMonitor to track ID references in DTD
-        DTDMonitor dtdMonitor = new DTDMonitor();
-        parser.setDTDHandler(dtdMonitor);
-
-        // Parse the input document and build DOM
-        parser.parse(uri);
-
-    At this point the DOMImpl and DTDMonitor objects are
-    populated with the necessary data. The two objects
-    are ready to be put in the cache (using the URI as
-    the lookup key).
-
- B) For each time a new document is requested by a translet:
-
-        // Expand translet's index array to fit this DOM
-        translet.setIndexSize(dom.getSize());
-
-        // Build indices for this DOM's DTD's ID references
-        dtd.buildIdIndex(dom, mask, translet);
-
-        // Pass unparsed entity URIs to the translet
-        translet.setUnparsedEntityURIs(dtd.getUnparsedEntityURIs());
-
-Step A) must be done every time a document is read into the
-cache, and step B) every time a document is given to a
-translet.
-
-The XSLTC package contains an example implementation of a
-DOM cache, based on a very simple round-robin caching
-algorithm:
-
-    org/apache/xalan/xsltc/dom/DocumentCache.java
-
-------------------------------------------------------------
-END OF README
diff --git a/samples/CompiledBrazil/TransformHandler.java b/samples/CompiledBrazil/TransformHandler.java
deleted file mode 100644
index c7c7d90..0000000
--- a/samples/CompiledBrazil/TransformHandler.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- *
- */
-
-import java.io.*;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-import org.xml.sax.*;
-
-import org.apache.xalan.xsltc.*;
-import org.apache.xalan.xsltc.runtime.*;
-import org.apache.xalan.xsltc.dom.*;
-
-import sunlabs.brazil.server.Handler;
-import sunlabs.brazil.server.Request;
-import sunlabs.brazil.server.Server;
-
-/**
- * This Brazil handler demonstrates how XSL transformations can be made
- * available as a web service without using a full web server. This class
- * implements the Handler interface from the Brazil project, see:
- * http://www.sun.com/research/brazil/
- *
- * Note that the XSLTC transformation engine is invoked through its native
- * interface and not the javax.xml.transform (JAXP) interface. This because
- * XSLTC still does not offer precompiled transformations through JAXP.
- */
-public class TransformHandler implements Handler {
-
-    // A cache for internal DOM structures
-    private static DocumentCache cache = null;
-
-    // These two are used while parsing the parameters in the URL
-    private final String PARAM_TRANSLET = "translet=";
-    private final String PARAM_DOCUMENT = "document=";
-    private final String PARAM_STATS = "stats=";
-
-    // All output goes here:
-    private PrintWriter _out = null;
-
-    /**
-     * Dump an error message to output
-     */
-    public void errorMessage(String message, Exception e) {
-	if (_out == null) return;
-	_out.println("<h1>XSL transformation error</h1>"+message);
-	_out.println("<br>Exception:</br>"+e.toString());
-    }
-
-    public void errorMessage(String message) {
-	if (_out == null) return;
-	_out.println("<h1>XSL transformation error</h1>"+message);
-    }
-
-    /**
-     * This method is run when the Brazil proxy is loaded
-     */
-    public boolean init(Server server, String prefix) {
-	return true;
-    }
-
-    /**
-     * This method is run for every HTTP request sent to the proxy
-     */
-    public boolean respond(Request request) throws IOException {
-
-	// Initialise the output buffer
-	final StringWriter sout = new StringWriter();
-	_out = new PrintWriter(sout);
-
-	// These two hold the parameters from the URL 'translet' and 'document'
-	String transletName = null;
-	String document = null;
-	String stats = null;
-
-	// Get the parameters from the URL
-	final StringTokenizer params = new StringTokenizer(request.query,"&");
-	while (params.hasMoreElements()) {
-	    final String param = params.nextToken();
-	    if (param.startsWith(PARAM_TRANSLET)) {
-		transletName = param.substring(PARAM_TRANSLET.length());
-	    }
-	    else if (param.startsWith(PARAM_DOCUMENT)) {
-		document = param.substring(PARAM_DOCUMENT.length());
-	    }
-	    else if (param.startsWith(PARAM_STATS)) {
-		stats = param.substring(PARAM_STATS.length());
-	    }
-	}
-
-	try {
-	    // Initialize the document cache with 32 DOM slots
-	    if (cache == null) cache = new DocumentCache(32);
-
-	    // Output statistics if user looked up "server:port/?stats=xxx"
-	    if (stats != null) {
-		cache.getStatistics(_out); // get cache statistics (in HTML)
-	    }
-	    // Make sure that both parameters were specified
-	    else if ((transletName == null) || (document == null)) {
-		errorMessage("Parameters <b><tt>translet</tt></b> and/or "+
-			     "<b><tt>document</tt></b> not specified.");
-	    }
-	    else {
-		// Get a reference to the translet class
-	        Class transletClass = Class.forName(transletName);
-		// Instanciate the translet object (inherits AbstractTranslet)
-		AbstractTranslet translet =
-		    (AbstractTranslet)transletClass.newInstance();
-		translet.setDOMCache(cache);
-
-		// Get the DOM from the DOM cache
-		DOMImpl dom = cache.retrieveDocument(document, 0, translet);
-
-		if (dom == null) {
-		    errorMessage("Could not locate: \"<b>"+document+"\"</b>");
-		}
-		else {
-		    // Initialise the translet's output handler
-		    DefaultSAXOutputHandler saxHandler = 
-			new DefaultSAXOutputHandler(_out);
-
-		    // Do the actual transformation
-		    final long start = System.currentTimeMillis();
-		    translet.transform(dom, new TextOutput(saxHandler));
-		    final long done = System.currentTimeMillis() - start;
-		    _out.println("<!-- transformed by XSLTC in "+done+"ms -->");
-		}
-	    }
-	}
-	catch (SAXException e) {
-	    errorMessage("Error parsing document \""+document+"\"");
-	}
-	catch (ClassNotFoundException e) {
-	    errorMessage("Could not locate the translet class: \""+
-			 transletName+"\"<br>Exception:</br>",e);
-	}
-	catch (Exception e) {
-	    errorMessage("Internal error.",e);
-	}
-
-	// Pass the transformation output as the HTTP response
-	request.sendResponse(sout.toString());
-	return true;
-    }
-
-
-}
diff --git a/samples/CompiledEJB/README.ejb b/samples/CompiledEJB/README.ejb
deleted file mode 100644
index 3a6f9f9..0000000
--- a/samples/CompiledEJB/README.ejb
+++ /dev/null
@@ -1,85 +0,0 @@
-============================================================
-CONTENTS OF THIS DOCUMENT:
-
-  o) HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
-  o) HOW TO INVOKE TRANSLETS FROM AN ENTERPRISE JAVA BEAN
-
-------------------------------------------------------------
-HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
-
-With XSLTC, XSL transformations can be run from within a
-an Enterprise Java Bean (EJB) and exported through a servlet.
-This sample code demonstrates how that can be implemented.
-
-The CompiledServlet and CompiledBrazil sample code
-demonstrates other aproaches to providing XSL transformations
-as a web service.
-
-------------------------------------------------------------
-HOW TO INVOKE TRANSLETS FROM AN ENTERPRISE JAVA BEAN
-
- o) Create an EJB that implements SessionBean and has a
-    single transform() entry point:
-
-    public class TransformBean implements SessionBean {
-        public String transform(String document, String transletName) {
-            // instanciate translet
-            // build internal DOM
-            // run transformation
-            :
-            :
-        }
-        :
-        :
-    }
-
- o) Create this EJB's remote interface (this is the interface
-    your servlet will use to call the bean's entry point):
-
-    public interface TransformRemote extends EJBObject {
-        public String transform(String document, String transletName) 
-        throws RemoteException;
-    }
-
- o) Create the EJB's home interface, which your servlet
-    will use to instanciate the remote interface:
-
-    public interface TransformHome extends EJBHome {
-        TransformRemote create()
-            throws CreateException, RemoteException;
-    }
-
- o) Create a servlet that uses the EJB's home interface to
-    create a remote interface to the EJB, and then calls
-    the EJB's transform() method through that remote
-    interface:
-
-    public class TransformServlet extends HttpServlet {
-
-        public void init(ServletConfig config) {
-            // look up the EJB's home interface using JNDI
-        }
-
-        public void doGet (HttpServletRequest request, 
-                           HttpServletResponse response) 
-            throws ServletException, IOException {
-            // create the remote interface
-            // pass the parameters from teh request to the EJB
-            // display results passed back from EJB
-        }
-    }
-
- o) Set up your J2EE_CLASSPATH to include JAXP and the XSLTC
-    runtime jars.
-
- o) Compile your XSL stylesheets and place them either in
-    your J2EE_CLASSPATH or wrap them in your EJB jar.
-
- o) Deploy your EJB
-
- o) Call the servlet with the necessary parameters (at least
-    an URI to the source XML document and the name of the
-    translet class).
-
-------------------------------------------------------------
-END OF README
diff --git a/samples/CompiledEJB/TransformBean.java b/samples/CompiledEJB/TransformBean.java
deleted file mode 100644
index 1914a89..0000000
--- a/samples/CompiledEJB/TransformBean.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- *
- */
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
-
-import java.rmi.RemoteException;
-import javax.ejb.SessionBean;
-import javax.ejb.SessionContext;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-
-import org.apache.xalan.xsltc.*;
-import org.apache.xalan.xsltc.runtime.*;
-import org.apache.xalan.xsltc.dom.*;
-
-public class TransformBean implements SessionBean {
-
-    private SessionContext _context = null;
-    
-    private final static String nullErrorMsg =
-	"<h1>XSL transformation error</h1>"+
-	"<p>'null' parameters sent to the XSL transformation bean's "+
-	"<tt>transform(String document, String translet)</tt> method.</p>";
-
-    private static final String NAMESPACE_FEATURE =
-	"http://xml.org/sax/features/namespaces";
-
-    /**
-     * Read the input document and build the internal "DOM" tree.
-     */
-    private DOMImpl getDOM(String url, AbstractTranslet translet)
-	throws Exception {
-
-	// Create a SAX parser and get the XMLReader object it uses
-	final SAXParserFactory factory = SAXParserFactory.newInstance();
-	try {
-	    factory.setFeature(NAMESPACE_FEATURE,true);
-	}
-	catch (Exception e) {
-	    factory.setNamespaceAware(true);
-	}
-	final SAXParser parser = factory.newSAXParser();
-	final XMLReader reader = parser.getXMLReader();
-
-	// Set the DOM's builder as the XMLReader's SAX2 content handler
-	DOMImpl dom = new DOMImpl();
-	reader.setContentHandler(dom.getBuilder());
-
-	// Create a DTD monitor and pass it to the XMLReader object
-	final DTDMonitor dtdMonitor = new DTDMonitor();
-	dtdMonitor.handleDTD(reader);
-	translet.setDTDMonitor(dtdMonitor);
-
-	// Parse the input document
-	reader.parse(url);
-
-	return dom;
-    }
-
-    /**
-     * Generates HTML from a basic error message and an exception
-     */
-    private void errorMsg(PrintWriter out, Exception e, String msg) {
-	out.println("<h1>Error</h1>");
-	out.println("<p>"+msg+"</p><br>");
-	out.println(e.toString());
-    }
-
-    /**
-     * Main bean entry point
-     */
-    public String transform(String document, String transletName) {
-
-	// Initialise the output stream
-	final StringWriter sout = new StringWriter();
-	final PrintWriter out = new PrintWriter(sout);
-
-	try {
-	    if ((document == null) || (transletName == null)) {
-		out.println(nullErrorMsg);
-	    }
-	    else {
-		// Instanciate a translet object (inherits AbstractTranslet)
-	        Class tc = Class.forName(transletName);
-		AbstractTranslet translet = (AbstractTranslet)tc.newInstance();
-
-		// Read input document from the DOM cache
-		DOMImpl dom = getDOM(document, translet);
-
-		// Initialize the (default) SAX output handler
-		DefaultSAXOutputHandler saxHandler = 
-		    new DefaultSAXOutputHandler(out);
-
-		// Start the transformation
-		final long start = System.currentTimeMillis();
-		translet.transform(dom, new TextOutput(saxHandler));
-		final long done = System.currentTimeMillis() - start;
-		out.println("<!-- transformed by XSLTC in "+done+"msecs -->");
-	    }
-	}
-
-	catch (IOException e) {
-	    errorMsg(out, e, "Could not locate source document: "+document);
-	}
-	catch (ClassNotFoundException e) {
-	    errorMsg(out, e, "Could not locate the translet class: "+
-		     transletName);
-	}
-	catch (SAXException e) {
-	    errorMsg(out, e, "Error parsing document "+document);
-	}
-	catch (Exception e) {
-	    errorMsg(out, e, "Impossible state reached.");
-	}
-
-	// Now close up the sink, and return the HTML output in the
-	// StringWrite object as a string.
-	out.close();
-	return sout.toString();
-    }
-
-    /**
-     *
-     */
-    public void setSessionContext(SessionContext context) {
-	_context = context;
-    }
-
-    // General EJB entry points
-    public void ejbCreate() { }
-    public void ejbRemove() { }
-    public void ejbActivate() { }
-    public void ejbPassivate() { }
-    public void ejbLoad() { }
-    public void ejbStore() { }
-}
diff --git a/samples/CompiledEJB/TransformHome.java b/samples/CompiledEJB/TransformHome.java
deleted file mode 100644
index ac5f9a7..0000000
--- a/samples/CompiledEJB/TransformHome.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- *
- */
-
-import java.rmi.RemoteException;
-import javax.ejb.CreateException;
-import javax.ejb.EJBHome;
-
-/**
- * XSL transformation bean home interface
- */
-public interface TransformHome extends EJBHome {
-    TransformRemote create() throws CreateException, RemoteException;
-}
diff --git a/samples/CompiledEJB/TransformRemote.java b/samples/CompiledEJB/TransformRemote.java
deleted file mode 100644
index 8cbaeed..0000000
--- a/samples/CompiledEJB/TransformRemote.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- *
- */
-
-import javax.ejb.EJBObject;
-import java.rmi.RemoteException;
-
-/**
- * XSL transformation bean remote interface
- */
-public interface TransformRemote extends EJBObject {
-    public String transform(String document, String transletName) 
-	throws RemoteException;
-}
diff --git a/samples/CompiledEJB/TransformServlet.java b/samples/CompiledEJB/TransformServlet.java
deleted file mode 100644
index 4bdab4a..0000000
--- a/samples/CompiledEJB/TransformServlet.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- *
- */
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
-import javax.naming.*;
-import javax.rmi.PortableRemoteObject;
-
-public class TransformServlet extends HttpServlet {
-
-    // Error message used when the XSL transformation bean cannot be created
-    private final static String createErrorMsg =
-	"<h1>XSL transformation bean error</h1>"+
-	"<p>An XSL transformation bean could not be created.</p>";
-
-    // Transformer - "more than meets the eye".
-    private TransformHome transformer;
-
-    /**
-     * Servlet initializer - look up the bean's home interface
-     */
-    public void init(ServletConfig config) 
-	throws ServletException{
-	try{
-	    InitialContext context = new InitialContext();
-	    Object transformRef = context.lookup("transform");
-	    transformer =
-		(TransformHome)PortableRemoteObject.narrow(transformRef,
-							   TransformHome.class);
-	} catch (Exception NamingException) {
-	    NamingException.printStackTrace();
-	}
-    }
-
-    /**
-     * Handles "GET" HTTP requests - ie. runs the actual transformation
-     */
-    public void doGet (HttpServletRequest request, 
-		       HttpServletResponse response) 
-	throws ServletException, IOException {
-
-	String document = request.getParameter("document");
-	String translet = request.getParameter("translet");
-
-	response.setContentType("text/html");
-
-	PrintWriter out = response.getWriter();
-	try{
-	    // Get the insult from the bean
-	    TransformRemote xslt = transformer.create();
-	    String result = xslt.transform(document, translet);
-	    out.println(result);
-	} catch(Exception CreateException){
-	    out.println(createErrorMsg);
-	}
-	out.close();
-    }
-
-    public void destroy() {
-	System.out.println("Destroy");
-    }
-}
diff --git a/samples/CompiledEJB/bottom_frame.html b/samples/CompiledEJB/bottom_frame.html
deleted file mode 100644
index edc1918..0000000
--- a/samples/CompiledEJB/bottom_frame.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-  <head></head>
-  <body>
-    <backgroundcolor=#ffffff>
-  </body>
-</html>
-
diff --git a/samples/CompiledEJB/index.html b/samples/CompiledEJB/index.html
deleted file mode 100644
index 641c2b4..0000000
--- a/samples/CompiledEJB/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<html>
-  <head><title>XML Technology Center</title></head>
-    <backgroundcolor=#ffffff>
-
-    <frameset border="0" rows="30%,70%">
-      <frame src="top_frame.html" NAME="top" scrolling="off">
-      <frame src="bottom_frame.html" NAME="bottom" scrolling="on">
-    </frameset>
-
-    <noframes>
-    </noframes>
-
-</html>
-
diff --git a/samples/CompiledEJB/top_frame.html b/samples/CompiledEJB/top_frame.html
deleted file mode 100644
index c529088..0000000
--- a/samples/CompiledEJB/top_frame.html
+++ /dev/null
@@ -1,105 +0,0 @@
-<html>
-
-  <head>
-    <base target=xtc_menu>
-  </head>
-
-  <body bgcolor=#ffffff>
-
-    <center><h1>Server-side XSL transformations</h1><p></center>
-
-    <script language="JavaScript">
-
-      function getURI() {
-        var root = "http://gobsheen.ireland/morten/Sun/XTC/demo/plays/";
-	var menu = document.XMLinput.elements[0];
-        var play = menu.options[menu.selectedIndex].value;
-        return(root+play);
-      }
-
-      function getTranslet() {
-	var menu = document.XMLinput.elements[1];
-        var translet = menu.options[menu.selectedIndex].value;
-	return(translet);
-      }
-
-      function setHTMLlocation(translet) {
-        var uri = getURI();
-        var translet = getTranslet();
-        var source = "http://gobsheen:8000/Transform/Transform?"+
-                     "document="+uri+"&translet="+translet;
-        open(source,"bottom");
-      }
-
-      function setXMLlocation() {
-        var target = parent.frames.demo_bottom;
-        var uri = getURI();
-        open(uri,"bottom");
-      }
-
-    </script>
-
-    <form name="XMLinput">
-
-    <table>
-    <tr>
-      <td>
-        <b>Source document:</b>
-      </td>
-      <td>
-        <select name="dropdown">
-          <option value="AsYouLikeIt.xml">As You Like It
-          <option value="Cymbeline.xml">Cymbeline
-          <option value="Hamlet.xml">The Tragedy of Hamlet
-          <option value="HenryV.xml">The Life of Henry V
-          <option value="HenryVIII.xml">The Famous History of the Life of Henry VIII
-          <option value="KingJohn.xml">The Life and Death of King John
-          <option value="KingLear.xml">The Tragedy of King Lear
-          <option value="KingRichardII.xml">The Tragedy of King Richard II
-          <option value="MeasureForMeasure.xml">Measure for Measure
-          <option value="MerchantOfVenice.xml">The Merchant of Venice
-          <option value="MerryWivesOfWindsor.xml">The Merry Wives of Windsor
-          <option value="MidsummerNightsDream.xml">A Midsummer Night's Dream
-          <option value="MuchAdoAboutNothing.xml">Much Ado about Nothing
-          <option value="PericlesPrinceOfTyre.xml">Pericles, Prince of Tyre
-          <option value="RomeoAndJuliet.xml">The Tragedy of Romeo and Juliet
-          <option value="TamingOfTheShrew.xml">The Taming of the Shrew
-          <option value="TheTempest.xml">The Tempest
-          <option value="TimonOfAthens.xml">The Life of Timon of Athens
-          <option value="TragedyOfCoriolanus.xml">The Tragedy of Coriolanus
-          <option value="TragedyOfJuliusCaesar.xml">The Tragedy of Julius Caesar
-          <option value="TragedyOfOthello.xml">The Tragedy of Othello, the Moor of Venice
-          <option value="TroilusAndCresida.xml">The History of Troilus and Cressida
-          <option value="TwelfthNight.xml">Twelfth Night, or What You Will
-          <option value="TwoGentlementOfVerona.xml">The Two Gentlemen of Verona
-          <option value="WintersTale.xml">The Winter's Tale
-        </select>
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <b>Transformation:</b>
-      </td>
-      <td>
-        <select name="dropdown">
-          <option value="PlayToHTML">Full
-          <option value="PlayToSpeakers">Speakers
-          <option value="PlayToIndex">Index
-        </select>
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <b>Method:</b>
-      </td>
-      <td>
-        <input type="button" value="Transform" onClick="setHTMLlocation()">
-        <input type="button" value="XML source" onClick="setXMLlocation()">
-      </td>
-    </tr>
-  </table>
-  </form>
-
-  </body>
-
-</html>
diff --git a/samples/CompiledJAXP/Compile.java b/samples/CompiledJAXP/Compile.java
deleted file mode 100644
index c42dbaa..0000000
--- a/samples/CompiledJAXP/Compile.java
+++ /dev/null
@@ -1,77 +0,0 @@
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.ObjectOutputStream;
-
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-
-import org.apache.xalan.xsltc.trax.TransformerFactoryImpl;
-
-public class Compile {
-
-    public static void main(String[] args){
-        Compile app = new Compile();
-        app.run(args[0]);
-    }
-
-    /**
-     * Compiles an XSL stylesheet into a translet, wraps the translet
-     * inside a Templates object and dumps it to a file.
-     */
-    public void run(String xsl) {
-        try {
-	    // Get an input stream for the XSL stylesheet
-	    StreamSource stylesheet = new StreamSource(xsl);
-
-	    // The TransformerFactory will compile the stylesheet and
-	    // put the translet classes inside the Templates object
-	    TransformerFactory factory = TransformerFactory.newInstance();
-	    Templates templates = factory.newTemplates(stylesheet);
-
-	    // Send the Templates object to a '.translet' file
-	    dumpTemplate(getBaseName(xsl)+".translet", templates);
-        }
-	catch (Exception e) {
-            System.err.println("Exception: " + e); 
-	    e.printStackTrace();
-        }
-        System.exit(0);
-    }
-
-    /**
-     * Returns the base-name of a file/url
-     */
-    private String getBaseName(String filename) {
-	int start = filename.lastIndexOf(File.separatorChar);
-	int stop  = filename.lastIndexOf('.');
-	if (stop <= start) stop = filename.length() - 1;
-	return filename.substring(start+1, stop);
-    }
-
-    /**
-     * Writes a Templates object to a file
-     */
-    private void dumpTemplate(String file, Templates templates) {
-	try {
-	    FileOutputStream ostream = new FileOutputStream(file);
-	    ObjectOutputStream p = new ObjectOutputStream(ostream);
-	    p.writeObject(templates);
-	    p.flush();
-	    ostream.close();
-	}
-	catch (Exception e) {
-	    System.err.println(e);
-	    e.printStackTrace();
-	    System.err.println("Could not write file "+file);
-	}
-    }
-
-    private void usage() {
-        System.err.println("Usage: compile <xsl_file>");
-        System.exit(1);
-    }
-
-}
diff --git a/samples/CompiledJAXP/README.cjaxp b/samples/CompiledJAXP/README.cjaxp
deleted file mode 100755
index af763e6..0000000
--- a/samples/CompiledJAXP/README.cjaxp
+++ /dev/null
@@ -1,26 +0,0 @@
-======================================================================
-The Sun XSLT Compiler (XSLTC) is a Java-based tool for compiling XSL
-stylesheets into extremely lightweight and portable Java byte code.
-
-This Compiled JAXP Demo shows you how can compile and use compiled 
-translets with JAXP.
-
-You use the two classes provided, Compile and Transform, just like the 
-org.apache.xalan.xsltc.cmdline Compile and Transform classes.
-
-Compile.java
-     Compiles an XSL stylesheet into a translet, wraps the translet
-     inside a Templates object and serializes it to a 
-     '.translet' file.
-     
-Transform.java
-     Reads a Templates object from the .translet file, the Templates 
-     object creates a translet and wraps it in a Transformer. The 
-     translet performs the transformation on behalf of the 
-     Transformer.transform() method.
-
-Usuage
-     java Compile <stylesheet.xsl>
-     java Transform <xmlfile.xml> <stylesheet>.translet
-----------------------------------------------------------------------
-END OF README
diff --git a/samples/CompiledJAXP/Transform.java b/samples/CompiledJAXP/Transform.java
deleted file mode 100644
index 102d745..0000000
--- a/samples/CompiledJAXP/Transform.java
+++ /dev/null
@@ -1,77 +0,0 @@
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.ObjectInputStream;
-
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-
-import org.apache.xalan.xsltc.trax.TransformerFactoryImpl;
-
-public class Transform {
-
-    public static void main(String[] args){
-        Transform app = new Transform();
-        app.run(args);
-    }
-
-    /**
-     * Reads a Templates object from a file, the Templates object creates
-     * a translet and wraps it in a Transformer. The translet performs the
-     * transformation on behalf of the Transformer.transform() method.
-     */
-    public void run(String[] args){
-        String xml = args[0];
-        String translet = args[1];
-
-        try {
-	    StreamSource document = new StreamSource(xml);
-	    StreamResult result = new StreamResult(System.out);
-	    Templates templates = readTemplates(translet);
-	    Transformer transformer = templates.newTransformer();
-            transformer.transform(document, result);
-        }
-	catch (Exception e) {
-            System.err.println("Exception: " + e); 
-	    e.printStackTrace();
-        }
-        System.exit(0);
-    }
-
-    /**
-     * Reads a Templates object from a file
-     */
-    private Templates readTemplates(String file) {
-	try {
-	    FileInputStream ostream = new FileInputStream(file);
-	    ObjectInputStream p = new ObjectInputStream(ostream);
-	    Templates templates = (Templates)p.readObject();
-	    ostream.close();
-	    return(templates);
-	}
-	catch (Exception e) {
-	    System.err.println(e);
-	    e.printStackTrace();
-	    System.err.println("Could not write file "+file);
-	    return null;
-	}
-    }
-
-    /**
-     * Returns the base-name of a file/url
-     */
-    private String getBaseName(String filename) {
-	int start = filename.lastIndexOf(File.separatorChar);
-	int stop  = filename.lastIndexOf('.');
-	if (stop <= start) stop = filename.length() - 1;
-	return filename.substring(start+1, stop);
-    }
-
-    public void usage() {
-        System.err.println("Usage: run <xml_file> <xsl_file>");
-        System.exit(1);
-    }
-
-}
diff --git a/samples/CompiledServlet/CompileServlet.java b/samples/CompiledServlet/CompileServlet.java
deleted file mode 100644
index 644b4d7..0000000
--- a/samples/CompiledServlet/CompileServlet.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- * @author Jacek Ambroziak
- *
- */
-
-package org.apache.xalan.xsltc.demo.servlet;
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
-import java.net.URL;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import org.apache.xalan.xsltc.compiler.*;
-import org.apache.xalan.xsltc.compiler.util.*;
-import org.apache.xalan.xsltc.util.getopt.*;
-
-public class CompileServlet extends HttpServlet {
-
-    /**
-     * Main servlet entry point. The servlet reads a stylesheet from the
-     * URI specified by the "sheet" parameter. The compiled Java class
-     * ends up in the CWD of the web server (a better solution would be
-     * to have an environment variable point to a translet directory).
-     */
-    public void doGet(HttpServletRequest request,
-		      HttpServletResponse response)
-	throws IOException, ServletException {
-
-	response.setContentType("text/html");
-	PrintWriter out = response.getWriter();
-		
-	String stylesheetName = request.getParameter("sheet");
-	
-	out.println("<html><head>");
-	out.println("<title>Servlet Stylesheet Compilation</title>");
-	out.println("</head><body>");
-
-	if (stylesheetName == null) {
-	    out.println("<h1>Compilation error</h1>");
-	    out.println("The parameter <b><tt>sheet</tt></b> "+
-			"must be specified");
-	}
-	else {
-	    XSLTC xsltc = new XSLTC();
-
-	    xsltc.init();
-	    xsltc.compile(new URL(stylesheetName));
-	    out.println("<h1>Compilation successful</h1>");
-	    out.println("The stylesheet was compiled into the translet "+
-			"class "+xsltc.getClassName() + " and is now "+
-			"available for transformations on this server.");
-	}
-	out.println("</body></html>");
-    }
-}
diff --git a/samples/CompiledServlet/README.servlet b/samples/CompiledServlet/README.servlet
deleted file mode 100644
index bd704cf..0000000
--- a/samples/CompiledServlet/README.servlet
+++ /dev/null
@@ -1,170 +0,0 @@
-=======================================================================
-CONTENTS OF THIS DOCUMENT:
-
-  o) HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
-  o) HOW TO INVOKE TRANSLETS FROM A SERVLET
-  o) BUILDING YOUR OWN DOM CACHE
-
------------------------------------------------------------------------
-HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
-
-With XSLTC, XSL transformations can be run from within a servlet. 
-This sample code demonstrates how that can be implemented.
-
-The CompiledEJB and CompiledBrazil sample code demonstrate other 
-aproaches to providing XSL transformations as a web service.
-
------------------------------------------------------------------------
-HOW TO INVOKE TRANSLETS FROM A SERVLET
-
-The CompiledServlet directory contains the example source code:
-
-    TransformServlet.java
-
-This file contains a minimal implementation of an XSL transformation 
-servlet. It utilizes a cache to store the DOM trees for frequently 
-accessed XML documents. These are not W3C DOM objects; They are 
-specialized DOMs, native to XSLTC and optimzed for use with compiled 
-translets. In addition to the initial input XML documents, the cache 
-may contain DOMs for other XML input documents the translet requires 
-at runtime, when the xsl:document() function is used in the stylesheet.
-
-Here's the essential code in the servlet for doing the transformation:
-
-    // Get a reference to the translet class
-    Class cls = Class.forName(transletName);
-
-    // Instanciate a translet object (inherits AbstractTranslet)
-    AbstractTranslet translet = (AbstractTranslet)cls.newInstance();
-
-    // The translet needs a reference to the cache in case
-    // in needs to load additional XML documents.
-    translet.setDOMCache(cache);
-
-    // Get the DOM from the DOM cache if current, otherwise
-    // build and cache the DOM first
-    DOMImpl dom = cache.retrieveDocument(documentURI, 0, translet);
-
-    // Create output handler (you can plug in your own)
-    DefaultSAXOutputHandler saxHandler;
-    saxHandler = new DefaultSAXOutputHandler(out);
-
-    // Start the transformation
-    translet.transform(dom, new TextOutput(saxHandler));
-
------------------------------------------------------------------------
-BUILDING YOUR OWN DOM CACHE
-
-The interface for the DOM cache consists of a single method,
-and its definition can be found in:
-
-    org/apache/xalan/xsltc/DOMCache.java
-
-The method contained in the interface is:
-
-    public DOMImpl retrieveDocument(String uri,
-                                    int mask,
-                                    Translet translet);
-
-The responsibilities of this method are:
-
- A) Build new a DOMImpl and DTDMonitor for XML documents
-    that are not already in the cache:
-
-        // Instanciate a DOMImpl object
-        Parser  parser = new Parser();
-        DOMImpl dom = new DOMImpl();
-        // Set URI for imports, includes, and document() functions
-        dom.setDocumentURI(uri);
-        parser = factory.newSAXParser();
-        reader = parser.getXMLReader();
-        reader.setContentHandler(dom.getBuilder());
-
-        // Use a DTDMonitor to track ID references in DTD
-        DTDMonitor dtdMonitor = new DTDMonitor();
-        dtdMonitor.handleDTD(reader);
-
-        // Parse the input document and build DOM
-        reader.parse(uri);
-
-    At this point the DOMImpl and DTDMonitor objects are
-    populated with the necessary data. The two objects
-    are ready to be put in the cache (using the URI as
-    the lookup key).
-
- B) For each time a new document is requested by a translet:
-
-        // Expand translet's index array to fit this DOM
-        translet.setIndexSize(dom.getSize());
-
-        // Build indices for this DOM's DTD's ID references
-        dtdMonitor.buildIdIndex(dom, mask, translet);
-
-        // Pass unparsed entity URIs to the translet
-        translet.setUnparsedEntityURIs(dtd.getUnparsedEntityURIs());
-
-Step A) must be done every time a document is read into the
-cache, and step B) every time a document is given to a
-translet.
-
-The XSLTC package contains an example implementation of a
-DOM cache, based on a very simple round-robin caching
-algorithm:
-
-    org/apache/xalan/xsltc/dom/DocumentCache.java
-
------------------------------------------------------------------------
-DOING TRANSFORMATIONS WITHOUT A DOM CACHE
-
-Alternatively, you can program a servlet to perform the same basic
-steps as the XSLTC command-line tool
-
-    org.apache.xalan.xsltc.cmdline.Transform
-
-as follows:
-
-
-    // Obtain a reference to the translet class
-    Class cls = Class.forName(transletName);
-    // Instanciate a translet object (inherits AbstractTranslet)
-    AbstractTranslet translet = (AbstractTranslet)cls.newInstance();
-
-    // Prepare the internal DOM tree
-    final DOMImpl dom = new DOMImpl();
-    dom.setDocumentURI(inputURI);
-
-    // Create a parser for the input document
-    // org.apache.xalan.xsltc.runtime.Constants sets NAMESPACE_FEATURE
-    final SAXParserFactory facory = SAXFactory.newInstance();
-    try {
-      factory.setFeature(NAMESPACE_FEATURE,true);
-    }
-    catch (Exception e) {
-      factory.setNamespaceAware(true);
-    }
-    parser = factory.newSAXParser();
-    reader = parser.getXMLReader();
-    reader.setContentHandler(dom.getBuilder());
-
-    // Create a DTDMonitor for handling ID references in the DTD
-    DTDMonitor dtdMonitor = new DTDMonitor();
-    dtdMonitor.handleDTD(reader);
-
-    // Create output handler (you can plug in your own)
-    DefaultSAXOutputHandler saxHandler;
-    saxHandler = new DefaultSAXOutputHandler(out);
-
-    // Parse the document and build the internal DOM
-    reader.parse(inputURI);
-
-    // Pass information on id/key indicies to the translet
-    translet.setIndexSize(dom.getSize());
-    dtdMonitor.buildIdIndex(dom, 0, translet);
-    translet.setUnparsedEntityURIs(dtdMonitor.getUnparsedEntityURIs());
-
-    // Start the transformation
-    translet.transform(dom, new TextOutput(saxHandler));
-
-
-------------------------------------------------------------
-END OF README
diff --git a/samples/CompiledServlet/TransformServlet.java b/samples/CompiledServlet/TransformServlet.java
deleted file mode 100644
index 8bb4fdf..0000000
--- a/samples/CompiledServlet/TransformServlet.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * @(#)$Id$
- *
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
- * @author Morten Jorgensen
- * @author Jacek Ambroziak
- *
- */
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import org.xml.sax.*;
-
-import org.apache.xalan.xsltc.*;
-import org.apache.xalan.xsltc.runtime.*;
-import org.apache.xalan.xsltc.dom.*;
-
-/**
- * This servlet demonstrates how XSL transformations can be made available as
- * a web service. See the CompileServlet for an example on how stylesheets
- * can be pre-compiled before this servlet is invoked.
- *
- * Note that the XSLTC transformation engine is invoked through its native
- * interface and not the javax.xml.transform (JAXP) interface. This because
- * XSLTC still does not offer precompiled transformations through JAXP.
- */
-public final class TransformServlet extends HttpServlet {
-
-    /*
-     * This is a document cache with 32 document slots. This servlet returns
-     * cache statistics if the 'stats' parameter is passed with the HTTP
-     * request in doGet().
-     */
-    private static DocumentCache cache = null;
-
-    /**
-     * Main servlet entry point
-     */
-    public void doGet(HttpServletRequest request,
-		      HttpServletResponse response)
-	throws IOException, ServletException {
-
-	// Initialise the output writer
-	response.setContentType("text/html");
-	PrintWriter out = response.getWriter();
-
-	// Get the two paramters "class" and "source".
-	String className   = request.getParameter("class");
-	String documentURI = request.getParameter("source");
-
-	try {
-	    // Initialize document cache with 32 DOM slots
-	    if (cache == null) cache = new DocumentCache(32);
-
-	    if (request.getParameter("stats") != null) {
-		cache.getStatistics(out);
-	    }
-	    else if ((className == null) || (documentURI == null)) {
-	        out.println("<h1>XSL transformation error</h1>");
-		out.println("The parameters <b><tt>class</tt></b> and " +
-			    "<b><tt>source</tt></b> must be specified");
-	    }
-	    else {
-		// Get a reference to the translet class (not object yet)
-	        Class tc = Class.forName(className);
-		// Instanciate a translet object (inherits AbstractTranslet)
-		AbstractTranslet translet = (AbstractTranslet)tc.newInstance();
-
-		// Set the document cache for the translet. This is needed in
-		// case the translet uses the document() function.
-		translet.setDOMCache(cache);
-
-		// Read input document from the DOM cache
-		DOMImpl dom = cache.retrieveDocument(documentURI, 0, translet);
-
-		// Initialize the output handler
-		DefaultSAXOutputHandler saxHandler = 
-		    new DefaultSAXOutputHandler(out);
-
-		// Start the transformation
-		final long start = System.currentTimeMillis();
-		translet.transform(dom, new TextOutput(saxHandler));
-		final long done = System.currentTimeMillis() - start;
-		out.println("<!-- transformed by XSLTC in "+done+"msecs -->");
-	    }
-	}
-	catch (IOException e) {
-	    out.println("<h1>Error</h1>");
-	    out.println("Could not locate source document: " + documentURI);
-	    out.println(e.toString());
-	}
-	catch (ClassNotFoundException e) {
-	  out.println("<h1>Error</h1>");
-	  out.println("Could not locate the translet class: " + className);
-	  out.println(e.toString());
-	}
-	catch (SAXException e) {
-	    out.println("<h1>Error</h1>");
-	    out.println("Error parsing document " + documentURI);
-	}
-	catch (Exception e) {
-	    out.println("<h1>Error</h1>");
-	    out.println(e.toString());
-	}
-    }
-}
diff --git a/samples/DOM2DOM/DOM2DOM.java b/samples/DOM2DOM/DOM2DOM.java
deleted file mode 100644
index 98c3269..0000000
--- a/samples/DOM2DOM/DOM2DOM.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.dom.DOMResult;
-
-// Imported java.io classes
-import java.io.IOException;
-import java.io.FileNotFoundException;
-
-// Imported SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-// Imported DOM classes
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-// Imported Serializer classes
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-
-import org.apache.xalan.templates.OutputProperties;
-
-// Imported JAVA API for XML Parsing classes
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException; 
-
-  /**
-   * Show how to transform a DOM tree into another DOM tree.  
-   * This uses the javax.xml.parsers to parse both an XSL file 
-   * and the XML file into a DOM, and create an output DOM.
-   */
-public class DOM2DOM
-{
-	public static void main(String[] args)
-    throws TransformerException, TransformerConfigurationException, FileNotFoundException,
-           ParserConfigurationException, SAXException, IOException
-  {    
-	  TransformerFactory tFactory = TransformerFactory.newInstance();
-
-    if(tFactory.getFeature(DOMSource.FEATURE) && tFactory.getFeature(DOMResult.FEATURE))
-    {
-      //Instantiate a DocumentBuilderFactory.
-      DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
-
-      // And setNamespaceAware, which is required when parsing xsl files
-      dFactory.setNamespaceAware(true);
-      
-      //Use the DocumentBuilderFactory to create a DocumentBuilder.
-      DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
-      
-      //Use the DocumentBuilder to parse the XSL stylesheet.
-      Document xslDoc = dBuilder.parse("birds.xsl");
-
-      // Use the DOM Document to define a DOMSource object.
-      DOMSource xslDomSource = new DOMSource(xslDoc);
-
-      // Set the systemId: note this is actually a URL, not a local filename
-      xslDomSource.setSystemId("birds.xsl");
-
-      // Process the stylesheet DOMSource and generate a Transformer.
-      Transformer transformer = tFactory.newTransformer(xslDomSource);
-
-      //Use the DocumentBuilder to parse the XML input.
-      Document xmlDoc = dBuilder.parse("birds.xml");
-      
-      // Use the DOM Document to define a DOMSource object.
-      DOMSource xmlDomSource = new DOMSource(xmlDoc);
-      
-      // Set the base URI for the DOMSource so any relative URIs it contains can
-      // be resolved.
-      xmlDomSource.setSystemId("birds.xml");
-      
-      // Create an empty DOMResult for the Result.
-      DOMResult domResult = new DOMResult();
-  
-  	  // Perform the transformation, placing the output in the DOMResult.
-      transformer.transform(xmlDomSource, domResult);
-	  
-	    //Instantiate an Xalan XML serializer and use it to serialize the output DOM to System.out
-	    // using a default output format.
-      Serializer serializer = SerializerFactory.getSerializer
-                                   (OutputProperties.getDefaultMethodProperties("xml"));
-      serializer.setOutputStream(System.out);
-      serializer.asDOMSerializer().serialize(domResult.getNode());
-	}
-    else
-    {
-      throw new org.xml.sax.SAXNotSupportedException("DOM node processing not supported!");
-    }
-  }
-}
diff --git a/samples/DOM2DOM/birds.xml b/samples/DOM2DOM/birds.xml
deleted file mode 100644
index 7027642..0000000
--- a/samples/DOM2DOM/birds.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Class>
-<Order Name="TINAMIFORMES">
-        <Family Name="TINAMIDAE">
-            <Species Scientific_Name="Tinamus major">  Great Tinamou.</Species>
-            <Species Scientific_Name="Nothocercus">Highland Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus soui">Little Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus cinnamomeus">Thicket Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus boucardi">Slaty-breasted Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus kerriae">Choco Tinamou.</Species>
-        </Family>
-    </Order>
-<Order Name="GAVIIFORMES">
-        <Family Name="GAVIIDAE">
-            <Species Scientific_Name="Gavia stellata">Red-throated Loon.</Species>
-            <Species Scientific_Name="Gavia arctica">Arctic Loon.</Species>
-            <Species Scientific_Name="Gavia pacifica">Pacific Loon.</Species>
-            <Species Scientific_Name="Gavia immer">Common Loon.</Species>
-            <Species Scientific_Name="Gavia adamsii">Yellow-billed Loon.</Species>
-        </Family>
-    </Order>
-
-
-<Order Name="PODICIPEDIFORMES">
-        <Family Name="PODICIPEDIDAE">
-            <Species Scientific_Name="Tachybaptus dominicus">Least Grebe.</Species>
-            <Species Scientific_Name="Podilymbus podiceps">Pied-billed Grebe.</Species>
-            <Species Scientific_Name="">Atitlan Grebe.</Species>
-            <Species Scientific_Name="">Horned Grebe.</Species>
-            <Species Scientific_Name="">Red-necked Grebe.</Species>
-            <Species Scientific_Name="">Eared Grebe.</Species>
-            <Species Scientific_Name="">Western Grebe.</Species>
-            <Species Scientific_Name="">Clark's Grebe.</Species>
-            <Species Scientific_Name=""/>
-        </Family>
-    </Order>
-
-
-<Order Name="PROCELLARIIFORMES">
-        <Family Name="DIOMEDEIDAE">
-            <Species Scientific_Name="Thalassarche chlororhynchos">Yellow-nosed Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche cauta">Shy Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche melanophris">Black-browed Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebetria palpebrata">Light-mantled Albatross. (A)</Species>
-            <Species Scientific_Name="Diomedea exulans">Wandering Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebastria immutabilis">Laysan Albatross.</Species>
-            <Species Scientific_Name="Phoebastria nigripes">Black-footed Albatross.</Species>
-            <Species Scientific_Name="Phoebastria albatrus">Short-tailed Albatross. (N)</Species>
-        </Family>
-        <Family Name="PROCELLARIIDAE">
-            <Species Scientific_Name="Fulmarus glacialis">Northern Fulmar.</Species>
-            <Species Scientific_Name="Pterodroma neglecta">Kermadec Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma arminjoniana">Herald Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma ultima">Murphy's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma inexpectata">Mottled Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma cahow">Bermuda Petrel.</Species>
-            <Species Scientific_Name="Pterodroma hasitata">Black-capped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma externa">Juan Fernandez Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma phaeopygia">Dark-rumped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma cervicalis">White-necked Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma hypoleuca">Bonin Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma nigripennis">Black-winged Petrel. (H, A)</Species>
-            <Species Scientific_Name="Pterodroma cookii">Cook's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma longirostris">Stejneger's Petrel. (A)</Species>
-            <Species Scientific_Name="Bulweria bulwerii">Bulwer's Petrel. (H)</Species>
-            <Species Scientific_Name="Bulweria fallax">Jouanin's Petrel. (H, A)</Species>
-            <Species Scientific_Name="Procellaria parkinsoni">Parkinson's Petrel. (N)</Species>
-            <Species Scientific_Name="Calonectris leucomelas">Streaked Shearwater. (A)</Species>
-            <Species Scientific_Name="Calonectris diomedea">Cory's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus creatopus">Pink-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus carneipes">Flesh-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus gravis">Greater Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus pacificus">Wedge-tailed Shearwater.</Species>
-            <Species Scientific_Name="Puffinus bulleri">Buller's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus griseus">Sooty Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus tenuirostris">Short-tailed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus nativitatis">Christmas Shearwater. (H)</Species>
-            <Species Scientific_Name="Puffinus puffinus">Manx Shearwater.</Species>
-            <Species Scientific_Name="Puffinus auricularis">Townsend's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus opisthomelas">Black-vented Shearwater.</Species>
-            <Species Scientific_Name="Puffinus lherminieri">Audubon's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus assimilis">Little Shearwater. (A)</Species>
-        </Family>
-        <Family Name="HYDROBATIDAE">
-            <Species Scientific_Name="Oceanites oceanicus">Wilson's Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Pelagodroma marina">White-faced Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Hydrobates pelagicus">European Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma furcata">Fork-tailed Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma leucorhoa">Leach's Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma homochroa">Ashy Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma castro">Band-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma tethys">Wedge-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma melania">Black Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma macrodactyla">Guadalupe Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma markhami">Markham's Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma tristrami">Tristram's Storm-Petrel. (H)</Species>
-            <Species Scientific_Name="Oceanodroma microsoma">Least Storm-Petrel.</Species>
-        </Family>
-    </Order>
-
-<Order Name="PELECANIFORMES">
-        <Family Name="PHAETHONTIDAE">
-            <Species Scientific_Name="Phaethon lepturus">White-tailed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon aethereus">Red-billed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon rubricauda">Red-tailed Tropicbird.</Species>
-        </Family>
-        <Family Name="SULIDAE">
-            <Species Scientific_Name="Sula dactylatra">Masked Booby.</Species>
-            <Species Scientific_Name="Sula nebouxii">Blue-footed Booby.</Species>
-            <Species Scientific_Name="Sula variegata">Peruvian Booby. (A)</Species>
-            <Species Scientific_Name="Sula leucogaster">Brown Booby.</Species>
-            <Species Scientific_Name="Sula sula">Red-footed Booby.</Species>
-            <Species Scientific_Name="Morus bassanus">Northern Gannet.</Species>
-        </Family>
-        <Family Name="PELECANIDAE">
-            <Species Scientific_Name="Pelecanus erythrorhynchos">American White Pelican.</Species>
-            <Species Scientific_Name="Pelecanus occidentalis">Brown Pelican.</Species>
-        </Family>
-        <Family Name="PHALACROCORACIDAE">
-            <Species Scientific_Name="Phalacrocorax penicillatus">Brandt's Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax brasilianus">Neotropic Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax auritus">Double-crested Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax carbo">Great Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax urile">Red-faced Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax pelagicus">Pelagic Cormorant.</Species>
-        </Family>
-        <Family Name="ANHINGIDAE">
-            <Species Scientific_Name="Anhinga anhinga">Anhinga.</Species>
-        </Family>
-        <Family Name="FREGATIDAE">
-            <Species Scientific_Name="Fregata magnificens">Magnificent Frigatebird.</Species>
-            <Species Scientific_Name="Fregata minor">Great Frigatebird.</Species>
-            <Species Scientific_Name="Fregata ariel">Lesser Frigatebird. (A)</Species>
-        </Family>
-    </Order>
-</Class>
diff --git a/samples/DOM2DOM/birds.xsl b/samples/DOM2DOM/birds.xsl
deleted file mode 100644
index 4d6f8e1..0000000
--- a/samples/DOM2DOM/birds.xsl
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:output method="xml" indent="yes"/>
-
-<xsl:template match="Class">
-<BirdInfo>
-	<xsl:apply-templates select="Order"/>
-</BirdInfo>
-</xsl:template>
-
-<xsl:template match="Order">
-Order is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Family"/><xsl:text>
-</xsl:text>
-</xsl:template>
-
-<xsl:template match="Family">
-	Family is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Species | SubFamily | text()"/>
-</xsl:template>
-
-<xsl:template match="SubFamily">
-		SubFamily is <xsl:value-of select="@Name"/>
-    <xsl:apply-templates select="Species | text()"/>
-</xsl:template>
-
-<xsl:template match="Species">
-	<xsl:choose>
-	  <xsl:when test="name(..)='SubFamily'">
-		<xsl:text>	</xsl:text><xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:when>
-	  <xsl:otherwise>
-		<xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/samples/DOM2DOM/readme.html b/samples/DOM2DOM/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/DOM2DOM/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/Pipe/Pipe.java b/samples/Pipe/Pipe.java
deleted file mode 100644
index 40e25da..0000000
--- a/samples/Pipe/Pipe.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.dom.DOMResult;
-
-// Imported SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.Parser;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.XMLReader;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.ext.LexicalHandler;
-
-// Imported DOM classes
-import org.w3c.dom.Node;
-
-// Imported Serializer classes
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-import org.apache.xalan.templates.OutputProperties;
-
-// Imported JAVA API for XML Parsing 1.0 classes
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException; 
-
-// Imported java.io classes
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.IOException;
-
-import org.apache.xalan.transformer.TransformerImpl;
-
-  /**
-   * This example shows how to chain a series of transformations by
-   * piping SAX events from one Transformer to another. Each Transformer
-   * operates as a SAX2 XMLFilter/XMLReader.
-   */
-public class Pipe
-{
-	public static void main(String[] args)
-	throws TransformerException, TransformerConfigurationException, 
-         SAXException, IOException	   
-	{
-    // Instantiate  a TransformerFactory.
-  	TransformerFactory tFactory = TransformerFactory.newInstance();
-    // Determine whether the TransformerFactory supports The use uf SAXSource 
-    // and SAXResult
-    if (tFactory.getFeature(SAXSource.FEATURE) && tFactory.getFeature(SAXResult.FEATURE))
-    { 
-      // Cast the TransformerFactory to SAXTransformerFactory.
-      SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);	  
-      // Create a TransformerHandler for each stylesheet.
-      TransformerHandler tHandler1 = saxTFactory.newTransformerHandler(new StreamSource("foo1.xsl"));
-      TransformerHandler tHandler2 = saxTFactory.newTransformerHandler(new StreamSource("foo2.xsl"));
-      TransformerHandler tHandler3 = saxTFactory.newTransformerHandler(new StreamSource("foo3.xsl"));
-    
-      // Create an XMLReader.
-	    XMLReader reader = XMLReaderFactory.createXMLReader();
-      reader.setContentHandler(tHandler1);
-      reader.setProperty("http://xml.org/sax/properties/lexical-handler", tHandler1);
-
-      tHandler1.setResult(new SAXResult(tHandler2));
-      tHandler2.setResult(new SAXResult(tHandler3));
-
-      // transformer3 outputs SAX events to the serializer.
-      Serializer serializer = SerializerFactory.getSerializer
-                                   (OutputProperties.getDefaultMethodProperties("xml"));        
-      serializer.setOutputStream(System.out);
-      tHandler3.setResult(new SAXResult(serializer.asContentHandler()));
-
-	    // Parse the XML input document. The input ContentHandler and output ContentHandler
-      // work in separate threads to optimize performance.   
-      reader.parse("foo.xml");
-    }
-  }
-}
\ No newline at end of file
diff --git a/samples/Pipe/foo.xml b/samples/Pipe/foo.xml
deleted file mode 100644
index da9f79b..0000000
--- a/samples/Pipe/foo.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<doc>Hello</doc>
\ No newline at end of file
diff --git a/samples/Pipe/foo1.xsl b/samples/Pipe/foo1.xsl
deleted file mode 100644
index 5da8d5e..0000000
--- a/samples/Pipe/foo1.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="doc">
-    <out><xsl:value-of select="."/></out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/Pipe/foo2.xsl b/samples/Pipe/foo2.xsl
deleted file mode 100644
index 67cd197..0000000
--- a/samples/Pipe/foo2.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="out">
-    <out><xsl:value-of select="."/> ...good to see you again!</out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/Pipe/foo3.xsl b/samples/Pipe/foo3.xsl
deleted file mode 100644
index 83cfaa6..0000000
--- a/samples/Pipe/foo3.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="out">
-    <out><xsl:value-of select="."/> ...and goodby!</out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/Pipe/readme.html b/samples/Pipe/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/Pipe/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/SAX2SAX/SAX2SAX.java b/samples/SAX2SAX/SAX2SAX.java
deleted file mode 100644
index 7d208ab..0000000
--- a/samples/SAX2SAX/SAX2SAX.java
+++ /dev/null
@@ -1,148 +0,0 @@
-
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-/**
- *  Replicate the SimpleTransform sample, explicitly using the SAX model to handle the
- *  stylesheet, the XML input, and the transformation.
- */
-
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.Templates;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;              
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-import org.apache.xalan.serialize.SerializerFactory;
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.templates.OutputProperties;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-
-public class SAX2SAX
-{
-  public static void main(String[] args)
-	throws TransformerException, TransformerConfigurationException, 
-         SAXException, IOException	   
-	{
-
-    // Instantiate a TransformerFactory.
-  	TransformerFactory tFactory = TransformerFactory.newInstance();
-    // Determine whether the TransformerFactory supports The use of SAXSource 
-    // and SAXResult
-    if (tFactory.getFeature(SAXSource.FEATURE) && tFactory.getFeature(SAXResult.FEATURE))
-    { 
-      // Cast the TransformerFactory.
-      SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);
-      // Create a ContentHandler to handle parsing of the stylesheet.
-      TemplatesHandler templatesHandler = saxTFactory.newTemplatesHandler();
-
-      // Create an XMLReader and set its ContentHandler.
-      XMLReader reader = XMLReaderFactory.createXMLReader();
-      reader.setContentHandler(templatesHandler);
-    
-      // Parse the stylesheet.                       
-      reader.parse("birds.xsl");
-
-      //Get the Templates object from the ContentHandler.
-      Templates templates = templatesHandler.getTemplates();
-      // Create a ContentHandler to handle parsing of the XML source.  
-      TransformerHandler handler 
-        = saxTFactory.newTransformerHandler(templates);
-      // Reset the XMLReader's ContentHandler.
-      reader.setContentHandler(handler);  
-
-      // Set the ContentHandler to also function as a LexicalHandler, which
-      // includes "lexical" events (e.g., comments and CDATA). 
-      reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
-      
-   	  FileOutputStream fos = new FileOutputStream("birds.out");
-      
-      Serializer serializer = SerializerFactory.getSerializer
-                              (OutputProperties.getDefaultMethodProperties("xml"));
-      serializer.setOutputStream(fos);
-   
-      
-      // Set the result handling to be a serialization to the file output stream.
-      Result result = new SAXResult(serializer.asContentHandler());
-      handler.setResult(result);
-      
-      // Parse the XML input document.
-      reader.parse("birds.xml");
-      
-    	System.out.println("************* The result is in birds.out *************");	
-    }	
-    else
-      System.out.println("The TransformerFactory does not support SAX input and SAX output");
-  }
-}
\ No newline at end of file
diff --git a/samples/SAX2SAX/birds.xml b/samples/SAX2SAX/birds.xml
deleted file mode 100644
index 7027642..0000000
--- a/samples/SAX2SAX/birds.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Class>
-<Order Name="TINAMIFORMES">
-        <Family Name="TINAMIDAE">
-            <Species Scientific_Name="Tinamus major">  Great Tinamou.</Species>
-            <Species Scientific_Name="Nothocercus">Highland Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus soui">Little Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus cinnamomeus">Thicket Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus boucardi">Slaty-breasted Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus kerriae">Choco Tinamou.</Species>
-        </Family>
-    </Order>
-<Order Name="GAVIIFORMES">
-        <Family Name="GAVIIDAE">
-            <Species Scientific_Name="Gavia stellata">Red-throated Loon.</Species>
-            <Species Scientific_Name="Gavia arctica">Arctic Loon.</Species>
-            <Species Scientific_Name="Gavia pacifica">Pacific Loon.</Species>
-            <Species Scientific_Name="Gavia immer">Common Loon.</Species>
-            <Species Scientific_Name="Gavia adamsii">Yellow-billed Loon.</Species>
-        </Family>
-    </Order>
-
-
-<Order Name="PODICIPEDIFORMES">
-        <Family Name="PODICIPEDIDAE">
-            <Species Scientific_Name="Tachybaptus dominicus">Least Grebe.</Species>
-            <Species Scientific_Name="Podilymbus podiceps">Pied-billed Grebe.</Species>
-            <Species Scientific_Name="">Atitlan Grebe.</Species>
-            <Species Scientific_Name="">Horned Grebe.</Species>
-            <Species Scientific_Name="">Red-necked Grebe.</Species>
-            <Species Scientific_Name="">Eared Grebe.</Species>
-            <Species Scientific_Name="">Western Grebe.</Species>
-            <Species Scientific_Name="">Clark's Grebe.</Species>
-            <Species Scientific_Name=""/>
-        </Family>
-    </Order>
-
-
-<Order Name="PROCELLARIIFORMES">
-        <Family Name="DIOMEDEIDAE">
-            <Species Scientific_Name="Thalassarche chlororhynchos">Yellow-nosed Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche cauta">Shy Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche melanophris">Black-browed Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebetria palpebrata">Light-mantled Albatross. (A)</Species>
-            <Species Scientific_Name="Diomedea exulans">Wandering Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebastria immutabilis">Laysan Albatross.</Species>
-            <Species Scientific_Name="Phoebastria nigripes">Black-footed Albatross.</Species>
-            <Species Scientific_Name="Phoebastria albatrus">Short-tailed Albatross. (N)</Species>
-        </Family>
-        <Family Name="PROCELLARIIDAE">
-            <Species Scientific_Name="Fulmarus glacialis">Northern Fulmar.</Species>
-            <Species Scientific_Name="Pterodroma neglecta">Kermadec Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma arminjoniana">Herald Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma ultima">Murphy's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma inexpectata">Mottled Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma cahow">Bermuda Petrel.</Species>
-            <Species Scientific_Name="Pterodroma hasitata">Black-capped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma externa">Juan Fernandez Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma phaeopygia">Dark-rumped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma cervicalis">White-necked Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma hypoleuca">Bonin Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma nigripennis">Black-winged Petrel. (H, A)</Species>
-            <Species Scientific_Name="Pterodroma cookii">Cook's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma longirostris">Stejneger's Petrel. (A)</Species>
-            <Species Scientific_Name="Bulweria bulwerii">Bulwer's Petrel. (H)</Species>
-            <Species Scientific_Name="Bulweria fallax">Jouanin's Petrel. (H, A)</Species>
-            <Species Scientific_Name="Procellaria parkinsoni">Parkinson's Petrel. (N)</Species>
-            <Species Scientific_Name="Calonectris leucomelas">Streaked Shearwater. (A)</Species>
-            <Species Scientific_Name="Calonectris diomedea">Cory's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus creatopus">Pink-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus carneipes">Flesh-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus gravis">Greater Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus pacificus">Wedge-tailed Shearwater.</Species>
-            <Species Scientific_Name="Puffinus bulleri">Buller's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus griseus">Sooty Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus tenuirostris">Short-tailed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus nativitatis">Christmas Shearwater. (H)</Species>
-            <Species Scientific_Name="Puffinus puffinus">Manx Shearwater.</Species>
-            <Species Scientific_Name="Puffinus auricularis">Townsend's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus opisthomelas">Black-vented Shearwater.</Species>
-            <Species Scientific_Name="Puffinus lherminieri">Audubon's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus assimilis">Little Shearwater. (A)</Species>
-        </Family>
-        <Family Name="HYDROBATIDAE">
-            <Species Scientific_Name="Oceanites oceanicus">Wilson's Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Pelagodroma marina">White-faced Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Hydrobates pelagicus">European Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma furcata">Fork-tailed Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma leucorhoa">Leach's Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma homochroa">Ashy Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma castro">Band-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma tethys">Wedge-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma melania">Black Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma macrodactyla">Guadalupe Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma markhami">Markham's Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma tristrami">Tristram's Storm-Petrel. (H)</Species>
-            <Species Scientific_Name="Oceanodroma microsoma">Least Storm-Petrel.</Species>
-        </Family>
-    </Order>
-
-<Order Name="PELECANIFORMES">
-        <Family Name="PHAETHONTIDAE">
-            <Species Scientific_Name="Phaethon lepturus">White-tailed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon aethereus">Red-billed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon rubricauda">Red-tailed Tropicbird.</Species>
-        </Family>
-        <Family Name="SULIDAE">
-            <Species Scientific_Name="Sula dactylatra">Masked Booby.</Species>
-            <Species Scientific_Name="Sula nebouxii">Blue-footed Booby.</Species>
-            <Species Scientific_Name="Sula variegata">Peruvian Booby. (A)</Species>
-            <Species Scientific_Name="Sula leucogaster">Brown Booby.</Species>
-            <Species Scientific_Name="Sula sula">Red-footed Booby.</Species>
-            <Species Scientific_Name="Morus bassanus">Northern Gannet.</Species>
-        </Family>
-        <Family Name="PELECANIDAE">
-            <Species Scientific_Name="Pelecanus erythrorhynchos">American White Pelican.</Species>
-            <Species Scientific_Name="Pelecanus occidentalis">Brown Pelican.</Species>
-        </Family>
-        <Family Name="PHALACROCORACIDAE">
-            <Species Scientific_Name="Phalacrocorax penicillatus">Brandt's Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax brasilianus">Neotropic Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax auritus">Double-crested Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax carbo">Great Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax urile">Red-faced Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax pelagicus">Pelagic Cormorant.</Species>
-        </Family>
-        <Family Name="ANHINGIDAE">
-            <Species Scientific_Name="Anhinga anhinga">Anhinga.</Species>
-        </Family>
-        <Family Name="FREGATIDAE">
-            <Species Scientific_Name="Fregata magnificens">Magnificent Frigatebird.</Species>
-            <Species Scientific_Name="Fregata minor">Great Frigatebird.</Species>
-            <Species Scientific_Name="Fregata ariel">Lesser Frigatebird. (A)</Species>
-        </Family>
-    </Order>
-</Class>
diff --git a/samples/SAX2SAX/birds.xsl b/samples/SAX2SAX/birds.xsl
deleted file mode 100644
index 4d6f8e1..0000000
--- a/samples/SAX2SAX/birds.xsl
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:output method="xml" indent="yes"/>
-
-<xsl:template match="Class">
-<BirdInfo>
-	<xsl:apply-templates select="Order"/>
-</BirdInfo>
-</xsl:template>
-
-<xsl:template match="Order">
-Order is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Family"/><xsl:text>
-</xsl:text>
-</xsl:template>
-
-<xsl:template match="Family">
-	Family is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Species | SubFamily | text()"/>
-</xsl:template>
-
-<xsl:template match="SubFamily">
-		SubFamily is <xsl:value-of select="@Name"/>
-    <xsl:apply-templates select="Species | text()"/>
-</xsl:template>
-
-<xsl:template match="Species">
-	<xsl:choose>
-	  <xsl:when test="name(..)='SubFamily'">
-		<xsl:text>	</xsl:text><xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:when>
-	  <xsl:otherwise>
-		<xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/samples/SAX2SAX/foo.xml b/samples/SAX2SAX/foo.xml
deleted file mode 100644
index da9f79b..0000000
--- a/samples/SAX2SAX/foo.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<doc>Hello</doc>
\ No newline at end of file
diff --git a/samples/SAX2SAX/foo.xsl b/samples/SAX2SAX/foo.xsl
deleted file mode 100644
index 5da8d5e..0000000
--- a/samples/SAX2SAX/foo.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="doc">
-    <out><xsl:value-of select="."/></out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/SimpleTransform/SimpleTransform.java b/samples/SimpleTransform/SimpleTransform.java
deleted file mode 100644
index 0b46a25..0000000
--- a/samples/SimpleTransform/SimpleTransform.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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 "XSLT4J" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-
-
-// Imported java classes
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-/**
- *  Use the TraX interface to perform a transformation in the simplest manner possible
- *  (3 statements).
- */
-public class SimpleTransform
-{
-	public static void main(String[] args)
-    throws TransformerException, TransformerConfigurationException, 
-           FileNotFoundException, IOException
-  {  
-  // Use the static TransformerFactory.newInstance() method to instantiate 
-  // a TransformerFactory. The javax.xml.transform.TransformerFactory 
-  // system property setting determines the actual class to instantiate --
-  // org.apache.xalan.transformer.TransformerImpl.
-	TransformerFactory tFactory = TransformerFactory.newInstance();
-	
-	// Use the TransformerFactory to instantiate a Transformer that will work with  
-	// the stylesheet you specify. This method call also processes the stylesheet
-  // into a compiled Templates object.
-	Transformer transformer = tFactory.newTransformer(new StreamSource("birds.xsl"));
-
-	// Use the Transformer to apply the associated Templates object to an XML document
-	// (foo.xml) and write the output to a file (foo.out).
-	transformer.transform(new StreamSource("birds.xml"), new StreamResult(new FileOutputStream("birds.out")));
-	
-	System.out.println("************* The result is in birds.out *************");
-  }
-}
\ No newline at end of file
diff --git a/samples/SimpleTransform/birds.xml b/samples/SimpleTransform/birds.xml
deleted file mode 100644
index 7027642..0000000
--- a/samples/SimpleTransform/birds.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Class>
-<Order Name="TINAMIFORMES">
-        <Family Name="TINAMIDAE">
-            <Species Scientific_Name="Tinamus major">  Great Tinamou.</Species>
-            <Species Scientific_Name="Nothocercus">Highland Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus soui">Little Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus cinnamomeus">Thicket Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus boucardi">Slaty-breasted Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus kerriae">Choco Tinamou.</Species>
-        </Family>
-    </Order>
-<Order Name="GAVIIFORMES">
-        <Family Name="GAVIIDAE">
-            <Species Scientific_Name="Gavia stellata">Red-throated Loon.</Species>
-            <Species Scientific_Name="Gavia arctica">Arctic Loon.</Species>
-            <Species Scientific_Name="Gavia pacifica">Pacific Loon.</Species>
-            <Species Scientific_Name="Gavia immer">Common Loon.</Species>
-            <Species Scientific_Name="Gavia adamsii">Yellow-billed Loon.</Species>
-        </Family>
-    </Order>
-
-
-<Order Name="PODICIPEDIFORMES">
-        <Family Name="PODICIPEDIDAE">
-            <Species Scientific_Name="Tachybaptus dominicus">Least Grebe.</Species>
-            <Species Scientific_Name="Podilymbus podiceps">Pied-billed Grebe.</Species>
-            <Species Scientific_Name="">Atitlan Grebe.</Species>
-            <Species Scientific_Name="">Horned Grebe.</Species>
-            <Species Scientific_Name="">Red-necked Grebe.</Species>
-            <Species Scientific_Name="">Eared Grebe.</Species>
-            <Species Scientific_Name="">Western Grebe.</Species>
-            <Species Scientific_Name="">Clark's Grebe.</Species>
-            <Species Scientific_Name=""/>
-        </Family>
-    </Order>
-
-
-<Order Name="PROCELLARIIFORMES">
-        <Family Name="DIOMEDEIDAE">
-            <Species Scientific_Name="Thalassarche chlororhynchos">Yellow-nosed Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche cauta">Shy Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche melanophris">Black-browed Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebetria palpebrata">Light-mantled Albatross. (A)</Species>
-            <Species Scientific_Name="Diomedea exulans">Wandering Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebastria immutabilis">Laysan Albatross.</Species>
-            <Species Scientific_Name="Phoebastria nigripes">Black-footed Albatross.</Species>
-            <Species Scientific_Name="Phoebastria albatrus">Short-tailed Albatross. (N)</Species>
-        </Family>
-        <Family Name="PROCELLARIIDAE">
-            <Species Scientific_Name="Fulmarus glacialis">Northern Fulmar.</Species>
-            <Species Scientific_Name="Pterodroma neglecta">Kermadec Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma arminjoniana">Herald Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma ultima">Murphy's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma inexpectata">Mottled Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma cahow">Bermuda Petrel.</Species>
-            <Species Scientific_Name="Pterodroma hasitata">Black-capped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma externa">Juan Fernandez Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma phaeopygia">Dark-rumped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma cervicalis">White-necked Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma hypoleuca">Bonin Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma nigripennis">Black-winged Petrel. (H, A)</Species>
-            <Species Scientific_Name="Pterodroma cookii">Cook's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma longirostris">Stejneger's Petrel. (A)</Species>
-            <Species Scientific_Name="Bulweria bulwerii">Bulwer's Petrel. (H)</Species>
-            <Species Scientific_Name="Bulweria fallax">Jouanin's Petrel. (H, A)</Species>
-            <Species Scientific_Name="Procellaria parkinsoni">Parkinson's Petrel. (N)</Species>
-            <Species Scientific_Name="Calonectris leucomelas">Streaked Shearwater. (A)</Species>
-            <Species Scientific_Name="Calonectris diomedea">Cory's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus creatopus">Pink-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus carneipes">Flesh-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus gravis">Greater Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus pacificus">Wedge-tailed Shearwater.</Species>
-            <Species Scientific_Name="Puffinus bulleri">Buller's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus griseus">Sooty Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus tenuirostris">Short-tailed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus nativitatis">Christmas Shearwater. (H)</Species>
-            <Species Scientific_Name="Puffinus puffinus">Manx Shearwater.</Species>
-            <Species Scientific_Name="Puffinus auricularis">Townsend's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus opisthomelas">Black-vented Shearwater.</Species>
-            <Species Scientific_Name="Puffinus lherminieri">Audubon's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus assimilis">Little Shearwater. (A)</Species>
-        </Family>
-        <Family Name="HYDROBATIDAE">
-            <Species Scientific_Name="Oceanites oceanicus">Wilson's Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Pelagodroma marina">White-faced Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Hydrobates pelagicus">European Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma furcata">Fork-tailed Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma leucorhoa">Leach's Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma homochroa">Ashy Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma castro">Band-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma tethys">Wedge-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma melania">Black Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma macrodactyla">Guadalupe Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma markhami">Markham's Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma tristrami">Tristram's Storm-Petrel. (H)</Species>
-            <Species Scientific_Name="Oceanodroma microsoma">Least Storm-Petrel.</Species>
-        </Family>
-    </Order>
-
-<Order Name="PELECANIFORMES">
-        <Family Name="PHAETHONTIDAE">
-            <Species Scientific_Name="Phaethon lepturus">White-tailed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon aethereus">Red-billed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon rubricauda">Red-tailed Tropicbird.</Species>
-        </Family>
-        <Family Name="SULIDAE">
-            <Species Scientific_Name="Sula dactylatra">Masked Booby.</Species>
-            <Species Scientific_Name="Sula nebouxii">Blue-footed Booby.</Species>
-            <Species Scientific_Name="Sula variegata">Peruvian Booby. (A)</Species>
-            <Species Scientific_Name="Sula leucogaster">Brown Booby.</Species>
-            <Species Scientific_Name="Sula sula">Red-footed Booby.</Species>
-            <Species Scientific_Name="Morus bassanus">Northern Gannet.</Species>
-        </Family>
-        <Family Name="PELECANIDAE">
-            <Species Scientific_Name="Pelecanus erythrorhynchos">American White Pelican.</Species>
-            <Species Scientific_Name="Pelecanus occidentalis">Brown Pelican.</Species>
-        </Family>
-        <Family Name="PHALACROCORACIDAE">
-            <Species Scientific_Name="Phalacrocorax penicillatus">Brandt's Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax brasilianus">Neotropic Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax auritus">Double-crested Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax carbo">Great Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax urile">Red-faced Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax pelagicus">Pelagic Cormorant.</Species>
-        </Family>
-        <Family Name="ANHINGIDAE">
-            <Species Scientific_Name="Anhinga anhinga">Anhinga.</Species>
-        </Family>
-        <Family Name="FREGATIDAE">
-            <Species Scientific_Name="Fregata magnificens">Magnificent Frigatebird.</Species>
-            <Species Scientific_Name="Fregata minor">Great Frigatebird.</Species>
-            <Species Scientific_Name="Fregata ariel">Lesser Frigatebird. (A)</Species>
-        </Family>
-    </Order>
-</Class>
diff --git a/samples/SimpleTransform/birds.xsl b/samples/SimpleTransform/birds.xsl
deleted file mode 100644
index 4d6f8e1..0000000
--- a/samples/SimpleTransform/birds.xsl
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:output method="xml" indent="yes"/>
-
-<xsl:template match="Class">
-<BirdInfo>
-	<xsl:apply-templates select="Order"/>
-</BirdInfo>
-</xsl:template>
-
-<xsl:template match="Order">
-Order is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Family"/><xsl:text>
-</xsl:text>
-</xsl:template>
-
-<xsl:template match="Family">
-	Family is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Species | SubFamily | text()"/>
-</xsl:template>
-
-<xsl:template match="SubFamily">
-		SubFamily is <xsl:value-of select="@Name"/>
-    <xsl:apply-templates select="Species | text()"/>
-</xsl:template>
-
-<xsl:template match="Species">
-	<xsl:choose>
-	  <xsl:when test="name(..)='SubFamily'">
-		<xsl:text>	</xsl:text><xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:when>
-	  <xsl:otherwise>
-		<xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/samples/SimpleTransform/foo.xml b/samples/SimpleTransform/foo.xml
deleted file mode 100644
index da9f79b..0000000
--- a/samples/SimpleTransform/foo.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<doc>Hello</doc>
\ No newline at end of file
diff --git a/samples/SimpleTransform/foo.xsl b/samples/SimpleTransform/foo.xsl
deleted file mode 100644
index 5da8d5e..0000000
--- a/samples/SimpleTransform/foo.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="doc">
-    <out><xsl:value-of select="."/></out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/SimpleTransform/readme.html b/samples/SimpleTransform/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/SimpleTransform/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/Trace/Trace.java b/samples/Trace/Trace.java
deleted file mode 100644
index d059e4b..0000000
--- a/samples/Trace/Trace.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.trace.TraceManager;
-import org.apache.xalan.trace.PrintTraceListener;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-
-public class Trace
-{	
-  public static void main (String[] args)
-	  throws java.io.IOException, 
-			 TransformerException, TransformerConfigurationException,
-			 java.util.TooManyListenersException, 
-			 org.xml.sax.SAXException			 
-  {
-    // Set up a PrintTraceListener object to print to a file.
-    java.io.FileWriter fw = new java.io.FileWriter("events.log");  
-    java.io.PrintWriter pw = new java.io.PrintWriter(fw, true);
-    PrintTraceListener ptl = new PrintTraceListener(pw);
-
-    // Print information as each node is 'executed' in the stylesheet.
-    ptl.m_traceElements = true;
-    // Print information after each result-tree generation event.
-    ptl.m_traceGeneration = true;
-    // Print information after each selection event.
-    ptl.m_traceSelection = true;
-    // Print information whenever a template is invoked.
-    ptl.m_traceTemplates = true;
-
-    // Set up the transformation    
-   	TransformerFactory tFactory = TransformerFactory.newInstance();
-    Transformer transformer = tFactory.newTransformer(new StreamSource("foo.xsl"));
-
-    // Cast the Transformer object to TransformerImpl.
-    if (transformer instanceof TransformerImpl) 
-	  {
-      TransformerImpl transformerImpl = (TransformerImpl)transformer;
-      // Register the TraceListener with a TraceManager associated 
-      // with the TransformerImpl.
-      TraceManager trMgr = transformerImpl.getTraceManager();
-      trMgr.addTraceListener(ptl);
-                     
-      // Perform the transformation --printing information to
-      // the events log during the process.
-      transformer.transform
-                         ( new StreamSource("foo.xml"), 
-                           new StreamResult(new java.io.FileWriter("foo.out")) );
-    }
-    // Close the PrintWriter and FileWriter.
-    pw.close();
-    fw.close();
-   	System.out.println("**The output is in foo.out; the log is in events.log ****");	
-    
-  }
-}
\ No newline at end of file
diff --git a/samples/Trace/foo.xml b/samples/Trace/foo.xml
deleted file mode 100644
index 5e72e15..0000000
--- a/samples/Trace/foo.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<upload>
-  <day>
-    <dow>tue</dow>
-    <order>
-      <line>
-         <product>Belt</product>
-         <price>5.54</price>
-      </line>
-    </order>
-  </day>
-  <day>
-    <dow>wed</dow>
-  </day>
-  <day>
-    <dow>thu</dow>
-    <order>
-      <line>
-         <product>Boots</product>
-         <price>9.23</price>
-      </line>
-    </order>
-  </day>
-  <day>
-    <dow>fri</dow>
-    <order>
-    </order>
-    <order>
-    </order>
-  </day>
-  <day>
-    <dow>sat</dow>
-    <order>
-      <line>
-         <product>Jacket</product>
-         <price>9.84</price>
-      </line>
-    </order>
-  </day>
-  <day>
-    <dow>mon</dow>
-    <order>
-    </order>
-    <order>
-      <line>
-         <product>Tie</product>
-         <price>5.37</price>
-      </line>
-    </order>
-  </day>
-  <day>
-    <dow>tue</dow>
-  </day>
-  <day>
-    <dow>wed</dow>
-    <order>
-    </order>
-  </day>
-  <day>
-    <dow>thu</dow>
-    <order>
-      <line>
-         <product>Overalls</product>
-         <price>3.16</price>
-      </line>
-    </order>
-  </day>
-</upload>
diff --git a/samples/Trace/foo.xsl b/samples/Trace/foo.xsl
deleted file mode 100644
index 2775ee7..0000000
--- a/samples/Trace/foo.xsl
+++ /dev/null
@@ -1,69 +0,0 @@
-<xsl:stylesheet
-  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
-  xmlns="http://www.w3.org/TR/REC-html40">
-
-  <!-- FileName: misc-evans -->
-  <!-- Document: http://www.w3.org/TR/xslt -->
-  <!-- DocVersion: 19991116 -->
-  <!-- Purpose: COPY of perf test;"A Practical Suggestion for XSLT Performance Improvement" by Clark Evans. -->
-
-   <xsl:variable name="day-list" 
-     select="//dow[not(.=following::dow)]" />
-
-   <xsl:variable name="product-list" 
-            select="//product[not(.=following::product)]" />
-     
-<xsl:template match="/">
-  <xsl:variable name="my-test"><a><b/></a></xsl:variable>
-  <html>
-    <xsl:copy-of select="$my-test"/>
-    <body>
-    <table>
-      <tr>
-        <td><xsl:text> </xsl:text></td>
-        <xsl:for-each select="$day-list">
-          <xsl:sort order="ascending" select="." />
-          <th><xsl:value-of select="."/></th>
-        </xsl:for-each>
-      </tr>
-      <xsl:for-each select="$product-list">
-        <xsl:sort    order="ascending" select="." />
-        <xsl:variable name="product" select="." />
-        <tr>
-          <td>
-            <xsl:value-of select="$product" />
-          </td>
-          <xsl:for-each select="$day-list">
-            <xsl:sort order="ascending" select="." />
-            <xsl:variable name="day" select="." />
-            <td>
-              <xsl:value-of 
-             select="sum(//price[../product=$product][../../../dow=$day])"
-/> .
-            </td>
-          </xsl:for-each>
-          <td>
-            <xsl:value-of 
-              select="sum(//price[../product=$product])" /> .
-           </td>
-        </tr>
-      </xsl:for-each>
-      <tr>
-        <td><xsl:text> </xsl:text></td>
-        <xsl:for-each select="$day-list">
-          <xsl:sort    order="ascending" select="." />
-          <xsl:variable name="day" select="." />
-          <td>
-            <xsl:value-of 
-              select="sum(//price[../../../dow=$day])" />
-          </td>
-        </xsl:for-each>
-        <td>
-          <xsl:value-of select="sum(//price)" />
-        </td>
-      </tr>
-    </table>
-    </body>
-  </html>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/samples/UseStylesheetPI/UseStylesheetPI.java b/samples/UseStylesheetPI/UseStylesheetPI.java
deleted file mode 100644
index aa0c714..0000000
--- a/samples/UseStylesheetPI/UseStylesheetPI.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-
-// Imported java.io classes
-import java.io.FileOutputStream;
-import java.io.IOException;	
-
-public class UseStylesheetPI
-{
-  public static void main(String[] args)
-	  throws TransformerException, TransformerConfigurationException
-	{
-	  String media= null , title = null, charset = null;
-	  try
-	  {	
-    	TransformerFactory tFactory = TransformerFactory.newInstance();
-      Source stylesheet = tFactory.getAssociatedStylesheet
-        (new StreamSource("fooX.xml"),media, title, charset);
-      
-      Transformer transformer = tFactory.newTransformer(stylesheet);
-        
-		   transformer.transform(new StreamSource("fooX.xml"), 
-                             new StreamResult(new java.io.FileOutputStream("foo.out")));
-       
-      System.out.println("************* The result is in foo.out *************");
-       
-	  }
-  	  catch (Exception e)
-	  {
-	    e.printStackTrace();
-	  }
-  }
-}
diff --git a/samples/UseStylesheetPI/foo.xsl b/samples/UseStylesheetPI/foo.xsl
deleted file mode 100644
index 5da8d5e..0000000
--- a/samples/UseStylesheetPI/foo.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="doc">
-    <out><xsl:value-of select="."/></out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/UseStylesheetPI/fooX.xml b/samples/UseStylesheetPI/fooX.xml
deleted file mode 100644
index cd4b743..0000000
--- a/samples/UseStylesheetPI/fooX.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="foo.xsl"?>
-<doc>Hello</doc>
\ No newline at end of file
diff --git a/samples/UseStylesheetParam/UseStylesheetParam.java b/samples/UseStylesheetParam/UseStylesheetParam.java
deleted file mode 100644
index a8b3c91..0000000
--- a/samples/UseStylesheetParam/UseStylesheetParam.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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 "XSLT4J" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-// Imported TraX classes
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-
-// Imported SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-// Imported java classes
-import java.io.IOException;
-
-  /**
-   * Use command-line input as a stylesheet parameter.
-   */
-
-public class UseStylesheetParam
-{
-  public static void main(String[] args)
-	throws TransformerException, TransformerConfigurationException, 
-         SAXException, IOException	   
-	{
-    if(args.length != 1)
-    {
-      System.err.println("Please pass one string to this program");
-      return;
-    }
-  	// Get the parameter value from the command line.
-    String paramValue = args[0];
-	
-   	TransformerFactory tFactory = TransformerFactory.newInstance();
-    Transformer transformer = tFactory.newTransformer(new StreamSource("foo.xsl"));
-
-	// Set the parameter. I can't get non-null namespaces to work!!
-    transformer.setParameter("param1",	/* parameter name */
-               							 paramValue /* parameter value */ );
-    
-    transformer.transform(new StreamSource("foo.xml"), new StreamResult(System.out));
-  }   
-}
\ No newline at end of file
diff --git a/samples/UseStylesheetParam/foo.xml b/samples/UseStylesheetParam/foo.xml
deleted file mode 100644
index 03c32b5..0000000
--- a/samples/UseStylesheetParam/foo.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<doc>Hello</doc>
diff --git a/samples/UseStylesheetParam/foo.xsl b/samples/UseStylesheetParam/foo.xsl
deleted file mode 100644
index 5ee19dc..0000000
--- a/samples/UseStylesheetParam/foo.xsl
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:param name="param1" select="'default value'"/>
-  <xsl:template match="doc">
-    <out><xsl:value-of select="$param1"/></out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/UseStylesheetParam/readme.html b/samples/UseStylesheetParam/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/UseStylesheetParam/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/UseXMLFilters/UseXMLFilters.java b/samples/UseXMLFilters/UseXMLFilters.java
deleted file mode 100644
index 2fe78fd..0000000
--- a/samples/UseXMLFilters/UseXMLFilters.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.Templates;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;              
-
-// Imported SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.Parser;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.XMLReader;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.ContentHandler;
-
-// Imported DOM classes
-import org.w3c.dom.Node;
-
-// Imported Serializer classes
-import org.apache.xalan.serialize.Serializer;
-import org.apache.xalan.serialize.SerializerFactory;
-import org.apache.xalan.templates.OutputProperties;
-
-// Imported JAVA API for XML Parsing classes
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException; 
-
-// Imported java.io classes
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.IOException;
-
-  /**
-   * This example shows how to chain a series of transformations by
-   * piping SAX events from one Transformer to another. Each Transformer
-   * operates as a SAX2 XMLFilter/XMLReader.
-   */
-public class UseXMLFilters
-{
-  public static void main(String[] args)
-	throws TransformerException, TransformerConfigurationException, 
-         SAXException, IOException	   
-	{
-    // Instantiate  a TransformerFactory.
-  	TransformerFactory tFactory = TransformerFactory.newInstance();
-    // Determine whether the TransformerFactory supports The use uf SAXSource 
-    // and SAXResult
-    if (tFactory.getFeature(SAXSource.FEATURE) && tFactory.getFeature(SAXResult.FEATURE))
-    { 
-      // Cast the TransformerFactory to SAXTransformerFactory.
-      SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);
-  	  // Create an XMLFilter for each stylesheet.
-      XMLFilter xmlFilter1 = saxTFactory.newXMLFilter(new StreamSource("foo1.xsl"));
-      XMLFilter xmlFilter2 = saxTFactory.newXMLFilter(new StreamSource("foo2.xsl"));
-      XMLFilter xmlFilter3 = saxTFactory.newXMLFilter(new StreamSource("foo3.xsl"));
-    
-      // Create an XMLReader.
-	    XMLReader reader = XMLReaderFactory.createXMLReader();
-    
-      // xmlFilter1 uses the XMLReader as its reader.
-      xmlFilter1.setParent(reader);
-    
-      // xmlFilter2 uses xmlFilter1 as its reader.
-      xmlFilter2.setParent(xmlFilter1);
-    
-      // xmlFilter3 uses xmlFilter2 as its reader.
-      xmlFilter3.setParent(xmlFilter2);
-    
-      // xmlFilter3 outputs SAX events to the serializer.
-      Serializer serializer = SerializerFactory.getSerializer
-                                   (OutputProperties.getDefaultMethodProperties("xml"));        
-      serializer.setOutputStream(System.out);
-      xmlFilter3.setContentHandler(serializer.asContentHandler());
-
-  	  // Perform the series of transformations as follows:
-	    //   - transformer3 gets its parent (transformer2) as the XMLReader/XMLFilter
-	    //     and calls transformer2.parse(new InputSource("foo.xml")).
-      //   - transformer2 gets its parent (transformer1) as the XMLReader/XMLFilter
-	    //     and calls transformer1.parse(new InputSource("foo.xml")). 
-      //   - transformer1 gets its parent (reader, a SAXParser) as the XMLReader 
-      //     and calls reader.parse(new InputSource("foo.xml")).
-	    //   - reader parses the XML document and sends the SAX parse events to transformer1, 
-	    //     which performs transformation 1 and sends the output to transformer2.
-  	  //   - transformer2 parses the transformation 1 output, performs transformation 2, and 
-	    //     sends the output to transformer3.
-	    //   - transformer3 parses the transformation 2 output, performs transformation 3,
-  	  //     and sends the output to the serializer.
-      xmlFilter3.parse(new InputSource("foo.xml"));
-    }
-  }
-}
\ No newline at end of file
diff --git a/samples/UseXMLFilters/foo.xml b/samples/UseXMLFilters/foo.xml
deleted file mode 100644
index da9f79b..0000000
--- a/samples/UseXMLFilters/foo.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<doc>Hello</doc>
\ No newline at end of file
diff --git a/samples/UseXMLFilters/foo1.xsl b/samples/UseXMLFilters/foo1.xsl
deleted file mode 100644
index 5da8d5e..0000000
--- a/samples/UseXMLFilters/foo1.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="doc">
-    <out><xsl:value-of select="."/></out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/UseXMLFilters/foo2.xsl b/samples/UseXMLFilters/foo2.xsl
deleted file mode 100644
index 67cd197..0000000
--- a/samples/UseXMLFilters/foo2.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="out">
-    <out><xsl:value-of select="."/> ...good to see you again!</out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/UseXMLFilters/foo3.xsl b/samples/UseXMLFilters/foo3.xsl
deleted file mode 100644
index 83cfaa6..0000000
--- a/samples/UseXMLFilters/foo3.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:template match="out">
-    <out><xsl:value-of select="."/> ...and goodby!</out>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/UseXMLFilters/readme.html b/samples/UseXMLFilters/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/UseXMLFilters/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/Validate/Validate.java b/samples/Validate/Validate.java
deleted file mode 100644
index 6532f76..0000000
--- a/samples/Validate/Validate.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-// Imported JAXP classes
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.ParserConfigurationException;
-
-// SAX import
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.XMLReader;
-
-// Imported java.io classes
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilenameFilter;
-import java.io.FileWriter;
-
-/* Use JAXP SAXParser to parse 1 .xml file or all the .xml files in a directory.
- * Takes 1 or 2 command-line arguments:
- *   Argument 1 (required) is a file name or directory name.
- *   Argument 2 (optional) is a log file name. If ommitted, messages are written to screen.
- */
-public class Validate
-{
-  static int numXMLFiles = 0;
-  static int numValidFiles = 0;
-  static int numInvalidFiles = 0;
-  static int numFilesMissingDoctype = 0;
-  static int numMalformedFiles = 0;
-  static boolean useLogFile = false;
-  static StringBuffer buff = new StringBuffer();
-
-  public static void main(String[] args)
-    throws FileNotFoundException, IOException, ParserConfigurationException, SAXException
-  {
-    if (args.length == 0 || args.length > 2)
-    {
-      System.out.println("\nEnter 'java validate -help' for information about running Validate");
-      return;
-    }
-    if (args[0].toLowerCase().equals("-help"))
-    { 
-      String sep = "\n====================================================\n";
-      String a = "Validate uses Xerces to parse the xml files in the directory you specify or the individual xml file you specify. The parser validates each document (checks that it conforms to its DOCTYPE).\n";
-      String b = "Each xml file should contain a DOCTYPE declaration.\n\n";
-      String c = "Validate takes 1 or 2 arguments:\n";
-      String d = " Argument 1 specifies a directory or an individual xml file.\n";
-      String e = " Argument 2 specifies a log file. If you include this argument, Validate appends messages to this file. If you do not, Validate writes messages to the screen.\n";
-      System.out.println(sep+a+b+c+d+e+sep);
-      return;
-    }    
-    try
-    {
-      Validate v = new Validate();
-      v.validate(args);
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-    }    
-  }
-  
-  void validate(String[] args)
-    throws FileNotFoundException, IOException, ParserConfigurationException, SAXException
-  {
-    File dir = new File(args[0]);
-   
-    // User may include a 2nd argument for the log file. 
-    useLogFile = (args.length == 2);
-   
-    if (dir.isFile()) // Just checking one file.
-    {
-      parse(null,args[0]);
-    }
-    else if (dir.isDirectory())  // Checking the contents of a directory.
-    {
-      // Only interested in .xml files.
-      XMLFileFilter filter = new XMLFileFilter();
-      String [] files = dir.list(filter);
-      for (int i = 0; i <files.length; i++)
-      { 
-        parse(dir.toString(),files[i]); // All the work is done here.
-        
-        if (!useLogFile) 
-        // Write messages to screen after parsing each file.
-        {
-          System.out.print(buff.toString());
-          buff = new StringBuffer();
-        }
-      }
-    }
-    else // Command-line argument is no good!
-    {
-      System.out.println(args[0] + " not found!");
-      return;
-    }
-    // Provide user with a summary.
-    buff.append("================SUMMARY=============================\n");
-    if (numXMLFiles > 1)
-      buff.append("Parsed " + numXMLFiles + " .xml files in " +  args[0] + ".\n");
-    if (numValidFiles > 1)
-      buff.append( numValidFiles + " files are valid.\n");
-    else if (numValidFiles == 1)
-      buff.append( numValidFiles + " file is valid.\n");
-    if (numInvalidFiles > 1)
-      buff.append(numInvalidFiles + " files are not valid.\n");
-    else if (numInvalidFiles == 1)
-      buff.append( numInvalidFiles + " file is not valid.\n");
-    if (numMalformedFiles > 1)
-      buff.append(numMalformedFiles + " files are not well-formed.\n");
-    else if (numMalformedFiles == 1)
-      buff.append( numMalformedFiles + " file is not well-formed.\n");
-    if (numFilesMissingDoctype > 1)
-      buff.append(numFilesMissingDoctype + " files do not contain a DOCTYPE declaration.\n");
-    else if (numFilesMissingDoctype == 1)
-      buff.append(numFilesMissingDoctype + " file does not contain a DOCTYPE declaration.\n");
-     
-    if (!useLogFile)
-      System.out.print(buff.toString());
-    else
-    {
-      // If log file exists, append.
-      FileWriter writer = new FileWriter(args[1], true);
-      writer.write(new java.util.Date().toString()+ "\n");
-      writer.write(buff.toString());
-      writer.close();     
-      System.out.println("Done with validation. See " + args[1] + ".");
-    }
-  }
-  
-  // Parse each XML file.
-  void parse(String dir, String filename)
-     throws FileNotFoundException, IOException, ParserConfigurationException, SAXException
-  {
-    try 
-    {
-      File f = new File(dir, filename);
-      StringBuffer errorBuff = new StringBuffer();
-      InputSource input = new InputSource(new FileInputStream(f));
-      // Set systemID so parser can find the dtd with a relative URL in the source document.
-      input.setSystemId(f.toString());
-      SAXParserFactory spfact = SAXParserFactory.newInstance();
-       
-      spfact.setValidating(true);
-      spfact.setNamespaceAware(true);
-            
-      SAXParser parser = spfact.newSAXParser();
-      XMLReader reader = parser.getXMLReader();
-      
-      //Instantiate inner-class error and lexical handler.
-      Handler handler = new Handler(filename, errorBuff);
-      reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
-      parser.parse(input, handler);
-
-      if (handler.containsDTD && !handler.errorOrWarning) // valid
-      {
-        buff.append("VALID " + filename +"\n");
-        numValidFiles++;
-      }
-      else if (handler.containsDTD) // not valid
-      {
-        buff.append ("NOT VALID " + filename + "\n");
-        buff.append(errorBuff.toString());
-        numInvalidFiles++;
-      }
-      else // no DOCTYPE to use for validation
-      {
-        buff.append("NO DOCTYPE DECLARATION " + filename + "\n");
-        numFilesMissingDoctype++;
-      }
-    }
-    catch (Exception e) // Serious problem!
-    {
-      buff.append("NOT WELL-FORMED " + filename + ". " + e.getMessage() + "\n");
-      numMalformedFiles++;
-    }
-    finally
-    {
-      numXMLFiles++;
-    }
-  }
-  // Inner classes
-  
-  // Only interested in parsing .xml files.
-  class XMLFileFilter implements FilenameFilter
-  {
-    public boolean accept(File dir, String fileName)
-    {
-      return fileName.toLowerCase().endsWith(".xml") && new File(dir.toString(),fileName).isFile();
-    }
-  }
-  
-  // Catch any errors or warnings, and verify presence of doctype statement.
-  class Handler extends DefaultHandler implements LexicalHandler
-  {
-    boolean errorOrWarning;
-    boolean containsDTD;
-    String sourceFile;
-    StringBuffer errorBuff;  
-  
-    Handler(String sourceFile, StringBuffer errorBuff)
-    {
-      super();
-      this.sourceFile = sourceFile;
-      this.errorBuff = errorBuff;
-      errorOrWarning = false;
-      containsDTD = false;
-    }
-    
-    public void error(SAXParseException exc)
-    {
-      errorBuff.append(sourceFile + " Error: " + exc.getMessage()+ "\n");    
-      errorOrWarning = true;
-    }
-    public void warning(SAXParseException exc)
-    {
-      errorBuff.append(sourceFile + " Warning:" + exc.getMessage()+ "\n");   
-      errorOrWarning = true;
-    }
-
-    // LexicalHandler methods; all no-op except startDTD().
-    
-    // Set containsDTD to true when startDTD event occurs.
-    public void startDTD (String name, String publicId, String systemId)
-	    throws SAXException
-    {
-      containsDTD = true;
-    }
- 
-    public void endDTD () throws SAXException
-    {}  
-  
-    public void startEntity (String name) throws SAXException
-    {}
-  
-    public void endEntity (String name) throws SAXException
-    {}
-  
-    public void startCDATA () throws SAXException
-    {}
-  
-    public void endCDATA () throws SAXException
-    {}
-  
-    public void comment (char ch[], int start, int length) throws SAXException
-    {}
-  }
-}
\ No newline at end of file
diff --git a/samples/Validate/ValidateXMLInput.java b/samples/Validate/ValidateXMLInput.java
deleted file mode 100644
index 06b3c2d..0000000
--- a/samples/Validate/ValidateXMLInput.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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 "XSLT4J" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Validate the XML input by using SAXParserFactory to turn on namespace awareness and 
- * validation, and a SAX XMLReader to parse the input and report problems to an error 
- * handler.
- * 
- * This sample uses birds.xml with an internal DOCTYPE declaration. As shipped, birds.xml
- * contains an element that violates the declared document type.
- */
-public class ValidateXMLInput
-{
-  
-  public static void main(String[] args) 
-    throws Exception
-  {
-    ValidateXMLInput v = new ValidateXMLInput();
-    v.validate();
-  }
-
-  void validate()
-    throws Exception
-   {
-     // Since we're going to use a SAX feature, the transformer must support 
-    // input in the form of a SAXSource.
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    if(tfactory.getFeature(SAXSource.FEATURE))
-    {
-      // Standard way of creating an XMLReader in JAXP 1.1.
-      SAXParserFactory pfactory= SAXParserFactory.newInstance();
-      pfactory.setNamespaceAware(true); // Very important!
-      // Turn on validation.
-      pfactory.setValidating(true);
-      // Get an XMLReader.
-      XMLReader reader = pfactory.newSAXParser().getXMLReader();
-  
-      // Instantiate an error handler (see the Handler inner class below) that will report any
-      // errors or warnings that occur as the XMLReader is parsing the XML input.
-      Handler handler = new Handler();
-      reader.setErrorHandler(handler);
-  
-      // Standard way of creating a transformer from a URL.
-      Transformer t = tfactory.newTransformer(
-        new StreamSource("birds.xsl"));
-      
-      // Specify a SAXSource that takes both an XMLReader and a URL.
-      SAXSource source = new SAXSource(reader,
-        new InputSource("birds.xml"));
-      
-      // Transform to a file.
-      try
-      {
-        t.transform(source, new StreamResult("birds.out"));
-      }
-      catch (TransformerException te)
-      {
-        // The TransformerException wraps someting other than a SAXParseException
-        // warning or error, either of which should be "caught" by the Handler.
-        System.out.println("Not a SAXParseException warning or error: " + te.getMessage());
-      }
-                                  
-      System.out.println("=====Done=====");
-    }
-    else
-      System.out.println("tfactory does not support SAX features!");
-  }
-
-  // Catch any errors or warnings from the XMLReader.
-  class Handler extends DefaultHandler
-  {
-    public void warning (SAXParseException spe)
-	     throws SAXException
-    {
-      System.out.println("SAXParseException warning: " + spe.getMessage());
-    }    
-
-    public void error (SAXParseException spe)
-    	throws SAXException
-    {
-      System.out.println("SAXParseException error: " + spe.getMessage());
-    }     
-  }
-}
diff --git a/samples/Validate/birds.xml b/samples/Validate/birds.xml
deleted file mode 100644
index 5b12938..0000000
--- a/samples/Validate/birds.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Class [
-  <!ELEMENT Class (Order+)>
-  <!ELEMENT Order (Family+)>
-  <!ATTLIST Order Name CDATA #REQUIRED>
-  <!ELEMENT Family (Species+)>
-  <!ATTLIST Family Name CDATA #REQUIRED>
-  <!ELEMENT Species (#PCDATA)>
-  <!ATTLIST Species Scientific_Name CDATA #REQUIRED>
-  ]>
-  
-<Class>
-<Order Name="TINAMIFORMES">
-        <Family Name="TINAMIDAE">
-            <Species Scientific_Name="Tinamus major">  Great Tinamou.</Species>
-            <Species Scientific_Name="Nothocercus">Highland Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus soui">Little Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus cinnamomeus">Thicket Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus boucardi">Slaty-breasted Tinamou.</Species>
-            <Species Scientific_Name="Crypturellus kerriae">Choco Tinamou.</Species>
-        </Family>
-    </Order>
-<Order Name="GAVIIFORMES">
-        <Family Name="GAVIIDAE">
-            <Speciesx Scientific_Name="Gavia stellata">Red-throated Loon.</Speciesx>
-            <Species Scientific_Name="Gavia arctica">Arctic Loon.</Species>
-            <Species Scientific_Name="Gavia pacifica">Pacific Loon.</Species>
-            <Species Scientific_Name="Gavia immer">Common Loon.</Species>
-            <Species Scientific_Name="Gavia adamsii">Yellow-billed Loon.</Species>
-        </Family>
-    </Order>
-
-
-<Order Name="PODICIPEDIFORMES">
-        <Family Name="PODICIPEDIDAE">
-            <Species Scientific_Name="Tachybaptus dominicus">Least Grebe.</Species>
-            <Species Scientific_Name="Podilymbus podiceps">Pied-billed Grebe.</Species>
-            <Species Scientific_Name="">Atitlan Grebe.</Species>
-            <Species Scientific_Name="">Horned Grebe.</Species>
-            <Species Scientific_Name="">Red-necked Grebe.</Species>
-            <Species Scientific_Name="">Eared Grebe.</Species>
-            <Species Scientific_Name="">Western Grebe.</Species>
-            <Species Scientific_Name="">Clark's Grebe.</Species>
-        </Family>
-    </Order>
-
-
-<Order Name="PROCELLARIIFORMES">
-        <Family Name="DIOMEDEIDAE">
-            <Species Scientific_Name="Thalassarche chlororhynchos">Yellow-nosed Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche cauta">Shy Albatross. (A)</Species>
-            <Species Scientific_Name="Thalassarche melanophris">Black-browed Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebetria palpebrata">Light-mantled Albatross. (A)</Species>
-            <Species Scientific_Name="Diomedea exulans">Wandering Albatross. (A)</Species>
-            <Species Scientific_Name="Phoebastria immutabilis">Laysan Albatross.</Species>
-            <Species Scientific_Name="Phoebastria nigripes">Black-footed Albatross.</Species>
-            <Species Scientific_Name="Phoebastria albatrus">Short-tailed Albatross. (N)</Species>
-        </Family>
-        <Family Name="PROCELLARIIDAE">
-            <Species Scientific_Name="Fulmarus glacialis">Northern Fulmar.</Species>
-            <Species Scientific_Name="Pterodroma neglecta">Kermadec Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma arminjoniana">Herald Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma ultima">Murphy's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma inexpectata">Mottled Petrel. (A)</Species>
-            <Species Scientific_Name="Pterodroma cahow">Bermuda Petrel.</Species>
-            <Species Scientific_Name="Pterodroma hasitata">Black-capped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma externa">Juan Fernandez Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma phaeopygia">Dark-rumped Petrel.</Species>
-            <Species Scientific_Name="Pterodroma cervicalis">White-necked Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma hypoleuca">Bonin Petrel. (H)</Species>
-            <Species Scientific_Name="Pterodroma nigripennis">Black-winged Petrel. (H, A)</Species>
-            <Species Scientific_Name="Pterodroma cookii">Cook's Petrel. (N)</Species>
-            <Species Scientific_Name="Pterodroma longirostris">Stejneger's Petrel. (A)</Species>
-            <Species Scientific_Name="Bulweria bulwerii">Bulwer's Petrel. (H)</Species>
-            <Species Scientific_Name="Bulweria fallax">Jouanin's Petrel. (H, A)</Species>
-            <Species Scientific_Name="Procellaria parkinsoni">Parkinson's Petrel. (N)</Species>
-            <Species Scientific_Name="Calonectris leucomelas">Streaked Shearwater. (A)</Species>
-            <Species Scientific_Name="Calonectris diomedea">Cory's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus creatopus">Pink-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus carneipes">Flesh-footed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus gravis">Greater Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus pacificus">Wedge-tailed Shearwater.</Species>
-            <Species Scientific_Name="Puffinus bulleri">Buller's Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus griseus">Sooty Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus tenuirostris">Short-tailed Shearwater. (N)</Species>
-            <Species Scientific_Name="Puffinus nativitatis">Christmas Shearwater. (H)</Species>
-            <Species Scientific_Name="Puffinus puffinus">Manx Shearwater.</Species>
-            <Species Scientific_Name="Puffinus auricularis">Townsend's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus opisthomelas">Black-vented Shearwater.</Species>
-            <Species Scientific_Name="Puffinus lherminieri">Audubon's Shearwater.</Species>
-            <Species Scientific_Name="Puffinus assimilis">Little Shearwater. (A)</Species>
-        </Family>
-        <Family Name="HYDROBATIDAE">
-            <Species Scientific_Name="Oceanites oceanicus">Wilson's Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Pelagodroma marina">White-faced Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Hydrobates pelagicus">European Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma furcata">Fork-tailed Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma leucorhoa">Leach's Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma homochroa">Ashy Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma castro">Band-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma tethys">Wedge-rumped Storm-Petrel. (N)</Species>
-            <Species Scientific_Name="Oceanodroma melania">Black Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma macrodactyla">Guadalupe Storm-Petrel.</Species>
-            <Species Scientific_Name="Oceanodroma markhami">Markham's Storm-Petrel. (A)</Species>
-            <Species Scientific_Name="Oceanodroma tristrami">Tristram's Storm-Petrel. (H)</Species>
-            <Species Scientific_Name="Oceanodroma microsoma">Least Storm-Petrel.</Species>
-        </Family>
-    </Order>
-
-<Order Name="PELECANIFORMES">
-        <Family Name="PHAETHONTIDAE">
-            <Species Scientific_Name="Phaethon lepturus">White-tailed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon aethereus">Red-billed Tropicbird.</Species>
-            <Species Scientific_Name="Phaethon rubricauda">Red-tailed Tropicbird.</Species>
-        </Family>
-        <Family Name="SULIDAE">
-            <Species Scientific_Name="Sula dactylatra">Masked Booby.</Species>
-            <Species Scientific_Name="Sula nebouxii">Blue-footed Booby.</Species>
-            <Species Scientific_Name="Sula variegata">Peruvian Booby. (A)</Species>
-            <Species Scientific_Name="Sula leucogaster">Brown Booby.</Species>
-            <Species Scientific_Name="Sula sula">Red-footed Booby.</Species>
-            <Species Scientific_Name="Morus bassanus">Northern Gannet.</Species>
-        </Family>
-        <Family Name="PELECANIDAE">
-            <Species Scientific_Name="Pelecanus erythrorhynchos">American White Pelican.</Species>
-            <Species Scientific_Name="Pelecanus occidentalis">Brown Pelican.</Species>
-        </Family>
-        <Family Name="PHALACROCORACIDAE">
-            <Species Scientific_Name="Phalacrocorax penicillatus">Brandt's Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax brasilianus">Neotropic Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax auritus">Double-crested Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax carbo">Great Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax urile">Red-faced Cormorant.</Species>
-            <Species Scientific_Name="Phalacrocorax pelagicus">Pelagic Cormorant.</Species>
-        </Family>
-        <Family Name="ANHINGIDAE">
-            <Species Scientific_Name="Anhinga anhinga">Anhinga.</Species>
-        </Family>
-        <Family Name="FREGATIDAE">
-            <Species Scientific_Name="Fregata magnificens">Magnificent Frigatebird.</Species>
-            <Species Scientific_Name="Fregata minor">Great Frigatebird.</Species>
-            <Species Scientific_Name="Fregata ariel">Lesser Frigatebird. (A)</Species>
-        </Family>
-    </Order>
-</Class>
diff --git a/samples/Validate/birds.xsl b/samples/Validate/birds.xsl
deleted file mode 100644
index 4d6f8e1..0000000
--- a/samples/Validate/birds.xsl
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:output method="xml" indent="yes"/>
-
-<xsl:template match="Class">
-<BirdInfo>
-	<xsl:apply-templates select="Order"/>
-</BirdInfo>
-</xsl:template>
-
-<xsl:template match="Order">
-Order is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Family"/><xsl:text>
-</xsl:text>
-</xsl:template>
-
-<xsl:template match="Family">
-	Family is:  <xsl:value-of select="@Name"/>
-	<xsl:apply-templates select="Species | SubFamily | text()"/>
-</xsl:template>
-
-<xsl:template match="SubFamily">
-		SubFamily is <xsl:value-of select="@Name"/>
-    <xsl:apply-templates select="Species | text()"/>
-</xsl:template>
-
-<xsl:template match="Species">
-	<xsl:choose>
-	  <xsl:when test="name(..)='SubFamily'">
-		<xsl:text>	</xsl:text><xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:when>
-	  <xsl:otherwise>
-		<xsl:value-of select="."/><xsl:text> </xsl:text><xsl:value-of select="@Scientific_Name"/>
-	  </xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/samples/Validate/readme.html b/samples/Validate/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/Validate/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/1-redir.xml b/samples/extensions/1-redir.xml
deleted file mode 100644
index e99f05a..0000000
--- a/samples/extensions/1-redir.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0"?> 
-<doc>
-  <foo file="1-redir.out">
-    Testing Redirect extension:
-    <bar>A foo subelement text node</bar>
-  </foo>
-  <main>
-    Everything else
-  </main>  
-</doc>
diff --git a/samples/extensions/1-redir.xsl b/samples/extensions/1-redir.xsl
deleted file mode 100644
index b3e69c2..0000000
--- a/samples/extensions/1-redir.xsl
+++ /dev/null
@@ -1,43 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    version="1.0"
-    xmlns:lxslt="http://xml.apache.org/xslt"
-    xmlns:redirect="org.apache.xalan.lib.Redirect"
-    extension-element-prefixes="redirect">
-
-  <lxslt:component prefix="redirect" elements="write open close" functions="">
-    <lxslt:script lang="javaclass" src="org.apache.xalan.lib.Redirect"/>
-  </lxslt:component>  
-    
-  <xsl:template match="/">
-    <standard-out>
-      Standard output:
-      <xsl:apply-templates/>
-    </standard-out>
-  </xsl:template>
-
-  <!-- not redirected -->
-  <xsl:template match="doc/main">
-    <main>
-    -- look in <xsl:value-of select="/doc/foo/@file"/> for the redirected output --
-      <xsl:apply-templates/>
-    </main>
-  </xsl:template>
-  
-  <!-- redirected -->
-  <xsl:template match="doc/foo">
-    <!-- get redirect file name from XML input -->
-    <redirect:write select="@file">
-      <foo-out>
-        <xsl:apply-templates/>
-      </foo-out>
-    </redirect:write>
-  </xsl:template>
-  
-<!-- redirected (from the xsl:apply-templates above. I.e., bar is in /doc/foo -->  
-  <xsl:template match="bar">
-    <foobar-out>
-      <xsl:apply-templates/>
-    </foobar-out>
-  </xsl:template>
-  
-</xsl:stylesheet>
diff --git a/samples/extensions/2-basicJscript.xml b/samples/extensions/2-basicJscript.xml
deleted file mode 100644
index 9c66ca1..0000000
--- a/samples/extensions/2-basicJscript.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<doc>
-  <deadline numdays="2"/>
-</doc>  
- 
\ No newline at end of file
diff --git a/samples/extensions/2-basicJscript.xsl b/samples/extensions/2-basicJscript.xsl
deleted file mode 100644
index a219cf7..0000000
--- a/samples/extensions/2-basicJscript.xsl
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<!--Namespaces are global if you set them in the stylesheet element-->
-<xsl:stylesheet 
-    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-    version="1.0"   
-    xmlns:lxslt="http://xml.apache.org/xslt"
-    xmlns:my-ext="ext2"
-    extension-element-prefixes="my-ext">
-    
-  <!--The component and its script are in the lxslt namespace and define the implementation-->
-  <lxslt:component prefix="my-ext" elements="timelapse" functions="getdate">
-    <lxslt:script lang="javascript">
-      var multiplier=1;
-      // Extension element implementations always take two arguments. The first
-      // argument is the XSL Processor context; the second argument is the element.
-      function timelapse(xslProcessorContext, elem)
-      {
-        multiplier=parseInt(elem.getAttribute("multiplier"));
-        // The element return value is placed in the result tree.
-        // If you do not want a return value, return null.
-        return null;
-      }
-      function getdate(numdays)
-      {
-        var d = new Date();
-        d.setDate(d.getDate() + parseInt(numdays*multiplier));
-        return d.toLocaleString();
-      }
-    </lxslt:script>
-  </lxslt:component>
-      
-  <xsl:template match="deadline">
-    <p><my-ext:timelapse multiplier="2"/>We have received your enquiry and will 
-      respond by <xsl:value-of select="my-ext:getdate(string(@numdays))"/></p>
-  </xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/3-java-namespace.xml b/samples/extensions/3-java-namespace.xml
deleted file mode 100644
index 6f2eb44..0000000
--- a/samples/extensions/3-java-namespace.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?> 
-<doc>
-   <date
-    year="2001" month="5" day="27"
-    format="EEEE, MMM dd, yyyy"/>
-</doc>
\ No newline at end of file
diff --git a/samples/extensions/3-java-namespace.xsl b/samples/extensions/3-java-namespace.xsl
deleted file mode 100644
index 45b6e59..0000000
--- a/samples/extensions/3-java-namespace.xsl
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                version="1.0">
-                
-  <xsl:template match="/">
-    <xsl:apply-templates select="/doc/date"/> 
-  </xsl:template>
- 
-  <xsl:template match="date">
-    <xsl:variable name="year" select="string(@year)"/>
-    <xsl:variable name="month" select="string(@month)"/> 
-    <xsl:variable name="day" select="string(@day)"/>          
-    <xsl:variable name="format" select="string(@format)"/>
-    <xsl:variable name="formatter"       
-         select="java:java.text.SimpleDateFormat.new($format)"/>
-    <xsl:variable name="date" 
-         select="java:IntDate.getDate($year,$month,$day)"/>
-    <p>Date: <xsl:value-of select="java:format($formatter, $date)"/></p>
-  </xsl:template>
- 
-</xsl:stylesheet>
diff --git a/samples/extensions/4-numlistJava.xsl b/samples/extensions/4-numlistJava.xsl
deleted file mode 100644
index bff9924..0000000
--- a/samples/extensions/4-numlistJava.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:lxslt="http://xml.apache.org/xslt"
-                xmlns:counter="MyCounter"
-                extension-element-prefixes="counter"
-                version="1.0">
-
-
-  <lxslt:component prefix="counter"
-                   elements="init incr" functions="read">
-    <lxslt:script lang="javaclass" src="MyCounter"/>
-  </lxslt:component>
-
-  <xsl:template match="/">
-    <HTML>
-      <H1>Java Example</H1>
-      <counter:init name="index" value="1"/>
-      <p>Here are the names in alphabetical order by last name:</p>
-      <xsl:for-each select="doc/name">
-        <xsl:sort select="@last"/>
-        <xsl:sort select="@first"/>
-        <p>
-        <xsl:text>[</xsl:text>
-        <xsl:value-of select="counter:read('index')"/>
-        <xsl:text>]. </xsl:text>
-        <xsl:value-of select="@last"/>
-        <xsl:text>, </xsl:text>
-        <xsl:value-of select="@first"/>
-        </p>
-        <counter:incr name="index"/>
-      </xsl:for-each>
-    </HTML>
-  </xsl:template>
- 
-</xsl:stylesheet>
diff --git a/samples/extensions/5-numlistJscript.xsl b/samples/extensions/5-numlistJscript.xsl
deleted file mode 100644
index 0f351cb..0000000
--- a/samples/extensions/5-numlistJscript.xsl
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:lxslt="http://xml.apache.org/xslt"
-                xmlns:counter="MyCounter"
-                extension-element-prefixes="counter"
-                version="1.0">
-
-  <lxslt:component prefix="counter"
-                   elements="init incr" functions="read">
-    <lxslt:script lang="javascript">
-      var counters = new Array();
-
-      function init (xslproc, elem) {
-        name = elem.getAttribute ("name");
-        value = parseInt(elem.getAttribute ("value"));
-        counters[name] = value;
-        return null;
-      }
-
-      function read (name) {
-        return "" + (counters[name]);
-      }
-
-      function incr (xslproc, elem)
-      {
-        name = elem.getAttribute ("name");
-        counters[name]++;
-        return null;
-      }
-    </lxslt:script>
-  </lxslt:component>
-
-  <xsl:template match="/">
-    <HTML>
-      <H1>JavaScript Example.</H1>
-      <counter:init name="index" value="1"/>
-      <p>Here are the names in alphabetical order by last name:</p>
-      <xsl:for-each select="doc/name">
-        <xsl:sort select="@last"/>
-        <xsl:sort select="@first"/>
-        <p>
-        <xsl:text>[</xsl:text>
-        <xsl:value-of select="counter:read('index')"/>
-        <xsl:text>]. </xsl:text>
-        <xsl:value-of select="@last"/>
-        <xsl:text>, </xsl:text>
-        <xsl:value-of select="@first"/>
-        </p>
-        <counter:incr name="index"/>
-      </xsl:for-each>
-    </HTML>
-  </xsl:template>
- 
-</xsl:stylesheet>
diff --git a/samples/extensions/6-sqllib-instantdb.xsl b/samples/extensions/6-sqllib-instantdb.xsl
deleted file mode 100644
index 10dec05..0000000
--- a/samples/extensions/6-sqllib-instantdb.xsl
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-  <xsl:output method="html" indent="yes"/>
-  <xsl:param name="query" select="'SELECT * FROM import1'"/>
- 
-  <xsl:template match="/">
-    <!-- 1. Make the connection -->
-    <xsl:variable name="products"
-                  select="sql:new('org.enhydra.instantdb.jdbc.idbDriver',
-                                'jdbc:idb:./instantdb/sample.prp')"/>
-    <!--2. Execute the query -->
-    <xsl:variable name="table" select='sql:query($products, $query)'/>
-    <HTML>
-      <HEAD>
-        <TITLE>Products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-          <TR>
-          <!-- Get column-label attribute from each column-header-->
-          <xsl:for-each select="$table/sql/metadata/column-header">
-            <TH><xsl:value-of select="@column-label"/></TH>
-          </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-          <xsl:text>&#10;</xsl:text>
-        </TABLE>
-      </BODY>
-    </HTML> 
-    <!-- 3. Close the connection -->
-    <xsl:value-of select="sql:close($products)"/>
-  </xsl:template>
-
-  <xsl:template match="row">
-        <TR>
-          <xsl:apply-templates select="col"/>
-        </TR>
-  </xsl:template>
-
-  <xsl:template match="col">
-    <TD>
-      <!-- Here is the column data -->
-      <xsl:value-of select="text()"/>
-    </TD>
-  </xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/IntDate.java b/samples/extensions/IntDate.java
deleted file mode 100644
index cc9c6c3..0000000
--- a/samples/extensions/IntDate.java
+++ /dev/null
@@ -1,17 +0,0 @@
-
-import java.util.Date;
-import java.util.Calendar;
-
-public class IntDate
-{
-  public static Date getDate(String year, String month, String day)
-    {
-      // Date(int, int, int) has been deprecated, so use Calendar to
-      // set the year, month, and day.
-      Calendar c = Calendar.getInstance();
-      // Convert each argument to int.
-      c.set(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day));
-      return c.getTime();
-    }
-}
-
diff --git a/samples/extensions/MyCounter.java b/samples/extensions/MyCounter.java
deleted file mode 100644
index 2b5f54a..0000000
--- a/samples/extensions/MyCounter.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-import java.util.Hashtable;
-
-public class MyCounter {
-  static Hashtable counters = new Hashtable ();
-
-
-  public void init(org.apache.xalan.extensions.XSLProcessorContext context, 
-                   org.w3c.dom.Element elem) 
-  {
-    String name = elem.getAttribute("name");
-    String value = elem.getAttribute("value");
-    int val;
-    try 
-    {
-      val = Integer.parseInt (value);
-    } 
-    catch (NumberFormatException e) 
-    {
-      e.printStackTrace ();
-      val = 0;
-    }
-    counters.put (name, new Integer (val));
-  }
-
-  public int read(String name) 
-  { 
-    Integer cval = (Integer)counters.get(name);
-    return (cval == null) ? 0 : cval.intValue();
-  }
-
-  public void incr(org.apache.xalan.extensions.XSLProcessorContext context,  
-                   org.w3c.dom.Element elem) {
-    String name = elem.getAttribute("name");
-    Integer cval = (Integer) counters.get(name);
-    int nval = (cval == null) ? 0 : (cval.intValue () + 1);
-    counters.put (name, new Integer (nval));
-  }
-}
\ No newline at end of file
diff --git a/samples/extensions/instantdb/idb.jar b/samples/extensions/instantdb/idb.jar
deleted file mode 100644
index b501833..0000000
--- a/samples/extensions/instantdb/idb.jar
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/sample.prp b/samples/extensions/instantdb/sample.prp
deleted file mode 100644
index 9d5b246..0000000
--- a/samples/extensions/instantdb/sample.prp
+++ /dev/null
@@ -1,316 +0,0 @@
-!---------------------------------------------------------------------
-!
-! BASIC PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! Path where index tables are held. Can be absolute or relative 
-! to the properties file. Defaults to tablePath.
-!
-!indexPath=./indexes
-!
-! Path where system tables are held. Can be absolute or relative to 
-! the properties file. Defaults to tablePath.
-!
-!systemPath=./system
-!
-! Path where database tables are held. Can be absolute or relative 
-! to the properties file. Defaults to "current" directory.
-!
-tablePath=./tables
-!
-! Path where results set tables are held. Can be absolute or relative 
-! to the properties file. Defaults to tablePath.
-!
-!tmpPath=./tmp
-!
-! Non-zero means paths are relative to the properties file. 
-! Default is absolute paths for files.
-!
-relativeToProperties=1
-!
-! Alternative partitions can be defined so that tables can be placed
-! in multiple locations. Each partition is numbered: 1, 2, 3,... Tables
-! can be created on partitions using the syntax 
-!
-!   CREATE TABLE <name> ON PARTITION <number>...
-!
-! The partition count has to be supplied.
-!
-!partitionCount=2
-!
-! The locations of each partition must be supplied. These are always
-! absolute path names.
-!
-!partition1=d:/petes
-!partition2=c:/temp
-
-
-!---------------------------------------------------------------------
-!
-! TUNING PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! The amount of each column to cache, expressed either as an absolute 
-! number of rows or as a percentage figure. Defaults to 256 or 10 respectively.
-!
-! This value applies only when tables are first created. It has no effect
-! when a table is being re-opened.
-!
-cacheAmount=512
-!
-! CACHE_ROWS Must be one of CACHE_ROWS or CACHE_PERCENT. Determines whether 
-! to cache columns in tables based on an absolute number of rows, or the 
-! percentage number of rows in the table. 
-!
-! This value applies only when tables are first created. It has no effect
-! when a table is being re-opened.
-!
-cacheCondition=CACHE_ROWS
-!
-! The amount of the system tables to be cached. Defaults to 100.
-!
-! This value applies only when tables are first created. It has no effect
-! when a table is being re-opened.
-!
-!systemCacheSize=10
-!
-! Similar to cacheCondition, but applies only to the system tables.
-!
-! This value applies only when tables are first created. It has no effect
-! when a table is being re-opened.
-!
-!systemCacheCondition=CACHE_ROWS
-!
-! The percentage cache hit improvement required in order to move the 
-! cache to a new location in a column. 
-!
-! (Currently not implemented).
-!
-cacheResetPercent=10
-!
-! Non-zero means that database changes do not get written to the 
-! database immediately. See tuning.html. 
-!
-fastUpdate=0
-!
-! Percentage of free space in an index that must be present before 
-! the index reorganises itself. High values means frequent index
-! reorganisation. Low values means slow index inserts.
-!
-indexLoad=5
-!
-! The number of cache misses to include in calculations of the next 
-! base for the cache. 
-!
-! (Currently not implemented).
-!
-missesInCacheStats=100
-!
-! Non-zero means that results sets get instantiated on disk. By default
-! InstantDB holds results sets emtirely in memory (apart from Binary
-! columns). For large results sets this can be a problem. This property
-! forces all results sets to be held on disk.
-!
-resultsOnDisk=0
-!
-! Similar to cacheCondition but applies only to disk based
-! results sets. Default is CACHE_ROWS.
-!
-resultsSetCache=CACHE_ROWS
-!
-! Similar to cacheAmount but applies only to disk based
-! results sets. Default is 100.
-!
-resultsSetCacheAmount=100
-!
-! Number of rows to read into the disk read ahead buffer. 
-! Recommended to be set somewhere around 128 to 256. 
-! Default is 20.
-!
-rowCacheSize=128
-!
-! The read ahead buffer is effective at speeding up full
-! table scans. However for indexed lookups or multiple
-! simultaneous scans it is better to read a single row at
-! a time. Each table holds a small number of single row
-! buffers to improve such operations. Default is 8.
-!
-!singleRowCount=4
-!
-! Sometimes the look ahead buffer can be held by a single
-! thread even though it is not retrieveing many values from it.
-! If too many lookups retrieve data from the single row
-! buffers then it is better to flush the look ahead buffer and
-! make it available for re-use. Default is 128.
-!
-!flushAfterCacheMisses=64
-!
-! Number of rows to read ahead for system tables. By default
-! system tables cache everything, so it is wasteful to have large
-! read ahead buffers since they will very rarely be used. This
-! allows the size of the system read ahead buffers to be reduced
-! if necessary. Defaults to rowCacheSize.
-!
-!systemRows=20
-!
-! The control column in all tables normally has a large cache
-! since this speeds up all operation on that table. This can be
-! varied to either improve performance or to reduce space.
-! default is 8192.
-!
-! This value applies only when tables are first created. It has no effect
-! when a table is being re-opened.
-!
-!controlColCacheSize=512
-!
-! By default, InstantDB only does a cursory search for deleted rows during 
-! UPDATE statements. Setting searchDeletes=1 causes more detailed searches 
-! for deleted rows. This slows down UPDATE executions, but reults in more 
-! compact tables.  Default is 0.
-!
-searchDeletes=0
-!
-! The interval, in milliseconds, between checks for statement execution
-! timeouts. Default is 5000.
-!
-!timerCheck=5000
-
-!---------------------------------------------------------------------
-!
-! LOGGING AND DEBUGGING PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! Non-zero means include SQL statements in the export file. 
-!
-exportSQL=0
-!
-! Non-zero means trace output also directed to console. 
-! Defaults to 0.
-!
-traceConsole=1
-!
-! Relative or absolute path where exporting and tracing goes.
-!
-traceFile=./trace.log
-!
-! Bitmap of various items that can be traced. See debug.html. 
-! Defaults to 0.
-!
-traceLevel=2
-
-!---------------------------------------------------------------------
-!
-! TRANSACTION AND RECOVERY PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! 0 means do not perform recovery on startup.
-! 1 means perform automatic recovery
-! 2 (default) means prompt the user using standard in 
-!
-recoveryPolicy=2
-!
-! Sets the level of transaction journalling. See trans.html.
-! Defaults to 1.
-!
-! 0 - No journalling takes place.
-! 1 - Normal journalling (default).
-! 2 - Full journalling.
-!
-transLevel=1
-!
-! When doing an import, defines the number of rows imported 
-! before the transaction is committed. Recommended value 8192.
-! defaults to 100.
-!
-transImports=100
-
-!---------------------------------------------------------------------
-!
-! DATE, TIME AND CURRENCY PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! Number of digits after decimal point in currency outputs. Defaults to 2.
-!
-currencyDecimal=2
-!
-! Currency symbol used in currency outputs. Defaults to $.
-!
-currencySymbol=$
-!
-! Default format for date columns. Defaults to "yyyy-mm-dd".
-!
-dateFormat=yyyy-mm-dd
-!
-! Default format for timestamp columns. Defaults to "yyyy-mm-dd hh:mm:ss.lll".
-!
-dateTimeFormat=yyyy-mm-dd hh:mm:ss.lll
-!
-! If set, then all two digit dates less than its value are interpreted 
-! as 21st century dates. 
-!
-!milleniumBoundary=50
-!
-! Set to 1 causes the date string "now" to store a full timestamp. 
-! Default is to store only the date for fields with now hour in the 
-! format string.
-!
-nowMeansTime=0
-
-!---------------------------------------------------------------------
-!
-! STRING HANDLING PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! If set to 1 then String hashes use the JDK Object.hashCode() function.
-! By default, uses InstantDB's String hashing.
-!
-altStringHashing=0
-!
-! Set to 1 to cause LIKE clauses to always perform case insensitive 
-! comparisons. 
-!
-likeIgnoreCase=0
-!
-! Same as SET LITERAL STRICT_ON. Prevents string literals being interpreted
-! as column names or numbers. Default is 0.
-!
-strictLiterals=0
-!
-! Set this value to 1 (one) if you would like PreparedStatement.setString()
-! to ignore "\" (backslash) characters when proceesing string constants.
-! When set, InstantDB will not attempt to interpret \ as the start of an
-! escape sequence. Default is 0.
-!
-!prepareIgnoresEscapes=1
-
-!---------------------------------------------------------------------
-!
-! MISCELLANEOUS PROPERTIES
-!
-!---------------------------------------------------------------------
-
-!
-! Allows selected InstantDB keywords to be un-reserved. 
-! e.g. ignoreKeywords=url,quote would allow the keywords 
-! url and quote to be used as table or column names. 
-!
-! This faciliy is provided for compatatbility reasons only.
-! It's use is not recommended AND IS NOT SUPPORTED.
-!
-!ignoreKeywords
-!
-! Non-zero means database is opened in read only mode.
-!
-readOnly=0
diff --git a/samples/extensions/instantdb/tables/$db$types.tbl b/samples/extensions/instantdb/tables/$db$types.tbl
deleted file mode 100644
index 8e78192..0000000
--- a/samples/extensions/instantdb/tables/$db$types.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/import1.tbl b/samples/extensions/instantdb/tables/import1.tbl
deleted file mode 100644
index cb20871..0000000
--- a/samples/extensions/instantdb/tables/import1.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/sample$db$Cols$pKey.tbl b/samples/extensions/instantdb/tables/sample$db$Cols$pKey.tbl
deleted file mode 100644
index c23982a..0000000
--- a/samples/extensions/instantdb/tables/sample$db$Cols$pKey.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/sample$db$Cols.tbl b/samples/extensions/instantdb/tables/sample$db$Cols.tbl
deleted file mode 100644
index 3092d01..0000000
--- a/samples/extensions/instantdb/tables/sample$db$Cols.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/sample$db$Indexes.tbl b/samples/extensions/instantdb/tables/sample$db$Indexes.tbl
deleted file mode 100644
index 3aa1517..0000000
--- a/samples/extensions/instantdb/tables/sample$db$Indexes.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/sample$db$Tables$pKey.tbl b/samples/extensions/instantdb/tables/sample$db$Tables$pKey.tbl
deleted file mode 100644
index 28f0c09..0000000
--- a/samples/extensions/instantdb/tables/sample$db$Tables$pKey.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/sample$db$Tables.tbl b/samples/extensions/instantdb/tables/sample$db$Tables.tbl
deleted file mode 100644
index 744194d..0000000
--- a/samples/extensions/instantdb/tables/sample$db$Tables.tbl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/instantdb/tables/sample.jrl b/samples/extensions/instantdb/tables/sample.jrl
deleted file mode 100644
index 78bef4f..0000000
--- a/samples/extensions/instantdb/tables/sample.jrl
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/numlist.xml b/samples/extensions/numlist.xml
deleted file mode 100644
index 76d41c2..0000000
--- a/samples/extensions/numlist.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<doc>
-  <name first="Sanjiva" last="Weerawarana"/>
-  <name first="Joseph" last="Kesselman"/>
-  <name first="Stephen" last="Auriemma"/>
-  <name first="Igor" last="Belakovskiy"/>    
-  <name first="David" last="Marston"/>
-  <name first="David" last="Bertoni"/>
-  <name first="Donald" last="Leslie"/>
-  <name first="Emily" last="Farmer"/>
-  <name first="Myriam" last="Midy"/>
-  <name first="Paul" last="Dick"/>
-  <name first="Scott" last="Boag"/>
-  <name first="Shane" last="Curcuru"/>
-  <name first="Marcia" last="Hoffman"/>
-  <name first="Noah" last="Mendelsohn"/>
-  <name first="Alex" last="Morrow"/>    
-</doc>
\ No newline at end of file
diff --git a/samples/extensions/readme.html b/samples/extensions/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/extensions/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/Xalan SQL Extension.doc b/samples/extensions/sql/Xalan SQL Extension.doc
deleted file mode 100644
index 6aa566d..0000000
--- a/samples/extensions/sql/Xalan SQL Extension.doc
+++ /dev/null
Binary files differ
diff --git a/samples/extensions/sql/Xalan SQL Extension.htm b/samples/extensions/sql/Xalan SQL Extension.htm
deleted file mode 100644
index 31abf3d..0000000
--- a/samples/extensions/sql/Xalan SQL Extension.htm
+++ /dev/null
@@ -1,161 +0,0 @@
-<HTML>
-<HEAD>
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
-<META NAME="Generator" CONTENT="Microsoft Word 97">
-<TITLE>Xalan SQL Extension</TITLE>
-</HEAD>
-<BODY LINK="#0000ff" VLINK="#800080">
-
-<B><FONT FACE="Arial" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc509062553">Xalan SQL Extension</A></P>
-<P ALIGN="CENTER"><A NAME="_Toc509062554">Connections and Queries</A></P>
-</FONT><FONT SIZE=2><P>Database Connections&#9;</B></FONT><A HREF="#_Toc509119435">*</A><DIR>
-
-<FONT SIZE=2><P>Providing Connection information in the XSL File&#9;</FONT><A HREF="#_Toc509119436">*</A></P>
-<I><FONT SIZE=2><P>XConnection(Sring DBDriver, String DBurl)&#9;</I></FONT><A HREF="#_Toc509119437">*</A></P>
-<I><FONT SIZE=2><P>XConnection(String DBDriver, String DBurl, String User, String Password)&#9;</I></FONT><A HREF="#_Toc509119438">*</A></P>
-<I><FONT SIZE=2><P>XConnection(String DBDriver, String DBurl, NodeList Properties)&#9;</I></FONT><A HREF="#_Toc509119439">*</A></P>
-<FONT SIZE=2><P>Providing Connection information in the XML File&#9;</FONT><A HREF="#_Toc509119440">*</A></P>
-<I><FONT SIZE=2><P>XConnection(NodeList ConnectionData)&#9;</I></FONT><A HREF="#_Toc509119441">*</A></P>
-<FONT SIZE=2><P>Using Existing Connections in a connection pool&#9;</FONT><A HREF="#_Toc509119442">*</A></P>
-<I><FONT SIZE=2><P>XConnection(String ConnectionName)&#9;</I></FONT><A HREF="#_Toc509119443">*</A></P></DIR>
-
-<B><FONT SIZE=2><P>Connection Pools&#9;</B></FONT><A HREF="#_Toc509119444">*</A></P><DIR>
-
-<FONT SIZE=2><P>Overview&#9;</FONT><A HREF="#_Toc509119445">*</A></P>
-<FONT SIZE=2><P>Creating a new wrapper&#9;</FONT><A HREF="#_Toc509119446">*</A></P>
-<FONT SIZE=2><P>The Default Connection Pool&#9;</FONT><A HREF="#_Toc509119447">*</A></P></DIR>
-
-<B><FONT SIZE=2><P>Queries&#9;</B></FONT><A HREF="#_Toc509119448">*</A></P><DIR>
-
-<FONT SIZE=2><P>Standard queries&#9;</FONT><A HREF="#_Toc509119449">*</A></P>
-<FONT SIZE=2><P>Parameter based queries&#9;</FONT><A HREF="#_Toc509119450">*</A></P>
-<I><FONT SIZE=2><P>Overview&#9;</I></FONT><A HREF="#_Toc509119451">*</A></P>
-<I><FONT SIZE=2><P>Handling Value and Type Information&#9;</I></FONT><A HREF="#_Toc509119452">*</A></P></DIR>
-
-<B><FONT SIZE=2><P>Examples&#9;</B></FONT><A HREF="#_Toc509119453">*</A></P><DIR>
-
-<FONT SIZE=2><P>Basic&#9;</FONT><A HREF="#_Toc509119454">*</A></P>
-<FONT SIZE=2><P>External Connections&#9;</FONT><A HREF="#_Toc509119455">*</A></P>
-<FONT SIZE=2><P>PQuery&#9;</FONT><A HREF="#_Toc509119456">*</A></P>
-<FONT SIZE=2></DIR>
-</P>
-</FONT><B><FONT FACE="Arial" SIZE=4><P><A NAME="_Toc509062555"><A NAME="_Toc509119435">Database Connection</A>s</A></P><DIR>
-
-</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The SQL Extension provides 2 basic mechanisms to connect to the database. The connection information can either be provided in the XSL/XML or pulled from a Connection Pool that was created outside the Xalan library.</P>
-<P ALIGN="JUSTIFY">The XConnection object is used to represent a connection to the database. The actual connection is established through the object constructor. Each of the different mechanisms differs with the signature of the extension.</P>
-<P ALIGN="JUSTIFY">When the connection information is provided in the XSL or XML sources, a default connection pool will be created on its behalf but due to restrictions in some drivers, the actual pooling of connections will disabled by default. See Connection Pools, The Default Connection Pool.</P>
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119436">Providing Connection information in the XSL File</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">When providing Connection Information from the XSL or XML input sources, the XConnection object will create a default connection pool that will exist for the lifetime of the Transformation object.</P>
-</FONT><FONT FACE="Arial"><P><A NAME="_Toc509119437">XConnection(Sring DBDriver, String DBurl)</A></P>
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Create a standard JDBC connection using the specified driver and URL. This is used primarily for local databases that do not return user identification.</P>
-</FONT><FONT FACE="Arial"><P><A NAME="_Toc509119438">XConnection(String DBDriver, String DBurl, String User, String Password)</A></P><DIR>
-
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Create a standard JDBC Connection, which also provides user identification.</P></DIR>
-
-</FONT><FONT FACE="Arial"><P><A NAME="_Toc509119439">XConnection(String DBDriver, String DBurl, NodeList Properties)</A></P><DIR>
-
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Create a standard JDBC connection that loads the database driver using the specified URL. The NodeList provides will then be converted into a properties object which will be passes in when getting the JDBC connection.</P></DIR>
-</DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119440">Providing Connection information in the XML File</A></P><DIR>
-
-</B></I><P><A NAME="_Toc509119441">XConnection(NodeList ConnectionData)</A></P><DIR>
-
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Create connection and pass in the complete connection information as a Nodelist. This allows the XML data to provide the connection information. The node list will be used to create a named value pair list where the Node Name will represent the name and the Node Value will be the value. Required Tags consist of &quot;dbdriver&quot; and &quot;dburl&quot;. Optional tags can include &quot;user&quot; and &quot;password&quot; to specify the user identification but can also include any other database connection property.</P></DIR>
-</DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119442">Using Existing Connections in a connection pool</A></P><DIR>
-
-</B></I><P><A NAME="_Toc509119443">XConnection(String ConnectionName)</A></P><DIR>
-
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The Xalan SQL Extensions allows the controlling program to create an external JDBC Connection Pool and reference the connection pools by name inside the Stylsheet. Besides providing a mechanism to share connection resources with Xalan, is also allows the Stylesheet to not be concerned with the Connection properties all together.</P></DIR>
-</DIR>
-</DIR>
-
-</FONT><B><FONT FACE="Arial" SIZE=4><P><A NAME="_Toc509119444">Connection Pools</A></P><DIR>
-
-</FONT><I><FONT FACE="Arial"><P><A NAME="_Toc509119445">Overview</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Connection pools allow the Xalan Transformer to share connections with the rest of the application. Any existing JDBC Connection pool should be compatible with the Xalan Transformer by creating a wrapper class around the specific connection pool and registering it with the XConnectionPoolManager.</P></DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119446">Creating a new wrapper</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The org.apache.xalan.lib.sql.connection is the interface that needs to be implemented be compatible with the Xalan Transformer.</P></DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119447">The Default Connection Pool</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">To provide a uniform internal programming model, the XConnection object will create an instance of the DefaultConnectionPool. By default the Default Connection Pool will</P></DIR>
-</DIR>
-
-</FONT><B><FONT FACE="Arial" SIZE=4><P><A NAME="_Toc509119448">Queries</A></P><DIR>
-
-</FONT><I><FONT FACE="Arial"><P><A NAME="_Toc509119449">Standard queries</A></P><DIR>
-<DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">query(XConnection conn, String SQL)</P>
-<P ALIGN="JUSTIFY">Standard queries take a connection as arguments, an XConnection and the SQL String. It is the responsibility of the Stylesheet designer to format the SQL String completely including any quotes that are necessary. For static queries this is fine because the sting can be assembled at design time.</P></DIR>
-</DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119450">Parameter based queries</A></P><DIR>
-
-</B></I><P><A NAME="_Toc509119451">Overview</A></P><DIR>
-
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Parameter based queries are used when data that dynamically changes the query needs to be supplied from the XML Data.</P>
-<P ALIGN="JUSTIFY">The Stylesheet will provide the skeleton template of the query with place holders where the data goes, then provides several mechanisms to apply that data from the XML Data.</P>
-<P ALIGN="JUSTIFY">Parameter based queries take advantage of the JDBC Prepared statement semantics.</P></DIR>
-
-</FONT><FONT FACE="Arial"><P><A NAME="_Toc509119452">Handling Value and Type Information</A></P><DIR>
-
-</FONT><FONT SIZE=2><P ALIGN="JUSTIFY">When using parameterized query the place markers in the query (a &quot;?&quot;) will be replaced with data that is provided using one of the addParameter.. methods. When adding data to a parameter based query, the type of each value must also be included so that real query can be produced. The type information can be passed in as a component of the Query or the Data which ever is more convenient to the Stylesheet designer. </P>
-<P ALIGN="JUSTIFY">If the type information is missing for a data point, the default type is set to String.</P>
-<P ALIGN="JUSTIFY">The list of possible value types include, string,  bigdecimal, boolean, bytes, date, double, float, long, short, time, timestamp.</P></DIR>
-
-</FONT><B><FONT FACE="Arial"><P>pquery(XConnection, query)</P><DIR>
-
-</B></FONT><FONT SIZE=2><P>When just the query statement is passed as a parameter, the Type information must be passed in as a component of the data. </P></DIR>
-
-</FONT><B><FONT FACE="Arial"><P>pquery(XConnection, query, typeinfo)</P><DIR>
-
-</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">This allows the query to be specified using the &quot;?&quot; place holders and defining the type for each of the placeholders as a comma separated value string. i.e. &quot;string,int,string,datetime&quot;</P></DIR>
-
-</FONT><B><FONT FACE="Arial"><P>addParameter(XConnection, value)</P><DIR>
-
-</B></FONT><FONT SIZE=2><P>Add a new value to be used with a pquery, each new value is appended to a list that will be merged into the query statement when the pquery statement is executed. All data points must be added prior to executing the pquery statement.</P></DIR>
-
-</FONT><B><FONT FACE="Arial"><P>addParameterWithType(XConnection, value,type)</P><DIR>
-
-</B></FONT><FONT SIZE=2><P>Add a new value specifying the type information also.</P></DIR>
-
-</FONT><B><FONT FACE="Arial"><P>addParameterFromElement(XConnection, NodeList)</P><DIR>
-
-</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">Add a block of data points from a node list queried from the XML Data Source.  Each tag name at the START_TAG and TAG1 level are irrelevant, the only significant information is the value and possibly the type attribute.</P>
-<P ALIGN="JUSTIFY">If the type attribute is present, it will set the current type. If the type information is missing, it will either be provide through one of the other mechanisms or default to a string.</P>
-<P ALIGN="JUSTIFY">&lt;START_TAG&gt;</P>
-<P ALIGN="JUSTIFY">  &lt;TAG1&gt; type=&quot;int&quot;&gt;value&lt;/TAG1&gt;</P>
-<P ALIGN="JUSTIFY">&lt;/START_TAG</P>
-<P ALIGN="JUSTIFY"></P>
-<P ALIGN="JUSTIFY">Typical implementation </P>
-<P ALIGN="JUSTIFY">&lt;xsl:param name=&quot;plist&quot; select=&quot;/START_TAG&quot; /&gt;</P>
-<P ALIGN="JUSTIFY">&lt;xsl:addParameterFromElement( $conn, $plist);</P></DIR>
-</DIR>
-</DIR>
-
-</FONT><B><FONT FACE="Arial" SIZE=4><P><A NAME="_Toc509119453">Examples</A></P><DIR>
-
-</B></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">All of the following examples use the Enhydra InstantDB which is included as part of the Xalan distribution to operate. Please read the Enhydra documentation on managing an InstantDB http://www.instantdb.co.uk/</P>
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119454">Basic</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The XML/XSL Files (dbinfo.xml and dbtest.xsl) provide an example of implementing a basic connection where the connection information is provided in the XSL file using a static query.</P>
-<P ALIGN="JUSTIFY">The XML/XSL Files (dbinfo.xml and dbtest-cinfo.xsl) provide an example of implementing a basic connection where the connection information is provided as a node list in the XML file using a static query.</P></DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119455">External Connections</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The java file ExternalConnection demonstrates how to build a JDBC connection pool that is independent of Xalan. The actual connection pool used is the Default Connection pool inside the Xalan SQL Extension, which already implements the ConnectionPool interface so no wrapper was required. To implement a third party connection pool, a wrapper function must be implemented.</P></DIR>
-
-</FONT><B><I><FONT FACE="Arial"><P><A NAME="_Toc509119456">PQuery</A></P><DIR>
-
-</B></I></FONT><FONT SIZE=2><P ALIGN="JUSTIFY">The XML/XSL file (dbInfo.xml and dbtest.xsl) provide an example of implementing a parameter based query.</P></DIR>
-</DIR>
-</FONT></BODY>
-</HTML>
diff --git a/samples/extensions/sql/basic-connection/DumpSQL.xsl b/samples/extensions/sql/basic-connection/DumpSQL.xsl
deleted file mode 100755
index 14d6caa..0000000
--- a/samples/extensions/sql/basic-connection/DumpSQL.xsl
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new($driver, $datasource)"/>
-    <xsl:variable name="table" select='sql:query($db, $query)'/>
-    <xsl:copy-of select="$table" />
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/basic-connection/dbinfo.xml b/samples/extensions/sql/basic-connection/dbinfo.xml
deleted file mode 100755
index 19e640f..0000000
--- a/samples/extensions/sql/basic-connection/dbinfo.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<dbtest>
- <description>This file contains information required to make a connection to the DBMS</description>
-
- <DBINFO>
-   <dbdriver>org.enhydra.instantdb.jdbc.idbDriver</dbdriver>
-   <dburl>jdbc:idb:../../instantdb/sample.prp</dburl>
-   <user />
-   <password/>
- </DBINFO>
- 
-
-</dbtest>
diff --git a/samples/extensions/sql/basic-connection/dbtest-cinfo.xsl b/samples/extensions/sql/basic-connection/dbtest-cinfo.xsl
deleted file mode 100755
index fcdcc7f..0000000
--- a/samples/extensions/sql/basic-connection/dbtest-cinfo.xsl
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="cinfo" select="//DBINFO"/>
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new()"/>
-
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $cinfo))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-          <xsl:variable name="table" select='sql:query($db, $query)'/>
-          
-          <!-- 
-          	Let's include Error Checking, the error is actually stored 
-            in the connection since $table will be either data or null
-          -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          
-          <TR>
-             <xsl:for-each select="$table/sql/metadaata/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/basic-connection/dbtest.xsl b/samples/extensions/sql/basic-connection/dbtest.xsl
deleted file mode 100755
index fe17ebb..0000000
--- a/samples/extensions/sql/basic-connection/dbtest.xsl
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-          <xsl:variable name="table" select='sql:query($db, $query)'/>
-          
-          <!-- 
-          	Let's include Error Checking, the error is actually stored 
-            in the connection since $table will be either data or null
-          -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          <TR>
-             <xsl:for-each select="$table/sql/metadata/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/basic-connection/readme.html b/samples/extensions/sql/basic-connection/readme.html
deleted file mode 100644
index 5f9d69e..0000000
--- a/samples/extensions/sql/basic-connection/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/ext-connection/ExternalConnection.java b/samples/extensions/sql/ext-connection/ExternalConnection.java
deleted file mode 100755
index 47eac80..0000000
--- a/samples/extensions/sql/ext-connection/ExternalConnection.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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 "XSLT4J" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-
-import org.apache.xalan.lib.sql.DefaultConnectionPool;
-import org.apache.xalan.lib.sql.ConnectionPoolManager;
-
-
-// Imported java classes
-import java.io.StringReader;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-/**
- *  Use the TraX interface to perform a transformation in the simplest manner possible
- *  (3 statements).
- */
-public class ExternalConnection
-{
-	public static void main(String[] args)
-    throws TransformerException, TransformerConfigurationException,
-           FileNotFoundException, IOException
-  {
-
-  // Create a connection to the database server
-  // Up the connection pool count for testing
-  DefaultConnectionPool cp = new DefaultConnectionPool();
-  cp.setDriver("org.enhydra.instantdb.jdbc.idbDriver");
-  cp.setURL("jdbc:idb:../../instantdb/sample.prp");
-  //cp.setUser("sa");
-  //cp.setPassword("");
-  cp.setMinConnections(10);
-  cp.setPoolEnabled(true);
-
-  // Now let's register our connection pool so we can use
-  // in a stylesheet
-  ConnectionPoolManager pm = new ConnectionPoolManager();
-  pm.registerPool("extpool", cp);
-
-
-  // Use the static TransformerFactory.newInstance() method to instantiate
-  // a TransformerFactory. The javax.xml.transform.TransformerFactory
-  // system property setting determines the actual class to instantiate --
-  // org.apache.xalan.transformer.TransformerImpl.
-	TransformerFactory tFactory = TransformerFactory.newInstance();
-
-	// Use the TransformerFactory to instantiate a Transformer that will work with
-	// the stylesheet you specify. This method call also processes the stylesheet
-  // into a compiled Templates object.
-	Transformer transformer = tFactory.newTransformer(
-        new StreamSource("dbtest.xsl"));
-
-	// For this transformation, all the required information is in the stylesheet, so generate 
-  // a minimal XML source document for the input.
-  // Note: the command-line processor (org.apache.xalan.xslt.Process) uses this strategy when 
-  // the user does not provide an -IN parameter.
-  StringReader reader =
-              new StringReader("<?xml version=\"1.0\"?> <doc/>");
-
-  // Use the Transformer to apply the associated Templates object to an XML document
-	// and write the output to a file.
-	transformer.transform(
-        new StreamSource(reader),
-        new StreamResult(new FileOutputStream("dbtest-out.html")));
-
-	System.out.println("************* The result is in dbtest-out.html *************");
-  
-  cp.setPoolEnabled(false);
-  }
-}
diff --git a/samples/extensions/sql/ext-connection/dbtest.xsl b/samples/extensions/sql/ext-connection/dbtest.xsl
deleted file mode 100755
index a33dd57..0000000
--- a/samples/extensions/sql/ext-connection/dbtest.xsl
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new()"/>
-
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, 'extpool'))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-          <xsl:variable name="table" select='sql:query($db, $query)'/>
-          
-          <!-- 
-          	Let's include Error Checking, the error is actually stored 
-            in the connection since $table will be either data or null
-          -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          <TR>
-             <xsl:for-each select="$table/sql/metadata/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/ext-connection/readme.html b/samples/extensions/sql/ext-connection/readme.html
deleted file mode 100644
index 5f9d69e..0000000
--- a/samples/extensions/sql/ext-connection/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/pquery/dbinfo.xml b/samples/extensions/sql/pquery/dbinfo.xml
deleted file mode 100755
index c4bf245..0000000
--- a/samples/extensions/sql/pquery/dbinfo.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<XMLSTORE>
-
- <QUERY>
-   <ProductID>1</ProductID>
- </QUERY>
-  
- <DBINFO>
-   <dbdriver>org.enhydra.instantdb.jdbc.idbDriver</dbdriver>
-   <dburl>jdbc:idb:../../instantdb/sample.prp</dburl>
-   <user/>
-   <password/>
- </DBINFO>
-
-</XMLSTORE>
diff --git a/samples/extensions/sql/pquery/dbtest.xsl b/samples/extensions/sql/pquery/dbtest.xsl
deleted file mode 100755
index 88534b2..0000000
--- a/samples/extensions/sql/pquery/dbtest.xsl
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<!-- Build a Parameter Type Query -->
-<xsl:param name="q1" select="'SELECT * FROM import1 where ProductID = ?'"/>
-
-<!-- Build a CSV list of parameter types -->
-<xsl:param name="q1type" select="int" />
-
-<!-- Pull out connection information from the Document Source -->
-<xsl:param name="cinfo" select="//DBINFO" />
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $cinfo))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-          <xsl:variable name="qparam" select="//QUERY"/>
-          <xsl:value-of select="sql:addParameterFromElement($db, $qparam)"/>
-
-          <xsl:variable name="table" select='sql:pquery($db, $q1, $q1type )'/>
-          
-          <!-- 
-          	Let's include Error Checking, the error is actually stored 
-            in the connection since $table will be either data or null
-          -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          
-          <TR>
-             <xsl:for-each select="$table/sql/metadata/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/samples/extensions/sql/pquery/readme.html b/samples/extensions/sql/pquery/readme.html
deleted file mode 100644
index 5f9d69e..0000000
--- a/samples/extensions/sql/pquery/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/readme.html b/samples/extensions/sql/readme.html
deleted file mode 100644
index 4f598d0..0000000
--- a/samples/extensions/sql/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/show-error/dbinfo.xml b/samples/extensions/sql/show-error/dbinfo.xml
deleted file mode 100755
index c4bf245..0000000
--- a/samples/extensions/sql/show-error/dbinfo.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<XMLSTORE>
-
- <QUERY>
-   <ProductID>1</ProductID>
- </QUERY>
-  
- <DBINFO>
-   <dbdriver>org.enhydra.instantdb.jdbc.idbDriver</dbdriver>
-   <dburl>jdbc:idb:../../instantdb/sample.prp</dburl>
-   <user/>
-   <password/>
- </DBINFO>
-
-</XMLSTORE>
diff --git a/samples/extensions/sql/show-error/invalidConn.xsl b/samples/extensions/sql/show-error/invalidConn.xsl
deleted file mode 100755
index dc8da29..0000000
--- a/samples/extensions/sql/show-error/invalidConn.xsl
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                version="1.0"                xmlns:sql="org.apache.xalan.lib.sql.XConnection"                extension-element-prefixes="sql"><xsl:output method="html" indent="yes"/><xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/><!-- ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR         We are specifying a database that does not exist,                which will cause a connection errorERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR--><xsl:param name="datasource" select="'jdbc:idb:../../instantdb/DoesNotExist.prp'"/><xsl:param name="query" select="'SELECT * FROM import2'"/><xsl:template match="/">        <xsl:variable name="db" select="sql:new()"/>        <!-- Connect to the database with minimal error detection -->		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >    	<xsl:message>Error Connecting to the Database</xsl:message>      <xsl:copy-of select="sql:getError($db)/ext-error" />    </xsl:if>        <HTML>      <HEAD>        <TITLE>List of products</TITLE>      </HEAD>      <BODY>        <TABLE border="1">          <xsl:variable name="table" select='sql:query($db, $query)'/>                    <!--           	Let's include Error Checking, the error is actually stored             in the connection since $table will be either data or null          -->                       <xsl:if test="not($table)" >          	<xsl:message>Error in Query</xsl:message>            <xsl:copy-of select="sql:getError($db)/ext-error" />          </xsl:if>                    <TR>             <xsl:for-each select="$table/row-set/column-header">               <TH><xsl:value-of select="@column-label"/></TH>             </xsl:for-each>          </TR>          <xsl:apply-templates select="$table/row-set/row"/>        </TABLE>      </BODY>    </HTML>    <xsl:value-of select="sql:close($db)"/></xsl:template><xsl:template match="row">  <TR><xsl:apply-templates select="col"/></TR></xsl:template><xsl:template match="col">  <TD><xsl:value-of select="text()"/></TD></xsl:template></xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/show-error/invalidPQuery.xsl b/samples/extensions/sql/show-error/invalidPQuery.xsl
deleted file mode 100755
index c1905b2..0000000
--- a/samples/extensions/sql/show-error/invalidPQuery.xsl
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-
-
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-
-
-<xsl:param name="query" select="'SELECT * FROM import1 where ProductID = ?'"/>
-
-<xsl:template match="/">
-    
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-        
-<!-- 
-ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR
-   We are specifying an extra value where are query only expects one
-ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR
--->
-
-          <xsl:value-of select="sql:clearParameters()"/>
-          <xsl:value-of select="sql:addParameterWithType($db, '1', 'short')"/>
-          <xsl:value-of select="sql:addParameterWithType($db, '1', 'short')"/>
-          <xsl:variable name="table" select='sql:pquery($db, $query)'/>
-          
-          <!-- 
-          	Let's include Error Checking, the error is actually stored 
-            in the connection since $table will be either data or null
-          -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          <TR>
-             <xsl:for-each select="$table/sql/metadata/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/show-error/invalidQuery.xsl b/samples/extensions/sql/show-error/invalidQuery.xsl
deleted file mode 100755
index 9181e40..0000000
--- a/samples/extensions/sql/show-error/invalidQuery.xsl
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-
-
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-
-<!-- 
-ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR
-              We will specify a table that does not exist
-              in our Database, causing the Query to Fail
-ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR
--->
-
-
-<xsl:param name="query" select="'SELECT * FROM TableNotDefined'"/>
-
-<xsl:template match="/">
-    
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-          <xsl:variable name="table" select='sql:query($db, $query)'/>
-          
-          <!-- 
-          	Let's include Error Checking, the error is actually stored 
-            in the connection since $table will be either data or null
-          -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          <TR>
-             <xsl:for-each select="$table/sql/metadata/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/sql/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/show-error/readme.html b/samples/extensions/sql/show-error/readme.html
deleted file mode 100644
index 5f9d69e..0000000
--- a/samples/extensions/sql/show-error/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/streamable/cachedNodes.xsl b/samples/extensions/sql/streamable/cachedNodes.xsl
deleted file mode 100644
index f83de30..0000000
--- a/samples/extensions/sql/streamable/cachedNodes.xsl
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-        	<xsl:value-of select="sql:disableStreamingMode($db)" />
-          <xsl:variable name="table" select='sql:query($db, $query)'/>
-      
-      <!-- 
-        	Let's include Error Checking, the error is actually stored 
-          in the connection since $table will be either data or null
-       -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-          <TR>
-             <xsl:for-each select="$table/row-set/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/streamable/dbinfo.xml b/samples/extensions/sql/streamable/dbinfo.xml
deleted file mode 100755
index 19e640f..0000000
--- a/samples/extensions/sql/streamable/dbinfo.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<dbtest>
- <description>This file contains information required to make a connection to the DBMS</description>
-
- <DBINFO>
-   <dbdriver>org.enhydra.instantdb.jdbc.idbDriver</dbdriver>
-   <dburl>jdbc:idb:../../instantdb/sample.prp</dburl>
-   <user />
-   <password/>
- </DBINFO>
- 
-
-</dbtest>
diff --git a/samples/extensions/sql/streamable/pivot.xsl b/samples/extensions/sql/streamable/pivot.xsl
deleted file mode 100644
index 7972098..0000000
--- a/samples/extensions/sql/streamable/pivot.xsl
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-      
-      <!-- Turn off Streaming -->
-      <xsl:value-of select="sql:disableStreamingMode()" />
-      
-      <xsl:variable name="table" select='sql:query($db, $query)'/>
-      
-      <!-- 
-        	Let's include Error Checking, the error is actually stored 
-          in the connection since $table will be either data or null
-       -->
-             
-          <xsl:if test="not($table)" >
-          	<xsl:message>Error in Query</xsl:message>
-            <xsl:copy-of select="sql:getError($db)/ext-error" />
-          </xsl:if>
-          
-      
-      
-        <TABLE border="1">
-          <TR>
-             <xsl:for-each select="$table/row-set/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/row-set/row"/>
-        </TABLE>
-        
-        <TABLE border="1">
-
-        <xsl:for-each select="$table/row-set/column-header">
-        <xsl:variable name="column" select="@column-label" />
-
-        	<TR>
-          	<TD><TH><xsl:value-of select="$column"/></TH></TD>
-            	<xsl:apply-templates
-               	select="$table/row-set/row/col[@column-label=$column]" />
-          </TR>
-          </xsl:for-each>
-
-        </TABLE>
-       
-        
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/extensions/sql/streamable/readme.html b/samples/extensions/sql/streamable/readme.html
deleted file mode 100644
index 5f9d69e..0000000
--- a/samples/extensions/sql/streamable/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/extensions/sql/streamable/streamNodes.xsl b/samples/extensions/sql/streamable/streamNodes.xsl
deleted file mode 100644
index a37a1af..0000000
--- a/samples/extensions/sql/streamable/streamNodes.xsl
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql">
-
-<xsl:output method="html" indent="yes"/>
-
-<xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/>
-<xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/>
-<xsl:param name="query" select="'SELECT * FROM import1'"/>
-
-<xsl:template match="/">
-    <xsl:variable name="db" select="sql:new()"/>
-    
-    <!-- Connect to the database with minimal error detection -->
-		<xsl:if test="not(sql:connect($db, $driver, $datasource))" >
-    	<xsl:message>Error Connecting to the Database</xsl:message>
-      <xsl:copy-of select="sql:getError($db)/ext-error" />
-    </xsl:if>
-    
-
-    <HTML>
-      <HEAD>
-        <TITLE>List of products</TITLE>
-      </HEAD>
-      <BODY>
-        <TABLE border="1">
-        	<xsl:value-of select="sql:enableStreamingMode($db)" />
-          <xsl:variable name="table" select='sql:query($db, $query)'/>
-          <TR>
-             <xsl:for-each select="$table/row-set/column-header">
-               <TH><xsl:value-of select="@column-label"/></TH>
-             </xsl:for-each>
-          </TR>
-          <xsl:apply-templates select="$table/row-set/row"/>
-        </TABLE>
-      </BODY>
-    </HTML>
-    <xsl:value-of select="sql:close($db)"/>
-</xsl:template>
-
-<xsl:template match="row">
-  <TR><xsl:apply-templates select="col"/></TR>
-</xsl:template>
-
-<xsl:template match="col">
-  <TD><xsl:value-of select="text()"/></TD>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/servlet/ApplyXSLT.java b/samples/servlet/ApplyXSLT.java
deleted file mode 100644
index c235a84..0000000
--- a/samples/servlet/ApplyXSLT.java
+++ /dev/null
@@ -1,963 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package servlet;
-
-import java.io.*;
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.net.URL;
-import java.net.MalformedURLException;
-import java.net.URLConnection;
-import javax.xml.transform.OutputKeys;
-
-import org.apache.xalan.templates.Constants;
-import org.apache.xalan.templates.StylesheetRoot;
-import org.apache.xalan.templates.OutputProperties;
-// SAX2 Imports
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.Locator;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.ext.DeclHandler;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
-
-import org.w3c.dom.*;
-import javax.xml.transform.*;
-import javax.xml.transform.stream.*;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XString;
-import org.apache.xalan.processor.*;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.XMLFilterImpl;
-
-/*****************************************************************************************************
- *
- * ApplyXSLT supplies the basic
- * functions for transforming XML data using XSL stylesheets.
- *
- * @author Spencer Shepard (sshepard@us.ibm.com)
- * @author R. Adam King (rak@us.ibm.com)
- * @author Tom Rowe (trowe@us.ibm.com)
- * @author Don Leslie (donald_leslie@lotus.com)
- *
- *****************************************************************************************************/
-
-public class ApplyXSLT extends HttpServlet
-{
-
-  /**
-   * Operational parameters for this class.
-   * <p>Request-time values override init-time values which override class defaults.</p>
-   * @see #init
-   * @serial
-   */
-  protected ApplyXSLTProperties ourDefaultParameters = null;
-  private boolean useDefaultTemplates = false;
-  private Templates defaultTemplates = null;
-
-  /**
-   * String representing the end of line characters for the System.
-   */
-  public final static String EOL = System.getProperty("line.separator");
-
-  /**
-   * String representing the file separator characters for the System.
-   */
-  public final static String FS = System.getProperty("file.separator");
-
-   /**
-   * String representing the current directory for properties files. See init().
-   */
-  public final static String ROOT = System.getProperty("server.root");
-  public static String CURRENTDIR;
-
-  /**
-   * Initialize operational parameters from the configuration.
-   * @param config Configuration
-   * @exception ServletException Never thrown
-   */
-  public void init(ServletConfig config)
-    throws ServletException
-  {
-    super.init(config);
-    // If the server.root property --see above-- is null, use current working directory
-    // as default location for media.properties.
-    if (ROOT != null)
-      CURRENTDIR= ROOT + FS + "servlets" + FS;
-    else
-      CURRENTDIR = System.getProperty("user.dir")+ FS;
-    
-	  setDefaultParameters(config);
-	
-    setMediaProps(config.getInitParameter("mediaURL"));
-    String defaultXSL = config.getInitParameter("xslURL");
-    try
-    {
-    if (defaultXSL !=null && defaultXSL.length() > 0)
-      compileXSL(defaultXSL);
-    }
-    catch (Exception e){}
-  }
-  
- /**
-  * If a default setting exists for xslURL, create a Templates object
-  * for rapid transformations.
-  */ 
-  protected void compileXSL(String defaultXSL)
-    throws TransformerConfigurationException
-  {
-    TransformerFactory tFactory = TransformerFactory.newInstance();
-    defaultTemplates = tFactory.newTemplates(new StreamSource(defaultXSL));
-    useDefaultTemplates = true;
-  }
-  
- /**
-   * Sets the default parameters for the servlet from the configuration.
-   * Also sets required system properties until we figure out why servlet 
-   * sometimess fails to read properties from properties files.
-   * @param config Configuration
-   */
-  protected void setDefaultParameters(ServletConfig config)
-  {
-    ourDefaultParameters = new DefaultApplyXSLTProperties(config);
-  }
-  
-  /**
-   *	Loads the media properties file specified by the given string.
-   * @param mediaURLstring Location of the media properties file.  Can be either a full URL or a path relative
-   * to the System's server.root /servlets directory.  If this parameter is null,
-   * server.root/servlets/media.properties will be used.
-   * @see ApplyXSL#CURRENTDIR
-   */
-  protected void setMediaProps(String mediaURLstring)
-  {
-    if (mediaURLstring != null)
-    {
-      URL url = null;
-      try
-      {
-        url = new URL(mediaURLstring);
-      }
-      catch (MalformedURLException mue1)
-      {
-        try
-        {
-          url = new URL("file", "", CURRENTDIR + mediaURLstring);
-        }
-        catch (MalformedURLException mue2)
-        {
-          writeLog("Unable to find the media properties file based on parameter 'mediaURL' = "
-                   + mediaURLstring, HttpServletResponse.SC_ACCEPTED, mue2);
-          url = null;
-        }
-      }
-      if (url != null)
-      {
-        try
-        {
-          ourMediaProps = new OrderedProps(url.openStream());
-        }
-        catch (IOException ioe1)
-        {
-          writeLog("Exception occurred while opening media properties file: " + mediaURLstring +
-                   ".  Media table may be invalid.", HttpServletResponse.SC_ACCEPTED, ioe1);
-        }
-      }
-    }
-    else
-    {
-      String defaultProp = CURRENTDIR + "media.properties";
-      try
-      {
-        ourMediaProps = new OrderedProps(new FileInputStream(defaultProp));
-      }
-      catch (IOException ioe2)
-      {
-        writeLog("Default media properties file " + defaultProp + " not found.",
-                 HttpServletResponse.SC_ACCEPTED, ioe2);
-      }
-    }
-  }
-
-  public String getMedia(HttpServletRequest request)
-  {
-    return ourMediaProps.getValue(request.getHeader(HEADER_NAME));
-  }
-  
-  // doPost removed for security reasons due to the possibility of sending
-  // unsecure XML and XSL XSLTInputSources through the request input stream
-
-  /**
-   * HTTP Get method passed on to process().
-   * @param request The request
-   * @param response The response
-   * @see #process
-   * @exception ServletException Never thrown
-   * @exception IOException Never thrown
-   */
-  public void doGet (HttpServletRequest request,
-                     HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    try
-    {	
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      process(tFactory, request, response);
-    }
-    catch (Exception e)
-    {
-    }
-  }
-  
-  /**
-   * Coordinates applying an XSL stylesheet to XML data using operational parameters.
-   * <p>If successfully applied, the result tree will be streamed to the response object
-   * and the content type set according to the XSL stylesheet's &lt;xsl:output> element(s).</p>
-   * <p>If there is a problem in parsing the XML/XSL or if there is a problem in applying
-   * the XSL to the XML, an exception will be streamed to the response object.  The detail
-   * of the information returned in the response object will depend on whether we're
-   * running in debug mode or not.</p>
-   * @param processor implementation of TRaX processor
-   * @param request  May contain information relevant to creating XML and XSL XSLTInputSource's
-   * @param response Where to write the transformation result
-   * @see #getDocument
-   * @see #getStylesheet
-   * @see #getContentType
-   * @see #displayException
-   * @see #setStylesheetParams
-   * @exception ServletException Never thrown
-   * @exception IOException Never thrown
-   */
-  
-  public void process(TransformerFactory tFactory, 
-		          			  HttpServletRequest request,
-                      HttpServletResponse response)
-    throws ServletException, IOException, SAXException
-  {
-    boolean debug = ourDefaultParameters.isDebug(request);
-
-    long time = 0;
-    if (debug)
-      time = System.currentTimeMillis();
-
-    // Listener to be used for all reporting
-    ApplyXSLTListener listener = new ApplyXSLTListener();
-	  listener.out.println("debug is " + debug);
-
-    Source xmlSource = null;
-	  Source xslSource = null;
-    try
-    {
-      if ((xmlSource = getDocument(request, listener)) == null)
-        throw new ApplyXSLTException("getDocument() returned null",
-                                     new NullPointerException(),
-                                     response.SC_NOT_FOUND);
-    }
-    catch (ApplyXSLTException axe)
-    {
-      axe.appendMessage(EOL + "getDocument() resulted in ApplyXSLTException" + EOL
-                        + listener.getMessage());
-      if (debug) writeLog(axe);
-      displayException(response, axe, debug);
-      xmlSource = null;
-    }
-    // creating XSL Stylesheet
-    if (xmlSource != null)
-	  {
-      try
-      {
-        if ((xslSource = getStylesheet(tFactory, request, xmlSource, listener)) == null)
-          throw new ApplyXSLTException("getStylesheet() returned null",
-                                      new NullPointerException(),
-                                      response.SC_NOT_FOUND);
- 
-        // Must "reset" xmlSource (a StreamSource) after looking for stylesheet PI
-		    xmlSource = getDocument(request, listener); 
-      }
-      catch (ApplyXSLTException axe)
-      {
-        axe.appendMessage(EOL + "getStylesheet() resulted in ApplyXSLTException" + EOL
-                          + listener.getMessage());
-        if (debug) writeLog(axe);
-        displayException(response, axe, debug);
-        xslSource = null;
-      }
-    // perform Transformation
-	  
-    if (useDefaultTemplates)
-    {
-      try
-      {
-        listener.out.println("Using default templates");
-        if (defaultTemplates == null)
-        {
-          listener.out.println("Must recompile default templates");
-          defaultTemplates = tFactory.newTemplates(xslSource);
-        }
-        Transformer transformer = defaultTemplates.newTransformer();
-            String contentType = null;
-			      contentType = getContentType(defaultTemplates);
-            if (contentType != null);
-              response.setContentType(contentType);
-
-			      if (transformer instanceof TransformerImpl)
-			      {
-			        TransformerImpl transformerImpl = (TransformerImpl)transformer;
-              transformerImpl.setQuietConflictWarnings(ourDefaultParameters.isNoCW(request));
-			      }
-			
-			      setStylesheetParams(transformer, request);			
-	          transformer.transform(xmlSource, new StreamResult(response.getOutputStream()));
-			
-			      if (debug)              
-              writeLog(listener.getMessage(), response.SC_OK);
-        
-      }
-      catch (Exception exc)
-      {
-        ApplyXSLTException axe = new ApplyXSLTException
-				          ("Exception occurred during Transformation:"
-                    + EOL + listener.getMessage() + EOL
-                    + exc.getMessage(), 
-					          exc,
-                    response.SC_INTERNAL_SERVER_ERROR);
-        if (debug) writeLog(axe);
-          displayException(response, axe, debug);      
-       }
-     }   
-      
-     else if ((xmlSource != null) && (xslSource != null))
-     {
-	     try
-	     {
-         listener.out.println("Performing transformation...");		
-         Templates templates = tFactory.newTemplates(xslSource);
-         Transformer transformer = templates.newTransformer();
- 
-         try
-         {
-           String contentType = null;
-			     contentType = getContentType(templates);
-           if (contentType != null);
-             response.setContentType(contentType);
-
-			     if (transformer instanceof TransformerImpl)
-			     {
-			       TransformerImpl transformerImpl = (TransformerImpl)transformer;
-             transformerImpl.setQuietConflictWarnings(ourDefaultParameters.isNoCW(request));
-			     }
-			
-			     setStylesheetParams(transformer, request);			
-	         transformer.transform(xmlSource, new StreamResult(response.getOutputStream()));
-			
-			     if (debug)              
-             writeLog(listener.getMessage(), response.SC_OK);
-          }
-          catch (Exception exc)
-          {
-            ApplyXSLTException axe = new ApplyXSLTException
-				                     ("Exception occurred during Transformation:"
-                                          + EOL + listener.getMessage() + EOL
-                                          + exc.getMessage(), 
-									              exc,
-                                response.SC_INTERNAL_SERVER_ERROR);
-            if (debug) writeLog(axe);
-            displayException(response, axe, debug);
-          }
-          finally
-          {
-            // transformer.reset();
-          } // end of try ... catch ... finally
-		    }
-        catch (/*org.xml.sax.SAX*/Exception saxExc)
-        {
-          ApplyXSLTException axe = new ApplyXSLTException
-			                     ("Exception occurred during ctor/Transformation:"
-                             + EOL + listener.getMessage() + EOL
-                             + saxExc.getMessage(), 
-			             					 saxExc,
-                             response.SC_INTERNAL_SERVER_ERROR);
-          if (debug) writeLog(axe);
-          displayException(response, axe, debug);
-        } // end of new try ... catch
-      } // end of if((stylesheetRoot != null) ...
-      if (debug)
-      {
-        time = System.currentTimeMillis() - time;
-        writeLog("  No Conflict Warnings = " + ourDefaultParameters.isNoCW(request) +
-                 "  Transformation time: " + time + " ms", response.SC_OK);
-      }
-    }
-  }  
-
-  /**
-   * Returns a Source object with the XML document to be transformed. Attempts will be make to create the 
-   * Source object from the following:
-   * <ol>
-   * <li>A relative URL specified in the HTTP request's path information. This capability is intended
-   * for use by <b>servlet engines that map</b> some or all XML data to be processed at the server.</li>
-   * <li>A URL specified in the HTTP request's <code>URL=</code> parameter.  This capability
-   * is intended for <b>clients wishing to selectively process</b> XML data at the server.  For
-   * security reasons, this URL will be forced to the local IP host.</li>
-   * <li>The HTTP request's XML input stream. This capability is intended for use by chained servlets.</li>
-   * </ol>
-   * @param request client HTTPRequest object
-   * @param listener To record detailed parsing messages for possible return to requestor
-   * @return Source with XML document to be transformed, or null if the Source could not be located
-   * @exception ApplyXSLTException Thrown if exception occurs while handling request
-   */
-  protected Source getDocument(HttpServletRequest request,
-                                     ApplyXSLTListener listener)
-    throws ApplyXSLTException
-  {
-    try
-    {
-      String xmlURL = null;
-      // document from PathInfo
-      if ((xmlURL = request.getPathInfo()) != null)
-      {
-        listener.out.println("Parsing XML Document from PathInfo: " + xmlURL);
-        return new StreamSource(new URL("http", ((DefaultApplyXSLTProperties)
-                                         ourDefaultParameters).getLocalHost(),
-                                         xmlURL.replace('\\', '/')).openStream());		
-      }
-      // document from Request parameter
-      if ((xmlURL = ourDefaultParameters.getXMLurl(request)) != null)
-      {
-        listener.out.println("Parsing XML Document from request parameter: " + xmlURL);
-        return new StreamSource(new URL(xmlURL).openStream());
-      }
-      // document from chain
-      String contentType = request.getContentType();
-      if ((contentType != null) && contentType.startsWith("text/xml"))
-      {
-        listener.out.println("Parsing XML Document from request chain");
-        return new StreamSource(request.getInputStream());
-      }
-    }
-    catch (IOException ioe)
-    {
-      throw new ApplyXSLTException(ioe, HttpServletResponse.SC_NOT_FOUND);
-    }
-    catch (Exception e)
-    {
-      throw new ApplyXSLTException(e, HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-    }
-    return null;
-  }
-
-  /**
-   * Returns a Source object containing the stylesheet.  Attempts will be make to obtain the stylesheet 
-   * from the following sources:
-   * <ol>
-   * <li>A URL specified in the HTTP request's <code>xslURL=</code> parameter. For security reasons, 
-   * this URL will be forced to the local IP host.</li>
-   * <li>A URL specified in the XML document xsl:stylesheet Processing Instruction.  XML documents may contain 
-   * Processing Instruction references to one or more stylesheets using the
-   * <a HREF="http://www.w3.org/TR/xml-stylesheet/>Associating Style Sheets with XML documents</a> 
-   * W3C ecommendation.
-   * If the XML document does contain such references, a best match will be chosen based on the browser
-   * type making the request and the default association.  This capability enables relationships to be
-   * defined between client capabilities and stylesheets capable of acting on these capabilities.</li>
-   * <li>A default stylesheet URL specified when the servlet is loaded. During init(), the servlet
-   * uses this xslURL startup parameter to create a Templates object, which is the used for transformations
-   * where no other stylesheet is designated.</li>
-   * </ol>
-   * @param request the client HTTP request, which may include an xslURL parameter
-   * @param xmlSource  the XML document to be transformed
-   * @param listener To record detailed parsing messages for possible return to requestor
-   * @return Source, or null if the stylesheet could not be located.
-   * @see #getMedia
-   * @see #STYLESHEET_ATTRIBUTE
-   * @see #toAcceptLanguageConnection
-   * @exception ApplyXSLTException Thrown if exception occurs while locating the stylesheet
-   */
-  protected Source getStylesheet(TransformerFactory tFactory,
-				   	        	  			   HttpServletRequest request,
-                                 Source xmlSource,
-                                 ApplyXSLTListener listener)
-    throws ApplyXSLTException
-  {
-    try
-    {
-      //stylesheet URL from request
-      String xslURL = ((DefaultApplyXSLTProperties) ourDefaultParameters).getXSLRequestURL(request);
-
-      if (xslURL != null)
-      {
-        listener.out.println("Parsing XSL Stylesheet Document from request parameter: "
-                             + xslURL);
-        useDefaultTemplates = false;
-      }
-      else 
-      {
-        // find stylesheet from XML Document, Media tag preference
-        SAXTransformerFactory stf = (SAXTransformerFactory)tFactory;
-        Source styleSource =
-               stf.getAssociatedStylesheet(xmlSource,getMedia(request), null, null);
-        if (styleSource != null)
-        {
-          listener.out.println("Parsing XSL Stylesheet from XML document stylesheet PI.");
-          useDefaultTemplates = false;
-          return styleSource;
-        }
-        
-        // Configuration Default
-        if ((xslURL = ourDefaultParameters.getXSLurl(null)) != null)
-        {
-          listener.out.println("Parsing XSL Stylesheet Document from configuration: " + xslURL);
-          useDefaultTemplates = true;
-        }
-      }
-      return new StreamSource(xslURL);
-    }
-    catch (IOException ioe)
-    {
-      throw new ApplyXSLTException(ioe, HttpServletResponse.SC_NOT_FOUND);
-    }
-    catch (Exception e)
-    {
-      throw new ApplyXSLTException(e, HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-    }
-  }
-
-  /**
-   * Returns the response content type specified by the media-type and encoding attributes of
-   * the &lt;xsl:output> element(s) of the stylesheet.
-   * Default output property settings are used for any properties not set by the stylesheet. 
-   * @param xslSourceRoot XSL Stylesheet to be examined for &lt;xsl:output> elements.
-   * @return The response content type (MIME type and charset) of the stylesheet output
-   * @see #process
-   */
-  public String getContentType(Templates templates)
-  {
-    Properties oprops = templates.getOutputProperties();
-    String method = oprops.getProperty(OutputKeys.METHOD);
-    if (method == null) method = "xml"; // the default.
-    
-    Properties defoprops = null;
-    if (method.equals("html"))
-      defoprops = OutputProperties.getDefaultMethodProperties("html");
-    else if (method.equals("text"))
-      defoprops = OutputProperties.getDefaultMethodProperties("text");
-    else
-      defoprops = OutputProperties.getDefaultMethodProperties("xml");
-    
-    String encoding = oprops.getProperty(OutputKeys.ENCODING);
-    if (encoding == null) 
-      encoding = defoprops.getProperty(OutputKeys.ENCODING);
-    
-    String media = oprops.getProperty(OutputKeys.MEDIA_TYPE);
-    if (media == null) 
-      media = defoprops.getProperty(OutputKeys.MEDIA_TYPE);
-    
-    return media + "; charset=" + encoding;
-  }  
-  
-
-  /**
-   * Defines and sets select top-level XSL stylesheet variables from the HTTP request, which
-   * can be evaluated using &lt;xsl:param-variable&gt;.  The following variables will be
-   * automatically set:
-   * <dl>
-   * <dt><i>ParameterName</i></dt>
-   * <dd>Each non-reserved request parameter returned from request.getParameterNames().  If a
-   *     parameter contains more than a single value, only the first value is available.</dd>
-   * <dt>servlet-RemoteAddr</dt>
-   * <dd>Contains String output from request.getRemoteAddr(), which is the IP address
-   *     of the client machine.</dd>
-   * <dt>servlet-RemoteHost</dt>
-   * <dd>Contains String output from request.getRemoteHost(), which is the host name
-   *     of the client machine.</dd>
-   * <dt>servlet-RemoteUser</dt>
-   * <dd>Contains String output from request.getRemoteUser(), which was the user name
-   *     accepted by the server to grant access to this servlet.</dd>
-   * <dt>servlet-Request</dt>
-   * <dd>Contains the request object.</dd>
-   * </dl>
-   * @param xslprocessor Where to register parameters to be set
-   * @param request Provides access to all meaningful parameters to set
-   * @see #process
-   */
-  public void setStylesheetParams(Transformer transformer, HttpServletRequest request)
-  {
-    Enumeration paramNames = request.getParameterNames();
-    while (paramNames.hasMoreElements())
-    {
-      String paramName = (String) paramNames.nextElement();
-      try
-      {
-        String[] paramVals = request.getParameterValues(paramName);
-        if (paramVals != null)
-            transformer.setParameter(paramName, new XString(paramVals[0]));
-                                            
-      }
-      catch (Exception e)
-      {
-      }
-    }
-    try
-    {
-      transformer.setParameter("servlet-RemoteAddr", new XString(request.getRemoteAddr()));
-                                      
-    }
-    catch (Exception e)
-    {
-    }
-    try
-    {
-      transformer.setParameter("servlet-RemoteHost", new XString(request.getRemoteHost()));
-                                      
-    }
-    catch (Exception e)
-    {
-    }
-    try
-    {
-      transformer.setParameter("servlet-RemoteUser", new XString(request.getRemoteUser()));
-                                      
-    }
-    catch (Exception e)
-    {
-    }
-  }
-
-
-  /**
-   * Writes the following information to the servlet log:
-   * <ol>
-   * <li>HTTP status code</li>
-   * <li>Message</li>
-   * <li>Stack trace</li>
-   * </ol>
-   * @param axe Contains valid HTTP status code, message, and stack trace (optional)
-   */
-  protected void writeLog(ApplyXSLTException axe)
-  {
-    writeLog(axe.getMessage(), axe.getStatusCode(), axe.getException());
-  }
-
-  /**
-   * Writes the following information to the servlet log:
-   * <ol>
-   * <li>HTTP status code</li>
-   * <li>Message</li>
-   * <li>Stack trace</li>
-   * </ol>
-   * @param msg Message to be logged
-   * @param statusCode Valid status code from javax.servlet.http.HttpServletResponse
-   * @param t Used to generate stack trace (may be =null to suppress stack trace)
-   */
-  protected void writeLog(String msg, int statusCode, Throwable t)
-  {
-    if (t == null)
-      writeLog(msg, statusCode);
-    else
-    {
-      ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-      PrintWriter writer = new PrintWriter(bytes, true);
-      System.out.println("Exception is " + t.getClass().getName());
-      t.printStackTrace(writer);
-      log("HTTP Status Code: " + statusCode + " - " + msg + EOL + bytes.toString());
-    }
-  }
-
-  /**
-   * Writes the following information to the servlet log:
-   * <ol>
-   * <li>HTTP status code</li>
-   * <li>Message</li>
-   * </ol>
-   * @param msg Message to be logged
-   * @param statusCode Valid status code from javax.servlet.http.HttpServletResponse
-   */
-  protected void writeLog(String msg, int statusCode)
-  {
-    log("HTTP Status Code: " + statusCode + " - " + msg);
-  }
-
-  /**
-   * Invokes response.sendError setting an HTTP status code and optionally an error message
-   * as an HTML page.
-   * <p>If running in debug mode, also try to return a stack trace of the exception and
-   * and xml/xsl processor messages.</p>
-   * @param response Where to stream the exception to
-   * @param xse The wrapper which contains the exception and its HTTP status code
-   * @param debug Indicates whether to include stack trace, etc.
-   */
-  protected void displayException(HttpServletResponse response, ApplyXSLTException xse, boolean debug)
-  {
-    String mesg = xse.getMessage();
-    if (mesg == null)
-      mesg = "";
-    else mesg = "<B>" + mesg + "</B>";
-    StringTokenizer tokens = new StringTokenizer(mesg, EOL);
-    StringBuffer strBuf = new StringBuffer();
-    while (tokens.hasMoreTokens())
-      strBuf.append(tokens.nextToken() + EOL + "<BR>");
-    mesg = strBuf.toString();
-    if (debug)
-    {
-      ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-      PrintWriter writer = new PrintWriter(bytes, true);
-      xse.getException().printStackTrace(writer);
-      mesg += " <PRE> " + bytes.toString() + " </PRE> ";
-    }
-    response.setContentType("text/html");
-    try
-    {
-      response.sendError(xse.getStatusCode(), mesg);
-    }
-    catch (IOException ioe)
-    {
-      System.err.println("IOException is occurring when sendError is called");
-    }
-  }
-
-  /**
-   * Mapping of HTTP request's user-Agent values to stylesheet media= values.
-   * <p>This mapping is defined by a file pointed to by the operational parameter "mediaURL" which can
-   *  either contain a full URL or a path relative to the System's server.root /servlets directory.</p>
-   * @see #setMediaProps
-   * @see #getMedia
-   * @serial
-   */
-  protected OrderedProps ourMediaProps = null;
-
-  /**
-   * Returns a connection which respects the Accept-Language header of the HTTP request.  This
-   * is useful when XSL files are internationalized for use with Web servers which respect this
-   * header.
-   * <p>For example, Apache 1.3.6 may be configured for multiviews.  Under this configuration,
-   * requests for http://myhost/index.html would return http://myhost/index.html.fr to French browsers
-   * and http://myhost/index.html.en to English browsers.</p>
-   * @param url Location to connect to
-   * @param request Could contain an Accept-Language header
-   * @return An Accept-Language-enabled URL connection
-   * @see #getStylesheet
-   */
-  protected URLConnection toAcceptLanguageConnection(URL url, HttpServletRequest request)
-    throws Exception
-  {
-    URLConnection tempConnection = url.openConnection();
-    tempConnection.setRequestProperty("Accept-Language", request.getHeader("Accept-Language"));
-    return tempConnection;
-  }
-
-
-  /**
-   * Returns the XSL stylesheet URL associated with the specified XML document.  If multiple XSL
-   * stylesheets are associated with the XML document, preference will be given to the stylesheet
-   * which contains an attribute name/value pair that corresponds to the specified attributeName
-   * and attributeValue.
-   * @param xmlSource XML XSLTInputSource to be searched for associated XSL stylesheets
-   * @param attributeName  Attribute name to provide preferential matching
-   * @param attributeValue Attribute value to provide preferential matching
-   * @return The preferred XSL stylesheet URL, or null if no XSL stylesheet association is found
-   * @see #getStylesheet
-   */
-/*  public static String getXSLURLfromDoc(StreamSource xmlSource,
-                                        String attributeName,
-                                        String attributeValue,
-                                        TransformerFactory tFactory)
-  {
-    String tempURL = null, returnURL = null;
-    try
-    {
-	  DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-      DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-      Node sourceTree = docBuilder.parse(xmlSource.getInputStream());
-      for(Node child=sourceTree.getFirstChild(); null != child; child=child.getNextSibling())
-      {
-        if(Node.PROCESSING_INSTRUCTION_NODE == child.getNodeType())
-        {
-          ProcessingInstruction pi = (ProcessingInstruction)child;
-          if(pi.getNodeName().equals("xml-stylesheet"))
-          {
-            PIA pia = new PIA(pi);
-            if("text/xsl".equals(pia.getAttribute("type")))
-            {
-              tempURL = pia.getAttribute("href");
-              String attribute = pia.getAttribute(attributeName);
-              if ((attribute != null) && (attribute.indexOf(attributeValue) > -1))
-                return tempURL;
-              if (!"yes".equals(pia.getAttribute("alternate")))
-                returnURL = tempURL;
-            }
-          }
-        }
-      }
-    }
-    catch(Exception saxExc)
-    {
-    }
-    return returnURL;
-  }  
-*/
- /**
-   * The attribute name in the <?xml-stylesheet> tag used in stylesheet selection.
-   */
-  protected static final String STYLESHEET_ATTRIBUTE = "media";
-
-  /**
-   *	The HTTP Header used for matching the Stylesheet attribute via the
-   * media properties file selected.
-   */
-  protected static final String HEADER_NAME = "user-Agent";
-}
-
-/**
- *  Stores the keys and values from a file (similar to a properties file) and
- *  can return the first value which has a key contained in its string.
- *  File can have comment lines starting with '#" and for each line the entries are
- *  separated by tabs and '=' char.
- */
-class OrderedProps
-{
-
-  /**
-   * Stores the Key and Values as an array of Strings
-   */
-  private Vector attVec = new Vector(15);
-
-  /**
-   * Constructor.
-   * @param inputStream Stream containing the properties file.
-   * @exception IOException Thrown if unable to read from stream
-   */
-  OrderedProps(InputStream inputStream)
-    throws IOException
-  {
-    BufferedReader input  = new BufferedReader(new InputStreamReader(inputStream));
-    String currentLine, Key = null;
-    StringTokenizer currentTokens;
-    while ((currentLine = input.readLine()) != null)
-    {
-      currentTokens = new StringTokenizer(currentLine, "=\t\r\n");
-      if (currentTokens.hasMoreTokens()) Key = currentTokens.nextToken().trim();
-      if ((Key != null) && !Key.startsWith("#") && currentTokens.hasMoreTokens())
-      {
-        String temp[] = new String[2];
-        temp[0] = Key; temp[1] = currentTokens.nextToken().trim();
-        attVec.addElement(temp);
-      }
-    }
-  }
-
-  /**
-   * Iterates through the Key list and returns the first value for whose
-   * key the given string contains.  Returns "unknown" if no key is contained
-   * in the string.
-   * @param s String being searched for a key.
-   * @return Value for key found in string, otherwise "unknown"
-   */
-  String getValue(String s)
-  {
-    int i, j = attVec.size();
-    for (i = 0; i < j; i++)
-    {
-      String temp[] = (String[]) attVec.elementAt(i);
-      if (s.indexOf(temp[0]) > -1)
-        return temp[1];
-    }
-    return "unknown";
-  }
-}
-
-/**
- * Parses a processing instruction's (PI) attributes for easy retrieval.
- */
-class PIA
-{
-
-  private Hashtable piAttributes = null;
-
-  /**
-   * Constructor.
-   * @param pi The processing instruction whose attributes are to be parsed
-   */
-  PIA(ProcessingInstruction pi)
-  {
-    piAttributes = new Hashtable();
-    StringTokenizer tokenizer = new StringTokenizer(pi.getNodeValue(), "=\"");
-    while(tokenizer.hasMoreTokens())
-    {
-      piAttributes.put(tokenizer.nextToken().trim(), tokenizer.nextToken().trim());
-    }
-  }
-
-  /**
-   * Returns value of specified attribute.
-   *  @param name Attribute name
-   *  @return Attribute value, or null if the attribute name does not exist
-   */
-  String getAttribute(String name)
-  {
-    return (String) piAttributes.get(name);
-  }  
-}
\ No newline at end of file
diff --git a/samples/servlet/ApplyXSLTException.java b/samples/servlet/ApplyXSLTException.java
deleted file mode 100644
index f63c6a1..0000000
--- a/samples/servlet/ApplyXSLTException.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- * 
-/*****************************************************************************************************
- *
- * Wrapper for exceptions occurring during apply XSL processing.  
- * Allows for exceptions to be returned with an associated HTTP Status Code.
- *
- * @author Spencer Shepard (sshepard@us.ibm.com)
- * @author R. Adam King (rak@us.ibm.com)
- * @author Tom Rowe (trowe@us.ibm.com)
- *
- *****************************************************************************************************/
-package servlet;
-
-public class ApplyXSLTException extends Exception {
-
-    /**
-      * Exception Message.
-      * @serial
-      */ 
-    private String myMessage = "";
-
-    /**
-      * HTTP Status Code. Default= internal server error.
-      * @serial
-      */
-    private int  myHttpStatusCode = javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; 
-
-    /**
-      * Wrapped exception
-      * @serial
-      */
-    private Exception myException = null;
-
-    /**
-      * Constructor for exception with no additional detail.
-      */
-    public ApplyXSLTException() 
-    { 
-        super(); 
-    }
-
-    /**
-      * Constructor for exception with message.
-      * @param s Exception message
-      */
-    public ApplyXSLTException(String s) 
-    { 
-        super(); 
-	myMessage = s;
-    }
-
-    /**
-      * Constructor for exception with HTTP status code.
-      * @param hsc Valid status code from javax.servlet.http.HttpServletResponse
-      */
-    public ApplyXSLTException(int hsc) 
-    {
-	super();
-	myHttpStatusCode = hsc;
-    }
-
-    /**
-      * Constructor for exception with message and HTTP status code.
-      * @param s Exception message
-      * @param hsc Valid status code from javax.servlet.http.HttpServletResponse
-      */
-    public ApplyXSLTException(String s, int hsc)
-    {
-	super();
-	myHttpStatusCode = hsc;
-    }
-
-    /**
-      * Constructor for exception.
-      * @param e Exception to be wrapped.
-      */
-    public ApplyXSLTException(Exception e)
-    {
-	super();
-	myMessage = e.getMessage();
-	myException = e;
-    }
-
-    /**
-      * Constructor for passed exception with message.
-      * @param s Exception message
-      * @param e Exception to be wrapped.
-      */
-    public ApplyXSLTException (String s, Exception e)
-    {
-	super();
-	myMessage = s;
-	myException = e;
-    }
-
-    /**
-      * Constructor for passed exception with HTTP status code.
-      * @param e Exception to be wrapped.
-      * @param hsc Valid status code from javax.servlet.http.HttpServletResponse
-      */
-    public ApplyXSLTException(Exception e, int hsc)
-    {
-	super();
-	myMessage = e.getMessage();
-	myException = e;
-	myHttpStatusCode = hsc;
-    }
-
-    /**
-      * Constructor for passed exception with HTTP status code and message.
-      * @param s Exception message
-      * @param e Exception to be wrapped.
-      * @param hsc Valid status code from javax.servlet.http.HttpServletResponse
-      */
-    public ApplyXSLTException(String s, Exception e, int hsc)
-    {
-	super();
-	myMessage = s;
-	myException = e;
-	myHttpStatusCode = hsc;
-    }
-
-    /**
-      * Returns exception message.
-      * @return exception message
-      */
-    public String getMessage()
-    {
-	return myMessage;
-    }
-
-    /**
-      * Appends string to exception message.
-      * @param s String to be added to message
-      */
-    public void appendMessage(String s)
-    {
-	myMessage += s;
-    }
-
-    /**
-      * Returns the wrapped exception.
-      * @return Wrapped exception
-      */
-    public Exception getException()
-    {
-	return myException;
-    }
-
-    /**
-      * Returns the HTTP status code associated with the exception.
-      * @return Valid status code from javax.servlet.http.HttpServletResponse
-      */
-    public int getStatusCode()
-    {
-	return myHttpStatusCode;
-    }
-}
-
diff --git a/samples/servlet/ApplyXSLTListener.java b/samples/servlet/ApplyXSLTListener.java
deleted file mode 100644
index 2e46e26..0000000
--- a/samples/servlet/ApplyXSLTListener.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package servlet;
-
-import java.io.*;
-import org.xml.sax.*;
-import org.apache.xml.utils.DefaultErrorHandler;
-
-/*****************************************************************************************************
- * ApplyXSLTListener provides a buffered listener essential for capturing, and then subsequently
- * reporting, XML and XSL processor messages which may be of use in debugging XML+XSL processed at
- * the server.
- *
- * @author Spencer Shepard (sshepard@us.ibm.com)
- * @author R. Adam King (rak@us.ibm.com)
- * @author Tom Rowe (trowe@us.ibm.com)
- *
- *****************************************************************************************************/
-
-public class ApplyXSLTListener extends DefaultErrorHandler implements ErrorHandler
-{
-
-    /**
-      * Output stream
-      */
-    private ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-
-    /**
-      * Buffered output stream
-      */
-    public PrintWriter out = null;
-
-    /**
-      * Constructor.
-      */
-    public ApplyXSLTListener()
-    {
-      out = new PrintWriter(new BufferedOutputStream(outStream), true);
-    }
-
-    /**
-      * Receive notification of a warning.
-      *
-      * @param spe The warning information encapsulated in a SAX parse exception.
-      */
-    public void warning(SAXParseException spe)
-    {
-	out.println("Parser Warning: " + spe.getMessage());
-    }
-
-    /**
-      * Receive notification of a recoverable error.
-      *
-      * @param spe The error information encapsulated in a SAX parse exception.
-      */
-    public void error(SAXParseException spe)
-    {
-	out.println("Parser Error: " + spe.getMessage());
-    }
-
-    /**
-      * Receive notification of a non-recoverable error.
-      *
-      * @param spe The error information encapsulated in a SAX parse exception.
-      * @exception SAXException Always thrown
-      */
-    public void fatalError(SAXParseException spe)
-    throws SAXException
-    {
-	out.println("Parser Fatal Error: " + spe.getMessage());
-	throw spe;
-    }
-
-    /**
-      * Returns the buffered processing message(s).
-      * @return Buffered processing message(s)
-      */
-    public String getMessage()
-    {
-	return outStream.toString();
-    }
-}
-
diff --git a/samples/servlet/ApplyXSLTProperties.java b/samples/servlet/ApplyXSLTProperties.java
deleted file mode 100644
index 69e0ed4..0000000
--- a/samples/servlet/ApplyXSLTProperties.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package servlet;
-
-import java.net.MalformedURLException;
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-/*****************************************************************************************************
- * 
- * ApplyXSLTProperties contains operational parameters for ApplyXSLT based 
- * on program defaults and configuration.  
- * <p>This class is also used to return values for request-time parameters.</p>
- *
- * @author Spencer Shepard (sshepard@us.ibm.com)
- * @author R. Adam King (rak@us.ibm.com)
- * @author Tom Rowe (trowe@us.ibm.com)
- *
- *****************************************************************************************************/
-
-public class ApplyXSLTProperties {
-
-    /**
-      * Program default for parameter "URL"
-      */
-    private final String DEFAULT_URL;
-
-    /**
-      * Program default for parameter "xslURL"
-      */
-    private final String DEFAULT_xslURL;
-    
-    /**
-      * Program default for parameter "debug"
-      */
-    private final boolean DEFAULT_debug;
-
-    /**
-      * Program default for parameter "noConflictWarnings"
-      */
-    private final boolean DEFAULT_noCW;
-    
-    /**
-      * Constructor to use program defaults.
-      */
-    public ApplyXSLTProperties() 
-    {
-	DEFAULT_URL = null;
-	DEFAULT_xslURL = null;
-	DEFAULT_debug = false;
-	DEFAULT_noCW = false;
-    }
-
-    /**
-      * Constructor to use to override program defaults.
-      * @param config Servlet configuration
-      */
-    public ApplyXSLTProperties(ServletConfig config)
-    {
-	String xm = config.getInitParameter("URL"),
-	       xu = config.getInitParameter("xslURL"),
-	       db = config.getInitParameter("debug"),
-	       cw = config.getInitParameter("noConflictWarnings");
-	       
-	if (xm != null) DEFAULT_URL = xm;
-	else DEFAULT_URL = null;
-	if (xu != null) DEFAULT_xslURL = xu;
-	else DEFAULT_xslURL = null;
-	if (db != null) DEFAULT_debug = new Boolean(db).booleanValue();
-	else DEFAULT_debug = false;
-	if (cw != null) DEFAULT_noCW = new Boolean(cw).booleanValue();
-	else DEFAULT_noCW = false;
-    }
-   
-    /**
-      * Given a parameter name, returns the HTTP request's String value; 
-      * if not present in request, returns default String value.
-      * @param request Request to check for default override
-      * @param param Name of the parameter
-      * @return String value of named parameter
-      */
-    public String getRequestParmString(HttpServletRequest request, String param)
-    {
-	if (request != null) { 
-	    String[] paramVals = request.getParameterValues(param); 
-	    if (paramVals != null) 
-		return paramVals[0];
-	}
-	return null;
-    }
-
-    /**
-      * Returns the current setting for "URL".
-      * @param request Request to check for parameter value
-      * @return String value for "URL"
-      * @exception MalformedURLException Will not be thrown
-      */
-    public String getXMLurl(HttpServletRequest request)
-    throws MalformedURLException
-    {
-	String temp = getRequestParmString(request, "URL");
-	if (temp != null)
-	    return temp;
-	return DEFAULT_URL;
-    }     
-    
-    /**
-      * Returns the current setting for "xslURL".
-      * @param request Request to check for parameter value
-      * @return String value for "xslURL"
-      * @exception MalformedURLException Will not be thrown
-      */
-    public String getXSLurl(HttpServletRequest request)
-    throws MalformedURLException
-    {  
-	String temp = getRequestParmString(request, "xslURL");
-	if (temp != null)
-	    return temp;
-	return DEFAULT_xslURL;
-    }
-    
-    /**
-      * Returns the current setting for "debug".
-      * @param request Request to check for parameter value
-      * @return Boolean value for "debug"
-      */
-    public boolean isDebug(HttpServletRequest request)
-    {
-	String temp = getRequestParmString(request, "debug");
-	if (temp != null)
-	    return new Boolean(temp).booleanValue();
-	return DEFAULT_debug;
-    }
-
-    /**
-      * Returns the current setting for "noConflictWarnings".
-      * @param request Request to check for parameter value
-      * @return Boolean value for "noConflictWarnings"
-      */
-    boolean isNoCW(HttpServletRequest request)
-    {
-	String temp = getRequestParmString(request, "noConflictWarnings");
-	if (temp != null)
-	    return new Boolean(temp).booleanValue();
-	return DEFAULT_noCW;
-    }    
-}
\ No newline at end of file
diff --git a/samples/servlet/DefaultApplyXSLTProperties.java b/samples/servlet/DefaultApplyXSLTProperties.java
deleted file mode 100644
index 1fdb967..0000000
--- a/samples/servlet/DefaultApplyXSLTProperties.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package servlet;
-
-import java.net.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.util.Enumeration;
-import java.util.Properties;
-
-/*****************************************************************************************************
- * 
- * DefaultApplyXSLTProperties contains operational parameters for DefaultApplyXSLT based 
- * on program defaults and configuration.  
- * <p>This class is also used to return values for request-time parameters.</p>
- *
- * @author Spencer Shepard (sshepard@us.ibm.com)
- * @author R. Adam King (rak@us.ibm.com)
- * @author Tom Rowe (trowe@us.ibm.com)
- *
- *****************************************************************************************************/
-
-public class DefaultApplyXSLTProperties extends ApplyXSLTProperties {
-    
-    /**
-      * Program default for parameter "catalog".
-      * @see #getCatalog
-      */
-    private final String DEFAULT_catalog;
-
-    /**
-      * Host used for local context comparisons.
-      * @see #getLocalHost
-      * @see #setLocalHost
-      */
-    protected transient String localHost = null;
-    
-    /**
-     * Server port. Used in toSafeURL() -- fix submitted by Ritesh Kumar.
-     */
-    protected static int port =0;
-
-    /**
-      * Constructor to use program defaults.
-      */
-    public DefaultApplyXSLTProperties()
-    {
-	super();
-	DEFAULT_catalog = null;
-	setLocalHost();
-	// setSystemProperties();
-    }
-
-    /**
-      * Constructor to use to override program defaults.
-      * @param config Servlet configuration
-      * @see #setLocalHost
-      */
-    public DefaultApplyXSLTProperties(ServletConfig config)
-    {
-	    super(config);
-	    String cat = config.getInitParameter("catalog");
-	    if (cat != null) DEFAULT_catalog = cat;
-	    else DEFAULT_catalog = null;
-	    setLocalHost();
-	    setSystemProperties();
-    }
-
-    /**
-      * Sets the name of the local IP host name; this value will be used to constrain untrusted 
-      * XML document and XSL stylesheet URLs to this trusted host.
-      * @see #getLocalHost
-      */
-    protected void setLocalHost()
-    {
-	    try 
-	    { 
-	        localHost = InetAddress.getLocalHost().getHostName();
-	    } 
-	    catch (Exception uhe) 
-	    {
-	      localHost = null;
-	    }
-    }
-
-    /**
-      * Returns the name of trusted IP host.
-      * @return Name of trusted host
-      * @see #setLocalHost
-      */
-    public String getLocalHost()
-    {
-	    return localHost;
-    }
-
-    /**
-      * Returns a URL which is constrained to a trusted IP host.
-      * @param xURL URL or file path to be made safe 
-      * @return Safe URL
-      * @exception MalformedURLException Thrown when xURL is not a valid URL
-      * @see #setLocalHost
-      * @see #getLocalHost
-      */
-    public URL toSafeURL(String xURL, HttpServletRequest request)
-    throws MalformedURLException
-    {
-      // Fix submitted by Ritesh Kumar. Port is included in construction of URL that is returned.
-      if (port == 0)
-        port = request.getServerPort();
-      
-	    if (xURL == null)
-	      return null;
-
-	    if (xURL.startsWith("/")) 
-      {
-	      try 
-        {
-		      return new URL("http", localHost, port, xURL);
-	      }
-        catch (MalformedURLException mue) 
-        {
-	        throw new MalformedURLException("toSafeURL(): " + xURL + 
-					                                " did not map to local");
-	      }
-	    }
-	    URL tempURL = null;
-	    try 
-      { 
-	      tempURL = new URL(xURL);
-	    } 
-      catch (MalformedURLException mue) 
-      {
-	      throw new MalformedURLException("toSafeURL(): " + xURL + 
-					                              " not a valid URL"); 
-	    }
-	    try 
-      { 
-	      return new URL(tempURL.getProtocol(), localHost, 
-			                 port, tempURL.getFile());
-	    } 
-      catch (MalformedURLException mue) 
-      {
-	      throw new MalformedURLException("toSafeURL(): " + xURL + 
-				                          	    " could not be converted to local host");
-	    }
-    }
-
-    /**
-      *	Returns a string representing the constrained URL for the XML document.
-      * If there is no request parameter for the XML document, return the configured default.
-      * @param request May contain an XML document URL parameter
-      * @return String form of XML URL
-      * @exception MalformedURLException Thrown when request URL is not a valid URL or path
-      * @see #toSafeURL
-      */
-    public String getXMLurl(HttpServletRequest request)
-    throws MalformedURLException
-    {
-	    URL url = toSafeURL(getRequestParmString(request, "URL"),request);
-	    if (url == null)
-	      return super.getXMLurl(null);
-	    return url.toExternalForm();
-    }
-
-    /**
-      * Returns a string representing the constrained URL for the XSL stylesheet 
-      * from the request.
-      * @param request May contain an XSL stylesheet URL parameter
-      * @return String form of request XSL URL, or null if request contains no xslURL parameter
-      * @exception MalformedURLException Thrown when request URL is not a valid URL or path
-      * @see #toSafeURL
-      */
-    public String getXSLRequestURL(HttpServletRequest request)
-    throws MalformedURLException
-    {
-	    URL url = toSafeURL(getRequestParmString(request, "xslURL"),request);
-	    if (url == null)
-	        return null;
-	    return url.toExternalForm();
-    }
-
-    /**
-      * Returns a string representing the constrained request URL for the XSL stylesheet.
-      * If there is no request parameter for the XSL stylesheet, return the configured default.
-      * @param request May contain an XSL stylesheet URL parameter
-      * @return String form of XSL URL
-      * @exception MalformedURLException Thrown when request URL is not a valid URL or path
-      * @see #toSafeURL
-      */
-    public String getXSLurl(HttpServletRequest request)
-    throws MalformedURLException
-    {
-	    String reqURL = getXSLRequestURL(request);
-	    if (reqURL != null)
-	        return reqURL;
-	    return super.getXSLurl(null);
-    }
-
-    /**
-      * Returns URLs for all <a href="http://www.ccil.org/~cowan/XML/XCatalog.html">XCatalogs</a> 
-      * that are to be used to process the request.  Catalogs are used to resolve XML public identifiers
-      * into system identifiers.
-      * <p>A single XCatalog can be configured as a default,
-      * but multiple XCatalogs can be specified at request time to augment the configured default.
-      * @param request May contain one or more XCatalog parameters
-      * @return Array of strings for all catalog URLs
-      */
-    public String[] getCatalog(HttpServletRequest request)
-    {
-	    String temp[] = request.getParameterValues("catalog");
-	    if (DEFAULT_catalog == null)
-	        return temp;
-	    if (temp == null) 
-      {
-	      String defaultArray[] = new String [1];
-	      defaultArray[0] = DEFAULT_catalog;
-	      return defaultArray;
-	    }
-	    int i, len = temp.length + 1;
-	    String newCatalogs[] = new String[len];
-	    newCatalogs[0] = DEFAULT_catalog;
-	    for (i=1; i < len; i++) 
-      {
-	      newCatalogs[i] = temp[i-1];
-	    }
-	    return newCatalogs;
-    }
-	
-	 /**
-   * I think we no longer need this. Sets the 3 jaxp core system properties.
-   */	
-    protected void setSystemProperties()
-	{
-	  Properties props = new Properties();
-    props.put("javax.xml.transform.TransformerFactory", 
-              "org.apache.xalan.processor.TransformerFactoryImpl");
-    props.put("javax.xml.parsers.DocumentBuilderFactory", 
-              "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
-    props.put("javax.xml.parsers.SAXParserFactory", 
-              "org.apache.xerces.jaxp.SAXParserFactoryImpl");
-    
-      Properties systemProps = System.getProperties();
-      Enumeration propEnum = props.propertyNames();
-      while(propEnum.hasMoreElements())
-      {
-        String prop = (String)propEnum.nextElement();
-        if(!systemProps.containsKey(prop))
-          systemProps.put(prop, props.getProperty(prop));
-      }
-      System.setProperties(systemProps);
-	}
-
-}
diff --git a/samples/servlet/SimpleXSLTServlet.java b/samples/servlet/SimpleXSLTServlet.java
deleted file mode 100644
index 68c0814..0000000
--- a/samples/servlet/SimpleXSLTServlet.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package servlet;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
-import java.net.URL;
-
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-
-/*
- * This sample applies the todo.xsl stylesheet to the
- * todo.xml XML document, and returns the transformation
- * output (HTML) to the client browser.
- *
- * IMPORTANT: For this to work, you must place todo.xsl and todo.xml 
- * in the servlet root directory for documents.
- *
- */
-
-public class SimpleXSLTServlet extends HttpServlet {
-
-  public void init(ServletConfig config) throws ServletException
-  {
-    super.init(config);
-  }
-
-  public void doGet (HttpServletRequest request,
-                     HttpServletResponse response)
-    throws ServletException, IOException, java.net.MalformedURLException
-  {
-    // The servlet returns HTML.
-    response.setContentType("text/html; charset=UTF-8");    
-    // Output goes in the response stream.
-    PrintWriter out = response.getWriter();
-    try
-    {	
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      // Get the XML input document and the stylesheet.
-      Source xmlSource = new StreamSource(new URL("file:trax.xml").openStream());
-      Source xslSource = new StreamSource(new URL("file:spec.xsl").openStream());
-      // Generate the transformer.
-      Transformer transformer = tFactory.newTransformer(xslSource);
-      // Perform the transformation, sending the output to the response.
-      transformer.transform(xmlSource, new StreamResult(out));
-    }
-    catch (Exception e)
-    {
-      out.write(e.getMessage());
-      e.printStackTrace(out);    
-    }
-    out.close();
-  }
-  
-}
diff --git a/samples/servlet/UseStylesheetParamServlet.java b/samples/servlet/UseStylesheetParamServlet.java
deleted file mode 100644
index 1df946f..0000000
--- a/samples/servlet/UseStylesheetParamServlet.java
+++ /dev/null
@@ -1,71 +0,0 @@
-
-/*
-Simple Servlet Example using a stylesheet parameter
- */
-package servlet;
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-
-// Imported SAX classes
-import org.xml.sax.SAXException;
-
-// Imported java.io and javax.servlet classes
-import java.io.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-public class UseStylesheetParamServlet extends HttpServlet {
-	
-	PrintWriter out;
-	String xslFile, xmlFile, paramValue;
-	public void doGet(HttpServletRequest req,
-		HttpServletResponse res)
-			throws ServletException, IOException {
-		try {
-			res.setContentType("text/html; charset=UTF-8");
-			out = res.getWriter();
-
-      paramValue = req.getParameter("PVAL");
-			xmlFile    = req.getParameter("XML");
-			xslFile    = req.getParameter("XSL");
- 		if (paramValue == null) {
-			out.println(
-			"<h1>No input for paramValue</h1>");
-			return;
-		}
- 		if ( xmlFile == null) {
-			out.println(
-			"<h1>No input for xmlFile</h1>");
-			return;
-		}	
-		if ( xslFile == null) {
-			out.println(
-			"<h1>No input for xslFile</h1>");
-			return;
-		}
-		TransformerFactory tFactory =
-			TransformerFactory.newInstance();
-		Transformer transformer =
-			tFactory.newTransformer(new StreamSource(xslFile));
-
-    // Set the stylesheet parameter (named param1).
-			transformer.setParameter("param1", paramValue);
-    // Perform the transformation.
-			transformer.transform(new StreamSource(xmlFile),
-					                  new StreamResult(out));
-		}		
-    catch (IOException e) {			
-			e.printStackTrace();
-			System.exit(-1);
-		}
-		catch (TransformerException e) {
-      e.printStackTrace(out);
-			return;
-		}
-	}
-}
diff --git a/samples/servlet/XSLTServletWithParams.java b/samples/servlet/XSLTServletWithParams.java
deleted file mode 100644
index b466560..0000000
--- a/samples/servlet/XSLTServletWithParams.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package servlet;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
-import java.util.Enumeration;
-import java.net.URL;
-
-import org.xml.sax.*;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-
-/*
- * This sample takes input parameters in the request URL: a URL
- * parameter for the XML input, an xslURL parameter for the stylesheet,
- * and optional stylesheet parameters.
- * To run the equivalent of SimplestXSLServlet (with the documents in the
- * servlet document root directory), the request URL is
- * http://<server/servletpath>servlet.SimpleXSLServlet?URL=file:todo.xml&xslURL=file:todo.xsl
- *
- * Using a stylesheet Processing Instruction:
- * If the XML document includes a stylesheet PI that you want to use, 
- * omit the xslURL parameter.
- *
- * Sending stylesheet parameters: 
- * If, for example, a servlet takes a stylesheet parameter named param1
- * param1 that you want to set to foo, include param1=foo in the URL.
- */
-
-public class XSLTServletWithParams extends HttpServlet {
-
-  public void init(ServletConfig config) throws ServletException
-  {
-    super.init(config);
-  }
-
-  public void doGet (HttpServletRequest request,
-                     HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    // The servlet returns HTML; charset is UTF8.
-    // See ApplyXSLT.getContentType() to get output properties from <xsl:output>.
-    response.setContentType("text/html; charset=UTF-8"); 
-    PrintWriter out = response.getWriter();
-    try
-    {	
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      // Get params from URL.
-      String xml = getRequestParam(request, "URL");
-      String xsl = getRequestParam(request, "xslURL");
-      Source xmlSource = null;
-      Source xslSource = null;
-      Transformer transformer = null;
-      // Get the XML input document.
-      if (xml != null && xml.length()> 0)
-        xmlSource = new StreamSource(new URL(xml).openStream());
-      // Get the stylesheet.
-      if (xsl != null && xsl.length()> 0)
-        xslSource = new StreamSource(new URL(xsl).openStream());
-      if (xmlSource != null) // We have an XML input document.
-      {
-        if (xslSource == null) // If no stylesheet, look for PI in XML input document.
-        {
-     	    String media= null , title = null, charset = null;
-          xslSource = tFactory.getAssociatedStylesheet(xmlSource,media, title, charset);
-        }
-        if (xslSource != null) // Now do we have a stylesheet?
-        {
-          transformer = tFactory.newTransformer(xslSource);
-          setParameters(transformer, request); // Set stylesheet params.
-          // Perform the transformation.
-          transformer.transform(xmlSource, new StreamResult(out)); 
-        }
-        else
-          out.write("No Stylesheet!");
-      }
-      else
-        out.write("No XML Input Document!");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(out);    
-    }
-    out.close();
-  }
-  
-  // Get parameters from the request URL.
-  String getRequestParam(HttpServletRequest request, String param)
-  {
-	  if (request != null) 
-    { 
-	    String paramVal = request.getParameter(param); 
-		  return paramVal;
-	  }
-	  return null;
-  }
-  
-  // Set stylesheet parameters from the request URL.
-  void setParameters(Transformer transformer, HttpServletRequest request)
-  {
-    Enumeration paramNames = request.getParameterNames();
-    while (paramNames.hasMoreElements())
-    {
-      String paramName = (String) paramNames.nextElement();
-      try
-      {
-        String paramVal = request.getParameter(paramName);
-        if (paramVal != null)
-          transformer.setParameter(paramName, paramVal);                                            
-      }
-      catch (Exception e)
-      {
-      }
-    }
-  }  
-}
diff --git a/samples/servlet/default.xsl b/samples/servlet/default.xsl
deleted file mode 100644
index e1a85e0..0000000
--- a/samples/servlet/default.xsl
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0"?>
-
-<!--                                                                                -->
-<!--  Default XSL stylesheet for use by com.lotus.xsl.server#DefaultApplyXSL.       -->
-<!--                                                                                -->
-<!--  This stylesheet mimics the default behavior of IE when XML data is displayed  -->
-<!--  without a corresponding XSL stylesheet.  This stylesheet uses JavaScript      -->
-<!--  to accommodate node expansion and contraction.                                -->
-<!--                                                                                -->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
-                xmlns="http://www.w3.org/TR/REC-html40">
-                
-<xsl:output method="html" indent="no"/>
-<xsl:strip-space elements="*"/>
-
-<xsl:template match="/">
-  <HTML>
-    <HEAD>
-      <STYLE type="text/css">
-        BODY {font:x-small 'Verdana'; margin-right:1.5em}
-      <!-- container for expanding/collapsing content -->
-        .c  {cursor:hand}
-      <!-- button - contains +/-/nbsp -->
-        .b  {color:red; font-family:'Courier New'; font-weight:bold; text-decoration:none}
-      <!-- element container -->
-        .e  {margin-left:1em; text-indent:-1em; margin-right:1em}
-      <!-- comment or cdata -->
-        .k  {margin-left:1em; text-indent:-1em; margin-right:1em}
-      <!-- tag -->
-        .t  {color:#990000}
-      <!-- tag in xsl namespace -->
-        .xt {color:#990099}
-      <!-- attribute in xml or xmlns namespace -->
-        .ns {color:red}
-      <!-- markup characters -->
-        .m  {color:blue}
-      <!-- text node -->
-        .tx {font-weight:bold}
-      <!-- multi-line (block) cdata -->
-        .db {text-indent:0px; margin-left:1em; margin-top:0px; margin-bottom:0px;
-             padding-left:.3em; border-left:1px solid #CCCCCC; font:small Courier}
-      <!-- single-line (inline) cdata -->
-        .di {font:small Courier}
-      <!-- DOCTYPE declaration -->
-        .d  {color:blue}
-      <!-- pi -->
-        .pi {color:blue}
-      <!-- multi-line (block) comment -->
-        .cb {text-indent:0px; margin-left:1em; margin-top:0px; margin-bottom:0px;
-             padding-left:.3em; font:small Courier; color:#888888}
-      <!-- single-line (inline) comment -->
-        .ci {font:small Courier; color:#888888}
-        PRE {margin:0px; display:inline}
-      </STYLE>
-
-      <SCRIPT type="text/javascript"><xsl:comment><![CDATA[
-        // Detect and switch the display of CDATA and comments from an inline view
-        //  to a block view if the comment or CDATA is multi-line.
-        function f(e)
-        {
-          // if this element is an inline comment, and contains more than a single
-          //  line, turn it into a block comment.
-          if (e.className == "ci") {
-            if (e.children(0).innerText.indexOf("\n") > 0)
-              fix(e, "cb");
-          }
-          
-          // if this element is an inline cdata, and contains more than a single
-          //  line, turn it into a block cdata.
-          if (e.className == "di") {
-            if (e.children(0).innerText.indexOf("\n") > 0)
-              fix(e, "db");
-          }
-          
-          // remove the id since we only used it for cleanup
-          e.id = "";
-        }
-        
-        // Fix up the element as a "block" display and enable expand/collapse on it
-        function fix(e, cl)
-        {
-          // change the class name and display value
-          e.className = cl;
-          e.style.display = "block";
-          
-          // mark the comment or cdata display as a expandable container
-          j = e.parentElement.children(0);
-          j.className = "c";
-
-          // find the +/- symbol and make it visible - the dummy link enables tabbing
-          k = j.children(0);
-          k.style.visibility = "visible";
-          k.href = "#";
-        }
-
-        // Change the +/- symbol and hide the children.  This function works on "element"
-        //  displays
-        function ch(e)
-        {
-          // find the +/- symbol
-          mark = e.children(0).children(0);
-          
-          // if it is already collapsed, expand it by showing the children
-          if (mark.innerText == "+")
-          {
-            mark.innerText = "-";
-            for (var i = 1; i < e.children.length; i++)
-              e.children(i).style.display = "block";
-          }
-          
-          // if it is expanded, collapse it by hiding the children
-          else if (mark.innerText == "-")
-          {
-            mark.innerText = "+";
-            for (var i = 1; i < e.children.length; i++)
-              e.children(i).style.display="none";
-          }
-        }
-        
-        // Change the +/- symbol and hide the children.  This function work on "comment"
-        //  and "cdata" displays
-        function ch2(e)
-        {
-          // find the +/- symbol, and the "PRE" element that contains the content
-          mark = e.children(0).children(0);
-          contents = e.children(1);
-          
-          // if it is already collapsed, expand it by showing the children
-          if (mark.innerText == "+")
-          {
-            mark.innerText = "-";
-            // restore the correct "block"/"inline" display type to the PRE
-            if (contents.className == "db" || contents.className == "cb")
-              contents.style.display = "block";
-            else contents.style.display = "inline";
-          }
-          
-          // if it is expanded, collapse it by hiding the children
-          else if (mark.innerText == "-")
-          {
-            mark.innerText = "+";
-            contents.style.display = "none";
-          }
-        }
-        
-        // Handle a mouse click
-        function cl()
-        {
-          e = window.event.srcElement;
-          
-          // make sure we are handling clicks upon expandable container elements
-          if (e.className != "c")
-          {
-            e = e.parentElement;
-            if (e.className != "c")
-            {
-              return;
-            }
-          }
-          e = e.parentElement;
-          
-          // call the correct funtion to change the collapse/expand state and display
-          if (e.className == "e")
-            ch(e);
-          if (e.className == "k")
-            ch2(e);
-        }
-        
-        // Erase bogus link info from the status window
-        function h()
-        {
-          window.status=" ";
-        }
-
-        // Set the onclick handler
-        document.onclick = cl;
-        
-      ]]>//</xsl:comment></SCRIPT>
-    </HEAD>
-
-    <BODY class="st"><xsl:apply-templates/></BODY>
-
-  </HTML>
-</xsl:template>
-
-<!-- Templates for each node type follows.  The output of each template has a similar structure
-  to enable script to walk the result tree easily for handling user interaction. -->
-  
-<!-- Template for pis not handled elsewhere -->
-<xsl:template match="processing-instruction()">
-  <DIV class="e">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="m">&lt;?</SPAN><SPAN class="pi"><xsl:value-of select="name(.)"/> <xsl:value-of select="."/></SPAN><SPAN class="m">?&gt;</SPAN>
-  </DIV>
-</xsl:template>
-
-<!-- Template for the XML declaration.  Need a separate template because the pseudo-attributes
-    are actually exposed as attributes instead of just element content, as in other pis 
-<xsl:template match="processing-instruction('xml')">
-  <DIV class="e">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="m">&lt;?</SPAN><SPAN class="pi">xml <xsl:for-each select="@*"><xsl:value-of select="name(.)"/>="<xsl:value-of select="."/>" </xsl:for-each></SPAN><SPAN class="m">?&gt;</SPAN>
-  </DIV>
-</xsl:template>
--->
-
-<!-- Template for attributes not handled elsewhere -->
-<xsl:template match="@*"><SPAN class="t"><xsl:text> </xsl:text><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">="</SPAN><B><xsl:value-of select="."/></B><SPAN class="m">"</SPAN></xsl:template>
-
-<!-- Template for attributes in the xmlns or xml namespace
-<xsl:template match="@xmlns:*|@xmlns|@xml:*"><SPAN class="ns"> <xsl:value-of select="name(.)"/></SPAN><SPAN class="m">="</SPAN><B class="ns"><xsl:value-of select="."/></B><SPAN class="m">"</SPAN></xsl:template>
--->
-
-<!-- Template for text nodes -->
-<xsl:template match="text()">
-  <xsl:choose><xsl:when test="name(.) = '#cdata-section'"><xsl:call-template name="cdata"/></xsl:when>
-  <xsl:otherwise><DIV class="e">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="tx"><xsl:value-of select="."/></SPAN>
-  </DIV></xsl:otherwise></xsl:choose>
-</xsl:template>
-  
-<!-- Template for comment nodes -->
-<xsl:template match="comment()">
-  <DIV class="k">
-  <SPAN><A class="b" onclick="return false" onfocus="h()" STYLE="visibility:hidden">-</A> <SPAN class="m">&lt;!--</SPAN></SPAN>
-  <SPAN id="clean" class="ci"><PRE><xsl:value-of select="."/></PRE></SPAN>
-  <SPAN class="b">&#160;</SPAN> <SPAN class="m">--&gt;</SPAN>
-  <SCRIPT>f(clean);</SCRIPT></DIV>
-</xsl:template>
-
-<!-- Template for cdata nodes -->
-<xsl:template name="cdata">
-  <DIV class="k">
-  <SPAN><A class="b" onclick="return false" onfocus="h()" STYLE="visibility:hidden">-</A> <SPAN class="m">&lt;![CDATA[</SPAN></SPAN>
-  <SPAN id="clean" class="di"><PRE><xsl:value-of select="."/></PRE></SPAN>
-  <SPAN class="b">&#160;</SPAN> <SPAN class="m">]]&gt;</SPAN>
-  <SCRIPT>f(clean);</SCRIPT></DIV>
-</xsl:template>
-
-<!-- Template for elements not handled elsewhere (leaf nodes) -->
-<xsl:template match="*">
-  <DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="m">&lt;</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN> <xsl:apply-templates select="@*"/><SPAN class="m"> /&gt;</SPAN>
-  </DIV></DIV>
-</xsl:template>
-  
-<!-- Template for elements with comment, pi and/or cdata children
-<xsl:template match="*[comment() or processing-instruction() or cdata()]">
-  <DIV class="e">
-  <DIV class="c"><A href="#" onclick="return false" onfocus="h()" class="b">-</A> <SPAN class="m">&lt;</SPAN><SPAN><xsl:attribute name="class"><xsl:if test="xsl:*">x</xsl:if>t</xsl:attribute><xsl:value-of select="name(.)"/></SPAN><xsl:apply-templates select="@*"/> <SPAN class="m">&gt;</SPAN></DIV>
-  <DIV><xsl:apply-templates/>
-  <DIV><SPAN class="b">&#160;</SPAN> <SPAN class="m">&lt;/</SPAN><SPAN><xsl:attribute name="class"><xsl:if test="xsl:*">x</xsl:if>t</xsl:attribute><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">&gt;</SPAN></DIV>
-  </DIV></DIV>
-</xsl:template> -->
-
-<!-- Template for elements with only text children -->
-<xsl:template match="*[text() and not(comment() or processing-instruction() or *)]">
-  <DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
-  <SPAN class="b">&#160;</SPAN> <SPAN class="m">&lt;</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><xsl:apply-templates select="@*"/>
-  <SPAN class="m">&gt;</SPAN><SPAN class="tx"><xsl:value-of select="."/></SPAN><SPAN class="m">&lt;/</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">&gt;</SPAN>
-  </DIV></DIV>
-</xsl:template>
-
-<!-- Template for elements with element children -->
-<xsl:template match="*[*]">
-  <DIV class="e">
-  <DIV class="c" STYLE="margin-left:1em;text-indent:-2em"><A href="#" onclick="return false" onfocus="h()" class="b">-</A> <SPAN class="m">&lt;</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><xsl:apply-templates select="@*"/><SPAN class="m">&gt;</SPAN></DIV>
-  <DIV><xsl:apply-templates/>
-  <DIV><SPAN class="b">&#160;</SPAN><SPAN class="m">&lt;/</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">&gt;</SPAN></DIV>
-  </DIV></DIV>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/servlet/default2.xsl b/samples/servlet/default2.xsl
deleted file mode 100644
index 1619f3f..0000000
--- a/samples/servlet/default2.xsl
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0"?>
-
-<!--                                                                                -->
-<!--  Default XSL stylesheet for use by com.lotus.xsl.server#DefaultApplyXSL.       -->
-<!--                                                                                -->
-<!--  This stylesheet mimics the default behavior of IE when XML data is displayed  -->
-<!--  without a corresponding XSL stylesheet.  This stylesheet uses no JavaScript   -->
-<!--  and displays all nodes as fully expanded.                                     -->
-<!--                                                                                -->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
-                xmlns="http://www.w3.org/TR/REC-html40">
-                
-<xsl:output method="html" indent="no"/>
-<xsl:strip-space elements="*"/>
-
-<xsl:template match="/">
-  <HTML>
-    <HEAD>
-      <STYLE type="text/css">
-        BODY {font:x-small 'Verdana'; margin-right:1.5em}
-      <!-- container for expanding/collapsing content -->
-        .c  {cursor:hand}
-      <!-- button - contains +/-/nbsp -->
-        .b  {color:red; font-family:'Courier New'; font-weight:bold; text-decoration:none}
-      <!-- element container -->
-        .e  {margin-left:1em; text-indent:-1em; margin-right:1em}
-      <!-- comment or cdata -->
-        .k  {margin-left:1em; text-indent:-1em; margin-right:1em}
-      <!-- tag -->
-        .t  {color:#990000}
-      <!-- tag in xsl namespace -->
-        .xt {color:#990099}
-      <!-- attribute in xml or xmlns namespace -->
-        .ns {color:red}
-      <!-- markup characters -->
-        .m  {color:blue}
-      <!-- text node -->
-        .tx {font-weight:bold}
-      <!-- multi-line (block) cdata -->
-        .db {text-indent:0px; margin-left:1em; margin-top:0px; margin-bottom:0px;
-             padding-left:.3em; border-left:1px solid #CCCCCC; font:small Courier}
-      <!-- single-line (inline) cdata -->
-        .di {font:small Courier}
-      <!-- DOCTYPE declaration -->
-        .d  {color:blue}
-      <!-- pi -->
-        .pi {color:blue}
-      <!-- multi-line (block) comment -->
-        .cb {text-indent:0px; margin-left:1em; margin-top:0px; margin-bottom:0px;
-             padding-left:.3em; font:small Courier; color:#888888}
-      <!-- single-line (inline) comment -->
-        .ci {font:small Courier; color:#888888}
-        PRE {margin:0px; display:inline}
-      </STYLE>
-    </HEAD>
-
-    <BODY class="st"><xsl:apply-templates/></BODY>
-
-  </HTML>
-</xsl:template>
-
-<!-- Templates for each node type follows.  The output of each template has a similar structure
-  to enable script to walk the result tree easily for handling user interaction. -->
-  
-<!-- Template for pis not handled elsewhere -->
-<xsl:template match="processing-instruction()">
-  <DIV class="e">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="m">&lt;?</SPAN><SPAN class="pi"><xsl:value-of select="name(.)"/> <xsl:value-of select="."/></SPAN><SPAN class="m">?&gt;</SPAN>
-  </DIV>
-</xsl:template>
-
-<!-- Template for the XML declaration.  Need a separate template because the pseudo-attributes
-    are actually exposed as attributes instead of just element content, as in other pis 
-<xsl:template match="processing-instruction('xml')">
-  <DIV class="e">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="m">&lt;?</SPAN><SPAN class="pi">xml <xsl:for-each select="@*"><xsl:value-of select="name(.)"/>="<xsl:value-of select="."/>" </xsl:for-each></SPAN><SPAN class="m">?&gt;</SPAN>
-  </DIV>
-</xsl:template>
--->
-
-<!-- Template for attributes not handled elsewhere -->
-<xsl:template match="@*"><SPAN class="t"><xsl:text> </xsl:text><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">="</SPAN><B><xsl:value-of select="."/></B><SPAN class="m">"</SPAN></xsl:template>
-
-<!-- Template for attributes in the xmlns or xml namespace
-<xsl:template match="@xmlns:*|@xmlns|@xml:*"><SPAN class="ns"> <xsl:value-of select="name(.)"/></SPAN><SPAN class="m">="</SPAN><B class="ns"><xsl:value-of select="."/></B><SPAN class="m">"</SPAN></xsl:template>
--->
-
-<!-- Template for text nodes -->
-<xsl:template match="text()">
-  <xsl:choose><xsl:when test="name(.) = '#cdata-section'"><xsl:call-template name="cdata"/></xsl:when>
-  <xsl:otherwise><DIV class="e">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="tx"><xsl:value-of select="."/></SPAN>
-  </DIV></xsl:otherwise></xsl:choose>
-</xsl:template>
-  
-<!-- Template for comment nodes -->
-<xsl:template match="comment()">
-  <DIV class="k">
-  <SPAN><SPAN class="b" STYLE="visibility:hidden">-</SPAN> <SPAN class="m">&lt;!--</SPAN></SPAN>
-  <SPAN class="cb"><PRE><xsl:value-of select="."/></PRE></SPAN>
-  <SPAN class="b">&#160;</SPAN> <SPAN class="m">--&gt;</SPAN>
-  </DIV>
-</xsl:template>
-
-<!-- Template for cdata nodes -->
-<xsl:template name="cdata">
-  <DIV class="k">
-  <SPAN><SPAN class="b" STYLE="visibility:hidden">-</SPAN> <SPAN class="m">&lt;![CDATA[</SPAN></SPAN>
-  <SPAN class="db"><PRE><xsl:value-of select="."/></PRE></SPAN>
-  <SPAN class="b">&#160;</SPAN> <SPAN class="m">]]&gt;</SPAN>
-  </DIV>
-</xsl:template>
-
-<!-- Template for elements not handled elsewhere (leaf nodes) -->
-<xsl:template match="*">
-  <DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
-  <SPAN class="b">&#160;</SPAN>
-  <SPAN class="m">&lt;</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN> <xsl:apply-templates select="@*"/><SPAN class="m"> /&gt;</SPAN>
-  </DIV></DIV>
-</xsl:template>
-  
-<!-- Template for elements with comment, pi and/or cdata children
-<xsl:template match="*[comment() or processing-instruction() or cdata()]">
-  <DIV class="e">
-  <DIV class="c"><A href="#" onclick="return false" onfocus="h()" class="b">-</A> <SPAN class="m">&lt;</SPAN><SPAN><xsl:attribute name="class"><xsl:if test="xsl:*">x</xsl:if>t</xsl:attribute><xsl:value-of select="name(.)"/></SPAN><xsl:apply-templates select="@*"/> <SPAN class="m">&gt;</SPAN></DIV>
-  <DIV><xsl:apply-templates/>
-  <DIV><SPAN class="b">&#160;</SPAN> <SPAN class="m">&lt;/</SPAN><SPAN><xsl:attribute name="class"><xsl:if test="xsl:*">x</xsl:if>t</xsl:attribute><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">&gt;</SPAN></DIV>
-  </DIV></DIV>
-</xsl:template> -->
-
-<!-- Template for elements with only text children -->
-<xsl:template match="*[text() and not(comment() or processing-instruction() or *)]">
-  <DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
-  <SPAN class="b">&#160;</SPAN> <SPAN class="m">&lt;</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><xsl:apply-templates select="@*"/>
-  <SPAN class="m">&gt;</SPAN><SPAN class="tx"><xsl:value-of select="."/></SPAN><SPAN class="m">&lt;/</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">&gt;</SPAN>
-  </DIV></DIV>
-</xsl:template>
-
-<!-- Template for elements with element children -->
-<xsl:template match="*[*]">
-  <DIV class="e">
-  <DIV class="c" STYLE="margin-left:1em;text-indent:-2em"><SPAN class="b">-</SPAN><SPAN class="m">&lt;</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><xsl:apply-templates select="@*"/> <SPAN class="m">&gt;</SPAN></DIV>
-  <DIV><xsl:apply-templates/>
-  <DIV><SPAN class="b">&#160;</SPAN> <SPAN class="m">&lt;/</SPAN><SPAN class="t"><xsl:value-of select="name(.)"/></SPAN><SPAN class="m">&gt;</SPAN></DIV>
-  </DIV></DIV>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/servlet/fooparam.xml b/samples/servlet/fooparam.xml
deleted file mode 100644
index 03c32b5..0000000
--- a/samples/servlet/fooparam.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<doc>Hello</doc>
diff --git a/samples/servlet/fooparam.xsl b/samples/servlet/fooparam.xsl
deleted file mode 100644
index 34d0fce..0000000
--- a/samples/servlet/fooparam.xsl
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  <xsl:param name="param1" select="'default value'"/>
-  <xsl:template match="doc">
-    <html>
-      <head><title>Stylesheet parameter</title></head>
-      <body>
-        <h2>XML source</h2>
-          <p><xsl:value-of select="."/></p>
-        <h2>Stylesheet parameter</h2>
-          <p>The param1 stylesheet parameter has been set to <xsl:value-of select="$param1"/>.</p>
-      </body>
-     </html>          
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/samples/servlet/jspSample.jsp b/samples/servlet/jspSample.jsp
deleted file mode 100644
index 773930c..0000000
--- a/samples/servlet/jspSample.jsp
+++ /dev/null
@@ -1,42 +0,0 @@
-<%@ page language="java" contentType="text/html" %>
-<%@ page import="javax.xml.transform.*"%>
-<%@ page import="javax.xml.transform.stream.*"%>
-<html>
-<head>
-<title>JSP sample passing a parameter to XSL</title>
-</head>
-<body>
-<%
-/**
- * This JSP uses PMA to set param1 in the
-*  foo.xsl stylesheet before using the
- * stylesheet to transform foo.xml
- * and outputing the result.
- *
- * Invoke the jsp from the appropriate
- * context for your servlet/jsp server.
- * For example: http://localhost:8080/samples/jspSample.jsp?HellowWorld!&XML=foo.xml&XSL=foo.xsl
- * This example assumes that foo.xsl and foo.xml
- * are in the same directory. 
- * Output should be Hello (from foo.xsml) and HelloWorld!
- * (value of param1 in foo.xsl).
-
- *@author Paul Campbell seapwc@halcyon.com
- *@version $Id$
- */
- 
-
-String paramValue = request.getParameter("PMA");
-String xmlFile    = request.getParameter("XML");
-String xslFile    = request.getParameter("XSL");
-
-TransformerFactory tFactory = 
-	TransformerFactory.newInstance();
-Transformer transformer =
-	tFactory.newTransformer(new StreamSource(xslFile));
-	transformer.setParameter("param1", paramValue);
-	transformer.transform(
-		 new StreamSource(xmlFile), new StreamResult(out));
-%>
-</body>
-</html>
diff --git a/samples/servlet/media.properties b/samples/servlet/media.properties
deleted file mode 100644
index 1b3cf45..0000000
--- a/samples/servlet/media.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# This property file is used by com.lotus.xsl.server.DefaultApplyXSL.
-#
-# Each line below specifies a mapping rule between a value contained in the HTTP request's user-Agent 
-# field and a value to be scanned for in XSL stylesheet(s) associated with the XML data. This mapping 
-# enables relationships to be defined between client capabilities and stylesheets capable of acting 
-# on these capabilities.
-#
-# The rules defined below are order-significant.  In other words, if the first rule is unsuccessful,
-# the second rule will be tried, etc.  The media value "unknown" will be used when no rules are
-# satisfied.
-#
-# Example: 
-#
-# Mapping rules of...
-#
-#   MSIE=explorer
-#   MSPIE=pocketexplorer
-#
-# ...and XML data that contains XSL stylesheet associations of...
-#
-# <?xml-stylesheet                 media="explorer"       href="alldata.xsl"  type="text/xsl"?>
-# <?xml-stylesheet alternate="yes" media="pocketexplorer" href="somedata.xsl" type="text/xsl"?>
-#
-# ...and an HTTP request that contains a user-Agent value of...
-#    
-#   foo MSPIE bar
-#
-# ...will apply the XSL stylesheet somedata.xsl.
-#
-MSIE=explorer
-MSPIE=pocketexplorer
-HandHTTP=handweb
-Mozilla=netscape
-Lynx=lynx
-Opera=opera
-Java=java
-AvantGo=avantgo
-Nokia=nokia
-UP.Browser=up
-DoCoMo=imode
diff --git a/samples/servlet/readme.html b/samples/servlet/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/servlet/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/translets/JAXPTransletMultipleTransformations.java b/samples/translets/JAXPTransletMultipleTransformations.java
deleted file mode 100644
index 97e4884..0000000
--- a/samples/translets/JAXPTransletMultipleTransformations.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * @author Donald Leslie
- *
- */
-import java.util.Properties;
-import java.io.FileOutputStream;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Templates;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import java.io.IOException;
-import java.io.FileNotFoundException;
-import org.xml.sax.SAXException;
-import javax.xml.parsers.ParserConfigurationException;
-
-
-/**
- * Using the TrAX/JAXP 1.1 interface to compile a translet and use it 
- * to perform multiple transformations. The translet implements 
- * the Templates interface. If you want to use the translet to perform a 
- * single transformation, see JAXPTransletOneTransformation.java.
- * 
- * 
- */
-public class JAXPTransletMultipleTransformations 
-{
- static void doTransform(Templates translet, String xmlInURI, String htmlOutURI)
-        throws TransformerException, FileNotFoundException     
-  {
-    // For each transformation, instantiate a new Transformer, and perform
-    // the transformation from a StreamSource to a StreamResult;
-    Transformer transformer = translet.newTransformer();
-    transformer.transform( new StreamSource(xmlInURI),
-                           new StreamResult(new FileOutputStream(htmlOutURI)));
-  }
-
-  public static void main(String argv[])        
-  { 
-    // Set the TransformerFactory system property to generate and use translets.
-    // Note: To make this sample more flexible, load properties from a properties file.
-    // The setting for the Xalan Transformer is "org.apache.xalan.processor.TransformerFactoryImpl"
-    String key = "javax.xml.transform.TransformerFactory";
-    String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl";
-    Properties props = System.getProperties();
-    props.put(key, value);
-    
-    System.setProperties(props);
-
-    String xslInURI = "todo.xsl";
-    
-    try
-    {
-      // Instantiate the TransformerFactory, and use it along with a SteamSource
-      // XSL stylesheet to create a translet as a Templates object.
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      Templates translet = tFactory.newTemplates(new StreamSource(xslInURI));
-    
-      // Perform each transformation
-      doTransform(translet, "../../xsltc_todo.xml", "todo-xsltc.html");
-      System.out.println("Produced todo-xsltc.html");
-    
-      doTransform(translet, "../../todo.xml", "todo-xalan.html");
-      System.out.println("Produced todo-xalan.html");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-    }    
-  } 
-}
\ No newline at end of file
diff --git a/samples/translets/JAXPTransletOneTransformation.java b/samples/translets/JAXPTransletOneTransformation.java
deleted file mode 100644
index 30e2d4e..0000000
--- a/samples/translets/JAXPTransletOneTransformation.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * @author Donald Leslie
- *
- */
-import java.util.Properties;
-import java.io.FileOutputStream;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Templates;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerConfigurationException;
-import java.io.IOException;
-import java.io.FileNotFoundException;
-import org.xml.sax.SAXException;
-import javax.xml.parsers.ParserConfigurationException;
-
-
-/**
- * Using the TrAX/JAXP 1.1 interface to compile and run a translet. The translet
- * extends the abstract Transformer class and is used to perform a single
- * transformation. If you want to use the translet to perform multiple 
- * transformations, see JAXPTransletMultipleTransformations.java.
- * 
- */
-public class JAXPTransletOneTransformation
-{
-  public static void main(String argv[])
-          throws TransformerException, TransformerConfigurationException, IOException, SAXException,
-                 ParserConfigurationException, FileNotFoundException
-  { 
-    // Set the TransformerFactory system property to generate and use a translet.
-    // Note: To make this sample more flexible, load properties from a properties file.    
-    // The setting for the Xalan Transformer is "org.apache.xalan.processor.TransformerFactoryImpl"
-    String key = "javax.xml.transform.TransformerFactory";
-    String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl";
-    Properties props = System.getProperties();
-    props.put(key, value);
-    System.setProperties(props);    
-
-    String xslInURI = "todo.xsl";
-    String xmlInURI = "../../xsltc_todo.xml";
-    String htmlOutURI = "todo-xsltc.html";
-    try
-    {
-      // Instantiate the TransformerFactory, and use it along with a SteamSource
-      // XSL stylesheet to create a Transformer.
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      Transformer transformer = tFactory.newTransformer(new StreamSource(xslInURI));
-      // Perform the transformation from a StreamSource to a StreamResult;
-      transformer.transform(new StreamSource(xmlInURI),
-                            new StreamResult(new FileOutputStream(htmlOutURI)));  
-      System.out.println("Produced todo-xsltc.html");  
-    }
-    catch (Exception e) 
-    {
-     System.out.println(e.toString());
-     e.printStackTrace();
-    }      
-  }
-}
\ No newline at end of file
diff --git a/samples/translets/readme.html b/samples/translets/readme.html
deleted file mode 100644
index ec8936f..0000000
--- a/samples/translets/readme.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-	<title>Xalan Samples</title>
-</head>
-<body>
-<h2>Xalan Samples</h2>
-<p>For information about the samples (what they illustrate and how to run them), see <a href="../../docs/samples.html">Samples</a>.</p>
-
-
-</body>
-</html>
diff --git a/samples/translets/todo.xsl b/samples/translets/todo.xsl
deleted file mode 100644
index 6ff8cac..0000000
--- a/samples/translets/todo.xsl
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-<xsl:variable name="title" select="concat(todo/@project, ' ', todo/@major-version)"/>
-  <xsl:template match="/">
-    <HTML>
-      <HEAD>
-         <TITLE><xsl:value-of select="$title"/></TITLE>
-      </HEAD>
-      <BODY>
-
-        <H2><xsl:value-of select="concat($title, ': ', todo/@title)"/></H2>
-        <p><font size="-1">See a 
-          <xsl:element name="a">
-            <xsl:attribute name="href">#developer-list</xsl:attribute>
-            <xsl:text>list of developers/initials.</xsl:text>
-          </xsl:element>
-        </font></p>
-        <font size="-1"><p>Planned releases: 
-            <BR/><xsl:for-each select="todo/actions/target-release-description">
-              <xsl:element name="a">
-                <xsl:attribute name="href">#release-date-<xsl:value-of select="date"/></xsl:attribute>
-                <xsl:value-of select="date"/>
-              </xsl:element><xsl:text> </xsl:text><xsl:text> </xsl:text>
-            </xsl:for-each>
-            <xsl:element name="a">
-                <xsl:attribute name="href">#release-date-completed</xsl:attribute>
-                <xsl:text>Completed</xsl:text>
-              </xsl:element>
-
-        </p></font>
-        <xsl:for-each select="todo">
-          <xsl:for-each select="actions">
-              <xsl:for-each select="target-release-description">
-                <p>
-                  <xsl:apply-templates/>
-                </p>
-              </xsl:for-each>
-              <xsl:for-each select="action">
-                <xsl:if test="normalize-space(.)">
-                  <p>
-                   <xsl:number/>) <xsl:apply-templates/>
-                   <xsl:if test="@*">
-                    <BR/>
-                   </xsl:if>
-                   <xsl:apply-templates select="@*"/>
-                  </p>
-                </xsl:if>
-            </xsl:for-each>
-            <HR/>
-          </xsl:for-each>
-
-          <xsl:for-each select="completed">
-              <xsl:element name="a">
-                <xsl:attribute name="name">release-date-completed</xsl:attribute>
-                <H3>Completed: </H3>
-              </xsl:element>
-            <xsl:for-each select="action">
-              <xsl:if test="normalize-space(.)">
-                <p>
-                 <xsl:number/>) <xsl:apply-templates/>
-                 <xsl:if test="@*">
-                  <BR/>
-                 </xsl:if>
-                 <xsl:apply-templates select="@*"/>
-                </p>
-              </xsl:if>
-          </xsl:for-each>
-          <HR/>
-        </xsl:for-each>
-
-        <xsl:call-template name="developer-list"/>
-       </xsl:for-each>
-
-      </BODY>
-    </HTML>
-  </xsl:template>
-
-  <xsl:template match="action/@*">
-  <!-- Add link to the who attributes to corresponding item in developer-list -->
-    <b><xsl:value-of select="name(.)"/>:</b><xsl:text> </xsl:text>
-      <xsl:choose>
-        <xsl:when test="name(.)='who'">
-          <xsl:element name="a">
-            <xsl:attribute name="href">#personref-<xsl:value-of select="."/></xsl:attribute>
-            <xsl:value-of select="."/>
-          </xsl:element>
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:value-of select="."/>
-        </xsl:otherwise>
-      </xsl:choose>
-    <xsl:if test="not (position()=last())">
-      <xsl:text>, </xsl:text>
-    </xsl:if>
-  </xsl:template>
-
-  <xsl:template match="target-release-description/date">
-      <xsl:element name="a">
-        <xsl:attribute name="name">release-date-<xsl:value-of select="."/></xsl:attribute>
-        <b><xsl:text>For release: </xsl:text><xsl:value-of select="."/></b>
-      </xsl:element>
-    
-  </xsl:template>
-
-  <xsl:template match="issue">
-    <BR/><b>Issue </b><xsl:text>[</xsl:text><xsl:value-of select="@id"/>
-    <xsl:text>]: </xsl:text>
-    <xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="target-release-description/level">
-    <xsl:text>, </xsl:text><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="target-release-description/goal">
-    <BR/><b>Goal </b><xsl:text>[</xsl:text><xsl:value-of select="@type"/>
-    <xsl:text>]: </xsl:text>
-    <xsl:apply-templates/>
-  </xsl:template>
-
-
-  <xsl:template name="developer-list">
-    <H3>
-      <xsl:element name="a">
-        <xsl:attribute name="name">developer-list</xsl:attribute>
-        <xsl:text>Developers:</xsl:text>
-      </xsl:element>
-    </H3>
-    <p>A list of some of people currently working on working on <xsl:value-of select="/todo/@project"/>:</p>
-    <ul>
-    <xsl:for-each select="devs/person">
-      <li>
-        <a href="mailto:{@email}">
-          <xsl:value-of select="@name"/>
-        </a>
-         <xsl:element name="a">
-           <xsl:attribute name="name"><xsl:text>personref-</xsl:text><xsl:value-of select="@id"/></xsl:attribute>
-           <xsl:text> (</xsl:text><xsl:value-of select="@id"/><xsl:text>)</xsl:text>
-         </xsl:element>
-         <BR/><xsl:value-of select="."/>
-      </li>
-    </xsl:for-each>
-    </ul>
-  </xsl:template>
-
-</xsl:stylesheet>
diff --git a/samples/trax/ExampleContentHandler.java b/samples/trax/ExampleContentHandler.java
deleted file mode 100644
index 3e308f4..0000000
--- a/samples/trax/ExampleContentHandler.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-import org.xml.sax.ContentHandler;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.Locator;
-
-public class ExampleContentHandler implements ContentHandler
-{
-  public void setDocumentLocator (Locator locator)
-  {
-    System.out.println("setDocumentLocator");
-  }
-
-
-  public void startDocument ()
-    throws SAXException
-  {
-    System.out.println("startDocument");
-  }
-
-
-  public void endDocument()
-    throws SAXException
-  {
-    System.out.println("endDocument");
-  }
-
-
-  public void startPrefixMapping (String prefix, String uri)
-    throws SAXException
-  {
-    System.out.println("startPrefixMapping: "+prefix+", "+uri);
-  }
-
-
-  public void endPrefixMapping (String prefix)
-    throws SAXException
-  {
-    System.out.println("endPrefixMapping: "+prefix);
-  }
-
-
-  public void startElement (String namespaceURI, String localName,
-                            String qName, Attributes atts)
-    throws SAXException
-  {
-    System.out.print("startElement: "+namespaceURI+", "+namespaceURI+
-                       ", "+qName);
-    int n = atts.getLength();
-    for(int i = 0; i < n; i++)
-    {
-      System.out.print(", "+atts.getQName(i));
-    }
-    System.out.println("");
-  }
-
-
-  public void endElement (String namespaceURI, String localName,
-                          String qName)
-    throws SAXException
-  {
-    System.out.println("endElement: "+namespaceURI+", "+namespaceURI+
-                       ", "+qName);
-  }
-
-
-  public void characters (char ch[], int start, int length)
-    throws SAXException
-  {
-    String s = new String(ch, start, (length > 30) ? 30 : length);
-    if(length > 30)
-      System.out.println("characters: \""+s+"\"...");
-    else
-      System.out.println("characters: \""+s+"\"");
-  }
-
-
-  public void ignorableWhitespace (char ch[], int start, int length)
-    throws SAXException
-  {
-    System.out.println("ignorableWhitespace");
-  }
-
-
-  public void processingInstruction (String target, String data)
-    throws SAXException
-  {
-    System.out.println("processingInstruction: "+target+", "+target);
-  }
-
-
-  public void skippedEntity (String name)
-    throws SAXException
-  {
-    System.out.println("skippedEntity: "+name);
-  }
-
-}
diff --git a/samples/trax/Examples.java b/samples/trax/Examples.java
deleted file mode 100644
index 32a5552..0000000
--- a/samples/trax/Examples.java
+++ /dev/null
@@ -1,882 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-import javax.xml.transform.*;
-import javax.xml.transform.sax.*;
-import javax.xml.transform.dom.*;
-import javax.xml.transform.stream.*;
-
-// Needed java classes
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.IOException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-
-import java.util.Properties;
-
-// Needed SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.Parser;
-import org.xml.sax.helpers.ParserAdapter;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.XMLReader;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.ext.DeclHandler;
-
-// Needed DOM classes
-import org.w3c.dom.Node;
-
-// Needed JAXP classes
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import java.io.BufferedInputStream;    // dml
-
-/**
- * Some examples to show how the Simple API for Transformations
- * could be used.
- * 
- * Xalan Developers: please see 
- * xml-xalan/test/java/src/org/apache/qetest/trax/ExamplesTest.java
- * when updating this file, and update that test file as well.
- *
- * @author <a href="mailto:scott_boag@lotus.com">Scott Boag</a>
- */
-public class Examples
-{
-  /**
-   * Method main
-   */
-  public static void main(String argv[])
-          throws TransformerException, TransformerConfigurationException, IOException, SAXException,
-                 ParserConfigurationException, FileNotFoundException
-  {
-    System.out.println("\n\n==== exampleSimple ====");
-    try {
-        exampleSimple1("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleSimple2 (see foo.out) ====");
-    try {
-        exampleSimple2("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleFromStream ====");
-    try {
-        exampleFromStream("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleFromReader ====");
-    try {
-        exampleFromReader("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleUseTemplatesObj ====");
-    try {
-        exampleUseTemplatesObj("xml/foo.xml", "xml/baz.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleContentHandlerToContentHandler ====");
-    try {
-        exampleContentHandlerToContentHandler("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleXMLReader ====");
-    try {
-        exampleXMLReader("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleXMLFilter ====");
-    try {
-        exampleXMLFilter("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleXMLFilterChain ====");
-    try {
-        exampleXMLFilterChain("xml/foo.xml", "xsl/foo.xsl", "xsl/foo2.xsl", "xsl/foo3.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleDOM2DOM ====");
-    try {
-        exampleDOM2DOM("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleParam ====");
-    try {
-        exampleParam("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleTransformerReuse ====");
-    try {
-        exampleTransformerReuse("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleOutputProperties ====");
-    try {
-        exampleOutputProperties("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleUseAssociated ====");
-    try {
-        exampleUseAssociated("xml/foo.xml");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleContentHandler2DOM ====");
-    try {
-        exampleContentHandler2DOM("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleAsSerializer ====");
-    try {
-        exampleAsSerializer("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-    
-    System.out.println("\n\n==== exampleContentHandler2DOM ====");
-    try {
-        exampleContentHandler2DOM("xml/foo.xml", "xsl/foo.xsl");
-    } catch( Exception ex ) { 
-        handleException(ex);
-    } 
-
-    System.out.println("\n==== done! ====");
-  }
-  
-  /**
-   * Show the simplest possible transformation from system id 
-   * to output stream.
-   */
-  public static void exampleSimple1(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException
-  {
-    // Create a transform factory instance.
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    
-    // Create a transformer for the stylesheet.
-    Transformer transformer 
-      = tfactory.newTransformer(new StreamSource(xslID));
-    
-    // Transform the source XML to System.out.
-    transformer.transform( new StreamSource(sourceID),
-                           new StreamResult(System.out));
-  }
-  
-  /**
-   * Show the simplest possible transformation from File 
-   * to a File.
-   */
-  public static void exampleSimple2(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException
-  {
-    // Create a transform factory instance.
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    
-    // Create a transformer for the stylesheet.
-    Transformer transformer 
-      = tfactory.newTransformer(new StreamSource(xslID));
-    
-    // Transform the source XML to foo.out.
-    transformer.transform( new StreamSource(new File(sourceID)),
-                           new StreamResult(new File("foo.out")));
-  }
-
-  
-  /**
-   * Show simple transformation from input stream to output stream.
-   */
-  public static void exampleFromStream(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException,
-           FileNotFoundException
-  {
-    // Create a transform factory instance.
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    InputStream xslIS = new BufferedInputStream(new FileInputStream(xslID));
-    StreamSource xslSource = new StreamSource(xslIS);
-    // Note that if we don't do this, relative URLs can not be resolved correctly!
-    xslSource.setSystemId(xslID);
-
-    // Create a transformer for the stylesheet.
-    Transformer transformer = tfactory.newTransformer(xslSource);
-    
-    InputStream xmlIS = new BufferedInputStream(new FileInputStream(sourceID));
-    StreamSource xmlSource = new StreamSource(xmlIS);
-    // Note that if we don't do this, relative URLs can not be resolved correctly!
-    xmlSource.setSystemId(sourceID);
-    
-    // Transform the source XML to System.out.
-    transformer.transform( xmlSource, new StreamResult(System.out));
-  }
-  
-  /**
-   * Show simple transformation from reader to output stream.  In general 
-   * this use case is discouraged, since the XML encoding can not be 
-   * processed.
-   */
-  public static void exampleFromReader(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException,
-           FileNotFoundException
-  {
-    // Create a transform factory instance.
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    // Note that in this case the XML encoding can not be processed!
-    Reader xslReader = new BufferedReader(new FileReader(xslID));
-    StreamSource xslSource = new StreamSource(xslReader);
-    // Note that if we don't do this, relative URLs can not be resolved correctly!
-    xslSource.setSystemId(xslID);
-
-    // Create a transformer for the stylesheet.
-    Transformer transformer = tfactory.newTransformer(xslSource);
-    
-    // Note that in this case the XML encoding can not be processed!
-    Reader xmlReader = new BufferedReader(new FileReader(sourceID));
-    StreamSource xmlSource = new StreamSource(xmlReader);
-    // Note that if we don't do this, relative URLs can not be resolved correctly!
-    xmlSource.setSystemId(sourceID);
-    
-    // Transform the source XML to System.out.
-    transformer.transform( xmlSource, new StreamResult(System.out));
-  }
-
-
- 
-  /**
-   * Show the simplest possible transformation from system id to output stream.
-   */
-  public static void exampleUseTemplatesObj(String sourceID1, 
-                                    String sourceID2, 
-                                    String xslID)
-          throws TransformerException, TransformerConfigurationException
-  {
-
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    
-    // Create a templates object, which is the processed, 
-    // thread-safe representation of the stylesheet.
-    Templates templates = tfactory.newTemplates(new StreamSource(xslID));
-
-    // Illustrate the fact that you can make multiple transformers 
-    // from the same template.
-    Transformer transformer1 = templates.newTransformer();
-    Transformer transformer2 = templates.newTransformer();
-    
-    System.out.println("\n\n----- transform of "+sourceID1+" -----");
-    
-    transformer1.transform(new StreamSource(sourceID1),
-                          new StreamResult(System.out));
-    
-    System.out.println("\n\n----- transform of "+sourceID2+" -----");
-    
-    transformer2.transform(new StreamSource(sourceID2),
-                          new StreamResult(System.out));
-  }
-  
-
-
-  /**
-   * Show the Transformer using SAX events in and SAX events out.
-   */
-  public static void exampleContentHandlerToContentHandler(String sourceID, 
-                                                           String xslID)
-          throws TransformerException, 
-                 TransformerConfigurationException, 
-                 SAXException, IOException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    // Does this factory support SAX features?
-    if (tfactory.getFeature(SAXSource.FEATURE))
-    {
-      // If so, we can safely cast.
-      SAXTransformerFactory stfactory = ((SAXTransformerFactory) tfactory);
-      
-      // A TransformerHandler is a ContentHandler that will listen for 
-      // SAX events, and transform them to the result.
-      TransformerHandler handler 
-        = stfactory.newTransformerHandler(new StreamSource(xslID));
-
-      // Set the result handling to be a serialization to System.out.
-      Result result = new SAXResult(new ExampleContentHandler());
-      handler.setResult(result);
-      
-      // Create a reader, and set it's content handler to be the TransformerHandler.
-      XMLReader reader=null;
-
-      // Use JAXP1.1 ( if possible )
-      try {
-	  javax.xml.parsers.SAXParserFactory factory=
-	      javax.xml.parsers.SAXParserFactory.newInstance();
-	  factory.setNamespaceAware( true );
-	  javax.xml.parsers.SAXParser jaxpParser=
-	      factory.newSAXParser();
-	  reader=jaxpParser.getXMLReader();
-	  
-      } catch( javax.xml.parsers.ParserConfigurationException ex ) {
-	  throw new org.xml.sax.SAXException( ex );
-      } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {
-	  throw new org.xml.sax.SAXException( ex1.toString() );
-      } catch( NoSuchMethodError ex2 ) {
-      }
-      if( reader==null ) reader = XMLReaderFactory.createXMLReader();
-      reader.setContentHandler(handler);
-      
-      // It's a good idea for the parser to send lexical events.
-      // The TransformerHandler is also a LexicalHandler.
-      reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
-      
-      // Parse the source XML, and send the parse events to the TransformerHandler.
-      reader.parse(sourceID);
-    }
-    else
-    {
-      System.out.println(
-        "Can't do exampleContentHandlerToContentHandler because tfactory is not a SAXTransformerFactory");
-    }
-  }
-  
-  /**
-   * Show the Transformer as a SAX2 XMLReader.  An XMLFilter obtained 
-   * from newXMLFilter should act as a transforming XMLReader if setParent is not
-   * called.  Internally, an XMLReader is created as the parent for the XMLFilter.
-   */
-  public static void exampleXMLReader(String sourceID, String xslID)
-          throws TransformerException, TransformerConfigurationException, SAXException, IOException    // , ParserConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    if(tfactory.getFeature(SAXSource.FEATURE))
-    {
-      XMLReader reader 
-        = ((SAXTransformerFactory) tfactory).newXMLFilter(new StreamSource(xslID));
-      
-      reader.setContentHandler(new ExampleContentHandler());
-
-      reader.parse(new InputSource(sourceID));
-    }
-    else
-      System.out.println("tfactory does not support SAX features!");
-  }
-
-  /**
-   * Show the Transformer as a simple XMLFilter.  This is pretty similar
-   * to exampleXMLReader, except that here the parent XMLReader is created 
-   * by the caller, instead of automatically within the XMLFilter.  This 
-   * gives the caller more direct control over the parent reader.
-   */
-  public static void exampleXMLFilter(String sourceID, String xslID)
-          throws TransformerException, TransformerConfigurationException, SAXException, IOException    // , ParserConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    XMLReader reader=null;
-    
-    // Use JAXP1.1 ( if possible )
-    try {
-	javax.xml.parsers.SAXParserFactory factory=
-	    javax.xml.parsers.SAXParserFactory.newInstance();
-	  factory.setNamespaceAware( true );
-	  javax.xml.parsers.SAXParser jaxpParser=
-	    factory.newSAXParser();
-	reader=jaxpParser.getXMLReader();
-	
-    } catch( javax.xml.parsers.ParserConfigurationException ex ) {
-	throw new org.xml.sax.SAXException( ex );
-    } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {
-	throw new org.xml.sax.SAXException( ex1.toString() );
-    } catch( NoSuchMethodError ex2 ) {
-    }
-    if( reader==null ) reader = XMLReaderFactory.createXMLReader();
-    // The transformer will use a SAX parser as it's reader.    
-    reader.setContentHandler(new ExampleContentHandler());
-    try
-    {
-      reader.setFeature("http://xml.org/sax/features/namespace-prefixes",
-                        true);
-      reader.setFeature("http://apache.org/xml/features/validation/dynamic",
-                        true);
-    }
-    catch (SAXException se)
-    {
-
-      // What can we do?
-      // TODO: User diagnostics.
-    }
-
-    XMLFilter filter 
-      = ((SAXTransformerFactory) tfactory).newXMLFilter(new StreamSource(xslID));
-
-    filter.setParent(reader);
-
-    // Now, when you call transformer.parse, it will set itself as 
-    // the content handler for the parser object (it's "parent"), and 
-    // will then call the parse method on the parser.
-    filter.parse(new InputSource(sourceID));
-  }
-
-  /**
-   * This example shows how to chain events from one Transformer
-   * to another transformer, using the Transformer as a
-   * SAX2 XMLFilter/XMLReader.
-   */
-  public static void exampleXMLFilterChain(
-                                           String sourceID, String xslID_1, 
-                                           String xslID_2, String xslID_3)
-    throws TransformerException, TransformerConfigurationException, SAXException, IOException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    
-    Templates stylesheet1 = tfactory.newTemplates(new StreamSource(xslID_1));
-    Transformer transformer1 = stylesheet1.newTransformer();
-    
-     // If one success, assume all will succeed.
-    if (tfactory.getFeature(SAXSource.FEATURE))
-    {
-      SAXTransformerFactory stf = (SAXTransformerFactory)tfactory;
-      XMLReader reader=null;
-
-      // Use JAXP1.1 ( if possible )
-      try {
-	  javax.xml.parsers.SAXParserFactory factory=
-	      javax.xml.parsers.SAXParserFactory.newInstance();
-	  factory.setNamespaceAware( true );
-	  javax.xml.parsers.SAXParser jaxpParser=
-	      factory.newSAXParser();
-	  reader=jaxpParser.getXMLReader();
-	  
-      } catch( javax.xml.parsers.ParserConfigurationException ex ) {
-	  throw new org.xml.sax.SAXException( ex );
-      } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {
-	  throw new org.xml.sax.SAXException( ex1.toString() );
-      } catch( NoSuchMethodError ex2 ) {
-      }
-      if( reader==null ) reader = XMLReaderFactory.createXMLReader();
-
-      XMLFilter filter1 = stf.newXMLFilter(new StreamSource(xslID_1));
-      XMLFilter filter2 = stf.newXMLFilter(new StreamSource(xslID_2));
-      XMLFilter filter3 = stf.newXMLFilter(new StreamSource(xslID_3));
-
-      if (null != filter1) // If one success, assume all were success.
-      {
-        // transformer1 will use a SAX parser as it's reader.    
-        filter1.setParent(reader);
-
-        // transformer2 will use transformer1 as it's reader.
-        filter2.setParent(filter1);
-
-        // transform3 will use transform2 as it's reader.
-        filter3.setParent(filter2);
-
-        filter3.setContentHandler(new ExampleContentHandler());
-        // filter3.setContentHandler(new org.xml.sax.helpers.DefaultHandler());
-
-        // Now, when you call transformer3 to parse, it will set  
-        // itself as the ContentHandler for transform2, and 
-        // call transform2.parse, which will set itself as the 
-        // content handler for transform1, and call transform1.parse, 
-        // which will set itself as the content listener for the 
-        // SAX parser, and call parser.parse(new InputSource("xml/foo.xml")).
-        filter3.parse(new InputSource(sourceID));
-      }
-      else
-      {
-        System.out.println(
-                           "Can't do exampleXMLFilter because "+
-                           "tfactory doesn't support asXMLFilter()");
-      }
-    }
-    else
-    {
-      System.out.println(
-                         "Can't do exampleXMLFilter because "+
-                         "tfactory is not a SAXTransformerFactory");
-    }
-  }
-
-  /**
-   * Show how to transform a DOM tree into another DOM tree.
-   * This uses the javax.xml.parsers to parse an XML file into a
-   * DOM, and create an output DOM.
-   */
-  public static Node exampleDOM2DOM(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException, SAXException, IOException,
-    ParserConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    if (tfactory.getFeature(DOMSource.FEATURE))
-    {
-      Templates templates;
-
-      {
-        DocumentBuilderFactory dfactory =
-          DocumentBuilderFactory.newInstance();
-        dfactory.setNamespaceAware(true);
-        DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-        org.w3c.dom.Document outNode = docBuilder.newDocument();
-        Node doc = docBuilder.parse(new InputSource(xslID));
- 
-        DOMSource dsource = new DOMSource(doc);
-        // If we don't do this, the transformer won't know how to 
-        // resolve relative URLs in the stylesheet.
-        dsource.setSystemId(xslID);
-
-        templates = tfactory.newTemplates(dsource);
-      }
-
-      Transformer transformer = templates.newTransformer();
-      DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-      // Note you must always setNamespaceAware when building .xsl stylesheets
-      dfactory.setNamespaceAware(true);
-      DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-      org.w3c.dom.Document outNode = docBuilder.newDocument();
-      Node doc = docBuilder.parse(new InputSource(sourceID));
-
-      transformer.transform(new DOMSource(doc), new DOMResult(outNode));
-      
-      Transformer serializer = tfactory.newTransformer();
-      serializer.transform(new DOMSource(outNode), new StreamResult(System.out));
-
-      return outNode;
-    }
-    else
-    {
-      throw new org.xml.sax
-        .SAXNotSupportedException("DOM node processing not supported!");
-    }
-  } 
-
-  /**
-   * This shows how to set a parameter for use by the templates. Use 
-   * two transformers to show that different parameters may be set 
-   * on different transformers.
-   */
-  public static void exampleParam(String sourceID, 
-                                  String xslID)
-    throws TransformerException, TransformerConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    Templates templates = tfactory.newTemplates(new StreamSource(xslID));
-    Transformer transformer1 = templates.newTransformer();
-    Transformer transformer2 = templates.newTransformer();
-
-    transformer1.setParameter("a-param",
-                              "hello to you!");
-    transformer1.transform(new StreamSource(sourceID),
-                           new StreamResult(System.out));
-    
-    System.out.println("\n=========");
-    
-    transformer2.setOutputProperty(OutputKeys.INDENT, "yes");
-    transformer2.transform(new StreamSource(sourceID),
-                           new StreamResult(System.out));
-  }
-  
-  /**
-   * Show the that a transformer can be reused, and show resetting 
-   * a parameter on the transformer.
-   */
-  public static void exampleTransformerReuse(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException
-  {
-    // Create a transform factory instance.
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    
-    // Create a transformer for the stylesheet.
-    Transformer transformer 
-      = tfactory.newTransformer(new StreamSource(xslID));
-    
-    transformer.setParameter("a-param",
-                              "hello to you!");
-    
-    // Transform the source XML to System.out.
-    transformer.transform( new StreamSource(sourceID),
-                           new StreamResult(System.out));
-
-    System.out.println("\n=========\n");
-
-    transformer.setParameter("a-param",
-                              "hello to me!");
-    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-
-    // Transform the source XML to System.out.
-    transformer.transform( new StreamSource(sourceID),
-                           new StreamResult(System.out));
-  }
-
-  /**
-   * Show how to override output properties.
-   */
-  public static void exampleOutputProperties(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException
-  {
-
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-    Templates templates = tfactory.newTemplates(new StreamSource(xslID));
-    Properties oprops = templates.getOutputProperties();
-
-    oprops.put(OutputKeys.INDENT, "yes");
-
-    Transformer transformer = templates.newTransformer();
-
-    transformer.setOutputProperties(oprops);
-    transformer.transform(new StreamSource(sourceID),
-                          new StreamResult(System.out));
-  }
-
-  /**
-   * Show how to get stylesheets that are associated with a given
-   * xml document via the xml-stylesheet PI (see http://www.w3.org/TR/xml-stylesheet/).
-   */
-  public static void exampleUseAssociated(String sourceID)
-    throws TransformerException, TransformerConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    // The DOM tfactory will have it's own way, based on DOM2, 
-    // of getting associated stylesheets.
-    if (tfactory instanceof SAXTransformerFactory)
-    {
-      SAXTransformerFactory stf = ((SAXTransformerFactory) tfactory);
-      Source sources =
-        stf.getAssociatedStylesheet(new StreamSource(sourceID),
-          null, null, null);
-
-      if(null != sources)
-      {
-        Transformer transformer = tfactory.newTransformer(sources);
-
-        transformer.transform(new StreamSource(sourceID),
-                              new StreamResult(System.out));
-      }
-      else
-      {
-        System.out.println("Can't find the associated stylesheet!");
-      }
-    }
-  }
-  
-  /**
-   * Show the Transformer using SAX events in and DOM nodes out.
-   */
-  public static void exampleContentHandler2DOM(String sourceID, String xslID)
-          throws TransformerException, TransformerConfigurationException, SAXException, IOException, ParserConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance();
-
-    // Make sure the transformer factory we obtained supports both
-    // DOM and SAX.
-    if (tfactory.getFeature(SAXSource.FEATURE)
-        && tfactory.getFeature(DOMSource.FEATURE))
-    {
-      // We can now safely cast to a SAXTransformerFactory.
-      SAXTransformerFactory sfactory = (SAXTransformerFactory) tfactory;
-      
-      // Create an Document node as the root for the output.
-      DocumentBuilderFactory dfactory 
-        = DocumentBuilderFactory.newInstance();
-      DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-      org.w3c.dom.Document outNode = docBuilder.newDocument();
-      
-      // Create a ContentHandler that can liston to SAX events 
-      // and transform the output to DOM nodes.
-      TransformerHandler handler 
-        = sfactory.newTransformerHandler(new StreamSource(xslID));
-      handler.setResult(new DOMResult(outNode));
-      
-      // Create a reader and set it's ContentHandler to be the 
-      // transformer.
-      XMLReader reader=null;
-
-      // Use JAXP1.1 ( if possible )
-      try {
-	  javax.xml.parsers.SAXParserFactory factory=
-	      javax.xml.parsers.SAXParserFactory.newInstance();
-	  factory.setNamespaceAware( true );
-	  javax.xml.parsers.SAXParser jaxpParser=
-	      factory.newSAXParser();
-	  reader=jaxpParser.getXMLReader();
-	  
-      } catch( javax.xml.parsers.ParserConfigurationException ex ) {
-	  throw new org.xml.sax.SAXException( ex );
-      } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {
-	  throw new org.xml.sax.SAXException( ex1.toString() );
-      } catch( NoSuchMethodError ex2 ) {
-      }
-      if( reader==null ) reader= XMLReaderFactory.createXMLReader();
-      reader.setContentHandler(handler);
-      reader.setProperty("http://xml.org/sax/properties/lexical-handler",
-                         handler);
-      
-      // Send the SAX events from the parser to the transformer,
-      // and thus to the DOM tree.
-      reader.parse(sourceID);
-      
-      // Serialize the node for diagnosis.
-      exampleSerializeNode(outNode);
-    }
-    else
-    {
-      System.out.println(
-        "Can't do exampleContentHandlerToContentHandler because tfactory is not a SAXTransformerFactory");
-    }
-  }
-  
-  /**
-   * Serialize a node to System.out.
-   */
-  public static void exampleSerializeNode(Node node)
-    throws TransformerException, TransformerConfigurationException, SAXException, IOException,
-    ParserConfigurationException
-  {
-    TransformerFactory tfactory = TransformerFactory.newInstance(); 
-    
-    // This creates a transformer that does a simple identity transform, 
-    // and thus can be used for all intents and purposes as a serializer.
-    Transformer serializer = tfactory.newTransformer();
-    
-    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
-    serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-    serializer.transform(new DOMSource(node), 
-                         new StreamResult(System.out));
-  }  
-  
-  /**
-   * A fuller example showing how the TrAX interface can be used 
-   * to serialize a DOM tree.
-   */
-  public static void exampleAsSerializer(String sourceID, String xslID)
-    throws TransformerException, TransformerConfigurationException, SAXException, IOException,
-    ParserConfigurationException
-  {
-    DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-    DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-    org.w3c.dom.Document outNode = docBuilder.newDocument();
-    Node doc = docBuilder.parse(new InputSource(sourceID));
-
-    TransformerFactory tfactory = TransformerFactory.newInstance(); 
-    
-    // This creates a transformer that does a simple identity transform, 
-    // and thus can be used for all intents and purposes as a serializer.
-    Transformer serializer = tfactory.newTransformer();
-    
-    Properties oprops = new Properties();
-    oprops.put("method", "html");
-    oprops.put("indent-amount", "2");
-    serializer.setOutputProperties(oprops);
-    serializer.transform(new DOMSource(doc), 
-                         new StreamResult(System.out));
-  }
-  
-
-  private static void  handleException( Exception ex ) {
-    System.out.println("EXCEPTION: " );
-    ex.printStackTrace();
-    
-    if( ex instanceof TransformerConfigurationException ) {
-      System.out.println();
-      System.out.println("Internal exception: " );
-      Throwable ex1=((TransformerConfigurationException)ex).getException();
-      ex1.printStackTrace();
-
-      if( ex1 instanceof SAXException ) {
-	  Exception ex2=((SAXException)ex1).getException();
-	  System.out.println("Internal sub-exception: " );
-	  ex2.printStackTrace();
-      }
-    }
-  }
-
-}
diff --git a/samples/trax/xml/baz.xml b/samples/trax/xml/baz.xml
deleted file mode 100644
index 9ecf473..0000000
--- a/samples/trax/xml/baz.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version='1.0'?>
-<foo:document 
-		  xmlns:foo="http://apache.org/foo"
-		  xmlns:bar="http://apache.org/bar">
-<bar:element>MyBaz</bar:element>
-</foo:document>
\ No newline at end of file
diff --git a/samples/trax/xml/foo.xml b/samples/trax/xml/foo.xml
deleted file mode 100644
index 79597ab..0000000
--- a/samples/trax/xml/foo.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0'?>
-<?xml-stylesheet type="text/xsl" href="../xsl/foo.xsl"?>
-<foo:document 
-		  xmlns:foo="http://apache.org/foo"
-		  xmlns:bar="http://apache.org/bar"
-		  file-name="test"
-         file-path="work"
-		  creation-date="971255692078">
-<bar:element>MyBar</bar:element>
-</foo:document>
\ No newline at end of file
diff --git a/samples/trax/xml/subdir1/foo2.xml b/samples/trax/xml/subdir1/foo2.xml
deleted file mode 100644
index 5708ae4..0000000
--- a/samples/trax/xml/subdir1/foo2.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version='1.0'?>
-<doc>text in foo2.xml</doc>
\ No newline at end of file
diff --git a/samples/trax/xml/subdir1/subdir2/foo3.xml b/samples/trax/xml/subdir1/subdir2/foo3.xml
deleted file mode 100644
index 77da1f0..0000000
--- a/samples/trax/xml/subdir1/subdir2/foo3.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version='1.0'?>
-<doc>text in foo3.xml</doc>
\ No newline at end of file
diff --git a/samples/trax/xsl/baz.xsl b/samples/trax/xsl/baz.xsl
deleted file mode 100644
index c1843b3..0000000
--- a/samples/trax/xsl/baz.xsl
+++ /dev/null
@@ -1,18 +0,0 @@
-<xsl:stylesheet 
-      xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
-    
-  <!-- same as foo.xsl but doesn't include the param because of a bug -->  
-  <xsl:template match="/">
-    <out>
-      <xsl:apply-templates/>
-    </out>
-  </xsl:template>
-      
-  <xsl:template 
-      match="@*|*|text()|processing-instruction()">
-    <xsl:copy>
-      <xsl:apply-templates 
-         select="@*|*|text()|processing-instruction()"/>
-    </xsl:copy>
-  </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/trax/xsl/foo.xsl b/samples/trax/xsl/foo.xsl
deleted file mode 100644
index b13b945..0000000
--- a/samples/trax/xsl/foo.xsl
+++ /dev/null
@@ -1,27 +0,0 @@
-<xsl:stylesheet 
-      xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'
-      xmlns:bar="http://apache.org/bar"
-      exclude-result-prefixes="bar">
-      
-  <xsl:include href="inc1/inc1.xsl"/>
-      
-  <xsl:param name="a-param">default param value</xsl:param>
-  
-  <xsl:template match="bar:element">
-    <bar>
-      <param-val>
-        <xsl:value-of select="$a-param"/><xsl:text>, </xsl:text>
-        <xsl:value-of select="$my-var"/>
-      </param-val>
-      <data><xsl:apply-templates/></data>
-    </bar>
-  </xsl:template>
-      
-  <xsl:template 
-      match="@*|*|text()|processing-instruction()">
-    <xsl:copy>
-      <xsl:apply-templates 
-         select="@*|*|text()|processing-instruction()"/>
-    </xsl:copy>
-  </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/trax/xsl/foo2.xsl b/samples/trax/xsl/foo2.xsl
deleted file mode 100644
index b04f5f0..0000000
--- a/samples/trax/xsl/foo2.xsl
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
-                xmlns:bar="http://apache.org/bar">
-  
-  <xsl:template match="bar">
-    <out>
-      <xsl:value-of select="."/>
-    </out>
-  </xsl:template>
-  
-  <xsl:template match="text()">
-  </xsl:template>  
- 
-</xsl:stylesheet>
diff --git a/samples/trax/xsl/foo3.xsl b/samples/trax/xsl/foo3.xsl
deleted file mode 100644
index a1bf42a..0000000
--- a/samples/trax/xsl/foo3.xsl
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?> 
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-  
-  <xsl:template match="out">
-    <out>
-      <xsl:apply-templates/>
-    </out>
-  </xsl:template>
-  
-  <xsl:template match="text()">
-    <some-text><xsl:value-of select="."/></some-text>
-  </xsl:template>  
-   
-</xsl:stylesheet>
diff --git a/samples/trax/xsl/inc1/inc1.xsl b/samples/trax/xsl/inc1/inc1.xsl
deleted file mode 100644
index 04ebb25..0000000
--- a/samples/trax/xsl/inc1/inc1.xsl
+++ /dev/null
@@ -1,6 +0,0 @@
-<xsl:stylesheet 
-      xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
-      
-  <xsl:include href="inc2/inc2.xsl"/>
-  
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/samples/trax/xsl/inc1/inc2/inc2.xsl b/samples/trax/xsl/inc1/inc2/inc2.xsl
deleted file mode 100644
index 36728eb..0000000
--- a/samples/trax/xsl/inc1/inc2/inc2.xsl
+++ /dev/null
@@ -1,4 +0,0 @@
-<xsl:stylesheet 
-      xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
-  <xsl:variable name="my-var" select="'text from my-var in inc2.xsl'"/>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/trax/trax.properties b/src/trax/trax.properties
deleted file mode 100644
index e593c39..0000000
--- a/src/trax/trax.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# $Revision$ $Date$
-#
-# Note: This properties file is provided for illustrative purposes
-#       only and is not part of the interface definition.
-#       This properties file is located in the implementation JAR
-#       and different implementations will specify different
-#       implementation classes and output methods.
-#
-
-# The TRaX Stylesheet processor
-trax.processor.xslt=org.apache.xalan.processor.StylesheetProcessor
diff --git a/todo.xsl b/todo.xsl
deleted file mode 100644
index 6ff8cac..0000000
--- a/todo.xsl
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-<xsl:variable name="title" select="concat(todo/@project, ' ', todo/@major-version)"/>
-  <xsl:template match="/">
-    <HTML>
-      <HEAD>
-         <TITLE><xsl:value-of select="$title"/></TITLE>
-      </HEAD>
-      <BODY>
-
-        <H2><xsl:value-of select="concat($title, ': ', todo/@title)"/></H2>
-        <p><font size="-1">See a 
-          <xsl:element name="a">
-            <xsl:attribute name="href">#developer-list</xsl:attribute>
-            <xsl:text>list of developers/initials.</xsl:text>
-          </xsl:element>
-        </font></p>
-        <font size="-1"><p>Planned releases: 
-            <BR/><xsl:for-each select="todo/actions/target-release-description">
-              <xsl:element name="a">
-                <xsl:attribute name="href">#release-date-<xsl:value-of select="date"/></xsl:attribute>
-                <xsl:value-of select="date"/>
-              </xsl:element><xsl:text> </xsl:text><xsl:text> </xsl:text>
-            </xsl:for-each>
-            <xsl:element name="a">
-                <xsl:attribute name="href">#release-date-completed</xsl:attribute>
-                <xsl:text>Completed</xsl:text>
-              </xsl:element>
-
-        </p></font>
-        <xsl:for-each select="todo">
-          <xsl:for-each select="actions">
-              <xsl:for-each select="target-release-description">
-                <p>
-                  <xsl:apply-templates/>
-                </p>
-              </xsl:for-each>
-              <xsl:for-each select="action">
-                <xsl:if test="normalize-space(.)">
-                  <p>
-                   <xsl:number/>) <xsl:apply-templates/>
-                   <xsl:if test="@*">
-                    <BR/>
-                   </xsl:if>
-                   <xsl:apply-templates select="@*"/>
-                  </p>
-                </xsl:if>
-            </xsl:for-each>
-            <HR/>
-          </xsl:for-each>
-
-          <xsl:for-each select="completed">
-              <xsl:element name="a">
-                <xsl:attribute name="name">release-date-completed</xsl:attribute>
-                <H3>Completed: </H3>
-              </xsl:element>
-            <xsl:for-each select="action">
-              <xsl:if test="normalize-space(.)">
-                <p>
-                 <xsl:number/>) <xsl:apply-templates/>
-                 <xsl:if test="@*">
-                  <BR/>
-                 </xsl:if>
-                 <xsl:apply-templates select="@*"/>
-                </p>
-              </xsl:if>
-          </xsl:for-each>
-          <HR/>
-        </xsl:for-each>
-
-        <xsl:call-template name="developer-list"/>
-       </xsl:for-each>
-
-      </BODY>
-    </HTML>
-  </xsl:template>
-
-  <xsl:template match="action/@*">
-  <!-- Add link to the who attributes to corresponding item in developer-list -->
-    <b><xsl:value-of select="name(.)"/>:</b><xsl:text> </xsl:text>
-      <xsl:choose>
-        <xsl:when test="name(.)='who'">
-          <xsl:element name="a">
-            <xsl:attribute name="href">#personref-<xsl:value-of select="."/></xsl:attribute>
-            <xsl:value-of select="."/>
-          </xsl:element>
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:value-of select="."/>
-        </xsl:otherwise>
-      </xsl:choose>
-    <xsl:if test="not (position()=last())">
-      <xsl:text>, </xsl:text>
-    </xsl:if>
-  </xsl:template>
-
-  <xsl:template match="target-release-description/date">
-      <xsl:element name="a">
-        <xsl:attribute name="name">release-date-<xsl:value-of select="."/></xsl:attribute>
-        <b><xsl:text>For release: </xsl:text><xsl:value-of select="."/></b>
-      </xsl:element>
-    
-  </xsl:template>
-
-  <xsl:template match="issue">
-    <BR/><b>Issue </b><xsl:text>[</xsl:text><xsl:value-of select="@id"/>
-    <xsl:text>]: </xsl:text>
-    <xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="target-release-description/level">
-    <xsl:text>, </xsl:text><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="target-release-description/goal">
-    <BR/><b>Goal </b><xsl:text>[</xsl:text><xsl:value-of select="@type"/>
-    <xsl:text>]: </xsl:text>
-    <xsl:apply-templates/>
-  </xsl:template>
-
-
-  <xsl:template name="developer-list">
-    <H3>
-      <xsl:element name="a">
-        <xsl:attribute name="name">developer-list</xsl:attribute>
-        <xsl:text>Developers:</xsl:text>
-      </xsl:element>
-    </H3>
-    <p>A list of some of people currently working on working on <xsl:value-of select="/todo/@project"/>:</p>
-    <ul>
-    <xsl:for-each select="devs/person">
-      <li>
-        <a href="mailto:{@email}">
-          <xsl:value-of select="@name"/>
-        </a>
-         <xsl:element name="a">
-           <xsl:attribute name="name"><xsl:text>personref-</xsl:text><xsl:value-of select="@id"/></xsl:attribute>
-           <xsl:text> (</xsl:text><xsl:value-of select="@id"/><xsl:text>)</xsl:text>
-         </xsl:element>
-         <BR/><xsl:value-of select="."/>
-      </li>
-    </xsl:for-each>
-    </ul>
-  </xsl:template>
-
-</xsl:stylesheet>
diff --git a/trax_bugs.xml b/trax_bugs.xml
deleted file mode 100644
index cb6f9c5..0000000
--- a/trax_bugs.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0"?>
-<?xm-well_formed path="E:\xml-xalan\java\bugs.dtd"?>
-<!-- This should contain *only* SPRs (Software Problem Reports) for the TrAX API 
-     interfaces and classes. -->
-<Sprs><Spr><Name>TRAXSPR0001</Name>
-<DateCreated>11/15/2000</DateCreated>
-<State>Open</State>
-<TestDesc>SAXTransformerFactoty#FEATURE should document support for all TransformerFactories.</TestDesc><Details><![CDATA[In SAXTransformerFactoty:
-
-    /** If {@link javax.xml.transform.TransformerFactory#getFeature}
-     * returns true when passed this value as an argument,
-     * the TransformerFactory returned from
-     * {@link javax.xml.transform.TransformerFactory#newInstance} may
-     * be safely cast to a SAXTransformerFactory.
-     */
-    public static final String FEATURE =
-
-I propose you remove the phrase "returned from
-TransforerFactory.newInstance". Isn't the intent that feature testing
-can be done on all TransformerFactories, regardless how they are
-created? It can be like this instead:
-
-    /** If {@link javax.xml.transform.TransformerFactory#getFeature}
-     * returns true when passed this value as an argument,
-     * the TransformerFactory can be safely cast to a
-     * SAXTransformerFactory.
-     */]]></Details></Spr><Spr><Name>TRAXSPR0002</Name>
-<DateCreated>11/15/2000</DateCreated>
-<State>Open</State>
-<TestDesc>OutputKeys#method should document qname instead of qname-but-not-ncname</TestDesc><Details><![CDATA[In OutputKeys:
-
-    /**
-     * method = "xml" | "html" | "text" | <var>qname-but-not-ncname</var>.
-     *
-     * <p>The method attribute identifies the overall method that
-     * should be used for outputting the result tree.  Other
-     * non-namespaced values may be used,
-
-This is contradictary, change "qname-but-not-ncname" to "qname".]]></Details></Spr>
-<Spr><Name>TRAXSPR0003</Name>
-<DateCreated>11/15/2000</DateCreated>
-<State>Open</State>
-<TestDesc></TestDesc><Details><![CDATA[]]></Details></Spr>
-<Spr><Name>TRAXSPR0004</Name>
-<DateCreated>11/15/2000</DateCreated>
-<State>Open</State>
-<TestDesc></TestDesc><Details><![CDATA[]]></Details></Spr>
-<Spr><Name>TRAXSPR0005</Name>
-<DateCreated>11/15/2000</DateCreated>
-<State>Open</State>
-<TestDesc></TestDesc><Details><![CDATA[]]></Details></Spr>
-
-</Sprs>
diff --git a/xdocs/sources/design/compilation.gif b/xdocs/sources/design/compilation.gif
deleted file mode 100644
index 675d7d4..0000000
--- a/xdocs/sources/design/compilation.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/conceptual.gif b/xdocs/sources/design/conceptual.gif
deleted file mode 100644
index 283fee5..0000000
--- a/xdocs/sources/design/conceptual.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/data.gif b/xdocs/sources/design/data.gif
deleted file mode 100644
index 0f28a17..0000000
--- a/xdocs/sources/design/data.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/design2_0_0.xml b/xdocs/sources/design/design2_0_0.xml
deleted file mode 100644
index 02dd509..0000000
--- a/xdocs/sources/design/design2_0_0.xml
+++ /dev/null
@@ -1,277 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<s1 title="Xalan-J 2.0 Design">
-  <p><img src="xmllogo.gif" alt="xmllogo.gif"/></p>
-  <p>Author: Scott Boag<br/>State: In Progress</p>
-  <ul> 
-	   <li><link anchor="intro">Introduction</link></li>
- 	   <li><link anchor="requirements">Xalan Requirements</link></li>
-	   <li><link anchor="overarch">Overview of Architecture</link></li>
-	   <li><link anchor="process">Process Module</link></li>
-	   <li><link anchor="templates">Templates Module</link></li>
-	   <li><link anchor="transformer">Transformer Module</link></li>
-       <ul>
-         <li><link anchor="stree">Stree Module</link></li>
-         <li><link anchor="extensions">Extensions Module</link></li>
-     </ul>
-	   <li><link anchor="xpath">XPath Module</link></li>
-       <ul><li><link anchor="xpathdbconn">XPath Database Connection</link></li></ul>
-	   <li><link anchor="utils">Utils Package</link></li>         
-	   <li><link anchor="other">Other Packages</link></li>         
-	   <li><link anchor="compilation">Xalan Stylesheet Complilation to Java</link></li><li><link anchor="optimizations">Future Optimizations</link></li><li><link anchor="coding">Coding Conventions</link></li>
-	        
-   <li><jump href="../apidocs/index.html">Xalan-J 2.0 Javadoc</jump></li>
-  </ul><anchor name="intro"/>
-  <s2 title="Introduction"> 
-	 <p>This document presents the basic design for Xalan-J 2.0, which is a
-		<jump href="http://www.awl.com/cseng/titles/0-201-89542-0/techniques/refactoring.htm">refactoring</jump>
-		and redesign of the Xalan-J 1.x processor.   This document will expand and grow over time, and is also incomplete in some sections, though hopefully overall accurate.  The reader should be able to get a good overall idea of the internal design of Xalan, and begin to understand the process flow, and also the technical challenges.</p> 
-	 <p>The main goals of this redesign are
-		to: </p><ol> 
-		<li>Make the design and code more understandable by Open Source
-		  people.</li> 
-		<li>Reduce code size and complexity.</li>
-		<li>By simplifying the code, make optimization easier.</li> 
-		<li>Make modules generally more localized, and less tangled with other
-		  modules.</li> 
-		<li>Conform to the <jump href="http://java.sun.com/aboutJava/communityprocess/jsr/jsr_063_jaxp11.html">javax.xml.transform  (TrAX [Transformations for XML])</jump> interfaces.</li> 
-	 <li>Increase the ability to incrementally produce the result tree.</li></ol> 
-	 <p>The techniques used toward these goals are to:</p> 
-	 <ol> 
-		<li>In general, flatten the hierarchy of packages, in order to make the
-		  structure more apparent from the top-level view.</li> 
-		<li>Break the construction and the validation of the XSLT stylesheet from
-		  the stylesheet objects themselves.</li>
-		<li>Drive the construction of the stylesheet through a table, so that it
-		  is less prone to error.</li> 
-		<li>Break the transformation process into a separate package, away from
-		  the stylesheet objects.</li> 
-		<li>Create this design document, as a starting point for people interested in
-		  approaching the code.</li> 
-	 </ol> 
-	 <p>The goals are not:</p> 
-	 <ol> 
-		<li>To add more features in the progress of this refactoring. This is
-		  design and code clean-up in order to meet the above-named goals. We expect that it will be <em>much</em> easier to add
-		  features once this work is completed.</li> 
-		<li>To optimize code for the sake of optimization. However, we
-		  expect that the code will be faster once this work is complete.</li> 
-	 </ol> 
-	 <p>How well we've achieved the goals will be measured by feedback from the
-		<jump href="http://archive.covalent.net/">Xalan-dev</jump> list, and by software metrics tools.</p> 
-	 <p>Please note that the diagrams in this design document are meant to be
-		useful abstractions, and may not always be exact.</p> 
-  </s2><anchor name="requirements"/> 
-  <s2 title="Xalan Requirements">
-  <p>These are the concrete general requirements of Xalan, as I understand them, and covering both the Java and C++ versions.  These requirements have been built up over time by experience with product groups and general users.</p><ol><li>Java, C++ Versions.</li><li>XSLT 1.0 conformance, and beyond. (i.e. conform to the current W3C recommendation).</li><li>Have design and Code understandable by Open Source Community.</li><li>Ability to interoperate with standard APIs.  (SAX2, DOM2, JAXP)  [this is currently Less of an issue with C++].</li><li>High Performance (Raw performance, Incremental ability, Scaleability to large documents, Reduction of Garbage Collection for the Java version.)</li><li>Tooling API (Access stylesheet data structures, Access source node from result event, Ask runtime questions, Debugging API).</li><li>Support addressing of XML in standalone fashion (i.e. XPath API).</li><li>Extensibility (Ability to call Java, Ability to call JavaScript, other languages).</li><li>Multiple data sources (JDBC, LDAP, other data sources, Direct XML repository coupling).</li></ol></s2><anchor name="overarch"/> 
-  <s2 title="Overview of Architecture"> 
-	 <p>The following diagram shows the XSLT abstract processing model.  A transformation expressed in XSLT describes rules for transforming a <jump href="http://www.w3.org/TR/xpath#data-model">Source Tree </jump> into a result tree. The transformation is achieved by associating patterns with templates. A pattern is matched against elements in the source tree. A template is instantiated to create part of the result tree. The result tree is separate from the source tree. The structure of the result tree can be completely different from the structure of the source tree. In constructing the result tree, elements from the source tree can be filtered and reordered, and arbitrary structure can be added.
-
-</p><p>The term "tree", as used within this document, describes an
-			 abstract structure that consists of nodes or events that may be produced by
-			 XML. A Tree physically may be a DOM tree, a series of well balanced parse
-			 events (such as those coming from a SAX2 ContentHander), a series of requests
-			 (the result of which can describe a tree), or a stream of marked-up
-			 characters.</p><p><img src="xslt_abstract.gif" alt="xslt_abstract.gif"/></p><p>The primary interface for Xalan 2.0 external usage is defined in the <jump href="../apidocs/javax/xml/transform/package-summary.html#package_description">javax.xml.transform</jump> interfaces.  These interfaces define a standard and powerful interface to perform tree-based transformations.</p> 
-	 <p>The internal architecture of Xalan 2.0 is divided into four major modules, and various smaller
-		modules. The main modules are:</p> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/processor/package-summary.html">org.apache.xalan.processor</jump></label> 
-		<item>The module that processes the stylesheet, and provides the main
-		  entry point into Xalan.</item> 
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/templates/package-summary.html">org.apache.xalan.templates</jump></label> 
-		<item>The module that defines the stylesheet structures, including the
-		  Stylesheet object, template element instructions, and Attribute Value
-		  Templates. </item> 
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/transformer/package-summary.html">org.apache.xalan.transformer</jump></label> 
-		<item>The module that applies the source tree to the Templates, and
-		  produces a result tree.</item> 
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xpath/package-summary.html">org.apache.xpath</jump></label> 
-		<item>The module that processes both XPath expressions, and XSLT Match
-		  patterns.</item> 
-	 </gloss> 
-	 <p>In addition to the above modules, Xalan implements the
-		<jump href="../apidocs/javax/xml/transform/package-summary.html#package_description">javax.xml.transform</jump> interfaces, and depends on the
-	 <jump href="http://www.megginson.com/SAX/Java/index.html">SAX2</jump> and <jump href="http://www.w3.org/TR/DOM-Level-2/">DOM</jump> packages.
-</p><p><img src="trax.gif" alt="trax.gif"/></p><p>There is also a general utilities package that contains both XML utility
-	 classes such as QName, but generally useful classes such as
-	 StringToIntTable.</p> 
-	 <p>In the diagram below, the dashed lines denote visibility. All packages
-		access the SAX2 and DOM packages.</p> 
-	 <p><img src="xalan1_1x1.gif" alt="xalan1_1x1.gif"/></p> 
-	 <p>In addition to the above packages, there are the following additional
-		packages:</p> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/client/package-summary.html">org.apache.xalan.client</jump></label> 
-		<item>This package has a client applet. I suspect this should be moved
-		  into the samples directory.</item> 
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/extensions/package-summary.html">org.apache.xalan.extensions</jump></label> 
-		<item>This holds classes belonging to the Xalan extensions mechanism,
-		  which allows Java code and script to be called from within a stylesheet.</item>
-		
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/lib/package-summary.html">org.apache.xalan.lib</jump></label> 
-		<item>This is the built-in Xalan extensions library, which holds
-		  extensions such as Redirect (which allows a stylesheet to produce multiple
-		  output files).</item> 
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/res/package-summary.html">org.apache.xalan.res</jump></label> 
-		<item>This holds resource files needed by Xalan, such as error message
-		  resources.</item> 
-	 </gloss> 
-	  
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/trace/package-summary.html">org.apache.xalan.trace</jump></label> 
-		<item>This package contains classes and interfaces that allow a caller to
-		  add trace listeners to the transformation, allowing an interface to XSLT
-		  debuggers and similar tools.</item> 
-	 </gloss> 
-	 <gloss> 
-		<label><jump href="../apidocs/org/apache/xalan/xslt/package-summary.html">org.apache.xalan.xslt</jump></label> 
-		<item>This package holds the Xalan2 command line processor.</item> 
-	 </gloss> 
-  <p>A more conceptual view of this architecture is as follows:</p><p><img src="conceptual.gif" alt="Picture of conceptual architecture."/></p></s2><anchor name="process"/> 
-  <s2 title="Process Module"> 
-	 <p>The <jump href="../apidocs/org/apache/xalan/processor/package-summary.html">org.apache.xalan.processor</jump> module implements the
-		<jump href="../apidocs/javax/xml/transform/TransformerFactory.html">javax.xml.transform.TransformerFactory</jump> interface, which provides a
-		factory method for creating a concrete Processor instance, and provides methods
-		for creating a <jump href="../apidocs/javax/xml/transform/Templates.html">javax.xml.transform.Templates</jump> instance, which, in
-		Xalan and XSLT terms, is the Stylesheet. Thus the task of the process module is
-		to read the XSLT input in the form of a file, stream, SAX events, or a DOM
-		tree, and produce a Templates/Stylesheet object.</p> 
-	 <p>The overall strategy is to define a schema in that dictates the legal
-		structure for XSLT elements and attributes, and to associate with those
-		elements construction-time processors that can fill in the appropriate fields
-		in the top-level Stylesheet object, and also associate classes in the templates
-		module that can be created in a generalized fashion. This makes the validation
-		object-to-class associations centralized and declarative.</p> 
-	 <p>The schema's root class is
-		<jump href="../apidocs/org/apache/xalan/processor/XSLTSchema.html">org.apache.xalan.processor.XSLTSchema</jump>, and it is here that the
-		XSLT schema structure is defined. XSLTSchema uses
-		<jump href="../apidocs/org/apache/xalan/processor/XSLTElementDef.html">org.apache.xalan.processor.XSLTElementDef</jump> to define elements, and
-		<jump href="../apidocs/org/apache/xalan/processor/XSLTAttributeDef.html">org.apache.xalan.processor.XSLTAttributeDef</jump> to define attributes.
-		Both classes hold the allowed namespace, local name, and type of element or
-		attribute. The XSLTElementDef also holds a reference to a
-		<jump href="../apidocs/org/apache/xalan/processor/XSLTElementProcessor.html">org.apache.xalan.processor.XSLTElementProcessor</jump>, and a sometimes a
-		<code>Class</code> object, with which it can create objects that derive from
-		<jump href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html">org.apache.xalan.templates.ElemTemplateElement</jump>. In addition, the
-		XSLTElementDef instance holds a list of XSLTElementDef instances that define
-		legal elements or character events that are allowed as children of the given
-		element.</p> 
-	 <p>The implementation of the <jump href="../apidocs/javax/xml/transform/TransformerFactory.html">javax.xml.transform.TransformerFactory</jump>
-		interface is in <jump href="../apidocs/org/apache/xalan/processor/TransformerFactoryImpl.html">org.apache.xalan.processor.TransformerFactoryImpl</jump>,
-		which creates a <jump href="../apidocs/org/apache/xalan/processor/StylesheetHandler.html">org.apache.xalan.processor.StylesheetHandler</jump>
-		instance. This instance acts as the ContentHandler for the parse events, and is
-		handed to the <jump href="../apidocs/org/xml/sax/XMLReader.html">org.xml.sax.XMLReader</jump>, which the StylesheetProcessor
-		uses to parse the XSLT document. The <code>StylesheetHandler</code> then receives the parse
-		events, which maintains the state of the construction, and passes the events on
-		to the appropriate <code>XSLTElementProcessor</code> for the given event, as dictated by the
-		<code>XSLTElementDef</code> that is associated with the given event.</p> 
-	 </s2><anchor name="templates"/> 
-  <s2 title="Templates Module"> 
-	 <p>The <jump href="../apidocs/org/apache/xalan/templates/package-summary.html">org.apache.xalan.templates</jump> module implements the
-		<jump href="../apidocs/javax/xml/transform/Templates.html">javax.xml.transform.Templates</jump> interface, and defines a set of
-		classes that represent a Stylesheet. The primary purpose of this module is to
-		hold stylesheet data, not to perform procedural tasks associated with the
-		construction of the data, nor tasks associated with the transformation itself.
-		</p> 
-	 <p>The base class of all templates objects that are associated with an XSLT element is the <jump href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html">ElemTemplateElement</jump> object, which in turn implements <jump href="../apidocs/org/apache/xml/utils/UnImplNode.html">UnImplNode</jump>.  A <code>ElemTemplateElement</code> object must be immutable once it's constructed, so that it may be shared among multiple threads concurrently.  Ideally, a <code>ElemTemplateElement</code> should be a data object only, and be used via a visitor pattern.  However, in practice this is impractical, because it would cause too much data exposure and would have a significant impact on performance.  Therefore, each <code>ElemTemplateElement</code> class has an <jump href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html#execute(org.apache.xalan.transformer.TransformerImpl, org.w3c.dom.Node, org.apache.xml.utils.QName)">execute</jump> method where it performs it's transformation duties.  A <code>ElemTemplateElement</code> also knows it's position in the source stylesheet, and can answer questions about current namespace nodes.</p><p>A <jump href="../apidocs/org/apache/xalan/templates/StylesheetRoot.html">StylesheetRoot</jump>, which implements the
-		<code>Templates</code> interface, is a type of <jump href="../apidocs/org/apache/xalan/templates/StylesheetComposed.html">StylesheetComposed</jump>,
-		which is a <jump href="../apidocs/org/apache/xalan/templates/Stylesheet.html">Stylesheet</jump> composed of itself and all included
-		<code>Stylesheet</code> objects. A <code>StylesheetRoot</code> has a global
-		imports list, which is a list of all imported <code>StylesheetComposed</code>
-		instances. From each <code>StylesheetComposed</code> object, one can iterate
-		through the list of directly or indirectly included <code>Stylesheet</code>
-		objects, and one call also iterate through the list of all
-		<code>StylesheetComposed</code> objects of lesser import precedence.
-		<code>StylesheetRoot</code> is a <code>StylesheetComposed</code>, which is a
-		<code>Stylesheet</code>.</p> 
-	 <p>Each stylesheet has a set of properties, which can be set by various
-		means, usually either via an attribute on xsl:stylesheet, or via a top-level
-		xsl instruction (for instance, xsl:attribute-set). The get methods for these
-		properties only access the declaration within the given <code>Stylesheet</code>
-		object, and never takes into account included or imported stylesheets. The
-		<code>StylesheetComposed</code> derivative object, if it is a root
-		<code>Stylesheet</code> or imported <code>Stylesheet</code>, has "composed"
-		getter methods that do take into account imported and included stylesheets, for
-		some of these properties.</p> 
-	  
-  </s2><anchor name="transformer"/> 
-  <s2 title="Transformer Module"> 
-	 <p>The <jump href="../apidocs/org/apache/xalan/transformer/package-summary.html">Transformer</jump> module is in charge of run-time transformations.  The <jump href="../apidocs/org/apache/xalan/transformer/TransformerImpl.html">TransformerImpl</jump> object, which implements the TrAX <jump href="../apidocs/javax/xml/transform/Transformer.html">Transformer</jump> interface, and has an association with a <jump href="../apidocs/org/apache/xalan/templates/StylesheetRoot.html">StylesheetRoot</jump> object, begins the processing of the source tree (or provides a <jump href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html">ContentHandler</jump> reference via the <jump href="../apidocs/org/apache/xalan/stree/SourceTreeHandler.html">SourceTreeHandler</jump>), and performs the transformation.  The Transformer package does as much of the transformation as it can, but element level operations are generally performed in the <jump href="../apidocs/org/apache/xalan/templates/ElemTemplateElement.html#execute(org.apache.xalan.transformer.TransformerImpl, org.w3c.dom.Node, org.apache.xalan.utils.QName)">ElemTemplateElement.execute(...)</jump> methods.</p><p>Result Tree events are fed into a <jump href="../apidocs/org/apache/xalan/transformer/ResultTreeHandler.html">ResultTreeHandler</jump> object, which acts as a layer between the direct calls to the result 
-tree content handler (often a <jump href="../apidocs/org/apache/xalan/serialize/package-summary.html">Serializer</jump>), and the <code>Transformer</code>.  For one thing, 
- we have to delay the call to
- startElement(name, atts) because of the
- xsl:attribute and xsl:copy calls.  In other words,
- the attributes have to be fully collected before you
- can call startElement.</p><p>Other important classes in this package are:</p><gloss><label>CountersTable and Counter</label><item>The <jump href="../apidocs/org/apache/xalan/transformer/Counter.html">Counter</jump> class does incremental counting for support of xsl:number.
- This class stores a cache of counted nodes (m_countNodes). 
-  It tries to cache the counted nodes in document order... 
- the node count is based on its position in the cache list.  The <jump href="../apidocs/org/apache/xalan/transformer/CountersTable.html">CountersTable</jump> class is a table of counters, keyed by <jump href="../apidocs/org/apache/xalan/templates/ElemNumber.html">ElemNumber</jump> objects, each 
- of which has a list of <code>Counter</code> objects.</item></gloss><gloss><label>KeyIterator, KeyManager, and KeyTable</label><item>These classes handle mapping of keys declared with the xsl:key element.  They attempt to work incrementally, locating nodes on request but indexing all as they traverse the tree, and stopping when the requested node is found.  If a requested node is not found, then the entire tree will be traversed.  Such is the nature of xsl:key.</item></gloss><gloss><label>TransformState</label><item>This interface is meant to be used by a consumer of SAX2 events produced by Xalan, and enables the consumer 
- to get information about the state of the transform.  It 
- is primarily intended as a tooling interface.</item></gloss><p>Even though the following modules are defined in the <code>org.apache.xalan</code> package, instead of the transformer package, they are defined in this section as they are mostly related to runtime transformation.</p><anchor name="stree"/>
-  <s3 title="Stree Module [and discussions about streaming]">
-  <p>The Stree module implements the default <jump href="http://www.w3.org/TR/xpath#data-model">Source Tree </jump> for Xalan, that is to be transformed.  It implements read-only <jump href="http://www.w3.org/TR/DOM-Level-2/">DOM2</jump> interfaces, and provides some information needed for fast transforms, such as document order indexes.  It also attempts to allow an incremental transform by launching the transform on a secondary thread as soon as the SAX2 <jump href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html#startDocument()">StartDocument</jump> event has occurred.  When the transform requests a node, and the node is not present, the getFirstChild and GetNextSibling methods will wait until the child node has arrived, or an <jump href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html#endElement(java.lang.String,%20java.lang.String,%20java.lang.String)">endElement</jump> event has occurred.</p><p>Note that the secondary thread is an issue.  It would be better to do the same thing as described above on a single thread, but using the parser in 'pull' mode, or simply with a parseNext method so the parse would occur in blocks.  However, this model would only be possible</p><p>This kind of incrementality is not perfect because it still requires an entire source tree to be concretely built.  There have been a lot of good discussions on the xalan-dev list about how to do static analysis of a stylesheet, and be able to allocate only the nodes needed by the transform, while they are needed (or not allocate source objects at all).</p></s3>
-<anchor name="serializer"/>
-<s3 title="Serializer Module">
-<p>XML serialization is a term used for turning a tree or set of events into a stream, and should not be confused with Java object serialization.  The Xalan serializers implement the <jump href="http://www.megginson.com/SAX/Java/javadoc/org/xml/sax/ContentHandler.html">ContentHandler</jump> to turn parser events coming from the transform, into a stream of XML, HTML, or plain text.  The serializers also implement the <jump href="../apidocs/org/apache/xalan/serializer/Serializer.html">Serializer</jump> which allows the transform process to set XSLT output properties and the output stream or Writer.</p></s3><anchor name="extensions"/>
-<s3 title="Extensions Module">
-<p>This package contains an implementation of Xalan Extension Mechanism, which uses the <jump href="http://oss.software.ibm.com/developerworks/opensource/bsf/">Bean Scripting Framework</jump>.
-
-The Bean Scripting Framework (BSF) is an architecture for incorporating scripting into Java applications and applets.  Scripting languages such as Netscape Rhino (Javascript), VBScript, Perl, Tcl, Python, NetRexx and Rexx can be used to augment XSLT's functionality.  In addition, the Xalan extension mechanism allows use of Java classes.  See the <jump href="http://xml.apache.org/xalan/extensions.html">Xalan-J 2 extension documentation</jump> for a description of using extensions in a stylesheet. Please note that the W3C XSL Working Group is working on a specification for standard extension bindings, and this module will change to follow that specification.  </p><p>[More needed... -sb]</p></s3></s2><anchor name="xpath"/> 
-  <s2 title="XPath Module"> 
-	 <p>This module is pulled out of the Xalan package, and put in the org.apache package, to emphasize that the intention is that this package can be used independently of the XSLT engine, even though it has dependencies on the Xalan utils module.</p><p><img src="org_apache.gif" alt="xalan ---> xpath"/></p> 
-  <p>The XPath module first compiles the XPath strings into expression trees, and then executes these expressions via a call to the XPath execute(...) function.  </p>  <p>Major classes are:</p><gloss><label>XPath</label><item>Represents a compiled XPath.  Major function is <code>XObject execute(XPathContext xctxt, Node contextNode, 
-                         PrefixResolver namespaceContext)</code>.</item></gloss><gloss><label>XPathAPI</label><item>The methods in this class are convenience methods into the
- low-level XPath API.</item></gloss><gloss><label>XPathContext</label><item>Used as the runtime execution context for XPath.</item></gloss><gloss><label>DOMHelper</label><item>Used as a helper for handling DOM issues.  May be subclassed to take advantage 
-   of specific DOM implementations.</item></gloss><gloss><label>SourceTreeManager</label><item>bottlenecks all management of source trees.  The methods
- in this class should allow easy garbage collection of source 
- trees, and should centralize parsing for those source trees.</item></gloss><gloss><label>Expression</label><item>The base-class of all expression objects, allowing polymorphic behaviors.</item></gloss><p>The general architecture of the XPath module is divided into the compiler, and categories of expression objects.</p><p><img src="xpath.gif" alt="xpath modules"/></p><p>The most important module is the axes module.  This module implements the DOM2 <jump href="http://www.w3.org/TR/DOM-Level-2/traversal.html#Iterator-overview">NodeIterator</jump> interface, and is meant to allow XPath clients to either override the default behavior or to replace this behavior.</p><p>The <jump href="../apidocs/org/apache/xpath/axes/LocPathIterator.html">LocPathIterator</jump> and <jump href="../apidocs/org/apache/xpath/axes/UnionPathIterator.html">UnionPathIterator</jump> classes implement the <jump href="http://www.w3.org/TR/DOM-Level-2/java-binding.html#org.w3c.dom.traversal.NodeIterator">NodeIterator</jump> interface, and polymorphically use <jump href="../apidocs/org/apache/xpath/axes/AxesWalker.html">AxesWalker</jump> derived objects to execute each step in the path.  The whole trick is to execute the <code>LocationPath</code> in depth-first document order so that nodes can be found without necessarily looking ahead or performing a breadth-first search.  Because a document order depth-first search requires state to be saved for many expressions, the default operations create "Waiter" clones that have to wait while the main <code>AxesWalkers</code> traverses child nodes (think carefully about what happens when a "//foo/baz" expression is executed).   Optimization is done by implementing specialized iterators and <code>AxesWalkers</code> for certain types of operations.  The decision as to what type of iterator or walker will be created is done in the <jump href="../apidocs/org/apache/xpath/axes/WalkerFactory.html">WalkerFactory</jump> class.</p><p>[Frankly, the implementation of the default AxesWalker, with it's waiters, is the one totally incomprehensible part of Xalan.  It gets especially difficult because you can not look to the node ahead.  I would be very interested if any rocket scientists out there can come up with a better algorithm.]</p><anchor name="xpathdbconn"/>
-<s3 title="XPath Database Connection">
-<p>An important part of the XPath design in both Xalan 1 and Xalan 2, is to enable database connections to be used as drivers directly to the XPath <jump href="http://www.w3.org/TR/xpath#location-paths">LocationPath</jump> handling.  This allows databases to be directly connected to the transform, and be able to take advantage of internal indexing and the like.  While in Xalan 1 this was done via the <jump href="http://xml.apache.org/xalan/apidocs/org/apache/xalan/xpath/XLocator.html">XLocator</jump> interface, in Xalan 2 this interface is no longer used, and has been replaced by the DOM2 <jump href="http://www.w3.org/TR/DOM-Level-2/traversal.html#Iterator-overview">NodeIterator</jump> interface.  An application or extension should be able to install their own NodeIterator for a given document.</p><p><img src="data.gif" alt="data.gif"/></p><p>[More to do]</p></s3></s2><anchor name="utils"/> 
-  <s2 title="Utils Package"> 
-  <p>This package contains general utilities for use by both the xalan and xpath packages.</p></s2><anchor name="other"/>
-  <s2 title="Other Packages"> 
-	 <gloss><label>client</label><item>Implementation of Xalan Applet [should we keep this?].
-
-</item></gloss> 
-		 
-		 
-		<gloss><label>lib</label><item>Implementation of Xalan-specific extensions.</item></gloss><gloss><label>res</label><item>Contains strings that require internationalization.</item></gloss></s2><anchor name="compilation"/>
-<s2 title="Xalan Stylesheet Complilation to Java">
-<p>We are doing some work on compiling stylesheet objects to Java.  This is a work in progress, and is not meant for general use yet.  For the moment, we are writing out Java text files, and then compiling them to bytecodes via javac, rather than directly producing bytecodes.  The CompilingStylesheetProcessor derives from TransformerFactoryImpl to produce these classes, which are then bundled into a jar file.  For the moment the full Xalan jar is required, but we're looking at ways to only use a subset of Xalan, so that only a minimal jar would be required.</p><p><img src="compilation.gif" alt="compilation.gif"/></p></s2><anchor name="optimizations"/>
-<s2 title="Future Optimizations">
-<p>This section enumerates some optimizations that we're planning to do in future versions of Xalan.</p><p>Likely near term optimizations (next six months?):</p><ol><li>By pre-analysis of the stylesheet, prune nodes from the tree that have been processed and can be predicted that they won't be visited again.</li><li>Eliminate redundent expressions (xsl:when, variable sets, rooted patterns, etc.).</li><li>Optimize variable patterns such as &lt;xsl:variable name="foo"&gt;&lt;xsl:variable select="yada"/&gt;&lt;/xsl:variable&gt; into &lt;xsl:variable name="foo" select="string(yada)"/&gt;, in order to reduce result tree fragment creation.</li><li>Reduce size of Stree nodes.</li><li>Implement our own NamespaceSupport class (the SAX2 one is too expensive).</li><li>More specialization of itterators and walkers.</li><li>Full Java compilation support.</li><li>Schema Awareness (if "//foo", the Schema can tell us where to look, but we need standard interface to Schemas).</li></ol><p>Likely longer term optimizations (12-18 months?):</p><ol><li>On-the-fly indexing.</li><li>Predict if nodes won't be processed at all, and so don't build them, achieve full streaming support for a certain class of stylesheets.</li></ol></s2><anchor name="coding"/> 
-  <s2 title="Coding Conventions"> 
-	 <p>This section documents the coding conventions used in the Xalan
-		source.</p> 
-	 <ol> 
-		<li>Class files are arranged with constructors and possibly an init()
-		  function first, public API methods second, package specific, protected, and
-		  private methods following (arranged based on related functionality), member
-		  variables with their getter/setter access methods last.</li> 
-		<li>Non-static member variables are prefixed with "m_".</li> 
-		<li>static final member variables should always be upper case, without
-		  the "m_" prefix. They need not have accessors.</li> 
-		<li>Private member variables that are not accessed outside the class need
-		  not have getter/setter methods declared.</li> 
-		<li>Private member variables that are accessed outside the class should
-		  have either package specific or public getter/setter methods declared. All
-		  accessors should follow the bean design patterns.</li> 
-		<li>Package-scoped member variables, public member variables, and
-		  protected member variables should not be declared.</li> 
-	 </ol> 
-  </s2><anchor name="open"/> 
-  
-</s1>
diff --git a/xdocs/sources/design/org_apache.gif b/xdocs/sources/design/org_apache.gif
deleted file mode 100644
index 105f264..0000000
--- a/xdocs/sources/design/org_apache.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/process.gif b/xdocs/sources/design/process.gif
deleted file mode 100644
index c7a871e..0000000
--- a/xdocs/sources/design/process.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/trax.gif b/xdocs/sources/design/trax.gif
deleted file mode 100644
index 8eb9614..0000000
--- a/xdocs/sources/design/trax.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/xalan.gif b/xdocs/sources/design/xalan.gif
deleted file mode 100644
index ca4a57c..0000000
--- a/xdocs/sources/design/xalan.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/xalan1_1x1.gif b/xdocs/sources/design/xalan1_1x1.gif
deleted file mode 100644
index c9e1536..0000000
--- a/xdocs/sources/design/xalan1_1x1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/xmllogo.gif b/xdocs/sources/design/xmllogo.gif
deleted file mode 100644
index b63188d..0000000
--- a/xdocs/sources/design/xmllogo.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/xpath.gif b/xdocs/sources/design/xpath.gif
deleted file mode 100644
index cf28f9c..0000000
--- a/xdocs/sources/design/xpath.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/design/xslt_abstract.gif b/xdocs/sources/design/xslt_abstract.gif
deleted file mode 100644
index fa041a6..0000000
--- a/xdocs/sources/design/xslt_abstract.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/entities.ent b/xdocs/sources/entities.ent
deleted file mode 100644
index a359a90..0000000
--- a/xdocs/sources/entities.ent
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml encoding="US-ASCII"?>
-
-<!ENTITY xslt4j "Xalan-Java">
-<!ENTITY xslt4j2 "Xalan-Java 2">
-<!ENTITY xslt4j-dist "xalan-j_2_3">
-<!ENTITY xslt4j-dist-bin "&xslt4j-dist;-bin">
-<!ENTITY xslt4j-dist-src "&xslt4j-dist;-src">
-<!ENTITY xslt4j-current "&xslt4j; version 2.3">
-<!ENTITY xslt4j-distdir "http://xml.apache.org/dist/xalan-j/">
-<!ENTITY xml4j "Xerces-Java">
-<!ENTITY xml4j1 "Xerces-Java 1">
-<!ENTITY xml4j2 "Xerces-Java 2">
-<!ENTITY xml4j-used "&xml4j; version 2.0.beta4">
-<!ENTITY xml4j-jar "xercesImpl.jar (xerces.jar for &xml4j1;)">
-<!ENTITY xslt4c "Xalan-C++">
-<!ENTITY xml4c "Xerces-C++">
-<!ENTITY download "The &xslt4j-current; download from xml.apache.org includes xerces.jar from &xml4j-used;.">
-
-<!ENTITY xsltcwhatsnewhead '<li><link anchor="xsltc">XSLTC</link></li>'>
-                         
-<!ENTITY xsltcwhatsnew '<anchor name="xsltc"/><s2 title="XSLTC">
-                <p>In April 2001, Sun donated XSLTC to the Xalan project. XSLTC compiles stylesheets into translets and
-                provides a runtime environment for using translets to transform XML documents. Initially, XSLTC is
-                available in a separate JAR. Over time, we plan to integrate the two codebases. For more information,
-                see <link idref="xsltc_usage">Using XSLTC</link>, <link idref="readme" anchor="xsltcreleasenotes">XSLTC 
-                Release Notes</link>, and <jump href="xsltc/index.html">XSLTC Design</link>.</p>
-                </s2>'>
-                
-<!ENTITY xsltcreleasenotesentry '<li><link idref="xsltc_constraints">XSLTC Release Notes</link></li>'>
-<!ENTITY history2xsltc '<note>For XSLTC changes since XSLTC was incorporated into &xslt4j;, see 
-                        <link idref="xsltc_history">XSLTC software changes</link>.</note>'>
-
-<!ENTITY xsltcsampleshead '<li><link anchor="translets">translets</link></li>'>
-
-<!ENTITY xsltcsamples '<anchor name="translets"/><s2 title="Translets">
-                 <ul>
-                 <li><link anchor="xsltc1">JAXPTransletOneTransformation</link></li>
-                 <li><link anchor="xsltc2">JAXPTransletMultipleTransformations</link></li>
-                 </ul>
-                 <p>See also: <link idref="readme" anchor="xsltcdemos">XSLTC demos</link>.</p><anchor name="xsltc1"/>
-                 <p>You can use the TrAX/JAXP 1.1 interfaces to compile and run translets. For this release, you must still
-                 use StreamSource objects for the XSL stylesheet and XML input document, and a StreamResult object for the 
-                 transformation output. For an overview of the usage patterns these samples illustrate, see 
-                 <link idref="xsltc_usage" anchor="api">Calling XSLTC with the TrAX/JAXP API</link>.</p>
-                 <anchor name="xsltcprepare"/>
-                 <p><em>Important:</em> To run these samples, you must compile the sample class files and adjust the 
-                 system classpath.</p>
-                 <ol>
-                   <li>To compile the samples, you can run the Ant build from the root directory as follows:<br/><br/>
-                   <code>&nbsp;&nbsp;build xsltc.samples</code><br/><br/></li>
-                   <li>Add xsltc.jar, runtime.jar, BCEL.jar, java_cup.jar, and the samples/translets subdirectory to 
-                   the classpath</li>
-                 </ol>
-                 <note>The JAR files listed above are in the bin directory. 
-                 The samples/translets directory contains the sample class files as well as the translet class file that is
-                 generated at tun time (todo.class from the todo.xsl stylesheet).</note> 
-                 <anchor name="xsltc1"/>
-                 <s3 title="JAXPTransletOneTransformation">
-                 <p>What it does: Uses the XSLTC TransformerFactory to compile a translet and use
-                 the translet to transform the XSLTC to-do list from XML into HTML.</p>
-                 <p>Complete the <link anchor="xsltcprepare">steps detailed above</link>, and run this sample 
-                 from the translets subdirectory with</p>
-                 <p><code>java JAXPTransletOneTransformation</code></p>
-                 <p>View the result in todo-xsltc.html.</p>
-                 </s3><anchor name="xsltc2"/>
-                 <s3 title="JAXPTransletMultipleTransformations">
-                 <p>What it does: Uses the XSLTC TransformerFactory to compile a translet and use
-                 the Templates object associated with the translet to transform the XSLTC and Xalan to-do lists from XML 
-                 into HTML.</p>
-                 <p>Complete the <link anchor="xsltcprepare">steps detailed above</link>, and run this sample 
-                 from the translets subdirectory with</p>
-                 <p><code>java JAXPTransletOneTransformation</code></p>
-                 <p>View the results in todo-xsltc.html and todo-xalan.html.</p>                
-                 </s3>
-                 </s2>'>
-                
diff --git a/xdocs/sources/xalan-collate.xsl b/xdocs/sources/xalan-collate.xsl
deleted file mode 100644
index 7b8ee47..0000000
--- a/xdocs/sources/xalan-collate.xsl
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-<xsl:template match ="/">
-  <documentation>
-    <chapter id="index"><xsl:copy-of select="document('xalan/dtm.xml')"/></chapter>  
-    <!--chapter id="index"><xsl:copy-of select="document('xalan/index.xml')"/></chapter>  
-    <chapter id="whatsnew"><xsl:copy-of select="document('xalan/whatsnew.xml')"/></chapter>
-    <chapter id="overview"><xsl:copy-of select="document('xalan/overview.xml')"/></chapter>
-    <chapter id="getstarted"><xsl:copy-of select="document('xalan/getstarted.xml')"/></chapter>
-    <chapter id="faq"><xsl:copy-of select="document('xalan/faq.xml')"/></chapter>
-    <chapter id="samples"><xsl:copy-of select="document('xalan/samples.xml')"/></chapter>
-    <chapter id="commandline"><xsl:copy-of select="document('xalan/commandline.xml')"/></chapter>
-    <chapter id="usagepatterns"><xsl:copy-of select="document('xalan/usagepatterns.xml')"/></chapter>
-    <chapter id="trax"><xsl:copy-of select="document('xalan/trax.xml')"/></chapter>
-    <chapter id="extensions"><xsl:copy-of select="document('xalan/extensions.xml')"/></chapter>
-    <chapter id="extensionslib"><xsl:copy-of select="document('xalan/extensionslib.xml')"/></chapter>
-    <chapter id="readme"><xsl:copy-of select="document('xalan/readme.xml')"/></chapter>
-    <chapter id="api">
-      <s1 title="Java API">
-        <p>Javadoc for the entire Xalan-Java API:</p>
-        <ul>
-          <li><jump href="apidocs/index.html">Xalan-Java 2 API</jump></li>
-          <li><jump href="compat_apidocs/index.html">Xalan-Java 1 compatibility API</jump></li>
-        </ul>         
-      </s1>
-    </chapter-->
-  </documentation>
-</xsl:template>
-</xsl:stylesheet>
-
-
diff --git a/xdocs/sources/xalan-jlocal.xml b/xdocs/sources/xalan-jlocal.xml
deleted file mode 100644
index 4c7b8a0..0000000
--- a/xdocs/sources/xalan-jlocal.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book SYSTEM "sbk:/style/dtd/book.dtd">
-
-<!--
- * 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, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<book title="Xalan XSL Transformer User's Guide" copyright="2002 The Apache Software Foundation">
-  <resources source="sbk:/sources/xalan/resources.xml"/>
-  <document id="whatsnew" label="What's New" source="xalan/whatsnew.xml"/>
-  <document id="dtm" label="DTM" source="xalan/dtm.xml"/>
-  <document id="xsltc_usage" label="XSLTC Translets" source="xalan/xsltc_usage.xml"/>
-  <separator/>
-  <document id="overview" label="Overview" source="xalan/overview.xml"/>
-  <document id="getstarted" label="Getting Started" source="xalan/getstarted.xml"/>
-  <separator/>
-  <faqs id="faq" label="FAQs" source="xalan/faq.xml"/>
-  <separator/>
-  <document id="samples" label="Sample Apps" source="xalan/samples.xml"/>
-  <document id="commandline" label="Command Line" source="xalan/commandline.xml"/>
-  <separator/>
-  <document id="usagepatterns" label="Usage Patterns" source="xalan/usagepatterns.xml"/>
-  <separator/>
-  <document id="trax" label="TrAX" source="xalan/trax.xml"/>
-  <external href="apidocs/index.html" label="API (Javadoc)"/>
-  <separator/>
-  <document id="extensions" label="Extensions" source="xalan/extensions.xml"/>
-  <document id="extensionslib" label="Extensions Library" source="xalan/extensionslib.xml"/>
-  <separator/>
-  <document id="readme" label="Release Notes" source="xalan/readme.xml"/>
-  <hidden id="history" source="xalan/history.xml"/>
-  <hidden id="xsltc_constraints" source="xalan/xsltc_constraints.xml"/>
-  <hidden id="xsltc_history" source="xalan/xsltc_history.xml"/>
-  <separator/>
-  <external href="design/design2_0_0.html" label="Xalan 2 Design"/>
-  <external href="xsltc/index.html" label="XSLTC Design"/>
-  <separator/>
-  <external href="readme.html#bugs" label="Bugs"/>
-  <external href="http://xml.apache.org/xalan-j/test/overview.html" label="Testing"/>
-  <separator/>
-  <external href="readme.html#developer-list" label="Credits"/>
-  <external href="xsltc/todo.html#developer-list" label="XSLTC Credits"/>  
-</book>
diff --git a/xdocs/sources/xalan-jsite.xml b/xdocs/sources/xalan-jsite.xml
deleted file mode 100644
index 4dec5b7..0000000
--- a/xdocs/sources/xalan-jsite.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book SYSTEM "sbk:/style/dtd/book.dtd">
-
-<!--
- * 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, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<book title="Xalan XSL Transformer User's Guide" copyright="2002 The Apache Software Foundation">
-  <resources source="sbk:/sources/xalan/resources.xml"/>
-  <external href="../index.html" label="Home"/>
-  <separator/>
-  <document id="index" label="Xalan-J 2.2" source="xalan/index.xml"/>
-  <document id="whatsnew" label="What's New" source="xalan/whatsnew.xml"/>
-  <document id="dtm" label="DTM" source="xalan/dtm.xml"/>  
-  <document id="xsltc_usage" label="XSLTC Translets" source="xalan/xsltc_usage.xml"/>
-  <separator/>
-  <document id="overview" label="Overview" source="xalan/overview.xml"/>
-  <document id="getstarted" label="Getting Started" source="xalan/getstarted.xml"/>
-  <separator/>
-  <faqs id="faq" label="FAQs" source="xalan/faq.xml"/>
-  <separator/>
-  <document id="samples" label="Sample Apps" source="xalan/samples.xml"/>
-  <document id="commandline" label="Command Line" source="xalan/commandline.xml"/>
-  <separator/>
-  <document id="usagepatterns" label="Usage Patterns" source="xalan/usagepatterns.xml"/>
-  <separator/>
-  <document id="trax" label="TrAX" source="xalan/trax.xml"/>
-  <external href="apidocs/index.html" label="API (Javadoc)"/>
-  <separator/>
-  <document id="extensions" label="Extensions" source="xalan/extensions.xml"/>
-  <document id="extensionslib" label="Extensions Library" source="xalan/extensionslib.xml"/>
-  <separator/>
-  <document id="readme" label="Release Notes" source="xalan/readme.xml"/>
-  <hidden id="history" source="xalan/history.xml"/>
-  <hidden id="xsltc_constraints" source="xalan/xsltc_constraints.xml"/>
-  <hidden id="xsltc_history" source="xalan/xsltc_history.xml"/>
-  <separator/>
-  <external href="design/design2_0_0.html" label="Xalan 2 Design"/>
-  <external href="xsltc/index.html" label="XSLTC Design"/>  
-  <separator/>
-  <external href="readme.html#bugs" label="Bugs"/>  
-  <external href="http://xml.apache.org/xalan-j/test/overview.html" label="Testing"/>
-  <separator/>
-  <external href="readme.html#developer-list" label="Credits"/>
-  <external href="xsltc/todo.html#developer-list" label="XSLTC Credits"/>      
-</book>
diff --git a/xdocs/sources/xalan/commandline.xml b/xdocs/sources/xalan/commandline.xml
deleted file mode 100644
index f72e17b..0000000
--- a/xdocs/sources/xalan/commandline.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- 
-
-<s1 title="Command-Line Utility">
-   
-   <s2 title="Using the Command-Line Utility">
-      <p>To perform a transformation, you can call &xslt4j; from the command line (or script), 
-      an applet, an application, or a servlet (see <link idref="usagepatterns">Usage Patterns</link>).</p>
-     <p>The org.apache.xalan.xslt.Process main() method provides a command-line interface
-    for performing XSL transformation. To perform a transformation from the command line or a script,
-    do the following:</p>
- 		<ol>
-    <li>Download &xslt4j;.<br/><br/></li> 
-    <li><link idref="getstarted" anchor="classpath">Set the Java classpath</link> to include xalan.jar, xml-apis.jar, and
-    &xml4j-jar; -- or another conformant XML Parser -- see <link idref="usagepatterns" anchor="plug">Plugging in 
-    the Transformer and XML parser</link>).<br/><br/></li>
-    <li>Call java and the Process class with the appropriate flags and
-    arguments (described below). The following command line, for example, includes the -IN, -XSL,
-    and -OUT flags with their accompanying arguments -- the XML source document, the XSL
-    stylesheet, and the output file:<br/><br/>
-    <code>java org.apache.xalan.xslt.Process -IN foo.xml -XSL foo.xsl -OUT foo.out</code>
-    </li></ol>
-    <p>The command line utility can take the following flags and arguments (the flags are case insensitive):</p> 
-      <source>-IN inputXMLURL
--XSL XSLTransformationURL
--OUT outputFileName
--V (Version info)
--QC (Quiet Pattern Conflicts Warnings)
-
--L (Use line numbers for source document)
--TT (Trace the templates as they are being called)
--TG (Trace each result tree generation event)
--TS (Trace each selection event)
--TTC (Trace the template children as they are being processed)
--EDUMP [optional]FileName (Do stackdump on error)
--XML (Use XML formatter and add XML header)
--TEXT (Use simple Text formatter)
--HTML (Use HTML formatter)
--PARAM name value (Set a stylesheet parameter)
--DIAG (Print number of milliseconds transform operation took)
--FLAVOR flavorName (Transform with SAX for s2s or DOM for d2d)
--URIRESOLVER fullClassName (Use a custom URIResolver)
--ENTITYRESOLVER fullClassName (Use a custom EntityResolver)
--CONTENTHANDLER fullClassName (Use a custom ContentHandler)
--INCREMENTAL (Request incremental transform by setting
-  http://xml.apache.org/xalan/features/incremental to true)
--NOOPTIMIZE (Request no optizimation of stylesheet processing
-  by setting http://xml.apache.org/xalan/features/optimize to
-  false)
--RL recursionLimit (Set numeric limit on depht of stylesheet 
-  recursion)
--L (Obtain a SourceLocator that can be used within stylesheet to 
-  report location of nodes within the XML source document)      
-</source>
-      <p>Use <code>-IN</code> to specify the XML source document.</p> 
-      <p>Use <code>-XSL</code> to specify the XSL stylesheet file.</p>
-      <p>Use <code>-TEXT</code> if you want the output to include only element values (not element tags with element names and
-      attributes).</p>
-      <p>Use <code>-HTML</code> to write 4.0 transitional HTML (some elements, such as &lt;br&gt;, are
-      not well formed XML).</p>
-      <p>To set stylesheet parameters from the command line, use <br/>
-      <code>java org.apache.xalan.xslt.Process -PARAM <ref>name value</ref></code></p>
-      <p>The value is passed to the transformer as a String.</p>
-      <p>Use <code>-URIRESOLVER</code> with a fully qualified class name to utilize a custom implementation of the
-      <jump href="apidocs/javax/xml/transform/URIResolver.html">URIResolver</jump> TrAX interface to resolve URIs for
-       xsl:include, xsl:import, and the document() function.</p>
-       <p>Use <code>-ENTITYRESOLVER</code> with a fully qualified class name to utilize a custom implementation of the
-       <jump href="apidocs/org/xml/sax/EntityResolver.html">EntityResolver</jump> SAX interface to handle external entity references.</p>
-       <p>Use <code>-CONTENTHANDLER</code> with a fully qualified class name to utilize a custom implementation of the 
-       <jump href="apidocs/org/xml/sax/ContentHandler.html">ContentHandler</jump> SAX interface to serialize output.</p>
-       <note>If you want to validate an XML document (verify that it adheres to its DOCTYPE declatation), you can use the <link idref="samples" anchor="validateutility">Validate utility</link> shipped with &xslt4j-current;.</note>
-   </s2>
-</s1>
diff --git a/xdocs/sources/xalan/dtm.xml b/xdocs/sources/xalan/dtm.xml
deleted file mode 100644
index 25cdd09..0000000
--- a/xdocs/sources/xalan/dtm.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<s1 title="&xslt4j; DTM">
-<ul>
-  <li><link anchor="intro">Introduction</link></li>
-  <li><link anchor="settings">Performance settings</link></li>  
-</ul><anchor name="intro"/>
-<s2 title="Introduction">
-  <p>The Document Table Model (DTM) is an interface to a Document Model designed specifically for the needs of our XPath and XSLT 
-  implementations. The motivation behind this model is to optimize performance and minimize storage.</p>
-  <p>Specifically, DTM avoids the overhead of instantiating the objects the standard DOM requires to represent a tree of nodes. 
-  DTM uses unique integer "handles" to identify nodes, integer ID values to represent URLs, local names, and expanded names, and 
-  integer index and length references to a string buffer to represent the text value of each node.</p>
-  <p>In general, the "read" APIs to DTM resemble those of the W3C Document Object Model (<resource-ref idref="dom"/>) interface. 
-  However, in place of the DOM object tree of nodes, DTM uses integer arrays and string pools to represent the structure and content 
-  of the XML document to be transformed. DTM also structures the document's contents slightly differently, to better match the XPath 
-  data model; some details and constraints present in a standard DOM are suppressed, and a few XPath-specific features are added.</p>
-  <p>DTM is intended to be a read-only model, and so does not attempt to replicate the DOM's write or create-node operations.</p> 
-  <p>The details of constructing a DTM vary depending on which implementation of this API you are using. Two reference implementations are
-  currently available:</p>
-<ul>
-  <li>SAX2DTM (built via a SAX stream)</li>
-  <li>DOM2DTM (which provides DTM access to an existing DOM)</li>
-</ul> 
-  <p>Both DTMs can be built incrementally (see <link anchor="incremental">incremental transforms</link>). When operating incrementally, the
-  DTM allows the Xalan processor to begin reading the DTM and performing the transformation while the DTM is still being assembled 
-  (for example, while the parser is still parsing the XML source), and attempts to do only as much work as is needed to support the
-  read requests actually made by the XPath or XSLT processor.</p>
-  <p>For the convenience of user-written extensions, a proxy mechanism presents the contents of the DTM as a read-only subset of the DOM.</p>
-  </s2><anchor name="settings"/>
-  <s2 title="DTM performance settings">
-  <p>&xslt4j; implements two DTM performance features that you can control with the TransformerFactory
-  <jump href="apidocs/javax/xml/transform/TransformerFactory.html#setAttribute(java.lang.String, java.lang.Object)">setAttribute(String name, Object value)</jump>
-  method.</p>
-  <table>
-  <tr>
-    <th>Attribute name (URL)</th>
-    <th>Default setting</th>
-    <th>Description</th>
-  </tr>
-  <tr>
-    <td>"http://xml.apache.org/xalan/features/incremental"</td>
-    <td>false</td>
-    <td><link anchor="incremental">incremental transforms</link></td>
-  </tr>
-  <tr>
-    <td>"http://xml.apache.org/xalan/features/optimize"</td>
-    <td>true</td>
-    <td><link anchor="optimized">optimized transforms</link></td>
-  </tr>
-  </table>
-  <p>Both of these DTM settings are described below.</p>
-  <anchor name="incremental"/>
-  <s3 title="http://xml.apache.org/xalan/features/incremental">
-   <p>Set this feature to true to enable incremental transformations. If set to false (the default), the transform and the parse 
-   are performed on the same thread.</p>
-   <note> When set to true: If the parser is Xerces, we perform an
-incremental transform on a single thread using the Xerces
-   "parse on demand" feature. If the parser is not Xerces, we run the
-transform in one thread and the parse in another. Exception: if the
-   parser is not Xerces and the XML source is a DOMSource, setting this
-feature to true has no effect.</note>
-   <p>Example: setting incremental transforms to true:</p>
-   <source>javax.xml.transform.TransformerFactory tFactory =
-            javax.xml.transform.TransformerFactory.newInstance();
- // setAttribute() takes a String and an Object.            
-  tFactory.setAttribute
-            ("http://xml.apache.org/xalan/features/incremental", 
-             java.lang.Boolean.TRUE);
-  ...</source>
-  </s3><anchor name="optimized"/>
-  <s3 title="http://xml.apache.org/xalan/features/optimize">
-   <p>When set to true (the default), this feature enables optimizations that may involve structural rewrites of the stylesheet. 
-   Any tool that requires direct access to the stylesheet structure should set this feature to false.</p>
-</s3>
-</s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/extensions.xml b/xdocs/sources/xalan/extensions.xml
deleted file mode 100644
index 52dbf99..0000000
--- a/xdocs/sources/xalan/extensions.xml
+++ /dev/null
@@ -1,762 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="&xslt4j; Extensions">
-<ul>
-<li><link anchor="intro">Introduction</link></li>
-<li><link anchor="supported-lang">Supported languages</link></li>
-<li><link anchor="basic-pattern">The basic pattern</link></li>
-<li><link anchor="setup-runtime">Setting up the runtime environment</link></li>
-<li><link anchor="basic-syntax">Syntax</link></li>
-<li><link anchor="ext-elements">Using an extension element</link></li>
-<li><link anchor="ext-functions">Using extension functions</link></li>
-<li><link anchor="java-namespace">Alternative: using the abbreviated syntax for extensions implemented in Java</link></li>
-<li>Examples: <link anchor="ex-basic">basic JavaScript example</link>, <link anchor="ex-java-namespace">using the java namespace</link>, <link anchor="ex-java">using a Java Hashtable</link>, <link anchor="ex-javascript">using a JavaScript array</link></li>
-</ul><anchor name="intro"/>
-  <s2 title="Introduction">
-  <p>For those situations where you would like to augment the functionality of XSLT with calls to a procedural language, &xslt4j; supports the creation and use of extension elements and extension functions. &xslt4j; also provides a growing <link idref="extensionslib">extensions library</link> available for your use. An extension (a collection of elements and functions) inhabits a namespace, either a namespace you declare and designate as an extensions namespace, or one of the predefined namespaces that &xslt4j; provides. For information about XML namespaces, see <jump href="http://www.w3.org/TR/REC-xml-names/">Namespaces in XML</jump>.</p>
-
-<p><em>Extension elements</em>  Unlike a literal result element, which the stylesheet simply transfers to the result tree, an extension element performs an action. For example, you can use the Redirect extension elements shipped with &xslt4j; to redirect portions of your transformation output to one or more files. Extension elements may contain attributes, text nodes, other elements, basically any valid XML. Extension elements may perform quite sophisticated actions, given that the extension routine (the implementation) has direct access to the XSLT processor context object and to the element. In many cases the implementation returns void or null; if it does return a value, that value is placed in the transformation result tree.</p>
-
-<p><em>Extension functions</em>  You can think of extension functions as extending the core library of functions that XPath provides. An extension function passes arguments to the extension implementation and returns a value. You can use extension functions to return values that XSLT can interact with directly (node-set, result tree fragment, string, boolean, and number) as well as values (of any type) that you pass in turn to other extension functions. Extension functions written in Java can also access certain items in the XSLT execution environment through an <jump href="apidocs/org/apache/xalan/extensions/ExpressionContext.html">ExpressionContext</jump> interface.</p>
-
-<p>XSLT extensions are specified in the <jump href="http://www.w3.org/TR/xslt#extension">XSLT Recommendation</jump>.  This document focuses on the &xslt4j; implementation of those requirements, not on XSLT extensions in general. For additional information on extensions, consult the Recommendation or the other resources listed in <link idref="overview" anchor="uptospeed">Getting up to speed with XSLT</link>.</p>
-</s2><anchor name="supported-lang"/>
-<s2 title="Supported languages">
-<p>Extensions written in Java are directly supported by &xslt4j;.  For extensions written in languages other than Java, &xslt4j; uses the <resource-ref idref="bsf"/>, an architecture for incorporating scripting into Java applications and applets. BSF allows an application to take advantage of scripting while being independent of any specific scripting language. To date, we have tested extensions implemented in JavaScript. Other languages with BSF support appear in the table below.</p>
-<p>BSF requires bsf.jar on the classpath. This JAR file is shipped with &xslt4j; and is required only if you have extensions written in languages other than Java. The additional JAR files or DLLs required to support extensions written in other languages are listed in the table below. These files are available from the sources indicated and are not shipped with &xslt4j;.</p>
-<table>
-  <tr>
-    <td><em>Language</em></td>
-    <td><em>Version</em></td>
-    <td><em>Requirements</em></td>
-  </tr>
-  <tr>
-    <td>Mozilla Rhino (JavaScript)<br/><br/></td>
-    <td>1.5<br/><br/></td>
-    <td>js.jar available from 
-				    http://www.mozilla.org/rhino<br/><br/></td>
-  </tr>
-  <tr>
-    <td>NetRexx<br/><br/></td>
-    <td>1.148 up <br/><br/></td>
-    <td>NetRexxC.zip available from http://www2.hursley.ibm.com/netrexx<br/><br/></td>
-  </tr>
-    <tr>
-    <td>BML<br/><br/></td>
-    <td>2.4<br/><br/></td>
-    <td>bmlall.jar available from http://oss.software.ibm.com/developerworks/projects/bsf<br/><br/></td>
-  </tr>
-    <tr>
-    <td>JPython<br/><br/></td>
-    <td>1.1-beta3<br/><br/></td>
-    <td>python.jar available from http://www.jpython.org/<br/><br/></td>
-  </tr>
-    <tr>
-    <td>Jacl<br/><br/></td>
-    <td>1.1.1<br/><br/></td>
-    <td> jacl.jar and tcljava.jar from http://www.scriptics.com/java<br/><br/></td>
-  </tr>
-    <tr>
-    <td>Win32 ActiveScript langs
-	JScript, VBScript<br/><br/></td>
-    <td><br/><br/></td>
-    <td>MSVCP60.DLL from Microsoft, appropriate language DLLs from Microsoft 
-    http://msdn.microsoft.com/scripting<br/><br/></td>
-  </tr>
-    <tr>
-    <td>PerlScript<br/><br/></td>
-    <td><br/><br/></td>
-    <td>ActivePerl from http://www.activestate.com/<br/><br/></td>
-  </tr>  
-</table>
-</s2><anchor name="basic-pattern"/>
-<s2 title="The basic pattern">
-<p>Let's examine a simple example. The stylesheet below uses an extension element and an extension function to transform an element in the XML source into a statement in the output indicating the date by which a customer can expect a response to a given enquiry.</p>
-
-<p>The source element contains a numdays attribute. The extension element contains a multiplier attribute, which is used to set a variable in the extension. The extension function computes the deadline, that is the current date plus numdays * multiplier. So for &lt;deadline numdays="3"/&gt; (in the XML source) and &lt;my-ext:timelapse multiplier="2"/&gt; (in the stylesheet), the extension computes a deadline 6 days from now, and the stylesheet template transforms the deadline element into a string along the lines of <code>&lt;p&gt;We have logged your enquiry and will respond by April 29, 2000 12:07:16 PM EST.&lt;/p&gt;</code></p>
-<note>The extension function could include both numdays and multiplier as arguments, thus bypassing the need for the extension element, but the purpose here is to illustrate the usage pattern for extension elements.</note>
-<p>As you review this stylesheet, please note the following:</p>
-<ol>
-	  <li>The declaration of the Xalan lxslt namespace, which provides support for the component and
-     component/script elements:<br/><br/>
-    <code>xmlns:lxslt="http://xml.apache.org/xslt"</code><br/><br/></li>
-    <li>The declaration of a namespace for this extension:<br/><br/>
-    <code>xmlns:my-ext="ext1"</code><br/><br/></li>
-  	<li>The designation of this namespace prefix as an extension prefix. This causes any element in the namespace associated with this prefix to be treated as an extension element rather than a literal result element.<br/><br/>
-     <code>extension-element-prefixes="my-ext"</code><br/><br/></li>
-	  <li>The lxslt:component with attributes designating the namespace prefix and the elements and
-     functions this extension provides.<br/><br/></li>
-  	<li>The lxslt:script subelement with a JavaScript implementation of the extension. For Java
-     extensions, the lxslt:script element has a src attribute that you set to identify the Java class.</li>
-</ol><anchor name="ex-basic"/>   
-<source>&lt;?xml version="1.0"?&gt;
-&lt;!--Namespaces are global if you set them in the stylesheet element--&gt;
-&lt;xsl:stylesheet 
-    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-    version="1.0"   
-    xmlns:lxslt="http://xml.apache.org/xslt"
-    xmlns:my-ext="ext1"
-    extension-element-prefixes="my-ext"&gt;
-    
-  &lt;!--The component and its script are in the lxslt namespace and define the 
-    implementation of the extension.--&gt;
-  &lt;lxslt:component prefix="my-ext" elements="timelapse" functions="getdate"&gt;
-    &lt;lxslt:script lang="javascript"&gt;
-      var multiplier=1;
-      // The methods or functions that implement extension elements always take 2
-      // arguments. The first argument is the XSL Processor context; the second 
-      // argument is the element node.
-      function timelapse(xslProcessorContext, elem)
-      {
-        multiplier=parseInt(elem.getAttribute("multiplier"));
-        // The element return value is placed in the result tree.
-        // If you do not want a return value, return null.
-        return null;
-      }
-      function getdate(numdays)
-      {
-        var d = new Date();
-        var totalDays = parseInt(numdays) * multiplier;
-        d.setDate(d.getDate() + totalDays);
-        return d.toLocaleString();
-      }
-    &lt;/lxslt:script&gt;
-  &lt;/lxslt:component&gt;
-      
-  &lt;xsl:template match="deadline"&gt;
-    &lt;p&gt;&lt;my-ext:timelapse multiplier="2"/&gt;We have logged your enquiry and will 
-      respond by &lt;xsl:value-of select="my-ext:getdate(string(@numdays))"/&gt;.&lt;/p&gt;
-  &lt;/xsl:template>
-
-&lt;/xsl:stylesheet&gt;
-</source>
-</s2><anchor name="setup-runtime"/>
-<s2 title="Setting up the runtime environment">
-<p>To run the preceding example, bsf.jar and js.jar must be on the classpath. Remember that bsf.jar must be on the classpath to run any extension written in a language other than Java. For extensions implemented in a scripting language, see the additional requirements in <link anchor="supported-lang">Supported languages</link>.</p>
-</s2><anchor name="basic-syntax"/>
-<s2 title="Syntax">
-<p>You can always use the pattern illustrated above to set up and use extension elements and extension functions. For extension elements and functions implemented in Java, you can also use an abbreviated syntax, described in <link anchor="java-namespace">Alternative: using the abbreviated syntax for extensions implemented in Java</link>. Unless you are using the abbreviated syntax, do the following:</p>
-<s3 title="1. Declare the lxslt namespace">
-<p><br/><code>xmlns:lxslt="http://xml.apache.org/xslt"</code></p>
-<p>The lxslt namespace provides support for the lxslt:component element and lxslt:script subelement.</p>
-</s3>
-<s3 title="2. Declare a unique namespace for each extension prefix">
-<p><br/><code>xmlns:<ref>prefix</ref>=<ref>URI</ref></code></p>
-<p>The <ref>prefix</ref> identifies the namespace, and <ref>URI</ref> is an arbitrary (but unique) string that matches the value of the prefix attribute of an lxslt:component element in the stylesheet.<br/>
-Example: <code>xmlns:ext1="xyz"</code><br/><br/></p>
-</s3>
-<s3 title="3. If you are using extension elements, designate the extension element prefixes">
-<p><br/>This step is required only if you are using extension elements.  If you are using extension functions only, you can skip this step.</p>
-<p>In the stylesheet element, write:</p> 
-<p><code>extension-element-prefixes="<ref>prefix-1 prefix-2 ...</ref>"</code></p>
-<p>In a literal result element or extension element include the xsl prefix:</p>
-<p><code>xsl:extension-element-prefixes="<ref>prefix1 prefix2 ...</ref>"</code></p>
-<p>Keep in mind that where you declare namespaces and designate extension prefixes determines the scope of those namespaces.To make your extensions available throughout the stylesheet, include these settings and attribute in the stylesheet element.</p>
-</s3>
-<s3 title="4. (Optional) Exclude the extension namespace declaration from the result tree">
-<p><br/>By default, namespace declarations are included in the transformation output. To exclude namespaces from the output, use</p>
-<p><code>exclude-result-prefixes="<ref>prefix-1 prefix-2 ...</ref>"</code></p>
-<p>in the stylesheet element or</p>
-<p><code>xsl:exclude-result-prefixes="<ref>prefix-1 prefix-2 ...</ref>"</code></p> 
-<p>in a literal result element or extension element.</p>
-</s3>
-<s3 title="5. Set up an lxslt:component">
-<p><br/>In the scope of the lxslt namespace declaration:</p>
-<p><code>&lt;lxslt:component prefix="<ref>prefix</ref>" </code><br/>
-   <code>&nbsp;&nbsp;&nbsp;&nbsp;functions="<ref>func-1 func-2 ...func-n</ref>"</code><br/> 
-   <code>&nbsp;&nbsp;&nbsp;&nbsp;elements="<ref>elem-1 elem-2 ...elem-n</ref>"&gt;</code><br/>
-   <code>&nbsp;&nbsp;&lt;!--See lxslt:script below--&gt;</code><br/>
-   <code>&lt;/lxslt:component&gt;</code></p>
-<p>where <ref>func-1 func-2 ... func-n</ref> and <ref>elem-1 elem-2 ... elem-n</ref> designate the functions and elements the extension provides and the stylesheet uses. You can use the function-available and element-available functions to determine at run time whether a function or element designated in the lxslt:component is actually available.</p>
-<note>If the component is implemented in Java, the values of the <code>functions</code> and <code>elements</code> attributes are ignored. The function-available and element-available functions use reflection to examine the actual Java methods.</note>
-</s3>
-<anchor name="setup-script"/>
-<s3 title="6. Set up the lxslt:script element">
-<p><br/>In each lxslt:component, you must include exactly one lxslt:script element. If the extension is implemented in JavaScript:</p>
-<p><code>&lt;lxslt:script lang="javascript" &gt;</code><br/>
-<code>&nbsp;&nbsp;&lt;!--The implementation script--&gt;</code><br/>
-<code>&lt;/lxslt:script&gt;</code></p>
-<p>For other scripting languages supported by BSF, use the same approach as for JavaScript. &xslt4j; plans to add support for using the src attribute to identify another document that contains the implementation script; this feature is not yet supported.</p>
-<p>If the extension is implemented in Java, you have three choices for the format of the src attribute in the lxslt:script element.</p>
-<p><code>&lt;lxslt:script lang="javaclass" src="xalan://<ref>FQCN</ref>"/&gt;</code>
-<br/>where <ref>FQCN</ref> is the fully qualified class name.
-<br/>Example: <code>&lt;lxslt:script lang="javaclass" src="xalan://java.util.Hashtable"/&gt;</code></p>
-<p><code>&lt;lxslt:script lang="javaclass" src="xalan://<ref>PJPN</ref>"/&gt;</code>
-<br/>where <ref>PJPN</ref> is the beginning of or the complete name of a java package.
-<br/>Example: <code>&lt;lxslt:script lang="javaclass" src="java.util"/&gt;</code></p>
-<p><code>&lt;lxslt:script lang="javaclass" src="http://xml.apache.org/xslt/java"/&gt;</code></p>
-<p>The different formats for the value of the src attribute when using Java extensions are more fully explained in <link anchor="java-namespace-declare">Declare the namespace</link>.</p>
-</s3>
-<s3 title="Implicit DTD for lxslt:component">
-<source>&lt;!ELEMENT lxslt:component (lxslt:script)&gt;
-&lt;!ATTLIST lxslt:component
-  prefix CDATA #REQUIRED
-  elements NMTOKENS #IMPLIED
-  functions NMTOKENS #IMPLIED&gt;
-
-&lt;!ELEMENT lxslt:script (#PCDATA | EMPTY)?&gt;
-&lt;!ATTLIST lxslt:script
-  lang CDATA #REQUIRED
-  src CDATA #IMPLIED&gt;</source>
-</s3>
-</s2><anchor name="ext-elements"/>
-<s2 title="Using an extension element">
-<p>Extension elements pass the extension two objects:</p>
-<ul>
-<li><jump href="apidocs/org/apache/xalan/extensions/XSLProcessorContext.html">org.apache.xalan.extensions.XSLProcessorContext</jump>, which provides access to the XSL processor, the XML source tree, the stylesheet tree, the current context node, and the current mode (if any).<br/><br/></li>
-<li><jump href="apidocs/org/apache/xalan/templates/ElemExtensionCall.html">org.apache.xalan.templates.ElemExtensionCall</jump>, which provides the API for interacting with the extension element.</li>
-</ul>
-<p>You can use the ElemExtensionCall getAttribute(String name) method, for example, to read element attributes in their raw form.  Use the getAttribute(String name, Node sourceNode, XSLTEngineImpl processor) method to evaluate the attribute as an attribute value template.  Note that the method names are the same but the method signatures are different.  For full details, see the <jump href="apidocs/org/apache/xalan/templates/ElemExtensionCall.html">Javadoc</jump> for the ElemExtensionCall class.</p>
-<s3 title="Implementing an extension element">
-<p>For each extension element in a namespace, the implementation must be a Java method with the following signature, or the scripting language equivalent:</p>
-<p><code><ref>Type element</ref>(org.apache.xalan.extensions.XSLProcessorContext, </code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.xalan.templates.ElemExtensionCall extensionElement)</code></p>
-<p>where <ref>Type</ref> designates the return type and <ref>element</ref> is the local part of the extension element name (the element name without the namespace prefix). In the method signature, you may also use superclasses of the indicated types.</p>
-<p>If the extension element is implemented in a loosely typed scripting language, such as JavaScript, the arguments and return value are untyped.</p>
-<p><em>Caution:</em> The value returned by an extension element is placed in the transformation result. If you are not interested in a return value, use a public void Java method or return null from a scripting language function.</p>
-<p>Java example: <code>public void myElement</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(org.apache.xalan.extensions.XSLProcessorContext, </code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.xalan.templates.ElemExtensionCall extensionElement)</code></p>
-<p>JavaScript example: <code>function myElement(xslProcContext, element)</code></p>
-<p>The <link idref="extensionslib" anchor="redirect">Redirect extension</link> in the extensions library contains three extension elements.</p>
-</s3>
-
-</s2><anchor name="ext-functions"/>
-<s2 title="Using extension functions">
-<p>Extension functions may include arguments of any type and return a value of any type.</p>
-<p>XSLT recognizes five data types: node-set, result-tree-fragment, string, boolean, and number. You can use XPath expressions to set variables with values of these types. You can also pass literals for string, boolean, and number arguments. If you want to pass an argument of a type that XSLT does not recognize, use another extension function to return an object of that type. The stylesheet that appears in <link anchor="format-date-stylesheet">Formatting a date</link>, for example uses extension functions to return a Date object and a SimpleDateFormat object, and then uses these objects to call another extension function.</p>
-<s3 title="Data type mapping and method selection">
-<p>When calling an extension function written in a language other than Java, objects of the following Java classes will always be passed to the extension function:</p>
-  <table>
-    <tr>
-      <th>XSLT Type</th>
-      <th>Java Type</th>
-    </tr>
-    <tr>
-       <td>Node-Set</td>
-       <td>org.w3c.dom.traversal.NodeIterator</td>
-    </tr>
-    <tr>
-       <td>String</td>
-       <td>java.lang.String</td>
-    </tr>
-    <tr>
-       <td>Boolean</td>
-       <td>java.lang.Boolean</td>
-    </tr>
-    <tr>
-       <td>Number</td>
-       <td>java.lang.Double</td>
-    </tr>
-    <tr>
-       <td>Result Tree Fragment</td>
-       <td>org.w3c.dom.DocumentFragment</td>
-    </tr>
-  </table>
-<p>Any non-XSLT type is passed without conversion.</p>
-<p>When calling an extension function written in Java, the extension function signature can specify any of the indicated Java types, as explained below:</p>
-  <table>
-    <tr>
-      <th>XSLT Type</th>
-      <th>Java Types</th>
-    </tr>
-    <tr>
-       <td>Node-Set</td>
-       <td>org.w3c.dom.traversal.NodeIterator, org.w3c.dom.NodeList, org.w3c.dom.Node or its subclasses, java.lang.String, java.lang.Object, char, [double, float, long, int, short, byte,] boolean</td>
-    </tr>
-    <tr>
-       <td>String</td>
-       <td>java.lang.String, java.lang.Object, char, [double, float, long, int, short, byte,] boolean</td>
-    </tr>
-    <tr>
-       <td>Boolean</td>
-       <td>boolean, java.lang.Boolean, java.lang.Object, java.lang.String</td>
-    </tr>
-    <tr>
-       <td>Number</td>
-       <td>double, java.lang.Double, float, long, int, short,char, byte, boolean, java.lang.String, java.lang.Object</td>
-    </tr>
-    <tr>
-       <td>Result Tree Fragment</td>
-       <td>org.w3c.dom.traversal.NodeIterator, org.w3c.dom.NodeList, org.w3c.dom.Node or its subclasses, java.lang.String, java.lang.Object, char, [double, float, long, int, short, byte,] boolean</td>
-    </tr>
-    <tr>
-       <td>Non-XSLT Type</td>
-       <td>the native type or any of its superclasses, double, float, long, int, short, char, byte, java.lang.String</td>
-    </tr>
-  </table>
-<p>When calling extension functions written in Java, &xslt4j; selects the method to call as follows:</p>
-<ol>
-  <li>&xslt4j; selects all methods whose name matches the extension function name as specified in <link anchor="ext-func-calls">Extension function Java calls</link>.</li>
-  <li>From this list of methods, &xslt4j; determines which methods are <ref>qualified</ref>.</li>
-  <li>Each qualified method is assigned a score based on the table shown above. To assign the score to a given method, &xslt4j; examines each of the XSLT argument types in the function invocation in the stylesheet. For each argument, the appropriate row in the table above is selected. Then, the corresponding Java parameter type in the method signature in the Java program is scored. Types which appear earlier in the list are given a higher score.  That is, the list appears in order of scoring preference from highest to lowest. Types shown in square brackets have equal priority.</li>
-  <li>The method with the highest score is invoked after the arguments are converted to the appropriate type. If more than one method has the highest score, an exception is thrown.</li>
-</ol>
-<p>Any extension function written in Java can have a first parameter of type <code>org.apache.xalan.extensions.ExpressionContext</code>. Any method with an ExpressionContext as the first parameter will score higher than any method which does not have an ExpressionContext as a first parameter.</p>
-</s3>
-
-<anchor name="ext-func-retval"/>
-<s3 title="Return values">
-<p>The &xslt4j; extension mechanism examines the class of the value returned from a function and converts the value into an XSLT type according to the following table:</p>
-  <table>
-    <tr>
-      <th>Java Types</th>
-      <th>XSLT Type</th>
-    </tr>
-    <tr>
-       <td>org.w3c.dom.traversal.NodeIterator<br/>org.apache.xml.dtm.DTM<br/>org.apache.xml.dtm.DTMAxisIterator<br/>org.apache.xml.dtm.DTMIterator<br/>org.w3c.dom.Node</td>
-       <td>Node-Set</td>
-    </tr>
-    <tr>
-       <td>java.lang.String</td>
-       <td>String</td>
-    </tr>
-    <tr>
-       <td>java.lang.Boolean</td>
-       <td>Boolean</td>
-    </tr>
-    <tr>
-       <td>java.lang.Number</td>
-       <td>Number</td>
-    </tr>
-    <tr>
-       <td>org.w3c.dom.DocumentFragment</td>
-       <td>Result Tree Fragment</td>
-    </tr>
-    <tr>
-       <td>org.apache.xpath.objects.XObject</td>
-       <td>Specified XSLT Type</td>
-    </tr>
-    <tr>
-       <td>All other classes</td>
-       <td>Non-XSLT Type</td>
-    </tr>
-  </table>
-  <p>Note that the above test is applied using <code>instanceof</code> so that any subclasses of the classes listed above will be treated the same as the listed superclass.  For example, a <code>java.lang.Double</code> will be treated the same as a <code>java.lang.Number</code> and will be converted to an XSLT Number.</p>
-  <note>The return value conversion can somtimes cause confusion.  For example, if your extension function returns an object that is a subclass of NodeIterator, that object will be converted by &xslt4j; to an XSLT Node-Set.  If you later attempt to treat that object as a non-XSLT object of your original class and try to invoke a method on that object, your method invocation will fail.</note>
-</s3>
-
-<anchor name="ext-func-calls"/>
-<s3 title="Extension function Java calls">
-<p>The technique for instantiating Java objects and calling Java methods depends on the format of the extension namespace that was declared.  See <link anchor="java-namespace-declare">Declare the namespace</link> for the three different formats of namespace declarations for Java extensions. For each namespace format, the section below describes how to instantiate an object, how to invoke an instance method, and how to invoke a static method. The sections below explain, for each syntax, which methods are <ref>qualified</ref> for method selection as described in the preceeding section.</p>
-<s4 title="Class format namespace">
-<p><br/><em>To create an instance of an object</em>:
-<br/><code><ref>prefix</ref>:new (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix. A new instance is to be created with the <ref>args</ref> constructor arguments (if any). All constructor methods are qualified for method selection.
-<br/>Example: <code>&lt;xsl:variable name="myType"</code>
-<br/><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-class:new()"&gt;</code></p>
-
-<p><em>To invoke an instance method on a specified object</em>:
-<br/><code><ref>prefix</ref>:<ref>methodName</ref> (<ref>object</ref>, <ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix and <ref>methodName</ref> is the name of the method to invoke on <ref>object</ref> with the <ref>args</ref> arguments. <ref>object</ref> must be an object of the class indicated by the namespace declaration.  Otherwise, the case shown immediately below will apply. Only instance methods with  the name <ref>methodName</ref> are qualified methods. If a matching method is found, <ref>object</ref> will be used to identify the object instance and <ref>args</ref> will be passed to the invoked method.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-class:valueOf($myType, string(@population))"&gt;</code></p>
-
-<p><em>To invoke an instance method on a default object</em>:
-<br/><code><ref>prefix</ref>:<ref>methodName</ref> (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix and <ref>methodName</ref> is the name of the method to invoke with the <ref>args</ref> arguments. The first <ref>arg</ref>, if any, must not be an object of the class indicated by the namespace declaration.  Otherwise, the case shown immediately above will apply. Only instance methods with the name <ref>methodName</ref> are qualified methods. If a matching method is found, a default instance of the class will be created if it does not already exist.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-class:valueOf(string(@population))"&gt;</code></p>
-
-<p><em>To invoke a static method</em>:
-<br/><code><ref>prefix</ref>:<ref>methodName</ref> (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix and <ref>methodName</ref> is the name of the method to invoke with the <ref>args</ref> arguments. Only static methods with the name <ref>methodName</ref> are qualified methods. If a matching method is found, <ref>args</ref> will be passed to the invoked static method.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-class:printit(string(@population))"&gt;</code></p>
-</s4>
-<s4 title="Package format namespace">
-<p><br/><em>To create an instance of an object</em>:
-<br/><code><ref>prefix</ref>:<ref>subpackage</ref>.<ref>class</ref>.new (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix, <ref>subpackage</ref> is the rest of the package name (the beginning of the package name was in the namespace declaration), and <ref>class</ref> is the name of the class. A new instance is to be created with the <ref>args</ref> constructor arguments (if any). All constructor methods are qualified for method selection.
-<br/>Example: <code>&lt;xsl:variable name="myType"</code>
-<br/><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-package:extclass.new()"&gt;</code></p>
-
-<p><em>To invoke an instance method on a specified instance</em>:
-<br/><code><ref>prefix</ref>:<ref>methodName</ref> (<ref>object</ref>, <ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix and <ref>methodName</ref> is the name of the method to invoke on <ref>object</ref> with the <ref>args</ref> arguments. Only instance methods of the <ref>object</ref> with the name <ref>methodName</ref> are qualified methods. If a matching method is found, <ref>object</ref> will be used to identify the object instance and <ref>args</ref> will be passed to the invoked method.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-package:valueOf($myType, string(@population))"&gt;</code></p>
-
-<p><em>To invoke a static method</em>:
-<br/><code><ref>prefix</ref>:<ref>subpackage</ref>.<ref>class</ref>.<ref>methodName</ref> (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix, <ref>subpackage</ref> is the rest of the package name (the beginning of the package name was in the namespace declaration), <ref>class</ref> is the name of the class, and <ref>methodName</ref> is the name of the method to invoke with the <ref>args</ref> arguments. Only static methods with the name <ref>methodName</ref> are qualified methods. If a matching method is found, <ref>args</ref> will be passed to the invoked static method.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="my-package:extclass.printit(string(@population))"&gt;</code></p>
-<note>Unlike the class format namespace, there is no concept of a default object since the namespace declaration does not identify a unique class.</note>
-</s4>
-<s4 title="Java format namespace">
-<p><br/><em>To create an instance of an object</em>:
-<br/><code><ref>prefix</ref>:<ref>FQCN</ref>.new (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix for the Java namespace and <ref>FQCN</ref> is the fully qualified class name of the class whose constructor is to be called. A new instance is to be created with the <ref>args</ref> constructor arguments (if any). All constructor methods are qualified for method selection.
-<br/>Example: <code>&lt;xsl:variable name="myHash"</code>
-<br/><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="java:java.util.Hashtable.new()"&gt;</code></p>
-
-<p><em>To invoke an instance method on a specified instance</em>:
-<br/><code><ref>prefix</ref>:<ref>methodName</ref> (<ref>object</ref>, <ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix and <ref>methodName</ref> is the name of the method to invoke on <ref>object</ref> with the <ref>args</ref> arguments. Only instance methods of the <ref>object</ref> with the name <ref>methodName</ref> are qualified methods. If a matching method is found, <ref>object</ref> will be used to identify the object instance and <ref>args</ref> will be passed to the invoked method.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="java:put($myHash, string(@region), $newpop)"&gt;</code></p>
-
-<p><em>To invoke a static method</em>:
-<br/><code><ref>prefix</ref>:<ref>FQCN</ref>.<ref>methodName</ref> (<ref>args</ref>)</code></p>
-<p>where <ref>prefix</ref> is the extension namespace prefix, <ref>FQCN</ref> is the fully qualified class name of the class whose static method is to be called, and <ref>methodName</ref> is the name of the method to invoke with the <ref>args</ref> arguments. Only static methods with the name <ref>methodName</ref> are qualified methods. If a matching method is found, <ref>args</ref> will be passed to the invoked static method.
-<br/>
-Example: <code>&lt;xsl:variable name="new-pop"</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="java:java.lang.Integer.valueOf(string(@population))"&gt;</code></p>
-<note>Unlike the class format namespace, there is no concept of a default object since the namespace declaration does not identify a unique class.</note>
-</s4>
-</s3>
-
-<s3 title="Passing Nodes to java">
-<p>Please keep in mind that <em>all</em> LocationPath expressions return a node-set, even if the expression only returns a single attribute or a text node (node-sets with one member). You can use the XSLT string() function (as in the syntax examples above) to convert a node-set value to string, and the number() function to convert a node-set value to number (a double).</p>
-<p>If you want to pass a node-set to an extension function, set up a Java method to accept an 
-org.w3c.dom.NodeList (or an org.apache.xpath.NodeSet, which implements NodeList, if you want to modify the nodes).</p>
-<p>Suppose, for example, you have a myExtensions.ProcessNodes class with the following doSomething method:</p>
-<p><code>public static boolean doSomething(org.w3c.dom.NodeList nList)</code></p>
-<p>Assuming you set up this extension in the node-ext namespace, any of the following extension calls from a stylesheet are syntactically possible:</p>
-<p><code>&lt;!--Process the current node--&gt;</code><br/>
-<code>&lt;xsl:variable name="success" select="node-ext:MyExtensions.ProcessNodes.doSomething(.)"/&gt;</code></p>
-<p><code>&lt;!--Process all nodes in current context--></code><br/>
-<code>&lt;xsl:variable name="success" select="node-ext:MyExtensions.ProcessNodes.doSomething(*)"/&gt;</code></p>
-<p><code>&lt;!-- Process all nodes --></code><br/>
-<code>&lt;xsl:variable name="success" select="node-ext:MyExtensions.ProcessNodes.doSomething(/*)"/&gt;</code></p>
-<p><code>&lt;!--Process the foo/baz nodes in current context --></code><br/>
-<code>&lt;xsl:variable name="success" select="node-ext:MyExtensions.ProcessNodes.doSomething(foo/baz)"/&gt;</code></p>
-<p><code>&lt;!--Process the/foo/baz and /bar/saz nodes --></code><br/>
-<code>&lt;xsl:variable name="success" select="node-ext:MyExtensions.ProcessNodes.doSomething(/foo/baz | /bar/saz)"/&gt;</code></p>
-<p>The NodeList is in fact a list of references into the XML document, so keep in mind that getNextSibling(), for example, gets you the next sibling in the document, which may not be the next Node in the NodeList.</p>
-</s3>
-<s3 title="Implementing extension functions">
-<p>For each extension function in a namespace which is implemented in a language other than Java, the implementation must include a method with the following signature, or the scripting language equivalent:</p>
-<p><code>public <ref> object function</ref>(<ref>args</ref>)</code></p>
-<p>where <ref>object</ref> is the return type, <ref>function</ref> is the local part of the extension function name (the function name without the namespace prefix), and <ref>args</ref> correspond to the arguments in the function call.</p>
-<p>In addition, for extension functions implemented in Java, the implementation may include either a Java method with the signature shown above or one with the following signature:</p>
-<p><code>public <ref> object function</ref>(org.apache.xalan.extensions.ExpressionContext, <ref>args</ref>)</code></p>
-</s3>
-</s2><anchor name="java-namespace"/>
-<s2 title="Alternative: using the abbreviated syntax for extensions implemented in Java">
-<p>For extension functions and extension elements implemented in Java, Xalan permits an abbreviated syntax. When you use the abbreviated syntax, you do not use an lxslt:component to designate the functions.</p>
-<p>The abbreviated syntax supports the use of extension functions and extension elements implemented in Java. You cannot use this syntax with extensions implemented in JavaScript or another scripting language.</p>
-<anchor name="java-namespace-declare"/>
-<s3 title="Declare the namespace">
-<p>Declare the namespace for your extensions using one of the following three formats. The technique for invoking an extension for each format is explained in <link anchor="ext-func-calls">Extension function Java calls</link>.</p>
-<p><em>class format:</em> <code>xmlns:my-class="xalan://<ref>FQCN</ref>"</code></p>
-<p>where <ref>FQCN</ref> is the fully qualified class name.
-<br/>Examples: <code>xmlns:my-class="xalan://java.util.Hashtable"</code>
-<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>xmlns:my-class="xalan://mypackage.myclass"</code></p>
-<p><em>package format:</em> <code>xmlns:my-class="xalan://<ref>PJPN</ref>"</code></p>
-<p>where <ref>PJPN</ref> is a partial java package name.  That is, it is the beginning of or the complete name of a java package.
-<br/>Examples: <code>xmlns:my-package="xalan://java.util"</code>
-<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>xmlns:my-package="xalan://mypackage"</code></p>
-<p><em>Java format:</em> <code>xmlns:java="http://xml.apache.org/xslt/java"</code></p>
-<note>Although the namespace declarations for the class and package formats are shown with the xalan:// prefix, the current implementation for those formats will simply use the string to the right of the rightmost forward slash as the Java class name. This format, however, is the preferred format for extension namespace declarations.</note>
-<note>The class: prefix which was sometimes required in earlier versions of &xslt4j; is no longer required.</note>
-<note>These formats are also available when coding the src attribute of the lxslt:script element as explained in <link anchor="setup-script">Set up the lxslt:script element</link>.</note>
-</s3>
-<s3 title="Use the namespace when you make extension calls">
-<p>Use the declared prefix with the syntax described in <link anchor="ext-func-calls">Extension function Java calls</link>.</p>
-<p>That is all. You do not include an lxslt:component element. Using the abbreviated syntax clearly involves less setup than using the lxslt:component/lxslt:script approach.</p>
-<note>We recommend that, for extensions coded in Java, the abbreviated syntax should always be used since the lxslt:component/lxslt:script constructs add no functionality.</note>
-</s3><anchor name="ex-java-namespace"/> 
-<s3 title="Example: Formatting a date">
-<p>This example uses extension functions to call the SimpleDateFormat class and the IntDate class. IntDate uses String arguments to set up a Date object:</p>
-<source>import java.util.Date;
-import java.util.Calendar;
-
-public class IntDate
-{
-  public static Date getDate(String year, String month, String day)
-    {
-      // Date(int, int, int) has been deprecated, so use Calendar to
-      // set the year, month, and day.
-      Calendar c = Calendar.getInstance();
-      // Convert each argument to int.
-      c.set ( Integer.parseInt(year),
-              Integer.parseInt(month),
-              Integer.parseInt(day) );
-      return c.getTime();
-    }
-}</source>
-<p>The template transforms date elements with four attributes. For example, it transforms <code>&lt;date format="EEEE, MMM dd, yyyy" year="2000" month="4" day="27"/&gt;</code> into &lt;p&gt;Date: Thursday, April 27, 2000.&lt;/p&gt;.</p>
-<p>As you review this stylesheet, please keep the following in mind:</p>
- <ul>
-  <li>The exclude-result-prefixes stylesheet attribute prevents the java namespace declaration from
-   appearing in the output.</li>
-  <li>The XSLT type returned by any LocationPath expression is node-set, so the XSLT string
-    function is used to convert the format, year, month, and day attribute values from node-sets to
-    strings.</li>
-  <li>The format attribute provides a String argument for constructing a java.text.SimpleDateFormat
-    object.</li>
-    <li>The IntDate class uses String values provided by the year, month, and day attributes, to set the
-    date. XSLT can pass number values, but these are converted into doubles.</li>
-  <li>The formatter variable holds a SimpleDateFormat object, and the date variable holds a Date object.
-    XSLT does not understand either of these types, but they are used to call the SimpleDateFormat format
-     method. In that call, $formatter is the object, and $date is the argument. The syntax for calling
-     Java constructors and methods is described above in <link anchor="ext-func-calls">Extension function Java calls</link>.</li>    
- </ul><anchor name="format-date-stylesheet"/>   
-<source>&lt;?xml version="1.0"?&gt;
-&lt;xsl:stylesheet 
-    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-    version="1.0"   
-    xmlns:java="http://xml.apache.org/xslt/java"
-    exclude-result-prefixes="java"&gt;
-    
-  &lt;!--Other templates for transforming the rest of
-                                            the XML source documents--&gt;
-  
-  &lt;xsl:template match="date"&gt; 
-    &lt;xsl:variable name="year" select="string(./@year)"/&gt;
-    &lt;xsl:variable name="month" select="string(./@month)"/&gt; 
-    &lt;xsl:variable name="day" select="string(./@day)"/&gt;          
-    &lt;xsl:variable name="format" select="string(./@format)"/&gt;
-
-    &lt;xsl:variable name="formatter"       
-        select="java:java.text.SimpleDateFormat.new($format)"/&gt;
-
-    &lt;xsl:variable name="date" 
-        select="java:IntDate.getDate($year, $month, $day)"/&gt;
-
-    &lt;p&gt;Date: &lt;xsl:value-of select="java:format($formatter, $date)"/&gt;&lt;/p&gt;
-  &lt;/xsl:template&gt;
-&lt;/xsl:stylesheet&gt;  
-</source>
-</s3>
-</s2>
-<s2 title="Examples: using Java and JavaScript to implement the same extension">
-<p>This section contains two examples. The first example uses a Java extension to transform a set of name elements  into an alphabetical and numbered list. The second example uses a JavaScript script to do the same. Both examples include equivalent extension elements and an extension function.</p>
-<anchor name="ex-java"/> 
-<s3 title="Java implementation">
-<p>MyCounter.java</p>
-<source>Import java.util.*;
-
-public class MyCounter {
-  Hashtable counters = new Hashtable ();
-
-  public MyCounter () 
-  {}
-
-  public void init
-             ( org.apache.xalan.extensions.XSLProcessorContext context,
-               org.apache.xalan.templates.ElemExtensionCall extElem ) 
-  {
-    String name = extElem.getAttribute("name");
-    String value = extElem.getAttribute("value");
-    int val;
-    try 
-    {
-      val = Integer.parseInt (value);
-    } 
-    catch (NumberFormatException e) 
-    {
-      e.printStackTrace ();
-      val = 0;
-    }
-    counters.put (name, new Integer (val));
-  }
-
-  public int read(String name) 
-  {
-    Integer cval = (Integer) counters.get (name);
-    return (cval == null) ? 0 : cval.intValue ();
-  }
-
-  public void incr
-             ( org.apache.xalan.extensions.XSLProcessorContext context,
-               org.apache.xalan.templates.ElemExtensionCall extElem) 
-  {
-    String name = extElem.getAttribute("name");
-    Integer cval = (Integer) counters.get(name);
-    int nval = (cval == null) ? 0 : (cval.intValue () + 1);
-    counters.put (name, new Integer (nval));
-  }
-}
-</source>
-<p>An XML source document:</p>
-<source>&lt;?xml version="1.0"?&gt;
-&lt;doc&gt;
-  &lt;name first="David" last="Marston"/&gt;
-  &lt;name first="David" last="Bertoni"/&gt;
-  &lt;name first="Donald" last="Leslie"/&gt;
-  &lt;name first="Emily" last="Farmer"/&gt;
-  &lt;name first="Jack" last="Donohue"/&gt;
-  &lt;name first="Myriam" last="Midy"/&gt;
-  &lt;name first="Paul" last="Dick"/&gt;
-  &lt;name first="Robert" last="Weir"/&gt;
-  &lt;name first="Scott" last="Boag"/&gt;
-  &lt;name first="Shane" last="Curcuru"/&gt;
-&lt;/doc&gt;</source>
-<p>The stylesheet:</p>
-<source>&lt;?xml version="1.0"?&gt; 
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:lxslt="http://xml.apache.org/xslt"
-                xmlns:counter="MyCounter"
-                extension-element-prefixes="counter"
-                version="1.0"&gt;
-
-  &lt;lxslt:component prefix="counter"
-                   elements="init incr" functions="read"&gt;
-    &lt;lxslt:script lang="javaclass" src="xalan://MyCounter"/&gt;
-  &lt;/lxslt:component&gt;
-
-  &lt;xsl:template match="/"&gt;
-    &lt;HTML&gt;
-      &lt;H1&gt;Names in alphabetical order&lt;/H1&gt;
-      &lt;counter:init name="index" value="1"/&gt;
-      &lt;xsl:for-each select="doc/name"&gt;
-        &lt;xsl:sort select="@last"/&gt;
-        &lt;xsl:sort select="@first"/&gt;
-        &lt;p&gt;
-        &lt;xsl:text&gt;[&lt;/xsl:text&gt;
-        &lt;xsl:value-of select="counter:read('index')"/&gt;
-        &lt;xsl:text&gt;]. &lt;/xsl:text&gt;
-        &lt;xsl:value-of select="@last"/&gt;
-        &lt;xsl:text&gt;, &lt;/xsl:text&gt;
-        &lt;xsl:value-of select="@first"/&gt;
-        &lt;/p&gt;
-        &lt;counter:incr name="index"/&gt;
-      &lt;/xsl:for-each&gt;
-    &lt;/HTML&gt;
-  &lt;/xsl:template&gt;
- 
-&lt;/xsl:stylesheet&gt;
-</source>
-<p>Transformation output:</p>
-<source>&lt;HTML&gt;
-&lt;H1&gt;Names in alphabetical order&lt;/H1&gt;
-&lt;p&gt;[1]. Bertoni, David&lt;/p&gt;
-&lt;p&gt;[2]. Boag, Scott&lt;/p&gt;
-&lt;p&gt;[3]. Curcuru, Shane&lt;/p&gt;
-&lt;p&gt;[4]. Dick, Paul&lt;/p&gt;
-&lt;p&gt;[5]. Donohue, Jack&lt;/p&gt;
-&lt;p&gt;[6]. Farmer, Emily&lt;/p&gt;
-&lt;p&gt;[7]. Leslie, Donald&lt;/p&gt;
-&lt;p&gt;[8]. Marston, David&lt;/p&gt;
-&lt;p&gt;[9]. Midy, Myriam&lt;/p&gt;
-&lt;p&gt;[10]. Weir, Robert&lt;/p&gt;
-&lt;/HTML&gt;</source>
-</s3><anchor name="ex-javascript"/> 
-<s3 title="JavaScript implementation">
-<p></p>
-<source>&lt;?xml version="1.0"?&gt; 
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:lxslt="http://xml.apache.org/xslt"
-                xmlns:counter="MyCounter"
-                extension-element-prefixes="counter"
-                version="1.0"&gt;
-
-  &lt;lxslt:component prefix="counter"
-                   elements="init incr" functions="read"&gt;
-    &lt;lxslt:script lang="javascript"&gt;
-      var counters = new Array();
-
-      function init (xslproc, elem) {
-        name = elem.getAttribute ("name");
-        value = parseInt(elem.getAttribute ("value"));
-        counters[name] = value;
-        return null;
-      }
-
-      function read (name) {
-        // Return a string.
-        return "" + (counters[name]);
-      }
-
-      function incr (xslproc, elem)
-      {
-        name = elem.getAttribute ("name");
-        counters[name]++;
-        return null;
-      }
-    &lt;/lxslt:script&gt;
-  &lt;/lxslt:component&gt;
-
-  &lt;xsl:template match="/"&gt;
-    &lt;HTML&gt;
-      &lt;H1&gt;Names in alphatebical order&lt;/H1&gt;
-      &lt;counter:init name="index" value="1"/&gt;
-      &lt;xsl:for-each select="doc/name"&gt;
-        &lt;xsl:sort select="@last"/&gt;
-        &lt;xsl:sort select="@first"/&gt;
-        &lt;p&gt;
-        &lt;xsl:text&gt;[&lt;/xsl:text&gt;
-        &lt;xsl:value-of select="counter:read('index')"/&gt;
-        &lt;xsl:text&gt;]. &lt;/xsl:text&gt;
-        &lt;xsl:value-of select="@last"/&gt;
-        &lt;xsl:text&gt;, &lt;/xsl:text&gt;
-        &lt;xsl:value-of select="@first"/&gt;
-        &lt;/p&gt;
-        &lt;counter:incr name="index"/&gt;
-      &lt;/xsl:for-each&gt;
-    &lt;/HTML&gt;
-  &lt;/xsl:template&gt;
- 
-&lt;/xsl:stylesheet&gt;
-</source>
-<p>This stylesheet produces the same output as the preceding example with the Java extension.</p>
-</s3>
-</s2>
-</s1>
diff --git a/xdocs/sources/xalan/extensionslib.xml b/xdocs/sources/xalan/extensionslib.xml
deleted file mode 100644
index e1598a0..0000000
--- a/xdocs/sources/xalan/extensionslib.xml
+++ /dev/null
@@ -1,486 +0,0 @@
-<?xml version="1.0" standalone="no"?> 
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="Extensions library">
-<ul>
-<li><link anchor="intro">Introduction</link></li>
-<li><link anchor="xalanns">Xalan namespace</link></li>
-<li><link anchor="redirect">Redirect</link></li>
-<li><link anchor="nodeset">nodeset</link></li>
-<li><link anchor="intersection">intersection</link></li>
-<li><link anchor="difference">difference</link></li>
-<li><link anchor="distinct">distinct</link></li>
-<li><link anchor="hassamenodes">hasSameNodes</link></li>
-<li><link anchor="sql">SQL library</link></li>
-<li><link anchor="pipedocument">PipeDocument</link></li>
-<li><link anchor="evaluate">evaluate</link></li>
-<li><link anchor="tokenize">tokenize</link></li>
-<li><link anchor="groupitem">group and item</link> <ref>(to be done)</ref></li>
-<li><link anchor="type">type</link> <ref>(to be done)</ref></li>
-<li><link anchor="todate">toDate</link> <ref>(to be done)</ref></li>
-<li><link anchor="formatdate">formatDate</link> <ref>(to be done)</ref></li>
-<li><link anchor="grep">grep</link> <ref>(to be done)</ref></li>
-<li><link anchor="foreachtoken">forEachToken</link> <ref>(to be done)</ref></li>
-<li>Examples: <link anchor="ex-redirect">Redirect</link>, <link anchor="ex-nodeset">nodeset</link>, <link anchor="ex-sql">SQL library</link></li>
-</ul><anchor name="intro"/>
-<s2 title= "Introduction">
-<p>Extension elements and functions provide a powerful mechanism
-for extending and simplifying what you can do with an XLST processor like
-Xalan. With input and contributions from the XML open-source developer community, we are working on placing the most useful
-extensions in an extensions library distributed with &xslt4j;. If you have ideas and/or contributions you would like to make, please email us at the <human-resource-ref idref="xalandev"/>.</p>
-</s2><anchor name="xalanns"/>
-<s2 title="Xalan namespace">
-<p>Where it makes sense, we are placing the new Xalan extensions in the org.apache.xalan.lib.Extensions class and we have defined a namespace for this class:</p>
-<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>http://xml.apache.org/xalan</code></p>
-<p>If you are calling &xslt4j;-supplied extensions, we recommend that you define this namespace in your stylesheet element, and call the extension using the namespace prefix that you have associated with that namespace. That way, if we later reorganize how the &xslt4j;-supplied extensions are stored, you won't have to modify your stylesheet.</p>
-<p>For an example that uses this namespace, see <link anchor="ex-nodeset">Example with the nodeset extension function</link>.</p>
-</s2><anchor name="redirect"/>
-<s2 title= "Redirect">
-<p>A standard XSL transformation involves an XSL stylesheet, an XML source tree, and the transformation result tree. The transformation sends the entire result to a single <jump href="apidocs/org/apache/trax/Result.html">org.apache.trax.Result</jump> object.</p> 
-<p>The Redirect extension 
-(<jump href="apidocs/org/apache/xalan/xslt/extensions/Redirect.html">org.apache.xalan.xslt.extensions.Redirect</jump>) supplies three extension elements that you can use to redirect portions of your transformation output to multiple files: &lt;open&gt;, &lt;write&gt;, and &lt;close&gt;. If you use the &lt;write&gt; element alone, the extension opens a file, writes to it, and closes the file immediately. If you want explicit control over the opening and closing of files, use &lt;write&gt; in conjunction with the &lt;open&gt; and &lt;close&gt; elements.</p>
-<p>Each of these elements includes a file attribute and/or a select attribute to designate the output file. The file attribute takes a string, so you can use it to directly specify the output file name. The select attribute takes an XPath expression, so you can use it to dynamically generate the output file name. If you include both attributes, the Redirect extension first evaluates the select attribute, and falls back to the file attribute if the select attribute expression does not return a valid file name.</p>
-<anchor name="ex-redirect"/> 
-<s3 title="Example with the Redirect extension">
-<p>Suppose you are outputting the bulk of your result tree to one file, but you want to output the transformation of all &lt;foo&gt; elements and their children to another file. The following example illustrates the basic structure of the XML source:</p>
-<source>&lt;?xml version="1.0"?&gt; 
-&lt;doc&gt;
-  &lt;foo file="foo.out"&gt;
-    Testing Redirect extension:
-      &lt;bar&gt;A foo subelement text node&lt;/bar&gt;
-  &lt;/foo&gt;
-  &lt;main&gt;
-    Everything else
-  &lt;/main&gt;  
-&lt;/doc&gt;</source>
-<p>This stylesheet redirects part of the output to a secondary file:</p>
-<source>
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    version="1.0"
-    xmlns:lxslt="http://xml.apache.org/xslt"
-    xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"
-    extension-element-prefixes="redirect"&gt;
-
-  &lt;xsl:template match="/"&gt;
-    &lt;standard-out&gt;
-      Standard output:
-      &lt;xsl:apply-templates/&gt;
-    &lt;/standard-out&gt;
-  &lt;/xsl:template&gt;
-  
-  &lt;xsl:template match="main"&gt;
-    &lt;main&gt;
-      &lt;xsl:apply-templates/&gt;
-    &lt;/main&gt;
-  &lt;/xsl:template&gt;
-  
-  &lt;xsl:template match="/doc/foo"&gt;
-    &lt;redirect:write select="@file"&gt;
-      &lt;foo-out&gt;
-        &lt;xsl:apply-templates/&gt;
-      &lt;/foo-out&gt;
-    &lt;/redirect:write&gt;
-  &lt;/xsl:template&gt;
-  
-  &lt;xsl:template match="bar"&gt;
-    &lt;foobar-out&gt;
-      &lt;xsl:apply-templates/&gt;
-    &lt;/foobar-out&gt;
-  &lt;/xsl:template&gt;
-  
-&lt;/xsl:stylesheet&gt;</source>
-<p>The standard output is:</p>
-<source>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;standard-out&gt;
-  Standard output:
-  &lt;main&gt;
-    Everything else.
-  &lt;/main&gt;
-&lt;standard-out&gt;</source>
-<p>The output redirected to foo.out is:</p>
-<source>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;foo-out&gt;
-    Testing Redirect extension:
-    &lt;foobar-out&gt;foo subelement text node&lt;/foobar-out&gt;
-  &lt;/foo-out&gt;</source>
-<p>For more information on using the Redirect extension to send output to multiple files, examine the <link idref="samples" anchor="ext1">SimpleRedirect</link> sample and see the <jump href="apidocs/org/apache/xalan/lib/Redirect.html">Redirect</jump> class Javadoc.</p>  
-</s3></s2><anchor name="nodeset"/>
-<s2 title= "nodeset">
-<p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
-<code>nodeset (result-tree-fragment)</code>  casts a result tree fragment into a node-set.</p>
-<note>When you bind a variable to a template, rather than to the value generated by a select expression, the data type of the variable is result tree fragment. For more information, see <jump href="http://www.w3.org/TR/xslt#section-Result-Tree-Fragments">Result Tree Fragments</jump>.</note>
-<anchor name="ex-nodeset"/>
-<s3 title="Example with the nodeset extension function">
-<p>The following stylesheet uses the nodeset extension function to cast a result tree fragment into a node-set that can then be navigated in standard XPath manner. It uses the http://xml.apache.org/xalan namespace to provide access to the nodeset() method in xml.apache.xalan.lib.Extensions.</p>
-<source>&lt;?xml version="1.0"?&gt;
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-                   version="1.0"
-                   xmlns:xalan="http://xml.apache.org/xalan"
-                   exclude-result-prefixes="xalan"&gt;
-&lt;xsl:template match="/"&gt;
-  &lt;out&gt;
-	  &lt;xsl:variable name="rtf"&gt;
-      &lt;docelem&gt;
-        &lt;elem1&gt;
-          &lt;elem1a&gt;ELEMENT1A&lt;/elem1a&gt;
-          &lt;elem1b&gt;,ELEMENT1B&lt;/elem1b&gt;
-        &lt;/elem1&gt;
-        &lt;elem2&gt;
-          &lt;elem2a&gt;ELEMENT2A&lt;/elem2a&gt;
-        &lt;/elem2&gt;
-      &lt;/docelem&gt;
-    &lt;/xsl:variable&gt;     
-      &lt;xsl:for-each select="xalan:nodeset($rtf)/docelem//*"&gt;
-        &lt;xsl:value-of select="name(.)"/&gt;&lt;xsl:text&gt;,&lt;/xsl:text&gt;
-      &lt;/xsl:for-each>
-  &lt;/out>
-&lt;/xsl:template> 
-&lt;/xsl:stylesheet&gt;</source>
-<p>The output of running this stylesheet (with any XML input source) is a comma-delimited list of the element names in the node-set<br/>
-&nbsp;&nbsp;<code>&lt;out&gt;elem1,elem1a,elem1b,elem2,elem2a&lt;/out&gt;</code></p>
-<note>For illustration purposes, the preceding stylesheet pays no attention to the structure and content of the XML input document. Instead, it processes the template (in the stylesheet) bound to the variable named rtf.</note>
-
-</s3>
-</s2><anchor name="intersection"/>
-<s2 title="intersection">
-<p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
-<code>intersection (node-set1, node-set2)</code>  function returns a node-set with all nodes that are in ns1 and in ns2 .</p>
-</s2><anchor name="difference"/>
-<s2 title= "difference">
-<p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
-<code>difference(node-set1, node-set2)</code> returns a node-set with the nodes in node-set1 and not in node-set2.</p>
-</s2><anchor name="distinct"/>
-<s2 title= "distinct">
- <p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
- distinct (node-set) returns a node-set containing nodes with distinct string values. If more than one node in the node-set 
- contains the same text node value, distinct only returns the first of these nodes that it finds.</p>
-</s2><anchor name="hassamenodes"/>
-<s2 title= "hasSameNodes">
-<p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
-<code>hasSameNodes(node-set1, node-set2)</code> returns true if both node-set1 and node-set2 contain exactly the same set of nodes.</p>
-</s2><anchor name="sql"/>
-<s2 title= "SQL library">
-<note>For UML Diagrams of the SQL Library, see <jump href="http://xml.apache.org/xalan-j/Xalan-SQL-Extension/DiagramIndex.html">SQL Library UML Diagrams</jump>.</note>
-<ul>
-<li><link anchor="sqlconn">Setting up a connection</link></li>
-<li><link anchor="sqlparam">Parameterized queries</link></li>
-<li><link anchor="ex-sql">SQL library example</link></li>
-<li><link idref="samples" anchor="sql">SQL library sample applications</link></li>
-</ul>
-<p>Provides extension functions for connecting to a JDBC data source, executing a query,
-and working incrementally through a "streamable" result set. Streaming (reuse of a single row node to traverse the result set) is the default mode of operation. If you want unlimited access to the entire result set, you can cache the query result set (1 row node for each row in the result set).</p>
-<p><em>If you use streaming mode (the default), you can only access row elements one at a time moving forward through the result set. The use of XPath expressions in your stylesheet, for example, that attempt to return nodes from the result set in any other manner may produce unpredictable results.</em></p>
-<note>Many features of the SQL library, including support for connection pools, parameterized queries, caching, and added support for extracting connection information and query parameters from XML source documents exist thanks to John Gentilin (johnglinux@eyecatching.com), who has also added a number of <link idref="samples" anchor="sql">SQL library samples</link>.</note>
-<p><jump href="apidocs/org/apache/xalan/lib/sql/XConnection.html">org.apache.xalan.lib.sql.XConnection</jump> provides a number of extension functions that you can use in your stylesheet.</p>
-    <ol>
-      <li>new() -- Use one of the XConnection constructors to connect to a data source, and return an XConnection
-       object. You can use one of the constructors creates a connection pool from which stylesheets can obtain connections 
-       to a datasource. To support connection pools, SQL library includes a ConnectionPool interface and a implementation:
-       DefaultConnectionPool. You can also provide your own ConnectionPool implementation.<br/><br/></li>
-      <li>query() -- Use the XConnection object query() method to return a "streamable" result set in the form of a row-set
-       node. Work your way through the row-set one row at a time. The same row element is used over and over again, so you can
-       begin "transforming" the row-set before the entire result set has been returned.<br/><br/></li>
-       <li>pquery(), addParameter(), addParameterFromElement(), clearParameters() -- Use the XConnection pquery() method in 
-       conjunction with these other methods to set up and execute parameterized queries.<br/><br/></li>
-       <li>Use enableStreamingMode() to use a single row node to "stream" through the result set, and disableStreamingMode()
-        to cache the query result set. <br/><br/></li>
-      <li>close() -- Use the XConnection object close() method to terminate the connection.</li>      
-    </ol>
-    <p>The query() and pquery() extension functions return a Document node that contains (as needed) an array of column-header elements, 
-    a single row element that is used repeatedly, and an array of col elements. Each column-header element (one per column in
-    the row-set) contains an attribute (ColumnAttribute) for each of the column descriptors in the ResultSetMetaData object. 
-    Each col element contains a text node with a textual representation of the value for that column in the current row.</p>
-    <anchor name="sqlconn"/>
-    <s3 title="Setting up a connection">
-    <p>You can place connection information (JDBC driver, datasource URL, and usually user ID and password) in stylesheets or
-     in XML source documents.</p> 
-     <p>The following stylesheet fragment uses stylesheet parameters to designate a JDBC driver and datasource. The default
-     parameter values can be overridden with runtime parameter values.</p>
-     <source>&lt;xsl:param name="driver" select="'org.enhydra.instantdb.jdbc.idbDriver'"/&gt;
-&lt;xsl:param name="datasource" select="'jdbc:idb:../../instantdb/sample.prp'"/&gt;
-&lt;xsl:param name="query" select="'SELECT * FROM import1'"/&gt;</source>
-      <p>You can also obtain connection information from the XML source document that you use for the transformationl. Suppose 
-      you have the following DBINFO nodeset in an XML document:</p>
-      <source>&lt;DBINFO&gt;
-  &lt;dbdriver&gt;org.enhydra.instantdb.jdbc.idbDriver&lt;/dbdriver&gt;
-  &lt;dburl&gt;jdbc:idb:../../instantdb/sample.prp&lt;/dburl&gt;
-  &lt;user&gt;jbloe&lt;/user&gt;
-  &lt;password&gt;geron07moe&lt;/password&gt;
-&lt;/DBINFO&gt;</source>
-       <p>In the stylesheet, you can extract this information as follows:</p>
-       <source>&lt;xsl:stylesheet version 1.0
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extension-element-prefixes="sql"&gt;
-&nbsp;&nbsp;&lt;xsl:param name="cinfo" select="//DBINFO"/&gt;
-&nbsp;&nbsp;&lt;xsl:variable name="db" select="sql:new($cinfo)"/&gt;
-....</source> 
-      <p>For an example of both approaches, see <link idref="samples" anchor="basic-conn">Basic Connection</link> samples.</p>
-      <p>You can also create a named connection pool that is maintained external to &xslt4j;.</p>
-      <source>import org.apache.xalan.lib.sql.DefaultConnectionPool;
-import org.apache.xalan.lib.sql.XConnectionPoolManager;
-...
-DefaultConnectionPool cp = new DefaultConnectionPool();
-cp.setDriver("org.enhydra.instantdb.jdbc.idbDriver");
-cp.setURL("jdbc:idb:../../instantdb/sample.prp");
-cp.setUser("jbloe");
-cp.setPassword("geron07moe");
-// Start with 10 connections.
-cp.setMinConnections(10);
-cp.enablePool();
-// Register the connection pool so stylesheets can use it.
-XConnectionPoolManager pm = new XConnectionPoolManager();
-pm.registerPool("extpool", cp);</source>
-      <p>A stylesheet can use this connection pool as follows:</p>
-      <source>&lt;xsl:stylesheet version 1.0
-     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-     xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-     extension-element-prefixes="sql"&gt;
-...
-  &lt;xsl:variable name="db" select="sql:new($driver, 'extpool')"/&gt;</source>
-      <p>For an example, see the <link idref="samples" anchor="ext-conn">ExternalConnection</link> sample.</p>
-    </s3><anchor name="sqlparam"/>
-    <s3 title="Parameterized queries">
-      <p>To define a parameterized query, use a SQL query string with a question mark (?) for each parameter. You can provide 
-      the parameter values at runtime with stylesheet parameters or with nodes in the XML source document. For each parameter, 
-      you should also designate the SQL data type.</p>
-      <p>XConnection provides a number of addParameter() methods and an addParameterFromElement() method that you can use 
-      as extension functions to pull in the parameter values (in the order the parameters appear in the query). To
-      execute the query and return the result set, call the pquery() method as an extension function. There are two variations 
-      of the pquery() method. The one you should ordinarily use includes as arguments the SQL query string and a string list 
-      (delimited by the space, tab, or line feeds) of parameter types. For example:</p>
-      <source>&lt;xsl:variable name="resultset" 
-        select=sql:pquery($XConnectionObj, 
-                          'select * from X where Y = ? and Z = ?',
-                          'int string')"/&gt;</source>
-      <p>For a complete example, see the <link idref="samples" anchor="pquery">Parameterized query</link> sample.</p>
-  </s3><anchor name="ex-sql"/> 
-    <s3 title="Example with SQL library">
-    <p>This example displays the result set from a table in a sample InstantDB database. It is also
-    available as a sample application; see <link idref="samples" anchor="ext6">6-sqllib-instantdb</link>.</p>
-<source>&lt;?xml version="1.0"?&gt;
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                version="1.0"
-                xmlns:sql="org.apache.xalan.lib.sql.XConnection"
-                extension-element-prefixes="sql"&gt;
-  &lt;xsl:output method="html" indent="yes"/&gt;
-  &lt;xsl:param name="query" select="'SELECT * FROM import1'"/&gt;
- 
-  &lt;xsl:template match="/"&gt;
-    &lt;!-- 1. Make the connection --&gt;
-    &lt;xsl:variable name="products"
-                  select="sql:new('org.enhydra.instantdb.jdbc.idbDriver',
-                                'jdbc:idb:.\instantdb\sample.prp')"/&gt;
-    &lt;HTML&gt;
-      &lt;HEAD&gt;
-      &lt;/HEAD&gt;
-      &lt;BODY&gt;
-        &lt;TABLE border="1"&gt;
-        &lt;!--2. Execute the query --&gt;
-        &lt;xsl:variable name="table" select='sql:query($products, $query)'/&gt;
-          &lt;TR&gt;
-          &lt;!-- Get column-label attribute from each column-header--&gt;
-          &lt;xsl:for-each select="$table/sql/metadata/column-header"&gt;
-            &lt;TH&gt;&lt;xsl:value-of select="@column-label"/&gt;&lt;/TH&gt;
-          &lt;/xsl:for-each&gt;
-          &lt;/TR&gt;
-          &lt;xsl:apply-templates select="$table/sql/row-set/row"/&gt;
-          &lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;
-        &lt;/TABLE&gt;
-      &lt;/BODY&gt;
-    &lt;/HTML&gt; 
-    &lt;!-- 3. Close the connection --&gt;
-    &lt;xsl:value-of select="sql:close($products)"/&gt;
-  &lt;/xsl:template&gt;
-
-  &lt;xsl:template match="row"&gt;
-        &lt;TR&gt;
-          &lt;xsl:apply-templates select="col"/&gt;
-        &lt;/TR&gt;
-  &lt;/xsl:template&gt;
-
-  &lt;xsl:template match="col"&gt;
-    &lt;TD&gt;
-      &lt;!-- Here is the column data -->
-      &lt;xsl:value-of select="text()"/>
-    &lt;/TD>
-  &lt;/xsl:template>
-
-&lt;/xsl:stylesheet&gt;
-</source>
-</s3>
-  
-  </s2><anchor name="pipedocument"/>
-  <s2 title="pipeDocument">
-  <p>Implemented in <jump href="apidocs/org/apache/xalan/lib/PipeDocument.html">org.apache.xalan.lib.PipeDocument</jump>,<br/>
-  the pipeDocument extension element pipes an XML document through a series of one or more transformations. The output of
-  each transformation is piped to the next transformation. The final transofrmation creates a target file.</p>
-  
-  <p>Suppose, for example,you have a stylesheet that is processing a "book" document with elements designating the 
-  documents to be transformed. This primary stylesheet generates a table of contents for the book. For each source 
-  document it uses a pipeDocument extension element to pipe the document through a series of one or more transformations.</p>
-  <s3 title="Sample: generating a table of contents and an HTML &quot;book&quot;">
-    <p>An XML "book" document contains a number of doc elements like the following:<br/>
-    <code>&lt;doc source="sources/intro.xml" id="intro" label="Introduction"&gt;</code></p>
-    <p>The source attribute identifies the document to be transformed, the id is the output file name, 
-    and the primary stylesheet places the label in the table-of-contents link.</p>
-    <p>The stylesheet declares the pipeDocument namespace, designates the namespace prefix as an extension element prefix,
-    and contains a parameter designating where the output files are to be placed:</p>
-  <source>&lt;xsl:stylesheet version="1.0"
-   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-   xmlns:pipe="xalan://PipeDocument"
-   extension-element-prefixes="pipe"&gt;
-   
-&lt;xsl:param  name="destdir" value="html/output"&gt;
-...</source>
-<p>This stylesheet contains a template where each doc element is processed. For each doc element, the stylesheet adds an 
-entry to the table-of-contents document. The extension element pipes the specified document through a series of two 
-transformations, with an stylesheet input parameter for the first transformation. The pipeDocument target attribute 
-designates the output from the second transformation.</p>
-
-<source>&lt;xsl:template match="doc"&gt;
-  &lt;p&gt;
-    &lt;a href={$destdir}&gt;&lt;xsl:value-of select="@label"/&gt;&lt;a&gt;
-  &lt;/p&gt;
-
-  &lt;pipe:pipeDocument   source="{@source}" target="{$destdir/@id}"&gt;
-    &lt;stylesheet href="ss1.xsl"&gt;
-      &lt;param name="doc-id" value="@id"/&gt;
-    &lt;/stylesheet&gt;
-    &lt;stylesheet href="ss2.xsl"/&gt;   
-  &lt;/pipe:pipeDocument&gt;
-  
-&lt;/xsl:template&gt;</source>
- 
-   <p>Notes:</p>
-   <ul>
-   <li>The base URI for the source attribute is the XML "book" document.</li>
-   <li>The target attribute is taken as is (the base is the current user directory from which this transformation is being run).</li>
-   <li>The stylsheet containg the extension element is the base URI for the stylesheet hrefs.</li>
-   </ul>
-</s3>
-<s3 title="Variation: using pipeDocument in an empty stylesheet">
-<p>Suppose you want to pipe a document through a series of transformations. You can use the pipeDocument extension element
-to perform this operation by placing the extension element in an otherwise empty stylesheet.</p>
-<p>The following stylesheet is used to merge the Xalan documents into a book (the first transformation), and transform the book
-into a tree of formatting objects, which can then be used to generate a PDF file. This transformation is invoked as follows:</p>
-<p><code>java org.apache.xalan.xslt.Process -in printbook.xml</code><br/>
-<code> -param source printbook.xml</code><br/>
-<code> -param target xalanbook.fo</code></p>
-<p>There is no XML input document or output document for the primary transformation, which does no more than invoke
-the extension element.</p>
-<source>&lt;?xml version='1.0'?&gt;
-
-&lt;xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:pipe="xalan://org.apache.xalan.lib.PipeDocument"
-                extension-element-prefixes="pipe"&gt;
-
-&lt;xsl:param name="source"/&gt;
-&lt;xsl:param name="target"/&gt;
-
-&lt;xsl:template match="/"&gt;
-
-  &lt;pipe:pipeDocument 
-        source="{$source}"
-        target="{$target}"&gt;
-    &lt;stylesheet href="printbook_assemble.xsl"/&gt;
-    &lt;stylesheet href="bkbook8x11_xalan.xsl"/&gt;
-  &lt;/pipe:pipeDocument&gt;
-  
-&lt;/xsl:template&gt;
-
-&lt;/xsl:stylesheet&gt;</source>
-
-</s3>  
-  </s2><anchor name="evaluate"/>
-  <s2 title= "evaluate">
-  <p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
-<code>evaluate (xpath-expression)</code> function returns the result of evaluating the xpath-expression in the current 
-XPath expression context (automatically passed in by the extension mechanism).</p>
-<p>Use the evaluation extension function when the value of the expression is not known until run time.</p>
-</s2><anchor name="tokenize"/>
-<s2 title="tokenize">
-<p>Implemented in <jump href="apidocs/org/apache/xalan/lib/Extensions.html">org.apache.xalan.lib.Extensions</jump>,<br/>
-<code>tokenize (tokenize-string, delimiters)</code><br/>
-or<br/>
-<code>tokenize (tokenize-string)</code> function returns a node-set containing one text node for each token in the tokenize-string.</p>
-<p>The delimiters determine which characters are used to divide the tokenize-string into individual tokens. If you do not include
-the delimiters argument, the function uses tab (&amp;#x09), linefeed (&amp;#x0A), return (&amp;#x0D), and space (&amp;#x20) as delimiters.
-If tokenize-string is an empty string or contains only delimiters, the result is an empty node-set.</p>
-</s2><anchor name="groupitem"/>
-<s2 title= "group and item">
-<p><em>To be done.</em> Provides efficient grouping of items with a common value.</p>
-</s2><anchor name="type"/>
-<s2 title= "type">
-<p><em>To be done.</em> Returns a string that represents the Schema or DTD type.</p>
-</s2><anchor name="todate"/>
-<s2 title="to-date">
-<p><em>To be done.</em> Takes a string as input, and returns a long value representing the date.</p>
-</s2><anchor name="formatdate"/>
-<s2 title="format-date">
-<p><em>To be done.</em> Takes a date string, and formats it according to a specification.</p>
-</s2><anchor name="grep"/>
-<s2 title="grep">
-<p><em>To be done.</em> Performs a grep function and returns the substring.</p>
-</s2><anchor name="foreachtoken"/>
-<s2 title="for-each-token">
-<p><em>To be done.</em> Tokenizes a string, treats each token as a DOM Text node, and executes the
-sub-template.</p>
-</s2>
-</s1>
diff --git a/xdocs/sources/xalan/faq.xml b/xdocs/sources/xalan/faq.xml
deleted file mode 100644
index bc2771d..0000000
--- a/xdocs/sources/xalan/faq.xml
+++ /dev/null
@@ -1,292 +0,0 @@
-<?xml version="1.0" standalone="no"?> 
-<!DOCTYPE faqs SYSTEM "../../style/dtd/faqs.dtd">
-
-<faqs title="Frequently asked questions">
-
-  <faq title="Where do I go to learn about XSLT">  
-    <q>Where do I go to learn about XSLT?</q>    
-    <a><p>The definitive sources are the W3C XSLT and XPath recommendations: <resource-ref idref="xslt"/> and 
-    <resource-ref idref="xpath"/>.</p>
-    <p>For a brief listing of tutorials, discussion forums, and other materials, see <link idref="overview"
-     anchor="uptospeed">Getting up to speed with XSLT</link>.</p></a>
-  </faq>
-
-  <faq title="Which version of Xerces should I be using?">  
-    <q>Which version of Xerces should I be using?</q>    
-    <a><p>&xslt4j-current; has been tested with &xml4j-used;. See <link idref="readme" anchor="status">Status</link>.</p></a>
-  </faq>
-  
-  <faq title="Compatibility with &xslt4j; version 1">
-   <q>How do I run applications that use the &xslt4j; version 1 API with &xslt4j2;</q>
-   <a><p>The Xalan-Java 1 compatibility API has been deprecated and now purged, so you must use the &xslt4j2; API. We strongly encourage you to
-   use the JAVAX 1.1/TrAX API. For more information ,see the next FAQ.</p></a>
-  </faq>
-    
-  <faq title="TrAX and JAXP">
-    <q>What are TrAX and JAXP, and are they related?</q>
-    <a><p>TrAX is the Transformation API for XML. In November 2000, TrAX was revised and incorporated into JAXP, the JAVA API for XML
-    Processing. JAXP (including TrAX) provides users a standard, vendor-neutral API for working with (and transforming) XML documents. 
-    You can use this API to build applications that are not bound to the particular implementation details of a given XML parser or XSL
-    transformer.</p>
-    <p>&xslt4j; includes the JAXP packages, implements the TrAX portion of that API (javax.xml.transform....), and includes &xml4j-jar; from
-    &xml4j;, which implements the parser portion of the API (javax.xml.parser....).</p>
-<p>For more information, see <link idref="trax">TRaX (Transformation API for XML)</link> and <resource-ref idref="jaxp11"/>.</p></a>
-  </faq>
-  <faq title="Chaining transformations">  
-    <q>How do you chain together a series of transformations?"</q>
-    
-    <a><p>&xslt4j; supports two strategies for chaining together a series of transformations such that the output of each 
-    transformation provides input for the next transformation.</p>
-    <ul>
-      <li>For each transformation in the series, you can set one SAX ContentHandler to process the input, and another ContenHandler to process
-       the output.<br/><br/></li>
-      <li>You can also set up a series of parent-child relationships between an XMLReader and one or more XMLFilters.</li> 
-    </ul>
-    <p>For the details and links to examples, see <link idref="usagepatterns" anchor="outasin">Using transformation output as input for 
-    another transformation</link>.<anchor name="jdk13"/></p></a>
-  </faq>
-  
-  <faq title="Issues running Xalan on JDK 1.3">
-  <q>I'm having a problem building or running &xslt4j; on the JDK 1.3.</q>
-  <a><p>The JDK 1.3 automatically places everything in the lib/ext directory in front of everything you place on the classpath. If this directory contains a version of DOM, JAXP, or Xerces that predates the &xslt4j; distribution you are using, you may have problems!</p> 
-<p>The IBM JDK 1.3 includes an earlier version of xerces.jar in the lib/ext directory, a version that does not implement the JAXP 1.1 interfaces and therefore does not work with the current Xalan release. Accordingly, you must either purge the xerces.jar that is in that directory or replace it with the &xml4j-jar; that is included with the Xalan distribution.</p>
-<p>The SUN JDK 1.3 includes a pre-1.1 version of the JAXP in crimson.jar. Either purge the crimson.jar in that directory or overwrite it with a newer crimson.jar that includes and implements the JAXP 1.1 interfaces.</p></a>  
-  </faq>
-  <faq title="a &quot;DOM006 Hierarchy request error&quot;">
-  <q>Why do I get a "DOM006 Hierarchy request error" when I try to transform into a DOM Document node?</q>
-  <a>
-  <p>This error occurs when Xalan tries to add a Node to a Document node where it isn't allowed. For example, attempting to add non-whitespace
-  text to the DOM Document node produces this error.</p>
-   <p>The error can also occur when a Document node is created with the DOMImplementation createDocument() method, which takes a qualified name
-    as an argument and creates an element node.  If you then pass the returned Document node to Xalan, you get a "DOM006 Hierarchy request
-    error" when Xalan tries to add a second element to the Document node. The solution is to either use the DocumentBuilder newDocument() method
-    to create a Document that does not contain an element node, or use a DocumentFragment. It should be noted that the 
-    DocumentBuilder newDocument() method is "Non-preferred" according to the JAXP 1.1 documentation.</p>
-  </a>
-  </faq>
-  
-  <faq title="Speeding up transformations">
-  
-    <q>What can I do to speed up transformations?</q>
-    
-    <a><p>In the ongoing development of &xslt4j;, enhancing performance is the primary goal of the &xslt4j; team.
-    Here are some preliminary suggestions for you to keep in mind as you set up your applications:</p><ul>
-    <li>Use a Templates object (with a different Transformers for each transformation) to perform multiple transformations with the same 
-    set of stylesheet instructions (see <link idref="usagepatterns" anchor="multithreading">Multithreading</link>).<br/><br/></li>         
-    <li>Set up your stylesheets to function efficiently.<br/><br/></li>
-       <ul>
-         <li>Don't use "//" (descendant axes) patterns near the root of a large document.<br/><br/></li>
-         <li>Use xsl:key elements and the key() function as an efficient way to retrieve node sets.<br/><br/></li>
-         <li>Where possible, use pattern matching rather than xsl:if or xsl:when statements.<br/><br/></li>
-         <li>xsl:for-each is fast because it does not require pattern matching.<br/><br/></li>
-         <li>Keep in mind that xsl:sort prevents incremental processing.<br/><br/></li>
-         <li>When you create variables, &lt;xsl:variable name="fooElem" select="foo"/&gt; is usually faster than
-         &gt;xsl:variable name="fooElem"&gt;&lt;xsl:value-of-select="foo"/&gt;&lt;/xsl:variable&gt;.<br/><br/></li>
-         <li>Be careful using the last() function.<br/><br/></li>
-         <li>The use of index predicates within match patterns can be expensive.<br/><br/></li>
-         <li>Decoding and encoding is expensive.<br/><br/></li>
-       </ul>
-     <li>For the ultimate in server-side scalability, perform transform operations on the client. For examples, see 
-     <link idref="samples" anchor="appletxmltohtml">appletXMLtoHTML</link> and <link idref="samples"
-     anchor="get-todo-list">get-todo-list</link>.</li>
-    </ul></a>
-  </faq>
-
-  <faq title="NoClassDefFound errors">
-  
-    <q>I'm getting a NoClassDefFound error. What has to be on the classpath?</q>
-    
-    <a><ol>
-    <li>xalan.jar, xml-apis.jar, and &xml4j-jar; -- or the XML parser you are using -- must always be on the classpath.<br/><br/></li>
-    <li>To run the samples in the samples subdirectories, xalansamples.jar must be on the classpath. To run the servlet (in
-    samples/servlet), xalanservlet.jar must be on the classpath along with the javax.servlet and javax.servlet.http packages. Sun distributes
-    the javax.servlet packages in the JSWDK servlet.jar file.<br/><br/></li>
-    <li>To run extensions (including the samples in samples/extensions), bsf.jar, and bsfengines.jar must be on the 
-    classpath. To run extensions implemented in JavaScript, js.jar must also be on the classpath. For information on what 
-    you need to run extensions implemented in other scripting languages, see <link idref="extensions"
-    anchor="supported-lang">Supported languages</link>.<br/><br/></li>
-    <li>To run applications that use the &xslt4j; version 1 API, you must put xalanj1compat.jar on the classpath, recompile the application,
-    and be sure xalanj1compat.jar is on the classpath at run time (see <link idref="usagepatterns" anchor="compat">Using the &xslt4j; version 1
-    API)</link>.</li>
-    </ol>
-    <p>For more information, see <link idref="getstarted" anchor="classpath">Setting up the system classpath</link>.</p>
-    <p><anchor name="environmentcheck"/><em>Using the EnvironmentCheck utility:</em> To help diagnose classpath problems, try running Xalan's environment checking utility, checked in at 
-    xml-xalan/java/src/org/apache/xalan/xslt/EnvironmentCheck.</p>
-    <p>You can run this utility from the command line as follows:</p>
-    <p><code>java org.apache.xalan.xslt.EnvironmentCheck [-out outFile]</code></p>
-    <p>You can also call this utility from within your application. For example,</p>
-    <p><code>boolean environmentOK = (new EnvironmentCheck()).checkEnvironment (yourPrintWriter);</code></p>
-    <p>Be sure to run EnvironmentCheck in the environment where you are experiencing the problem. For example, if you get a 
-    NoClassDefFound error from a command-line application, run EnvironmentCheck on the command line with exactly the same 
-    classpath. If the error occurs inside your Java application (or in a servlet, etc.), be sure to call the 
-    EnvironmentCheck checkEnvironment(...) method from within your running application.</p>
-    </a>
-   </faq>
- 
-	<faq title="Stylesheet validation">
-		<q>How do I validate an XSL stylesheet?</q>
-		<a>
-      <p>An XSL stylesheet is an XML document, so it can have a DOCTYPE and be subject to validation, right? </p>
-      <p>The XSLT Recommendation includes a <jump href="http://www.w3.org/TR/xslt#dtd">DTD Fragment 
-      for XSL Stylesheets</jump> with some indications of what you need to do to create a complete DTD for a given
-      stylesheet. Keep in mind that stylesheets can include literal result elements and produce output that is not valid
-      XML.</p>
-      <p>You can use the xsl:stylesheet doctype defined in xsl-html40s.dtd for stylesheets that generate HTML.</p>
-		</a>
-	</faq>
-    
-    <faq title="Retrieving nodes in the default namespace">
-     <q>XPath isn't retrieving nodes that are in the default namespace I defined. How do I get them?</q>
-     <a><p>If you are looking for nodes in a namespace, the XPath expression must include a namespace prefix that you have mapped to the
-       namespace with an xmlns declaration. If you have declared a default namespace, it does not have a prefix (see 
-       <jump href="http://www.w3.org/TR/xpath.html#node-tests">XPath Node Tests</jump>). In order to construct XPath expressions 
-       to retrieve nodes from this namespace, you must add a namespace declaration that provides a prefix you can include in the XPath
-        expressions.</p>
-       <p>Suppose, for example, you you want to locate nodes in a default namespace declared as follows:<br/>
-       <code>xmlns="http://my-namespace"</code></p>
-       <p>Add a nampespace declaration with a prefix:<br/>
-       <code>xmlns:foo="http://my-namespace"</code></p>       
-       <p>Then you can use foo: in your XPath expression.</p>
-       <p>Hint: Don't use default namespaces, and the problem doesn't arise.</p></a>
-    </faq>
-       
-    <faq title="Using the 'signature' file to verify a download">
-      <q>How do I use the "signature" file to verify my download?</q>
-      <a>
-        <p>For each Xalan download file in <resource-ref idref="xslt4j-distdir"/>, there is a corresponding signature file. 
-        The signature file for xalan-j_2_0_1.tar.gz, for example, is xalan-j_2_0_1.tar.gz.sig.</p>
-        <p>The .sig files are PGP signatures of the actual .zip or .tar.gz
-        download files.  You can use these files to verify the authenticiy of the download. You do not need the .sig file to 
-        use the corresponding donwload file.</p>
-        <p>To check the authenticity of a Xalan distribution, you need a copy of
-        PGP which is available in a number of licenses, including some free
-        non-commercial licenses, either from an mit.edu site or on
-        the pgp.com site. Once you have a version of PGP installed, you
-        should be able to 'verify the signature' of the .sig file, which basically verifies that the corresponding 
-        .zip or tar.gz file has not been changed since we signed it.</p>
-      </a>
-    </faq>
-    <faq title="Setting output encoding">
-    <q>Why is the output character encoding I set in the stylesheet not being used?</q>
-    <a>
-    <p>If you use a character output stream to instantiate the 
-    <jump href="apidocs/javax/xml/transform/stream/StreamResult.html">StreamResult</jump> object which holds the 
-    transformation output, the Writer uses its own encoding, not the encoding you specify
-    in the stylesheet.</p>
-    <p>If you want to use the stylesheet output encoding, do not use StreamResult(java.io.Writer) to
-    instantiate the holder for the output. Alternatively, you can specify the encoding when you create a Writer 
-    (java.io.OutputStreamWriter). Once the Writer exists, you cannot change its encoding.</p>
-    </a>
-    </faq>
-    <faq title="Servlet unable to find classes for extension functions/elements">
-    <q>My servlet cannot find classes that implement extension functions or elements. What can I do?</q>
-    <a>
-    <p>If you install xalan.jar in the servlet engine's lib directory (e.g., tomcat/lib), as opposed to the servlet's 
-    lib directory, then the Xalan classes are loaded by a classloader that does not see the classes in the servlet's
-    classloader (i.e., the extension classes, if you placed them there). The Xalan classes try to load the extension 
-    classes using their own classloader, and that attempt fails.</p>
-    <p>Workaround: place xalan.jar in the servlet's lib directory and NOT in the servlet engine's lib directory. 
-    Another workaround is to place the extension classes also in the servlet engine's lib directory, but you
-    generally want to avoid cluttering that directory.</p>
-    <p>Thanks to Gunnlauger Thor Briem (gthb@dimon.is) for providing this information. </p>
-    </a>
-  </faq>
-  <faq title="Namespace not supported by SAXParser">
-  <q>Why am I getting a "Namespace not supported by SAXParser exception?</q>
-  <a>
-  <p>We have seen this probem arise for two quite different reasons:</p>
-  <ul>
-  <li>SAX1 interfaces are on your classpath in front of the SAX2 interfaces provided with your XML
-  parser.<br/><br/>
-  or<br/><br/></li>
-  <li>The parser you are using to process a stylesheet Source and generate a Transformer does not have the 
-  namespaceAware property set to true.</li>
-  </ul>
-  <p><em>SAX1 on the classpath</em></p>
-  <p>SAX1 should not be on your classpath. The SAX1 interfaces and implementations of the SAX1 SAXPparser
-  are not namespace aware.</p>
-  <p>To help diagnose your classpath, you can use the <link anchor="environmentcheck">EnvironmentCheck
-  utility</link>. If you are running under JDK 1.3, see <link anchor="jdk13">Issues running Xalan on JDK
-  1.3</link>. If you are running a servlet, make sure the servlet engine is not placing SAX1 on the
-  classpath.</p>
-  <p><em>Setting the parser to be namespace aware</em></p>
-  <p>When you create a Transformer, you must use a namespace-aware parser to parse the stylesheet.</p>
-  <p>If you use a TransformerFactory to process a stylesheet Source and generate a Transformer, the
-  TransformerFactory instructs the  SAXParserFactory to set the parser's namespaceAware property to true.
-  But if you call the parser directly, you may need to set the namespaceAware property yourself. For
-  example:</p>
-<source>javax.xml.parsers.SAXParserFactory spFactory =
-  javax.xml.parsers.SAXParserFactory.newInstance();
-spFactory.setNamespaceAware(true);</source>
-<note>For more information about setting the namespaceAware property, and SAX2 vs. JAXP default settings, see <jump href="http://xml.apache.org/~edwingo/jaxp-faq.html#nsDefaults">JAXP FAQ: Warning about namespace processing defaults</jump>.</note>
-</a>
-</faq>
-<faq title="Getting line and column numbers for errors in XML input documents and XSL stylesheets">
-<q>How do I get line numbers for errors in the XML or XSL input when I am performing a transformation?</q>
-<a>
-<p>Use or mimic the command-line processor (<jump href="apidocs/org/apache/xalan/xslt/Process.html">org.apache.xalan.xslt.Process</jump>).</p>
-<p>A <jump href="apidocs/javax/xml/transform/TransformerException.html">TransformerException</jump> generally wraps another exception, often a SAXParseException. The command-line processor uses the static <jump href="apidocs/org/apache/xml/utils/DefaultErrorHandler.html">org.apache.xml.utils.DefaultErrorHandler</jump> printLocation() method to chase down the exception cause and get a <jump href="apidocs/javax/xml/transform/SourceLocator.html">SourceLocator</jump> that can usually report line and column number.</p>
-<p>Suppose you wanted to modify the ValidateXMLInput sample in the samples/Validate subdirectory to include line and column numbers . All you
-need to do is call DefaultErrorHandler.printLocation() in the the Handler internal class error() and warning() methods. For example, replace</p>
-<source>public void error (SAXParseException spe)
-  throws SAXException
-{
-  System.out.println("SAXParseException error: " + spe.getMessage());
-}</source>
-<p>with</p>
-<source>public void error (SAXParseException spe)
-  throws SAXException
-{
-  PrintWriter pw = new PrintWriter(System.out, true);
-  org.apache.xml.utils.DefaultErrorHandler.printLocation(pw, spe);
-  pw.println("SAXParseException error: " + spe.getMessage());
-}</source>
-<p>You can also replicate code from the printLocation() method to obtain a SourceLocator, and then use the SourceLocator getLineNumber() and getColumnNumber() methods. The getRootSourceLocator() method below returns a SourceLocator.</p>
-<source>
-import javax.xml.transform.SourceLocator;
-import javax.xml.transform.TransformerException;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.apache.xml.utils.SAXSourceLocator;
-import org.apache.xml.utils.WrappedRuntimeException;
-....
-public static SourceLocator getRootSourceLocator(Throwable exception)
-{
-  SourceLocator locator = null;
-  Throwable cause = exception;
-    
-  // Try to find the locator closest to the cause.
-  do
-  {
-    if(cause instanceof SAXParseException)
-    {
-      locator = new SAXSourceLocator((SAXParseException)cause);
-    }
-    else if (cause instanceof TransformerException)
-    {
-      SourceLocator causeLocator = 
-                    ((TransformerException)cause).getLocator();
-      if(null != causeLocator)
-        locator = causeLocator;
-    }
-    if(cause instanceof TransformerException)
-      cause = ((TransformerException)cause).getCause();
-    else if(cause instanceof WrappedRuntimeException)
-      cause = ((WrappedRuntimeException)cause).getException();
-    else if(cause instanceof SAXException)
-      cause = ((SAXException)cause).getException();
-    else
-      cause = null;
-  }
-  while(null != cause);
-        
-  return locator;
-}</source>
-
-<note><em>Xalan exception handling:</em>  The exception architecture in Xalan and with transforms in general is tricky because of multiple layers of exception handling, involving movement back and forth between SAX and Transformer exceptions and across pipes. Xalan often uses a WrappedRuntimeException to throw over many layers of checked exceptions, in order not to have every possible checked exception be declared for every function in the stack, which means it has to catch this exception at the upper levels and unwrap the exception to pass it on as a TransformerException.
-<br/><br/>
-A JAXP 1.1 TransformerException often wraps another exception. Two of the TransformerException structures that are frequently used to construct contained exceptions in JAXP 1.1 do not set the locator.  The locator is not set because we don't know the type of exception that the Throwable argument represents.  The solution is to chase up the contained exceptions to find the root cause, which will usually have a location set for you.  This can be somewhat tricky, as not all the exceptions may be TransformerExceptions.  A good sample is in the DefaultHandler static printLocation() method, which the Xalan command-line processor uses to report errors. You can also roll your own functions along the lines of the getRootSourceLocator() example above.</note>
-</a>
-
-</faq>
-</faqs>
diff --git a/xdocs/sources/xalan/getstarted.xml b/xdocs/sources/xalan/getstarted.xml
deleted file mode 100644
index 579cdf8..0000000
--- a/xdocs/sources/xalan/getstarted.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" standalone="no"?>  
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<s1 title="Getting Started">
-<ul>
-<li><link anchor="download">Downloading what you need</link></li>
-<li><link anchor="classpath">Setting up the system classpath</link></li>
-<li><link anchor="samples">Trying out the samples</link></li>
-<li><link anchor="commandline">Performing your own transformations from the command line</link></li>
-<li><link anchor="java-apps">Setting up your own XSLT applications</link></li>
-</ul>
-<anchor name="download"/>
-<s2 title="Downloading what you need">
-<p>To use Xalan, you need the following:</p>
-<ul>
-<li>The JDK or JRE 1.1.8, 1.2.2, or 1.3</li>
-<li>xalan.jar</li>
-<li>&xml4j-jar;, or another <link idref="usagepatterns" anchor="plug">XML Parser</link>)</li>
-</ul>
-<p>You can get the JDK or JRE from <jump href="http://www.ibm.com/java/jdk">ibm.com/java/jdk/</jump> or <jump href="http://www.java.sun.com">java.sun.com</jump>.</p> 
-<p>For the binary distribution, which includes everything required to use and build applications with &xslt4j;, download <resource-ref idref="xslt4j-dist-bin-zip"/> or <resource-ref idref="xslt4j-dist-bin-targz"/>. Both of these files contain <resource-ref idref="xslt4j-current"/> (with xalan.jar) and &xml4j-jar; from <resource-ref idref="xml4j-used"/>. You can use a zip or tar utility to expand these files into a full build.</p>
-<p>If you want the &xslt4j; source files, download <resource-ref idref="xslt4j-dist-src-zip"/> or <resource-ref idref="xslt4j-dist-src-targz"/>. After you expand these files into the complete source tree, you can use <resource-ref idref="ant"/> to do your own builds. For more information, see <link idref="readme" anchor="build">Build notes</link>.</p>
-
-<p>If you plan to run <link idref="extensions">XSLT extensions</link>, you need bsf.jar, which is included in the &xslt4j; distribution. If you plan to run XSLT extensions implemented in Javascript or another scripting language, you will need one or more additional files as indicated in <link idref="extensions" anchor="supported-lang">extensions language requirements</link>.</p>
-</s2><anchor name="classpath"/>
-<s2 title="Setting up the system classpath">
-<p>At the very minimum, you must include xalan.jar, xml-apis.jar, and &xml4j-jar; -- or another conformant XML parser -- see <link idref="usagepatterns" anchor="plug">Plugging in a Transformer and XML parser</link>) on the system classpath. To run the sample applications, include xalansamples.jar (all samples other than the servlet) and xalanservlet.jar. To run extensions, include bsf.jar. All these JAR files are distributed with &xslt4j;. For extensions implemented in JavaScript or another scripting language, see <link idref="extensions" anchor="supported-lang">extensions language requirements</link> to identify any additional JAR files you must place on the classpath and where you can get them.</p>
-<p>If you are using JDK or JRE 1.1.8, also include classes.zip on the classpath. If you are using JDK or JRE 1.2, include tools.jar on the classpath.</p>
-<note>If you are running Xalan on a 1.1.8 platform or recompiling Xalan on any platform, be sure to put xalan.jar and xml-apis.jar in front of &xml4j-jar; on the classpath. Both JAR files include the org.w3c.dom packages. Xerces has added a number of DOM level-3 methods. These are not yet part of the W3C DOM recommendation, and Xalan does not support these methods.</note>
-</s2><anchor name="samples"/>
-<s2 title="Trying out the samples">
-<p>The &xslt4j; distribution includes a number of basic sample applications. These samples are easy to run, and you can review the source files -- all of which are brief -- to see just how they work.</p>
-<p>To run the samples, do the following:</p>
-<ol>
-<li>Set up your classpath (see above), including xalansamples.jar and (for the servlet) xalanservlet.jar.</li>
-<li>Be sure the java executable is on your path.</li>
-<li>Go to the samples subdirectory containing the sample (use the DOS shell if you are running Windows).</li>
-<li>Use the java executable to run the sample from the command line.</li>
-<li>Examine the application source and result files.</li>
-</ol>
-<p>For example, go to the SimpleTransform subdirectory and issue the following command:</p>
-<p><code>java SimpleTransform</code></p>
-<p>The sample writes the transformation result  to a file (birds.out). To see how the example works, examine the source files: birds.xml, birds.xsl, and SimpleTransform.java.</p>
-<p>The extensions examples require additional JAR files on the classpath, and the procedure for running the sample applet and sample servlet is different. For more information about all the samples, see <link idref="samples">&xslt4j; Samples</link>.</p>
-</s2><anchor name="commandline"/>
-<s2 title="Performing your own transformations from the command line">
-<p>java.org.apache.xalan.xslt.Process provides a basic utility for performing transformations from the command line. You use this utility, for example, to run several of the extensions samples. The command line for most standard transformations is as follows:</p>
-<p><code>java org.apache.xalan.xslt.Process -in <ref>xmlSource</ref></code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;-xsl <ref>stylesheet</ref> -out <ref>outputfile</ref></code></p>
-<p>where <ref>xmlSource</ref> is the XML source file name, <ref>stylesheet</ref> is the XSL stylesheet file name, and <ref>outputfile</ref> is the output file name.</p>
-<p>If you want the output to be displayed on the screen, simply omit the -out flag and argument.</p>
-<p>You can use this utility to try out XSL stylesheets you have written, to make sure they do what you expect with the XML source files they are designed to transform. The utility provides useful messages if the source file or stylesheet is not well formed. For more information, see <link idref="commandline">Command-Line Utility</link>.</p>
-</s2><anchor name="java-apps"/>
-<s2 title="Setting up your own Java applications">
-<p>You can start by using your own XML source files and XSL stylesheets with the sample applications, which illustrate a number of the <link idref="usagepatterns">basic usage patterns</link>.</p>
-<p>Here is the basic TRaX procedure to keep in mind when you set up a transformation:</p>
-<ol>
-<li>Use the <jump href="apidocs/javax/xml/transform/TransformerFactory.html">TransformerFactory</jump> static newInstance() method to instantiate a TransformerFactory.<br/><br/></li>
-<li>Use the TransformerFactory newTransformer(Source stylesheet) method to process the transformation instructions in an XSLT stylesheet Source (producing under the covers a <jump href="apidocs/javax/xml/transform/Templates.html">Templates</jump> object) and generate a <jump href="apidocs/javax/xml/transform/Transformer.html">Transformer</jump>.<br/><br/></li>
-<li>Use the Transformer transform(Source xmlSource, Result transformResult) method to apply the transformation instructions (the Templates object) to the XML Source and produce the transformation Result.<br/><br/></li>
-</ol>
-<p>For more information about this procedure and its variations, see <link idref="usagepatterns">Basic Usage Patterns</link>.</p>
-</s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/history.xml b/xdocs/sources/xalan/history.xml
deleted file mode 100644
index 56718a6..0000000
--- a/xdocs/sources/xalan/history.xml
+++ /dev/null
@@ -1,1906 +0,0 @@
-<?xml version="1.0" standalone="no"?> 
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
- <s1 title="History of software changes">
-   <p>The following sections list the core software changes in each release since &xslt4j; version 2.0.D01.</p>
-   &history2xsltc;
-<s2 title="Changes for &xslt4j; 2.2">
-<p>Following a series of Developer releases, &xslt4j-current; represents a stable, production-quality release with 
-the <link idref="dtm">DTM (Document Table Model)</link>. &xslt4j; uses the DTM to represent the XML source document 
-to be transformed. Please send your feedback to the <human-resource-ref idref="xalandev"/>.</p>
-<p> Core (Non-XSLTC) source code updates:</p><ul><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>11/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>updated version number to 2.2.D14<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>11/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>updated version number to 2.2.D14<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBaseIterators.java<br/><ref>Committer's log entry: </ref>Bugzilla 5242: Special-case initializing iteration from Document node -- 
-one-liner wasn't safe.<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/04/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc ProcessorVersion.java<br/><ref>Committer's log entry: </ref>new class to version xsltc software<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Additional debugging printouts, added while analysing Bugzilla 5272 but 
-generally useful.
- No functional change, and should be optimized away when DEBUG is set false.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Removed the "magic" default which causes us to switch into incremental
- processing mode whenever we were writing to Standard Output (ie,
- -OUT had not been specified). If you want incremental processing,
- please use the (relatively new) -INCREMENTAL switch to explicitly
- request it.
-
- (The automatic switchover was causing some confusion
- when testing against Xerces2. )<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMManagerDefault.java<br/><ref>Committer's log entry: </ref>Efficiency improvement to the new DTM "overflow addressing" scheme.
- In some tests, this one alteration shaved about 30% off the runtime.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath CachedXPathAPI.java
- XPathContext.java<br/><ref>Committer's log entry: </ref>Changes requested by the xml-security group:
-
- 1) Provide something a constructor that allows sharing the
- XPathContext object between CachedXPathAPI objects
-
- 2) Add getXPathContext(). I'm just a bit nervious about this
- method, but they assure us they need it and the field isn't
- private. We may need to discus this one further.
-
- 3) Make the XPathContext's m_dtmManager member
- protected rather than private, so their subclass can get to it.
- We may want to work with them to understand why they're
- accessing this directly and whether there's a better solution.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref
- IncrementalSAXSource_Xerces.java<br/><ref>Committer's log entry: </ref>Bugzilla5272 patch suggested by Sandy Gao.
-
- This startup sequence for incremental SAX parsing under Xerces2
- really is excessively complicated and excessively fragile as a result.
- Not to mention being underdocumented. We really need to push the
- Xerces folks to provide a simple incremental SAX API, similar to that
- in the Xerces1incremental prototype.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Part 1 of 2: Reducing initial space requirements of a DTM. This may
- involve a slight performance hit, but should help stylesheets which
- generate a lot of Result Tree Fragment. Part 2 of this change will be
- checked in after I resolve a bug in whitespace normalization.
-
- Note that a better long-term answer will be to reduce the number of
- DTMs tied up as RTFs, by doing a better job of discarding or reusing
- them when we're done with them. There are some issues regarding
- exactly what their lifetimes will be when assigned to variables,
- especially when one variable is used to build another, which we
- need to address before we can make that change.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Part 2a of 2: Reducing initial space requirements of a DTM. This may
- involve a slight performance hit in some circumstances due to
- smaller and more complex subdivision of FastStringBuffers,, but
- should help stylesheets which generate a lot of Result Tree
- Fragments.
-
- Note that a better long-term answer will be to reduce the number of
- DTMs tied up as RTFs<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>Part 2b of 2: Reducing initial space requirements of a DTM. This may
- involve a slight performance hit in some circumstances due to
- smaller and more complex subdivision of FastStringBuffers,, but
- should help stylesheets which generate a lot of Result Tree
- Fragments.
-
- (Leveraging FSB's features more strongly exposed a bug in
- whitespace normalization, which I've fixed.)
-
- Note that a better long-term answer will be to reduce the number of
- DTMs tied up as RTFs<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils AttList.java<br/><ref>Committer's log entry: </ref>Two goofs: Forgetting to use the namespace-aware DOM call, and
- forgetting to check for a returned null before dereferencing.
-
- How long has _that_ been lurking in the undergrowth?!<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SuballocatedIntVector.java<br/><ref>Committer's log entry: </ref>Finally following up on an old hunch, I switched from /% addressing
- to shift-and-mask. Big improvement!<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Performance improvements; Some changes to better leverage the
- DOM's existing code, others to avoid some call-and-return overhead.
-
- Combined with other recent changes, we've now got a significant
- speedup over D14 on some tests. We may want to drop the scheduled
- December 17th 2.2 release and instead bring 2.2 out on 1/14 (which is
- when we'd planned 2.3) with performance gains and Xerces2 support.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- DOM2DTMdefaultNamespaceDeclarationNode.java<br/><ref>Committer's log entry: </ref>A few more subtle performance tweaks, and an actual bug.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>12/20/2001<br/><ref>Added: </ref>java/src/org/apache/xml/utils ListingErrorHandler.java<br/><ref>Committer's log entry: </ref>Alternate ErrorHandler/ErrorListener implementation that allows
- configuration and prints errors out similarly to javac<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>12/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils AttList.java<br/><ref>Committer's log entry: </ref>Bugzilla 5496; previously unimplemented functions.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>01/03/2002<br/><ref>Modified: </ref>java/src/org/apache/xml/utils DOMBuilder.java<br/><ref>Committer's log entry: </ref>[Bug 5528] DOMBuilder mixed DOM Level 1 and 2<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>01/11/2002<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>updated release number to 2.2.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>01/11/2002<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>updated release number to 2.2.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>01/13/2002<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Fix Bugzilla#5701: incorrect resolution of certain kinds of absolute file: 
-URIs
- Note: This definitely seems to be more correct in terms of resolving URIs
- vis-a-vis RFC 2396 than it used to be. The only user case which might now
- fail where it used to work is a user that supplies an incorrect
- 'file:subdir/blah' that they intended to be a relative URI (technically
- it is an absolute URI no matter which way you look at it); this might
- lead to a change in behavior in this particular case, although the behavior
- before was incorrect.
- The major risk factor could be if there are other parts of Xalan code that 
-rely
- on the previously incorrect behavior, but I can't find any, and the whole test
- suite runs and passes normally.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>01/14/2002<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Fix Bugzilla#4678 and Bugzilla#5533: call setSystemId on StreamResult
- in Process command line class; ignored if using System.out
- This should enable the redirect extension to properly put it's redirected
- output in a location relative to the output if possible; previously it
- always put redirected output relative to the input since it
- never had the systemId of where the output should be<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>   
-<s2 title="Changes for &xslt4j; 2.2.D14">
-<p>&xslt4j; 2.2.D14 is intended to be the final release in the current series of Developer releases incorporating
-     the <link idref="dtm">DTM</link>. We believe Xalan with the DTM has reached a level of stability that warrants a                                                          
-     standard "User" release. Accordingly, we plan to release &xslt4j; 2.2 soon.</p>
-     <p>&xslt4j; 2.2.D14 also includes a new <jump href="apidocs/org/apache/xpath/CachedXPathAPI.html">CachedXPathAPI</jump> class that
-     provides an enhanced alternative to the XPath convenience methods in <jump href="apidocs/org/apache/xpath/XPathAPI.html">XPathAPI</jump>.</p>
-     <p>Beginning with 2.2.D12, xalan.jar contains just the &xslt4j; implementation. The source files for the SAX level 2, DOM 2, 
-     and JAXP 1.1 interfaces are pulled from the xml-commons repository (<resource-ref idref="xmlapirepository"/>), and are built as
-     xml-apis.jar. These interfaces are shared by a number of tools, so placing them in their own jar simplifies coordination and reduces 
-     the risk of duplication. <em>To run &xslt4j;, you must add xml-apis.jar to your classpath.</em> See <link idref="getstarted"
-     anchor="classpath">Setting up the system class path</link>.</p>
-<p> Core (Non-XSLTC) source code updates:</p><ul><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Reorder slightly and add test to not synthesize xmlns:xsl declaration
- if one was already present on the DOM's root element.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan Version.java<br/><ref>Committer's log entry: </ref>D13 internal version number update<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>D13 internal version number update<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeList.java<br/><ref>Committer's log entry: </ref>Bugzilla4842, secondary complaint (glitch in getChildren)... &lt;blush/&gt;<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeProxy.java<br/><ref>Committer's log entry: </ref>Bugzilla4842: Expand the proxy layer to support more of the DOM API.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Namespace decls are themselves not namespace-aware, in the
- Namespaces 1.0 REC. Use the qname.Grumble.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>"Tupograflica eror". Sorry 'bout that!<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Sigh. The XML Namespaces spec it itself imperfectly
- namespace-aware. While there's a plan to fix that, it's
- safer for now if we test the QName when looking for
- explicit instances of xmlns:xml in the source document.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql DTMDocument.java
- java/src/org/apache/xalan/templates ElemApplyTemplates.java
- java/src/org/apache/xalan/xslt Process.java
- java/src/org/apache/xml/dtm DTMManager.java
- java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMDefaultBaseIterators.java
- DTMDefaultBaseTraversers.java
- DTMManagerDefault.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Another fairly large change in the DTM architexture (sic)....
-
- We've changed DTM's internal behavior so it can now assign
- more than one "DTM ID" to a single document, cascading from
- one ID to the next. This means that the size of a single DTM is
- no longer limited by the bits available in the low part of the DTM
- Node Handle. This means we can support larger documents.
-
- That has allowed us to reduce the number of bits reserved
- for that portion of the node addresing scheme... which in turn has
- increased the number of bits available for use in the DTM ID. This
- means we can now have many more documents active at once.
-
- The trade-off is that huge documents will require more than one
- DTM ID and thus cut into the number of documents, But since we
- now have 16 bits of DTM ID space, I don't think we're really likely
- to run into both limits at once. And the changes are essentially
- limited to the DTM layer; the rest of Xalan should be unaffected.
-
- In the process of making this change, I've also encapsulated the
- conversions between DTM API node handles and DTMDefaultBase's
- internal node indices. That should be safer all 'round.
-
- NOTE: One side effect of this change is that the strings
- generated by the key() function have changed again.
- I've updated the IDKEY testcases to reflect this.
-
- Smoketest is currently passing everything except
- axes109 and the API's TraceListenerTest . But I believe
- those failures are due to a glitch in my test directory
- since they also happen when I run the D13 code there,
- whereas D13 runs fine in the directory where I built it.
- I'm going to assume that "same result is no new bug"
- for now.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref
- DTMDefaultBaseTraversers.java<br/><ref>Committer's log entry: </ref>Found the glitch causing the axes108 bug -- exptype/type.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Added option to set the recursion limit (which we're having trouble with
- right now; the code that supported it seems to be disabled...) and
- selfdoc for this and a few other newer options.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>11/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Catch exceptions from the output content handler in flush(), and throw a
- SAXParseException with line numbers filled in.
- If we don't do this, and the exception is a RuntimeException,
- good line numbers of where the exception occured in the stylesheet
- won't get reported. I tried just catching RuntimeException, but
- for whatever reason it didn't seem to catch.
- Fix for Christina's DOMException error problem.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Added: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm
- DOM2DTMdefaultNamespaceDeclarationNode.java<br/><ref>Committer's log entry: </ref>Moved default namespace declaration node object out of its "inner
- class" status, since I think I want to perform an instanceof test on it.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMManagerDefault.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xpath XPathAPI.java<br/><ref>Added: </ref>java/src/org/apache/xpath CachedXPathAPI.java<br/><ref>Committer's log entry: </ref>Bugzilla 4336 -- fix for presenting symptom (since the implicit
- xml: declaration pseudo-DOM node is resynthesized in each
- DTM, find the _corresponding_ node), and a first draft of
- CachedXPathAPI which should be a fix for the larger symptom
- (XPathAPI creates a new DTM every time, which is potentially
- very ugly for applications that want to run XPaths repeatedly
- on a single document).
-
- Also caught and fixed another node-handle/node-identity confusion.
- The fact that DTM.get...() allowed us to be sloppy about that
- distinction in the past means there may still be a few others lurking
- in the code. Ye gods, I _wish_ Java had typedef!<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeProxy.java<br/><ref>Committer's log entry: </ref>Minor tweaks<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Redirect.java<br/><ref>Committer's log entry: </ref>Patch to enable optional 'append' attribute on redirect:open and
- redirect:write elements to append to file; note that behavior may
- not be what you expect when using xml output, since the xml decl
- will currently be output *each* time you newly write to the file
- Submitted by: jpvdm@iafrica.com<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeProxy.java<br/><ref>Committer's log entry: </ref>Implement getDocumentElement. If the DTM doesn't represent a
- wellformed Document, this call is undefined and throws an exception...
- which isn't DOMlike but that's a non-DOMlike situation.<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D12 and 2.2.D13">
-<p>&xslt4j; 2.2.D13 is intended to be the final release in the current series of Developer releases incorporating
-     the <link idref="dtm">DTM</link>. We believe Xalan with the DTM has reached a level of stability that warrants a                                                          
-     standard "User" release. Accordingly, we plan to release &xslt4j; 2.2 soon.</p>
-     <p>Beginning with this release, xalan.jar contains just the &xslt4j; implementation. The source files for the SAX level 2, DOM 2, 
-     and JAXP 1.1 interfaces are pulled from the xml-commons repository (<resource-ref idref="xmlapirepository"/>), and are built as
-     xml-apis.jar. These interfaces are shared by a number of tools, so placing them in their own jar simplifies coordination and reduces 
-     the risk of duplication. <em>To run &xslt4j;, you must add xml-apis.jar to your classpath.</em> See <link idref="getstarted"
-     anchor="classpath">Setting up the system class path</link>.</p>
-     <p>Beginning with this release, we are placing two distribution files in the <resource-ref idref="xslt4j-distdir"/>: a binary
-     distribution file, which includes everything needed to run &xslt4j; and build applications, and a source distribution. For
-     more information, see <link idref="getstarted" anchor="download">Downloading what you need</link>.</p>
-     <p>This release also includes <link idref="samples" anchor="validatexmlinput">ValidateXMLInput</link>, a sample that illustrates 
-     how you can verify that the XML input you are transforming adheres to its document type. It is in the samples/validate subdirectory
-     along with a Validate utility that you can use to validate XML files without performing a transformation.</p>     
-<p> Core (Non-XSLTC) source code updates:</p><ul><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath VariableStack.java<br/><ref>Committer's log entry: </ref>Bugzilla3995: Removed "final" keywords. That doesn't by itself
- provide the requested enhancement, but it makes prototyping one
- a bit easier.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XStringForFSB.java<br/><ref>Committer's log entry: </ref>Bugzilla 3384. See comments in the toDouble method; I suspect this may be 
-wasted micro-optimization.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XStringForFSB.java<br/><ref>Committer's log entry: </ref>Is " 12 34 . 56 78 " really considered acceptable?
- Or should whitespace within the value be treated as NAN?<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>Updated build number to 2.2.D12.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>Updated build number to 2.2.D12.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemLiteralResult.java<br/><ref>Committer's log entry: </ref>Fix for Bugzilla1133, LRE21: xsl:extension-element-prefixes should be 
-considered an exclusion<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemLiteralResult.java<br/><ref>Committer's log entry: </ref>Fix for Bugzilla 3464. Exposes errors in conformance tests namespace93 and 94.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize CharInfo.java
- HTMLEntities.res XMLEntities.res<br/><ref>Committer's log entry: </ref>Fix Bugzilla#4000, force reading of *Entites.res to be in UTF-8; added 
-comments
- PR: Bugzilla#4000<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XStringForFSB.java<br/><ref>Committer's log entry: </ref>Avoid overgenerality of isDigits
- Combine most character tests into a single switch for performance
- Reject values with embedded (as opposed to leading/trailing) whitespace.
-
- Note that this is "more correct:" than the old solution of calling Java's
- toDouble, since (I think) XSLT doesn't officially accept leading + or
- scientific notation. If folks want to accept those notations, an
- extension function specifically for that purpose seems the
- simplest/safest/most-portable solution.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XStringForFSB.java<br/><ref>Committer's log entry: </ref>Gaaah. Typo.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java
- java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Added: </ref>java/src/org/apache/xalan Version.java<br/><ref>Committer's log entry: </ref>Added new org.apache.xalan.Version class for better versioning info;
- Deprecated org.apache.xalan.processor.XSLProcessorVersion;
- Updated EnvironmentCheck with this info<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan Version.java<br/><ref>Committer's log entry: </ref>Be careful with parentheses when using ?: operator.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMManagerDefault.java
- IncrementalSAXSource_Xerces.java<br/><ref>Removed: </ref>java/src/org/apache/xml/dtm/ref CoroutineSAXParser.java
- CoroutineSAXParser_Xerces.java<br/><ref>Committer's log entry: </ref>CoroutineParser API was replaced by IncrementalSAXSource; dropping obsolete 
-code.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/18/2001<br/><ref>Removed: </ref>java/src/org/apache/xml/dtm/ref CoroutineSAXFilterTest.java<br/><ref>Committer's log entry: </ref>CoroutineParser API was replaced by IncrementalSAXSource; dropping obsolete 
-code.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan Version.java<br/><ref>Committer's log entry: </ref>Whups; sloppy: Actually, problem was that the latter two arguments to ?:
- must agree in datatype. Dropped in a quick-and-dirty int-to-string hint.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMManagerDefault.java<br/><ref>Committer's log entry: </ref>Preliminary Xerces-2 support. Doesn't leverage Xerces-2 incremental features
- yet, but should at least compile and run under the new parser without
- breaking support for the old one. Still working on improving this.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemApplyTemplates.java
- ElemCallTemplate.java<br/><ref>Committer's log entry: </ref>Bugzilla 4218: Make sure that the stack frame gets restored to the frame that 
-was previously set. Just calling unlink() may restore to the wrong frame, and 
-get us out of synch.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/xml/sax/helpers ParserAdapter.java<br/><ref>Committer's log entry: </ref>Java 1.1.8 back-compatability requires not using Java 1.2 collection calls.
- (Still waiting for community consensus before abandoning 1.1)<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath VariableStack.java<br/><ref>Committer's log entry: </ref>Bugzilla 4218: Make sure that the stack frame gets restored to the frame that 
-was previously set. Just calling unlink() may restore to the wrong frame, and 
-get us out of synch.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref
- IncrementalSAXSource_Xerces.java<br/><ref>Committer's log entry: </ref>In Xerces2, SAXParser no longer seems to inherit from
- XMLReader; explicit casts needed to work around that.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>10/23/2001<br/><ref>Removed: </ref>java/src/javax/xml/parsers SAXParserFactory.java
- SAXParser.java ParserConfigurationException.java
- package.html FactoryFinder.java
- FactoryConfigurationError.java
- DocumentBuilderFactory.java DocumentBuilder.java<br/><ref>Committer's log entry: </ref>Remove javax.xml.parsers package from xalan sources since we no longer ship 
-with these files<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize CharInfo.java<br/><ref>Committer's log entry: </ref>Microsoft VJ++ workaround. Should never arise in any reasonably
- standards-compliant Java environment, but VJ++ isn't...<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize CharInfo.java<br/><ref>Committer's log entry: </ref>Additional "big scary" docs for Microsoft VJ++ workaround.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler XPathParser.java<br/><ref>Committer's log entry: </ref>Added fix for bug reported by Myriam for match="//x/a" patterns. On the
- second "/" on "//", the parser wasn't swallowing the token, which caused
- the "x" pattern to be ancestor instead of parent. If you don't have this fix,
- it will cause 'a' to be matched when it has any ancestor that is 'x'.
- This fix should be localized to only match patterns. The reason this probably
- wasn't reported before, is because "//" at the head of a match pattern is
- pretty useless, "x/a" being equivelent.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>10/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToHTML.java<br/><ref>Committer's log entry: </ref>By longstanding request, don't URL-escape spaces. This is consistent with the
- specification, and the opinion of the right thing to do by several people on 
-the
- XSL working group, including Mike Kay, and by the LotusXSLTeam.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLTElementDef.java<br/><ref>Committer's log entry: </ref>Improved safety net: When running with Xerces2, the "uri" field may be null.
- (Also reordered tests to encourage optimization of code.)<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Add command-line switches for the options introduced at same time as DTM, to 
-make testing those features easier.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor StylesheetPIHandler.java<br/><ref>Committer's log entry: </ref>Bugzilla 4575: Add the EOL character to the list of token delimiters.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMManagerDefault.java
- IncrementalSAXSource_Xerces.java<br/><ref>Committer's log entry: </ref>Leverage Xerces-2 incremental parsing feature, when possible,
-
- Making this compile _and_ run under both the old and new versions of
- the parser involves a lot of reflection... especially since Xerces-2
- no longer provides a way to directly request incremental delivery
- of SAX events; we now have to assemble that concept ourselves,
- using XNI components.
-
- Note that if you pass an existing Xerces-2 SAXParser into the
- IncrementalSAXSource_Xerces wrapper, there is currently no way
- for us to access its incremental controls. In that case, we are
- forced to fall back on the _Filter solution and coroutines.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XStringForFSB.java<br/><ref>Committer's log entry: </ref>Bugzilla 4396: Defaulting to the super hashCode(). This causes us to create 
-a string, but at this point this only seems to get called in key processing. 
-Maybe we can live with it?<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>11/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Committer's log entry: </ref>Use appropriate context class loader as done in JAXP's FactoryFinder;
- Added various new jars; added checkAntVersion()<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>11/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize HTMLEntities.res<br/><ref>Committer's log entry: </ref>Commented out mainly greek entities that Netscape seems not to handle.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>11/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize Encodings.java
- SerializerToHTML.java SerializerToText.java
- SerializerToXML.java<br/><ref>Committer's log entry: </ref>Progress on Bugzilla Bug 1639 : Xalan escaping characters for ISO encodings 
-other than ISO-8859-1.
-
- The problem is that you can't tell from the Java Writers if they can encode
- a character, and you can't tell which character they are going to encode to.
- So...
-
- Do a one-time-only reflection to see if a sun.io.CharToByteConverter for the
- specific encoding is available. I'm hoping this will work for most or all
- platforms... but only some extensive testing will tell for sure. If the
- CharToByteConverter is not available, it falls back to the old behavior.
- If it is available, use the canConvert method to see if the UTF-16 character
- can be encoded. If it can be, just send it to the writer, otherwise escape 
-it.
- This doesn't need to be done for &lt; 128, so I'm suspecting the performance
- hit won't be too bad.
-
- The alternative is to create lookups for all the encodings that tell which
- blocks of characters can't be encoded. Too much work for me this
- weekend, though it remains a possibility. I want to try the use of
- CharToByteConverter.canConvert first.
-
- One problem I've encountered is that CharToByteConverter.canConvert
- returns true for (utf-16 code points) 127-159. And so they go unescaped.
- How bad of a problem is this? This seems like a bug in the Java
- CharToByteConverter for ISO-8859-7.
-
- It remains to be seen if this problem exists with other encodings, or if this 
-is
- the best approach.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>11/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToXML.java<br/><ref>Committer's log entry: </ref>Check for control characters for canConvert, and return false if it is a 
-control
- character, so that it will be escaped.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>11/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMManagerDefault.java<br/><ref>Committer's log entry: </ref>Don't set the ErrorHandler if it is already set.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>11/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Minor fix to JavaDoc for setRecursionLimit.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/operations Operation.java
- UnaryOperation.java<br/><ref>Committer's log entry: </ref>Bugzilla 4679: Accessors for left and right operands<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToHTML.java<br/><ref>Committer's log entry: </ref>Do not escape the percent '%' character anymore.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes LocPathIterator.java
- OneStepIterator.java PredicatedNodeTest.java<br/><ref>Committer's log entry: </ref>Bugzilla 4638: When we are in a subcontext we need to clip off the predicate 
-when evaluating. If not, we end up with the wrong nodeset. This also relates to 
-test position68.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- ClonerToResultTree.java ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Bugzilla 4607; allow explicitly cloning namespace nodes rather than
- throwing exception.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>11/07/2001<br/><ref>Removed: </ref>java/src/META-INF/services
- javax.xml.parsers.SAXParserFactory
- javax.xml.parsers.DocumentBuilderFactory<br/><ref>Committer's log entry: </ref>Remove services/javax.xml.parsers.* references; we assume parsers have their 
-own<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>11/07/2001<br/><ref>Removed: </ref>java/src/javax/xml/transform ErrorListener.java
- FactoryFinder.java OutputKeys.java Result.java
- Source.java SourceLocator.java Templates.java
- Transformer.java
- TransformerConfigurationException.java
- TransformerException.java TransformerFactory.java
- TransformerFactoryConfigurationError.java
- URIResolver.java overview.html package.html
- java/src/javax/xml/transform/dom DOMLocator.java
- DOMResult.java DOMSource.java package.html
- java/src/javax/xml/transform/sax SAXResult.java
- SAXSource.java SAXTransformerFactory.java
- TemplatesHandler.java TransformerHandler.java
- package.html
- java/src/javax/xml/transform/stream StreamResult.java
- StreamSource.java package.html
- java/src/org/w3c/dom Attr.java CDATASection.java
- CharacterData.java Comment.java DOMException.java
- DOMImplementation.java Document.java
- DocumentFragment.java DocumentType.java
- Element.java Entity.java EntityReference.java
- NamedNodeMap.java Node.java NodeList.java
- Notation.java ProcessingInstruction.java Text.java
- package.html
- java/src/org/w3c/dom/ranges DocumentRange.java Range.java
- RangeException.java package.html
- java/src/org/w3c/dom/traversal DocumentTraversal.java
- NodeFilter.java NodeIterator.java TreeWalker.java
- package.html
- java/src/org/xml/sax AttributeList.java Attributes.java
- ContentHandler.java DTDHandler.java
- DocumentHandler.java EntityResolver.java
- ErrorHandler.java HandlerBase.java InputSource.java
- Locator.java Parser.java SAXException.java
- SAXNotRecognizedException.java
- SAXNotSupportedException.java
- SAXParseException.java XMLFilter.java
- XMLReader.java package.html
- java/src/org/xml/sax/ext DeclHandler.java
- LexicalHandler.java package.html
- java/src/org/xml/sax/helpers AttributeListImpl.java
- AttributesImpl.java DefaultHandler.java
- LocatorImpl.java NamespaceSupport.java
- ParserAdapter.java ParserFactory.java
- XMLFilterImpl.java XMLReaderAdapter.java
- XMLReaderFactory.java package.html<br/><ref>Committer's log entry: </ref>Use a condensed copy of xml-commons sources instead of individual sources;
- remove xalan-specific copies of commons files<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/templates ElemNumber.java
- java/src/org/apache/xml/utils/res XResources_cy.java
- XResources_el.java XResources_ja_JP_A.java
- XResources_ja_JP_HA.java XResources_ja_JP_HI.java
- XResources_ja_JP_I.java XResources_zh_CN.java
- XResources_zh_TW.java<br/><ref>Committer's log entry: </ref>Bugzilla 4601: Change ElemNumber to use a long integer for the value of the 
-number. This will allow us to format bigger numbers. As far as japanese 
-multipliers, we decided to document as a xalan limitation the fact that the 
-last 2 japanese multipliers will not be supported. If anyone has a strong and 
-valid user case for this, we will reconsider. For now, we could not justify the 
-expense of moving to BigInteger to support these multipliers.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Bugzilla 4735: We should at least report an error when we overflow DTM 
-addressing...<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor ProcessorInclude.java<br/><ref>Committer's log entry: </ref>Bugzilla 4355: Make sure that when finding out if a stylesheet imports 
-itself, we use the resolved href.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath NodeSetDTM.java<br/><ref>Committer's log entry: </ref>Bugzilla 4158: Make sure we get the current, not the node pointed to by 
-m_next, which has been already incremented.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Bugzilla 4344: discard attrs which don't have an element to belong to<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Bugzilla 4344: more efficient.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Reorder slightly and add test to not synthesize xmlns:xsl declaration
- if one was already present on the DOM's root element.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan Version.java<br/><ref>Committer's log entry: </ref>D13 internal version number update<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>D13 internal version number update<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D11">
-<p> Core (Non-XSLTC) source code updates:</p><ul><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>09/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Removed the code which precalculated node levels
- (depth in tree). This has been IFed out for some time, but
- was retained in case we wanted to go back to it. Since it
- seems we're happy with this choice, zapping it entirely
- saves a few more cycles.
-
- It's simple enough to recreate if we change our minds later.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>09/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Committer's log entry: </ref>Minor cleanup and updates in preparation for extension function;
- note SAX portion isn't complete yet<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>09/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Extensions.java
- java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Committer's log entry: </ref>Update EnvironmentCheck service with SAX checking; better method organization;
- Add checkEnvironment to xalan: built-in Extensions class<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler Lexer.java<br/><ref>Committer's log entry: </ref>Bug 2140: Catch index out of bounds exception<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Bug 2130: Check for null data to avoid NPE<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/templates ElemElement.java<br/><ref>Committer's log entry: </ref>Bug 3421: Issue an error if namespace attribute is used with an empty string 
-in xsl:element<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemElement.java<br/><ref>Committer's log entry: </ref>Backing out this change. Some conformance tests need to be updated first<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemElement.java<br/><ref>Committer's log entry: </ref>Bug 3421: Issue an error if namespace
- attribute is used with an empty string in xsl:element<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemTemplateElement.java<br/><ref>Committer's log entry: </ref>Bug 3442: when building the prefix table for an element, just override 
-prefixes defined in parent element with uris that have been redefined by the 
-element instead of keeping both uris in the table.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerFactory.java<br/><ref>Committer's log entry: </ref>Fix Bugzilla 3491: updated error message text; also updated Javadoc to
- reflect @throws; note that the Javadoc is still somewhat contradictory
- about returning a null on error (it appears to throw exceptions instead)
- PR:3491
- Submitted by:Julian.Birch@ranplc.co.uk<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/javax/xml/transform TransformerFactory.java
- java/src/org/apache/xml/dtm DTMManager.java<br/><ref>Committer's log entry: </ref>Fix Bugzilla 3423: documentation updates for proper class, property names
- (one of two checkins)
- PR:3423
- Submitted by:gthb@dimon.is<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>09/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath XPath.java<br/><ref>Committer's log entry: </ref>Fix Bugzilla 2637: documentation updates for constructor functionality
- PR:2637
- Submitted by:gthb@dimon.is<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemUse.java<br/><ref>Committer's log entry: </ref>Bug 2548: Combine attribute sets with the same name but process them in order 
-of precedence.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes UnionPathIterator.java<br/><ref>Committer's log entry: </ref>Bug 3533: Check for null m_iterators before trying to use it.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer KeyRefIterator.java<br/><ref>Committer's log entry: </ref>Bugzilla 3618: Check cache before anything else when getting the next node in 
-the iterator.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc TransletException.java<br/><ref>Committer's log entry: </ref>Changed the TransletException class so that it inherits from SAXException
- and not from Exception. This should make it possible for us to avoid
- testing for both SAXExceptions and TransletExceptions. Exception handling
- is one of the things that JVM takes its time with, and we should try to
- avoid using them when we can, and use as few of them as possible otherwise.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Bugzilla 2332: Implement getAttribute() method to return the values for 
-incremental and optimize<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeProxy.java<br/><ref>Committer's log entry: </ref>Enable Attr.getOwnerElement()<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor StylesheetHandler.java
- java/src/org/apache/xalan/templates ElemLiteralResult.java<br/><ref>Committer's log entry: </ref>Bugzilla 1803: Handle version attribute on a litteral element.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>release 2.2.D11<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>release 2.2.D11<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLTSchema.java<br/><ref>Committer's log entry: </ref>Mark xsl:template as containing ordered elements. Fix for no error when 
-xsl:param not first child of xsl:template<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemLiteralResult.java
- ElemTemplateElement.java Stylesheet.java<br/><ref>Committer's log entry: </ref>Bugzilla 3800: Make sure that when looking for excluded prefixes, we check 
-the URI associated with the prefix, not the prefix in the excluded list.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>09/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath NodeSetDTM.java<br/><ref>Committer's log entry: </ref>Do not reorder or strip duplicate nodes when converting a DOM nodelist into a 
-DTM nodelist<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref
- IncrementalSAXSource_Filter.java<br/><ref>Committer's log entry: </ref>Catch for unwrappered StopException (apparently not all parsers generate
- a SAXException wrapper).<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>10/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMDefaultBaseIterators.java
- DTMDefaultBaseTraversers.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Creating the implied Namespace Node for xml:<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D10">
-<note>The SQL Extension library has been updated to work with DTM.</note>
-<p> Core (Non-XSLTC) source code updates:</p><ul>
-<li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Fix bugzilla bug 3056 
-(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3056). SAX2DTM now keeps 
-track if it is receiving events inside a DTD and ignores comment events when 
-inside the DTD.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>Update version for 2.2.D9 build<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>08/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ConnectionPool.java
- DefaultConnectionPool.java SQLDocument.java
- XConnection.java<br/><ref>Committer's log entry: </ref>Fixed bug in connect method where User and Password were not
- correctly being passed to the JDBC Driver. Requires chnage in
- ConnectionPool Interface
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql XConnection.java<br/><ref>Committer's log entry: </ref>Use defined constant DTMManager.IDENT_DTM_NODE_BITS for shifting DTM nodes, 
-not hard coded value.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Fix problem with resolving a relative URI from a processing instruction<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Make sure base is not null before checking for its contents.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates FuncDocument.java<br/><ref>Committer's log entry: </ref>Fix document function so that if only one argument is passed and it is a 
-nodetest, the base to be used to resolve relative URIs is the base of the each 
-node in the nodeset.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLTSchema.java<br/><ref>Committer's log entry: </ref>Allow multiple iterations of xsl:with-param within an xsl:call-template or 
-xsl:apply-template<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath XPathContext.java<br/><ref>Committer's log entry: </ref>Added getCurrentNodeList() for getting the current node list as defined
- by http://www.w3.org/TR/xslt#dt-current-node-list.
- This looks up the stack of the SubContextLists to find the top-level
- LocPathIterator. I'm fairly unhappy with this fix, and hope to restructure
- the context list stuff a bit to avoid the casts in the getCurrentNodeList(),
- and to fix getCurrentNode() so that it properly defines the current
- node as defined by the XSLT spec. As a matter of fact, I would
- like to break up XPathContext into an XSLTContext.
- Part of the http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3031
- fix.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/functions FuncCurrent.java<br/><ref>Committer's log entry: </ref>Call new XPathContext#getCurrentNodeList. Fixes
- http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3031.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer KeyRefIterator.java
- java/src/org/apache/xpath/axes ChildIterator.java
- ChildTestIterator.java DescendantIterator.java
- MatchPatternIterator.java
- SelfIteratorNoPredicate.java UnionPathIterator.java<br/><ref>Committer's log entry: </ref>Fix for problem reported by Mike Starr &lt;mike.starr@air2web.com&gt;,
- where the transformation hangs for "foo[2] | bang"
- patters, i.e. unions with positional predicates. The fix
- is to have the iterators#nextNode() set m_lastFetched to DTM.NULL
- when m_foundLast is found to be true on function entry
- (after the cache check). This allows getCurrentNode() to
- fullfill it's contract of returning null if the last fetch was
- null. The bug occured after an optimization for positional
- predicates to have them not continue searching once
- the positional node was found, by setting m_foundLast
- to true.<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>08/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Removed debug flag
- Submitted by:John Gentilin<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>08/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java
- XConnection.java<br/><ref>Committer's log entry: </ref>Fixed Streaming Mode
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>08/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm DTM.java
- java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMDocumentImpl.java DTMManagerDefault.java<br/><ref>Committer's log entry: </ref>added document registration and release events to the DTM interface
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>08/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Extensions.java<br/><ref>Committer's log entry: </ref>Fix bug 3112 (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3112). Fix 
-tokenize to work with DTM by obtaining a new DocumentBuilder and not using the 
-document from the context node.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>08/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath VariableStack.java
- java/src/org/apache/xpath/operations Variable.java<br/><ref>Committer's log entry: </ref>Fix bug 3265 (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3265). Using 
-an expression in the evaluate extension function that contains a top-level 
-variable was cause an NPE.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XStringForChars.java<br/><ref>Committer's log entry: </ref>Fixed two bugs, one in getChars and one in charAt where the m_start
- offset wasn't being used correctly. This manifested itself in some
- stuff I was doing with the startsWith function, but likely caused
- many other bugs with other functionality.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/27/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc StripFilter.java<br/><ref>Committer's log entry: </ref>Forgot to add this file in my last putback.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java<br/><ref>Committer's log entry: </ref>added dumpNode method, convenience for debugging.
-
- We might want to move this function up to DTMDefaultBase, or
- perhaps to the DTM API itself.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToText.java<br/><ref>Committer's log entry: </ref>Fix http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3131 by
- overriding writeNormalizedChars and writeUTF16Surrogate to
- not do any XML escaping.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java<br/><ref>Committer's log entry: </ref>The index was being stored as opposed to the node handle when we were 
-replacing namespace nodes. Store the actual node handle.<br/><br/></li>
-<li><ref>Committed by</ref> mmidy@apache.org<ref> on </ref>08/29/2001<br/><ref>Modified: </ref>
-java/src/org/apache/xpath/compiler Lexer.java<br/><ref>Committer's log entry: </ref>Fix for Bugzilla 2684 StringIndexOutOfBounds Exception. Check if we are at the end of the pattern string.<br/><br/></li>
-</ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D9">
-<p> Core (Non-XSLTC) source code updates:</p>
-<ul><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>2.2.D8<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>2.2.D8<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer NodeSortKey.java<br/><ref>Committer's log entry: </ref>Submitted fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2851.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Just added some stuff to diagnose bugs for flavor th.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes WalkerFactory.java
- java/src/org/apache/xpath/compiler Compiler.java
- java/src/org/apache/xpath/patterns
- ContextMatchStepPattern.java StepPattern.java<br/><ref>Committer's log entry: </ref>These are changes submitted (offline) by Mukund Raghavachari/Watson/IBM@IBMUS.
-
- This fixes a bug with match="chapter//footnote[1]" patterns.
-
- The main change here is minor to remove the automatic attachment of parent::* 
-to simple step patterns.
-
- He has re-implemented executePredicates to be
- more efficient. Given a pattern such as row[6], it
- does not iterate over the entire axis until it reaches
- the node to see if it is the sixth node. Rather,
- starting from the current node, it works backwards
- (preceding siblings) until it either runs out of nodes
- or finds more than six nodes that match the
- predicate [I can explain it better if desired].
- This optimization improves performance slightly
- overall. It helps decoy and patterns most (by
- about 10%).
-
- The other optimization that I implemented was the
- following. For a pattern foo[][3][][4] ..., where more
- than one predicate is a number (position check),
- in checking the predicate [4], the fact that the
- current node has passed foo[][3] implies that it is
- the only node that is the third node among its
- siblings that passes foo[]. Therefore, any
- subsequent position checks can be true if and
- only if the position is [1]. This optimization is not
- used by the xsltmark benchmarks and so does
- not offer any performance benefits.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes DescendantIterator.java<br/><ref>Committer's log entry: </ref>Fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1336<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler Lexer.java<br/><ref>Committer's log entry: </ref>Resize the m_patternMap if m_patternMapSize exceeds the bounds.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions
- ExtensionHandlerGeneral.java
- ExtensionHandlerJavaPackage.java
- ExtensionsTable.java MethodResolver.java
- java/src/org/apache/xalan/lib Extensions.java
- java/src/org/apache/xalan/lib/sql ConnectionPoolManager.java
- java/src/org/apache/xalan/processor ProcessorLRE.java
- ProcessorTemplateElem.java StylesheetHandler.java
- TransformerFactoryImpl.java XSLTAttributeDef.java
- XSLTElementProcessor.java
- java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/serialize CharInfo.java
- WriterToUTF8Buffered.java
- java/src/org/apache/xalan/templates ElemExtensionCall.java
- ElemExtensionDecl.java ElemMessage.java
- FuncDocument.java FuncFormatNumb.java
- OutputProperties.java StylesheetRoot.java
- java/src/org/apache/xalan/transformer TrAXFilter.java
- TransformerHandlerImpl.java
- TransformerIdentityImpl.java TransformerImpl.java
- java/src/org/apache/xalan/xslt Process.java
- java/src/org/apache/xml/dtm DTMException.java
- DTMManager.java
- java/src/org/apache/xml/dtm/ref ChunkedIntArray.java
- CoroutineManager.java CoroutineSAXParser.java
- CoroutineSAXParser_Xerces.java DTMBuilder.java
- DTMDefaultBase.java DTMDefaultBaseIterators.java
- DTMDefaultBaseTraversers.java
- DTMManagerDefault.java
- IncrementalSAXSource_Filter.java
- IncrementalSAXSource_Xerces.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java
- java/src/org/apache/xml/utils ObjectPool.java QName.java
- URI.java
- java/src/org/apache/xpath NodeSet.java NodeSetDTM.java
- VariableStack.java XPath.java XPathContext.java
- java/src/org/apache/xpath/axes WalkerFactory.java
- java/src/org/apache/xpath/functions FuncSubstring.java
- FunctionDef1Arg.java
- java/src/org/apache/xpath/objects
- XRTreeFragSelectWrapper.java XStringForChars.java
- java/src/org/apache/xpath/operations Variable.java
- java/src/org/apache/xpath/res XPATHErrorResources.java<br/><ref>Committer's log entry: </ref>Getting all (almost all) error message strings into the resource bundle<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/27/2001<br/><ref>Removed: </ref>java/src/org/apache/xml/dtm/ref DTMBuilder.java<br/><ref>Committer's log entry: </ref>Accidentally added. Now deleting.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath Expression.java
- java/src/org/apache/xpath/axes AxesWalker.java
- LocPathIterator.java PredicatedNodeTest.java
- ReverseAxesWalker.java
- java/src/org/apache/xpath/objects XNumber.java
- java/src/org/apache/xpath/operations Variable.java<br/><ref>Committer's log entry: </ref>If a proximity predicate is a stable number (variable or number literal) then,
- once the node is found, don't keep searching! (since only one
- node is possible).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java<br/><ref>Committer's log entry: </ref>In getNextNamespaceNode and getFirstNamespaceNode, was
- sometimes returning a node without the DTM identity bits.
- Fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2878.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler OpMap.java<br/><ref>Committer's log entry: </ref>Throw real error instead of runtime error in getFirstPredicateOpPos
- for better error reporting.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes PredicatedNodeTest.java
- java/src/org/apache/xpath/compiler OpMap.java<br/><ref>Committer's log entry: </ref>Bit of a hack to make /descendant-or-self::north with getFirstPredicateOpPos
- where getFirstPredicateOpPos was always throwing an error if
- there was not a predicate (!! Should have been discovered before
- now?!?!). If -2 return -2 (instead of throwing an error), and
- handle this case in PredicatedNodeTest#initPredicateInfo.<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ObjectArray.java
- SQLDocument.java SQLErrorDocument.java
- XConnection.java<br/><ref>Committer's log entry: </ref>Added the original pquery and streaming mode functionality
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/30/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/lib/sql DTMDocument.java<br/><ref>Committer's log entry: </ref>Added DTM Document, a common impl between SQLDocument and SQLErrorDocument
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes DescendantIterator.java
- WalkerFactory.java<br/><ref>Committer's log entry: </ref>Fix addresses http://nagoya.apache.org/bugzilla/enter_bug.cgi?product=XalanJ2,
- and a whole class of related problems.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XNodeSet.java XObject.java
- java/src/org/apache/xpath/patterns StepPattern.java<br/><ref>Committer's log entry: </ref>Detach expressions in match patterns. Also, defined
- numWithSideEffects and boolWithSideEffects (for lack of
- better names) that will increment the iterator, and call these
- for predicates. The combination of these results in about an
- 18% performance improvement for decoy.xsl.
- Credits to Mukund Raghavachari/Watson/IBM@IBMUS.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions
- ExtensionHandlerGeneral.java
- java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/templates ElemExtensionDecl.java<br/><ref>Committer's log entry: </ref>Add support for external scripts (ie, the src attribute on a script element)<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath XPathContext.java
- java/src/org/apache/xpath/axes ChildTestIterator.java
- OneStepIteratorForward.java<br/><ref>Committer's log entry: </ref>In XPathContext#createDTMIterator(int node), call 
-OneStepIteratorForward(Axis.SELF)
- instead of DescendantIterator. This addresses one of the bugs
- in http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2925
- (i.e. &lt;xsl:copy-of select="xalan:nodeset($stylesheets)"/&gt;...
- The DescendantIterator was enumerating all of the nodes in the RTF
- rather than just the one.)<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ConnectionPool.java
- ConnectionPoolManager.java DTMDocument.java
- DefaultConnectionPool.java ObjectArray.java
- PooledConnection.java SQLDocument.java
- SQLErrorDocument.java XConnection.java<br/><ref>Committer's log entry: </ref>Added Error Managment and javadocs
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/patterns StepPattern.java<br/><ref>Committer's log entry: </ref>Fixed some major problems with position() and last() in secondary
- predicates for match patterns. Credit goes to
- Mukund Raghavachari/Watson/IBM@IBMUS for flagging these.<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>08/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql XConnection.java<br/><ref>Committer's log entry: </ref>Update after building Unit Test's
- Submitted by: John Gentilin<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLTAttributeDef.java<br/><ref>Committer's log entry: </ref>Fix for Bugzilla 2930. Fix from Alexander Rudnev. Handle namespaced elements.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm DTMAxisIterator.java
- java/src/org/apache/xml/dtm/ref DTMAxisIteratorBase.java
- DTMDefaultBaseIterators.java
- java/src/org/apache/xpath/axes OneStepIterator.java<br/><ref>Committer's log entry: </ref>Addresses http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2945
-
- Bug was caused by (redundent) cloneWithReset being called from
- the UnionPathIterator, and the iterator in OneStepIterator not being
- reset. (Need to review: check other iterators for this.)
-
- Call reset on the iterator in OneStepIterator#reset. Reset the position
- value in the ancestor iterator reset. Define DTMAxisIterator#cloneIterator
- to not reset the iterator position, and fix the implementations of
- this to not call clone.reset().<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java
- java/src/org/apache/xpath NodeSetDTM.java
- java/src/org/apache/xpath/functions FuncExtFunction.java
- java/src/org/apache/xpath/objects XBoolean.java
- XNodeSet.java XNumber.java XObject.java<br/><ref>Added: </ref>java/src/org/apache/xpath/objects XNodeSetForDOM.java<br/><ref>Committer's log entry: </ref>Address http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2925
-
- Create new XObject, XNodeSetForDOM, which is constructed
- from a Node, NodeList, or NodeIterator, and acts the same as
- XNodeSet, except it returns the original object for object(),
- nodeset(), and nodelist().
-
- Add XObject#create(Object val, XPathContext xctxt), which is
- called from TransformerImpl#setParameter(s), and
- FuncExtFunction#execute (for the return values of the
- extension).
-
- XBoolean and XNumber now also have Boolean and Number
- constructors, in which case the original object will also be
- returned from the object() method.
-
- This should make the conversion from java object to XObject
- consistent between function returns and setParameter. These
- changes should also fix a bug where NodeLists weren't being converted.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/03/2001<br/><ref>Added: </ref>java/src/org/apache/xml/utils NamespaceSupport2.java<br/><ref>Committer's log entry: </ref>Replacement for org.xml.sax.helpers.NamespaceSupport; extends
- that API so it can be easily swapped in.
-
- Current changes;
-
- Minor code reorg. I'm sorry, but I find classes easier to read
- if fields are defined before methods reference them rather than
- at end, especially when inner classes are present.
-
- Punt stack vector in favor of doubly-linked list. (It was already
- singly-linked in parallel with the vector!)
-
- The whole dirty-tables concept was broken, because Context's
- ctor always called copyTables and thus always marked tables
- dirty. It also wasted some time setting itself only to be reset by
- setParent. I've fixed both by parameterizing the ctor and making
- copyTables specific to prep-for-new-declaration. (Could be
- moved back into the declaration method, for that matter.)
-
- I'm dubious about the caches in processName. As far as I can
- tell, Xalan per se never actually uses that method...
-
- The use of Hashtables is questionable. Hashtable is
- known to be inefficient and oversynchronized in older JVMs, and
- the fact that this is a bidirectional mapping suggests that an
- approach similar to our own String Pool -- lighter-weight, more
- targeted, hashing without reduplicating the two column tables --
- would be a win. Since these are typically short sets, even
- simple linear search is worth considering!<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor StylesheetHandler.java
- java/src/org/apache/xalan/templates ElemTemplateElement.java
- java/src/org/apache/xalan/transformer ResultTreeHandler.java
- TransformSnapshotImpl.java<br/><ref>Committer's log entry: </ref>Cutover to NamespaceSupport2, q.v.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils NamespaceSupport2.java<br/><ref>Committer's log entry: </ref>Continuing code review.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils NamespaceSupport2.java<br/><ref>Committer's log entry: </ref>More efficient prefixes-for-specific-URI. This may wind up being
- redone yet again if/when the underlying storage representation
- changes.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>08/03/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/lib PipeDocument.java<br/><ref>Committer's log entry: </ref>PipeDocument extension element (the pipeDocument method).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java
- java/src/org/apache/xpath NodeSet.java NodeSetDTM.java<br/><ref>Committer's log entry: </ref>Bug fixed regarding the current() function in the root template
- (related to bug#1269). Bug was reported by David Marston
- offline. The test for this is conf/copy/copy29.
-
- In TransformerImpl#applyTemplateToNode, create a NodeSetDTM and pass it to 
-m_xcontext.pushContextNodeList(cnl);.
- In NodeSetDTM fix getCurrentNode so that it doesn't use m_next-1
- (which simply appears to be completely wrong). Do the same for
- NodeSet... though I don't think this will be called anywhere in
- Xalan.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm DTMAxisIterator.java
- java/src/org/apache/xml/dtm/ref DTMAxisIteratorBase.java
- DTMDefaultBaseIterators.java<br/><ref>Committer's log entry: </ref>Provide method for DTMAxisIterator to get the current root node
- of the iteration.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XObject.java<br/><ref>Committer's log entry: </ref>In response to regression posted on xalan-dev by John Gentilin 
-&lt;johnglinux@eyecatching.com&gt;
- on 08/03/2001 06:49 PM. When the XNodeSet taks a DTMIterator, it
- will call val.getDTMManager();, which will call LocPathIterator#getDTMManager,
- which will call m_execContext..getDTMManager(), which means
- that setRoot has to be called on the iterator before it is added to
- XNodeSet. Thus, call setRoot on the OneStepIterator in
- create(Object, XPathContext) before it is added to the XNodeSet.
- The regression was related to fix for 
-http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2925.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes OneStepIterator.java<br/><ref>Committer's log entry: </ref>For the OneStepIterator(DTMAxisIterator iterator) constructor,
- initialize the node tests to DTMFilter.SHOW_ALL (duh).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XObject.java<br/><ref>Added: </ref>java/src/org/apache/xpath/objects XObjectFactory.java<br/><ref>Committer's log entry: </ref>Move create methods from XObject to XObjectFactory, in response
- to cyclic build problems encountered with javac 1.1.8.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils NamespaceSupport2.java<br/><ref>Committer's log entry: </ref>Moved anonomous class to PrefixEnumerator, in response
- to problems encountered with 1.1.8 build.
- Joe may want to fix this in another way, as
- I'm sure the anon class is probably a bit
- cheaper?<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath VariableStack.java<br/><ref>Committer's log entry: </ref>Address http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2972,
- where it was throwing a NPE instead of reporting that the variable
- was being accessed before it was bound (i.e. the variable was being
- accessed inside an RTF for that same variable).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerHandlerImpl.java<br/><ref>Committer's log entry: </ref>Remove m_hasStarted variable and associated assertion.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBaseIterators.java<br/><ref>Committer's log entry: </ref>Addresses bug http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3001.
- In the cloneIterator function of PrecedingIterator, the cloned array
- was being sized for _maxAncestors, which defaults to 8. But if the
- _stack was resized, it will copy more into the new stack than is
- allocated. The solution is to allocate the new clone._stack array to
- _stack.length.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils NamespaceSupport2.java<br/><ref>Committer's log entry: </ref>Don't create caches unless used (which I don't think they are, in Xalan).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBaseIterators.java<br/><ref>Committer's log entry: </ref>Made _maxAncestors not static, as this is
- not compatible with 1.1.8 (reported by
- Gary Peskin).<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils NamespaceSupport2.java<br/><ref>Committer's log entry: </ref>Playing a hunch, I moved the Context objects out of NamespaceSupport2.
- They're now a second class in the same file rather than being an inner class.
- That reduces the size of the Context2 object, and its initialization time, by
- removing the need for it to carry a reference to the NamespaceSupport2
- object that created it.
-
- Performance seems significantly improved... even (surprisingly!) on the
- getDeclaredPrefixes operation. Memory usage also seems better, as
- expected.
-
- NamespaceSupport2 is still acounting for about 5%
- of the time spent in the ResultTreeHandler, according
- to my latest trace. Apparently we are calling
- getDeclaredPrefixes an obscenely large number of
- times, and the Vector.elements call is adding up. We
- may want to look at where this is being called from
- and whether we can reduce the number of invocations.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Performance improvement; avoid scanning the same list twice.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerHandlerImpl.java TransformerImpl.java
- java/src/org/apache/xalan/xslt Process.java
- java/src/org/apache/xml/dtm/ref
- IncrementalSAXSource_Filter.java
- java/src/org/apache/xml/utils DefaultErrorHandler.java
- java/src/org/apache/xpath/operations Variable.java<br/><ref>Committer's log entry: </ref>This checkin hopefully fixes many problems with bad diagnostics lately, but
- at the expense of a slight change in behavior. The rule now is, the
- DefaultErrorHandler never outputs location info for error and fatalError... 
-this has to be done
- by the catcher of the exception. Convenience methods for this are
- in DefaultErrorHandler#printLocation. This method will unwrap the
- exception as close to the originating source as possible.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions
- XSLProcessorContext.java
- java/src/org/apache/xml/dtm DTMIterator.java
- java/src/org/apache/xml/dtm/ref DTMAxisIteratorBase.java
- java/src/org/apache/xpath NodeSetDTM.java
- java/src/org/apache/xpath/axes AttributeIterator.java
- AxesWalker.java ChildIterator.java
- ChildTestIterator.java DescendantIterator.java
- FilterExprWalker.java LocPathIterator.java
- OneStepIterator.java OneStepIteratorForward.java
- ReverseAxesWalker.java UnionPathIterator.java
- WalkingIteratorSorted.java
- java/src/org/apache/xpath/objects XObjectFactory.java<br/><ref>Committer's log entry: </ref>Changes to allow some dynamic determination in WalkerIteratorSorted to
- see if the nodes really need to be sorted. Added isDocOrdered() and
- getAxis() to both DTMIterator and AxesWalker, and implemented
- appropriate overloads in derived or implementing classes. In FilterExprWalker
- return the contained DTMIterator's getAxis(). In WalkerIteratorSorted,
- implement canBeWalkedInNaturalDocOrder() function that is called
- from setRoot(...). If this function returns true, than don't sort the nodes
- in setRoot, and in all other respects treat this as if it is a simple
- WalkingIterator.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fix for bugzilla 1251. Make sure exceptions are thrown when we're on the main 
-thread.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes AxesWalker.java
- WalkerFactory.java WalkingIteratorSorted.java<br/><ref>Committer's log entry: </ref>Eliminate do/while check for duplicates in AxesWalker#nextNode()
- by using WalkingIteratorSorted for cases where both the preceding[-sibling]
- and following[-sibling] axes are being walked, and for "@*/foo" patterns
- ("@attr/foo" patterns still use WalkingIterator).<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>08/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates FuncFormatNumb.java<br/><ref>Committer's log entry: </ref>Fix bugzilla bug 3036 
-(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3036). When no 
-xsl:decimal-format element is supplied in the composed stylesheet, the defaults 
-specified in the Recommendation section 12.3 should be used for the attribute 
-values, not locale-specific defaults.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>08/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Fix for bugzilla 3060 
-(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3060). Prefixes and
- namespaceURIs are kept in the same Vector, m_prefixMappings. The entries are 
-stored as pairs of vector elements. The even elements contain the prefix and 
-the odd elements contain the URI. In two routines, getPrefix and endElement, 
-the appropriate prefix or URI was being located in the Vector using an 
-indexOf. However, in this case where the prefix and the URI were the same, the 
-routine was looking for the URI but finding the prefix instead of the URI. It 
-tried tried to back up one to get the prefix and underflowed the Vector size.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java
- TransformerImpl.java<br/><ref>Committer's log entry: </ref>Implement ErrorHandler in ResultTreeHandler so that fatal errors can get 
-passed in to the SAXHandler. Also change the code in TransformerImpl to call 
-fatalError in case of an error instead of endDocument. (overlaps with URI 
-handling fix...)<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java
- java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java
- java/src/org/apache/xml/utils SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Fix code to handle absolute paths from unix systems. This fix is part of an 
-ongoing process and is just meant to fix a few pending bugs. More changes are 
-expected in this area.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>Change version for xalan2.2.D9 build<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemElement.java
- java/src/org/apache/xalan/transformer ResultTreeHandler.java
- java/src/org/apache/xml/utils DefaultErrorHandler.java<br/><ref>Committer's log entry: </ref>ResultTreeHandler was pushing a new namespace context but failing to note 
-that result in more pushes than pops. Cleaned up the execute() method of 
-ElemElement to make it more understandable (to me) and added a few comments. 
-The DefaultErrorHandler was not flushing Writers that it created. Since the 
-Writers are never closed (and cannot be as there is no close method), error 
-messages were failing to appear.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm DTMManager.java<br/><ref>Committer's log entry: </ref>Increasing the number of bits used to identify DTM nodes, at the expense of 
-decreasing the number of DTMs that a DTMManager can track simultaneously. Some 
-other code has been updated to track this change (and to better track posible 
-future changes), as have the IDKEY testcases.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMDocumentImpl.java DTMManagerDefault.java<br/><ref>Committer's log entry: </ref>Increasing the number of bits used to identify DTM nodes, at the expense of 
-decreasing the number of DTMs that a DTMManager can track simultaneously. Some 
-other code has been updated to track this change (and to better track posible 
-future changes), as have the IDKEY testcases.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/functions FuncGenerateId.java<br/><ref>Committer's log entry: </ref>Increasing the number of bits used to identify DTM nodes, at the expense of 
-decreasing the number of DTMs that a DTMManager can track simultaneously. Some 
-other code has been updated to track this change (and to better track posible 
-future changes), as have the IDKEY testcases.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath NodeSetDTM.java<br/><ref>Committer's log entry: </ref>Try to support getRoot. Fixes problem with TransformStateTest.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>08/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes WalkerFactory.java<br/><ref>Committer's log entry: </ref>Fix problem with duplicate nodes produced from a walking iterator<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D8">
-<p> Core (Non-XSLTC) source code updates:</p><ul><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Code Update
- Submitted by:John Gentilin<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Fixed DTM.NULL compile error<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TreeWalker2Result.java<br/><ref>Committer's log entry: </ref>Redundant test removed, possibly redundant code flagged for %REVIEW%<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java
- java/src/org/apache/xalan/transformer
- TransformerHandlerImpl.java
- java/src/org/apache/xml/dtm/ref DTMDefaultBase.java
- DTMDocumentImpl.java DTMManagerDefault.java
- IncrementalSAXSource.java
- IncrementalSAXSource_Filter.java
- IncrementalSAXSource_Xerces.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java
- java/src/org/apache/xml/utils SuballocatedIntVector.java<br/><ref>Committer's log entry: </ref>IncrementalSAXSource replaces CoroutineSAXParser -- simpler API,
- hence less risk of programming errors introducing timing windows. I hope.
- A few performance-related tweaks are also included in this check-in.
- Only very minor gains are expected.<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ObjectArray.java
- SQLDocument.java<br/><ref>Committer's log entry: </ref>Project Update<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Oops.Should have been checked in as part of the IncrementalSAXSource cutover. 
-Sorry!<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>07/23/2001<br/><ref>Modified: </ref>java build.xml
- java/src/org/apache/xml/dtm/ref
- IncrementalSAXSource_Filter.java
- java/src/org/apache/xml/utils/synthetic JavaUtils.java<br/><ref>Committer's log entry: </ref>3 small fixes to the build process ( to make it work with jdk1.4 and crimson)
-
- - exclude IncrementalSAXSource_Xerces if xerces is not detected
- - comment-out the "main" in IncrementalSAXSource_Filter.java ( it is a
- test, but has deps on xerces )
- - don't try to load the compiler in syntetic/JavaUtils. This is a mess,
- it was debated on tomcat-dev and ant-dev, as you may know some people
- decided to remove the internal compiler class ( sun.tools.javac.Main ),
- and that brakes jasper, ant and now xalan.
-
- It seems right now the only portable way to run the compiler is via command
- line call in a separate process ( jikes can easily make up for the
- overhead of creating a new process and doesn't leave garbage ).
-
- Question: is synthetic used ? Seems like a very usefull package, but if
- xalan is not using it it might be better to move it to xml-commons or
- jakarta-commons or some other place.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Don't set m_level anymore, as it looks like Joe commented out it's
- initialization. m_level is no longer called by Xalan, and the implementation
- can calculate it when it is called.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java<br/><ref>Committer's log entry: </ref>Fixed bug 2758 (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2758). The 
-flag indicating that a call to startDocument() in the resultContentHandler was 
-necessary was not being reset for multiple transforms.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Fix bug 2727 (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2727). 
-Attributes which contain a namespace prefix are indicated by placing a negative 
-number in the appropriate entry in the m_dataOrQName array. The absolute value 
-of this number is an entry in m_data. However, in this example, there were no 
-text nodes before the first namespaced attribute so the entry in m_data had an 
-array index of 0. This resulted in an entry of zero, not a negative number, in 
-m_dataOrQName. This situation got several routines which tested for &lt; 0 
-confused. I looked at several ways of fixing this but decided to just always 
-allocate m_data.elementAt(0) entry to a dummy entry. The other solutions 
-involved runtime checking which could slow down this piece of code and I felt 
-that wasting one entry was worth it to not slow down the run time.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize
- WriterToUTF8Buffered.java<br/><ref>Committer's log entry: </ref>Fix bugzilla bug 2639 
-(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2639) where buffer was 
-overflowing because the expansion of the Unicode characters into multiple UTF8 
-characters was not being properly taken into account. Many thanks to 
-Gunnlaugur Thor Briem for his "multiply by three" trick.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer NodeSorter.java<br/><ref>Committer's log entry: </ref>Commented out NumberFormat m_formatter = NumberFormat.getNumberInstance();.
-
- Mukund reported:
-
- a minor improvement for alphabetize.xsl is to comment out the line
-
- //NumberFormat m_formatter = NumberFormat.getNumberInstance();
-
- in NodeSorter.java. The variable m_formatter does not seem to be used 
-anywhere, and the performance difference is:
-
- Before: alphabetize 10 90 5108 196 156 34.58 
-OK
- After : alphabetize 10 70 4316 196 156 
-40.93 OK<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>2.2.D8<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>2.2.D8<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer NodeSortKey.java<br/><ref>Committer's log entry: </ref>Submitted fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2851.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Just added some stuff to diagnose bugs for flavor th.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes WalkerFactory.java
- java/src/org/apache/xpath/compiler Compiler.java
- java/src/org/apache/xpath/patterns
- ContextMatchStepPattern.java StepPattern.java<br/><ref>Committer's log entry: </ref>These are changes submitted (offline) by Mukund Raghavachari/Watson/IBM@IBMUS.
-
- This fixes a bug with match="chapter//footnote[1]" patterns.
-
- The main change here is minor to remove the automatic attachment of parent::* 
-to simple step patterns.
-
- He has re-implemented executePredicates to be
- more efficient. Given a pattern such as row[6], it
- does not iterate over the entire axis until it reaches
- the node to see if it is the sixth node. Rather,
- starting from the current node, it works backwards
- (preceding siblings) until it either runs out of nodes
- or finds more than six nodes that match the
- predicate [I can explain it better if desired].
- This optimization improves performance slightly
- overall. It helps decoy and patterns most (by
- about 10%).
-
- The other optimization that I implemented was the
- following. For a pattern foo[][3][][4] ..., where more
- than one predicate is a number (position check),
- in checking the predicate [4], the fact that the
- current node has passed foo[][3] implies that it is
- the only node that is the third node among its
- siblings that passes foo[]. Therefore, any
- subsequent position checks can be true if and
- only if the position is [1]. This optimization is not
- used by the xsltmark benchmarks and so does
- not offer any performance benefits.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes DescendantIterator.java<br/><ref>Committer's log entry: </ref>Fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1336<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D7">
-<p> Core (Non-XSLTC) source code updates:</p><ul><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMManagerDefault.java<br/><ref>Committer's log entry: </ref>Since the real root of our tree may be a DocumentFragment, we need to
- use getParent to find the root, instead of getOwnerDocument. Otherwise
- DOM2DTM#getHandleOfNode will be very unhappy.
- Result of report via private mail by Carsten Ziegeler of breakage
- in Cocoon.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToHTML.java
- SerializerToXML.java<br/><ref>Committer's log entry: </ref>Made m_maxCharacter, accumDefaultEscape,
- accumDefaultEntity, and m_isRawStack
- protected by request from Johannes Farrenkopf
- and Frank Nestel.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/functions FuncNormalizeSpace.java<br/><ref>Committer's log entry: </ref>In executeCharsToContentHandler check first for
- DTM.NULL before trying to get the DTM.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>Fix bug reported by "Carsten Ziegeler" &lt;cziegeler@sundn.de&gt;.
- Test for this is whitespace23.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SuballocatedIntVector.java<br/><ref>Committer's log entry: </ref>Drop some bounds tests for cases which shouldn't arise in the first place, 
-since this is an inner-loop method.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SuballocatedByteVector.java
- SuballocatedIntVector.java<br/><ref>Committer's log entry: </ref>Synch SuballocatedByteVector with changed SuballocatedIntVector<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref CoroutineSAXParser.java<br/><ref>Committer's log entry: </ref>Revert back to throwing a shutdownException if (arg == null) in co_yield. I 
-see this
- occur if the parser is Crimson with output\output01, and it causes
- a hang if the shutdownException is not thrown.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToXML.java<br/><ref>Committer's log entry: </ref>Make accumDefaultEntity and accumDefaultEscape non-final.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes ChildTestIterator.java
- OneStepIterator.java
- java/src/org/apache/xpath/functions FuncExtFunction.java<br/><ref>Committer's log entry: </ref>Fix for John G. for the SQL extension: handle return types of
- DTM and DTMAxisIterator.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>In executeChildTemplates, somehow there was a popMode without
- a corresponding pushMode. The pushMode was added.
- Addresses bug posted by Stephane Bailliez &lt;sbailliez@imediation.com&gt;
- on the xalan-dev list on 07/09/2001 07:28 AM.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions ExpressionContext.java
- java/src/org/apache/xalan/templates StylesheetRoot.java
- java/src/org/apache/xpath VariableStack.java
- XPathContext.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla 2355 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2355&gt;. To make the 
-functionality clearer, I've changed the method name from getVariable to 
-getVariableOrParam since the routine will pick up either one. Also fixed a 
-bug where top level variables and parameters were not getting marked as such.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Extensions.java
- java/src/org/apache/xpath XPathContext.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla 2523 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2523&gt;. evaluate extension 
-function was not refactored with DTM. Also need to add function to 
-XPathContext.XPathExpressionContext to allow an extension to obtain the 
-associated XPathContext.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes DescendantIterator.java<br/><ref>Committer's log entry: </ref>Fix problem with descendant-or-self and from root pattern. When from root, 
-descedant or self was not recognized.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Quick patch to handle case where someone wants to build a DTM from
- an Element rather than from a Document. The Attr handling might want to
- move down into addNode.
-
- This opens several cans of worms -- what if the next user wants the
- root of their DTM to be an EntityReference node, which has no DTM
- node equivalent -- but we'll eat those when we get to them.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Extensions.java<br/><ref>Committer's log entry: </ref>Modify distinct() extension so that it no longer relies on DOMHelper which is 
-deprecated but uses ExpressionContext.toString().<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/trace PrintTraceListener.java
- java/src/org/apache/xalan/transformer TransformerImpl.java
- java/src/org/apache/xalan/xslt Process.java
- java/src/org/apache/xml/dtm DTM.java
- java/src/org/apache/xml/dtm/ref DTMDocumentImpl.java
- ExpandedNameTable.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Added: </ref>java/src/org/apache/xalan/lib NodeInfo.java
- java/src/org/apache/xalan/transformer XalanProperties.java
- java/src/org/apache/xml/dtm/ref NodeLocator.java<br/><ref>Committer's log entry: </ref>Application of patch submitted by Ovidiu Predescu &lt;ovidiu@cup.hp.com&gt;
- for file, line, column number information for XML source document.
-
- [A made one change: m_sourceSystemId, m_sourceLine, and
- m_sourceColumn are not created with the member variable
- initializer, since they are initialized in setProperty.]
-
- The following patch is a rework of a previous patch I've submitted on
- May 24 against the Stree model, current at that time. This time the
- patch is against the DTM model, and makes use of DTM features to
- optimize the lookup time and storage requirements. I hope this time
- the patch gets incorporated in the CVS repository, before any major
- rework happens again ;-).
-
- As with the previous patch, there is no overhead in space or time if
- source information is not needed.
-
- From a user perspective, this feature can be turned on by passing the
- -L flag to Xalan when invoking it from the command
- line. Programmatically you can also enable it by invoking the
- setProperty method on the TransformerImpl:
-
- TransformerImpl impl = ((TransformerImpl) transformer);
- 
-impl.setProperty(org.apache.xalan.transformer.XalanProperties.SOURCE_LOCATION,
- Boolean.TRUE);
-
- A Transformer "property" is different from a "feature": while a
- feature is specific to all the transformer instances and usually
- refers to an implementation aspect, a property is a runtime capability
- that is set per Transformer instance. Currently the only property
- added by this patch is the source location in the XML source document.
-
- The patch adds two methods to the DTM interface:
-
- public void setProperty(String property, Object value);
- public SourceLocator getSourceLocatorFor(int node);
-
- The second method is used to obtain the source location given a node
- handle.
-
- There are two ways you can make use of the source location. The first
- one is from within a stylesheet, where you can have something like
- this:
-
- &lt;xsl:stylesheet
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:nodeinfo="xalan://org.apache.xalan.lib.NodeInfo"
- version="1.0"&gt;
-
- &lt;xsl:template match="*"&gt;
- //node &lt;xsl:value-of select="name()"/&gt;
- //file &lt;xsl:value-of select="nodeinfo:systemId()"/&gt;
- //line &lt;xsl:value-of select="nodeinfo:lineNumber()"/&gt;
- //column &lt;xsl:value-of select="nodeinfo:columnNumber()"/&gt;
- &lt;xsl:apply-templates/&gt;
- &lt;/xsl:template&gt;
-
- &lt;/xsl:stylesheet&gt;
-
- If no arguments are passed to the systemId(), lineNumber() or
- columnNumber() functions, the corresponding information of the current
- context node is returned. A node can be passed as argument to the
- above functions, in which case the corresponding information about
- that node is returned. If a node set containing multiple nodes is
- passed as argument, only the information of the first node in the set
- is returned.
-
- The second way of obtaining the source location is
- programmatically. Given a Node instance, one can obtain the owner DTM
- and the node handle (an integer) that represents the
- node. Unfortunately I didn't see any way of hiding this: if you find
- one please let me know and I'll fix it.
-
- The following example is extracted from PrintTraceListener and
- illustrates the API:
-
- Node sourceNode = ev.m_sourceNode;
- int nodeHandler = ((DTMNodeProxy)sourceNode).getDTMNodeNumber();
- SourceLocator locator = ((DTMNodeProxy)sourceNode).getDTM()
- .getSourceLocatorFor(nodeHandler);
-
- m_pw.println("Selected source node '" + sourceNode.getNodeName()
- + "', at " + locator);<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler Compiler.java<br/><ref>Committer's log entry: </ref>Fix bug 2175 &lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2175&gt; by 
-adding the current time to the method key to ensure method key uniqueness. 
-Multiple Compilers were getting the same hashCode, particularly in Visual Age 
-for Java, due to aggressive garbage collection. Added the current time in 
-mills to distinguish between the different functions being compiled.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemVariable.java
- StylesheetRoot.java
- java/src/org/apache/xpath VariableStack.java
- java/src/org/apache/xpath/operations Variable.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla 2355 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2355&gt;. Added code to 
-populate m_index for global variables and parameters. If the backward search 
-for templates reaches the top level, use the list of composed top-level 
-variables and parameters from StylesheetRoot.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeProxy.java<br/><ref>Committer's log entry: </ref>Now implements DocumentFragment.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>Updated version to 2.2.0.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>Updated version to 2.2.0.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMNodeProxy.java<br/><ref>Committer's log entry: </ref>Fixed very ugly bug, left-over from DTM1, in getValue, where +1 was being 
-added per the old attribute structure of DTM1.<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ConnectionPool.java
- DefaultConnectionPool.java PooledConnection.java
- QueryParameter.java XConnection.java<br/><ref>Added: </ref>java/src/org/apache/xalan/lib/sql ConnectionPoolManager.java
- ObjectArray.java SQLDocument.java
- SQLErrorDocument.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/lib/sql Column.java
- ColumnAttribute.java ColumnData.java
- ColumnHeader.java ExtensionError.java Row.java
- RowSet.java SQLExtensionError.java
- StreamableNode.java XConnectionPoolManager.java
- XStatement.java<br/><ref>Committer's log entry: </ref>First round of changes to port DOM mode to DTM Mode
- Submitted by: John Gentilin mailto://johng@apache.org<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Check if locator property is set before trying to use locator fields<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/trace PrintTraceListener.java<br/><ref>Committer's log entry: </ref>Don't print locator message if locator is null<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerHandlerImpl.java<br/><ref>Committer's log entry: </ref>In startDocument, run m_contentHandler.startDocument before you start the 
-thread.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Call wait for initial events before the the transform is started.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref CoroutineSAXParser.java<br/><ref>Committer's log entry: </ref>Allow co_yield to be called after the parse has finished.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java
- SQLErrorDocument.java<br/><ref>Committer's log entry: </ref>Added setProperty and getSourceLocatorFor empty methods.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>07/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>Fix problem reported by Carsten Ziegeler &lt;cziegeler@sundn.de&gt;. Using 
-ApplyXPath (or doing a transformation) with DOM input was resulting in an NPE 
-due to declareNamespaceInContext() being called before setting m_exptype which 
-is needed by declareNamespaceInContext().<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerHandlerImpl.java<br/><ref>Committer's log entry: </ref>Add pauseForTransformThreadStartup. Call this in startDocument just
- after starting the transform thread. This should get rid of any variability
- with racing threads.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions
- XSLProcessorContext.java<br/><ref>Committer's log entry: </ref>Fix problem reported by jason heddings &lt;Jason.Heddings@Sun.COM&gt;.
-
- "In v2.0.1, I was able to pass a Node to this function and have the node
- be copied to the result tree (as expected). In the source code for
- XSLProcessorContext, it appears that the only objects that can be sent
- to the result tree are XObjects. Everything else is converted to a
- String. So for instance, I can no longer create a ProcessingInstruction
- and pass it to the result tree via this method since the PI is simply
- converted to a String."<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToHTML.java<br/><ref>Committer's log entry: </ref>Application of patch submitted by Benjamin Riefenstahl 
-&lt;Benjamin.Riefenstahl@ision.net&gt;
-
- Motivation: We are using Xalan to generate HTML pages. We have the
- requirement to integrate code for ad banners. The ad server provider
- has written the code to use with compatibility to NetScape 4 in mind.
- The code uses the NetScape proprietory &lt;LAYER&gt; element and &lt;IFRAME&gt;
- elements for other browsers. The SRC attributes of these elements
- contain URLs with several URL parameters separated by '&amp;', as is the
- common convention.
-
- Problem: The code is integrated in our XSL stylesheets. In the
- stylesheet the '&amp;' has to be written as the entity '&amp;amp;'. That's
- ok. The problem is that in the output the '&amp;' is also written as
- '&amp;amp;' which is not ok, because NetScape doesn't understand that.
- OTOH the same URL is written with '&amp;' when used in an &lt;A&gt; element.
-
- Solution: This goes down to a different handling of attribute values
- in the class SerializeToHTML, depending on whether the attribute in
- question is known to contain a URI or not. Xalan knows this for &lt;A&gt;
- but not for &lt;LAYER&gt; and &lt;IFRAME&gt;. When I compare the list in
- SerializeToHTML.java with the HTML specs, I find a couple of other
- missing URI attributes in SerializeToHTML.java. When I add the
- missing pieces, the generation works fine.
-
- Patch: Here is the patch (diff -c) for xalan-j_2_2_D6. I also have
- one for xalan-j_2_0_1 which is the version I actually tested this
- with. Please let me know if this is insufficient or the patch is
- wrong or if there is something else I can do to fix this problem.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>On code review of previous checkin from Gary P., we determined there
- was a problem with the point at which type was declared a
- DTM.NAMESPACE_NODE. So that part was moved back up (actuall
- a bit higher than where it was before),
- and the call to declareNamespaceInContext was moved a bit
- further down.<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql XConnection.java<br/><ref>Committer's log entry: </ref>Project Update
- Submitted by: John Gentilin mailto://johng@apache.org<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Project Update
- Submitted by: John gentilin mailto://johng@apache.org<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Fixup from previous check-in, defined new
- functions.
- Submitted by: John Gentilin mailto://johng@apache.org<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Project Update<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>reduced Attribute's for testing<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>07/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/sax2dtm SAX2DTM.java<br/><ref>Committer's log entry: </ref>Minor hack to catch an attribute value being null.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemNumber.java
- java/src/org/apache/xalan/transformer Counter.java
- CountersTable.java KeyRefIterator.java
- java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java
- java/src/org/apache/xpath NodeSetDTM.java
- java/src/org/apache/xpath/axes LocPathIterator.java
- UnionPathIterator.java WalkingIteratorSorted.java
- java/src/org/apache/xpath/objects XNodeSet.java
- XRTreeFrag.java<br/><ref>Committer's log entry: </ref>Add new parameter to NodeSetDTM constructor. We need to have a DTMManager on 
-hand. Change code to use the new constructors.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>07/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref/dom2dtm DOM2DTM.java<br/><ref>Committer's log entry: </ref>OOps! Back out this last change. Old code on my machine!!!<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>07/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql SQLDocument.java<br/><ref>Committer's log entry: </ref>Fixed a few bugs, almost there
- Submitted by: John Gentilin mailto://johng@apache.org<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref CoroutineManager.java
- CoroutineSAXParser.java
- CoroutineSAXParser_Xerces.java<br/><ref>Added: </ref>java/src/org/apache/xml/dtm/ref IncrementalSAXSource.java
- IncrementalSAXSource_Filter.java
- IncrementalSAXSource_Xerces.java<br/><ref>Committer's log entry: </ref>Starting to phase out Coroutine*Parser* in favor of IncrementalSAXSource*.
- The latter simplifies the code, and should help us avoid some of the
- confusion that can arise in using the older tools.
-
- Most importantly, it greatly simplifies the calling sequences, by discarding
- the "which file do you want to parse" and "do you want to parse any more
- files" transactions. These now operate _only_ as filters, and only as single
- -use (though in fact the Xerces-specific version is reusable, and we may
- reintroduce that feature in the generic filtering version at a later date).
-
- Note too that we have swept the CoroutineManager completely
- under the covers of the filter's API. There's no particular reason to expose
- that implementation detal to the outside world.
-
- Still to be done: Rework the rest of Xalan to use the new code.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref CoroutineParser.java<br/><ref>Committer's log entry: </ref>Starting to phase out Coroutine*Parser* in favor of IncrementalSAXSource*.
- See comment in previous check-in; I just missed this one....<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/dtm/ref DTMStringPool.java<br/><ref>Committer's log entry: </ref>doc.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>2.2.D7<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>07/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>2.2.D7<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>07/18/2001<br/><ref>Removed: </ref>java/src/org/apache/xml/dtm/ref DTMBuilder.java<br/><ref>Committer's log entry: </ref>Obsolete<br/><br/></li></ul><note>This release includes no updates of the compatibility source code (now deprecated).</note>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D6">
-     <p><em>Important: Xerces has added a number of DOM level-3 methods to its DOM interfaces. The DOM level-3 proposal
-is currently a working draft (it is not yet a W3C recommendation), and Xalan does not support these new methods. 
-To run Xalan in the JDK 1.1.8 platform, you must put xalan.jar (with its DOM level-2 interfaces) in front of 
-xerces.jar on the system class path. If you want to rebuild Xalan (on JDK 1.1.8 or higher), you must put Xalan 
-in front of xerces.jar the system class path.</em></p>
-
-     <p>This beta release includes the following non-XSLTC code changes:</p>     
-     <ul>
-       <li>Costin Manolache has slightly modified the CoRoutine stuff so that a you can compile and run everything but the CoRoutineXercesParser without having Xerces on the classpath.<br/><br/></li>
-       <li>Joseph Kesselman added chunked int array stuff to address our scaling problems that Mukund &amp; co. uncovered.  This was a fairly mechanical, but still substantial, change.  No bugs have yet been discovered that relate to this.  This is probably the most controversial change.<br/><br/></li>       
-       <li>The Process class now outputs incrementally if the output is standard out.  This is mostly for testing purposes, but it makes general sense.<br/><br/></li>
-       <li>Bug was fixed with setting the incremental flag in TransformerFactoryImpl.  Clearly the change was made but never tested.  Simply a missing 'else'.<br/><br/></li>
-       <li>Fix for Bugzilla Bug 2275, Xalan did not fire the right templates.  This was substantial and somewhat risky.  Xalan had several problems related to the last() function.  Fixes cover four axes files.<br/><br/></li>                     
-       <li>Change PrintTraceListener to output the file, as well as the line numbers.  This is really a feature change, but simple, and aids diagnosing problems with multi-part stylesheets.<br/><br/></li>       
-       <li>XPath fix: the XPath API wasn't working correctly due to a problem with with NodeSet/NodeIterator adapters.  This fix ended up interacting quite a bit with the #2275 fix.<br/><br/></li>
-       <li>Fix for the Norm Walsh bug posted 06/20/2001: iterators weren't always being cloned correctly from the variable value stack.  This fix is not without some risk, though we haven't seen any problems since Scott Boag made it.<br/><br/></li>
-       <li>David Bertoni added missing html element properties to SerializerToHTML.java.<br/><br/></li>
-       <li>Shance Curcuru modified TransformerFactoryImpl.setAttribute() to accept a String ("true" or "false") as well as a Boolean object to set the value of a Boolean attribute.<br/><br/></li>
-       <li>TransformerHandlerImpl was threading when incrementality is turned off. Scott Boag has fixed this bug.</li>       
-     </ul>
-</s2>     
-   <anchor name="dtm"/>
-     <s2 title="Changes for &xslt4j; 2.2.D2">
-     <p>This release includes the following changes:</p>
-     <ul>
-       <li>Deprecation of the <link idref="usagepatterns" anchor="compat">Xalan-Java 1 compatiblity API</link></li>
-       <li>The DTM</li>
-       <li>Other optimization work</li>
-     </ul>
-     <p>The primary focus of the 2.2 Developer releases is incorporation of all our work over the past several months on the Document Table
-      Model (<link idref="dtm">DTM</link>).</p>
-
-<p>As a result of the changes in *internal* api, you may encounter problems with extensions. We have done some bug fixing in support
-for extensions since 2.2.D1.  John Gentilin is working on fixing the SQL library extension,which currently is broken. Please report 
-any problems you find (see <link anchor="bugs">bugs</link>).</p>
-
-<p>The DTM and related work provides faster performance and less accumulation of garbage... though it is an
-ongoing battle.  Brief summary:</p>
-<ul>
-<li>The DTM identifies nodes with 32-bit integer handles.
-The DTM has many features, including direct character dispatch to SAX2,
-native DTM iterators and "traversers", multiple document management, etc.<br/><br/></li>
-<li>Joe Kesselman's CoRoutine parsers, which are in a threaded SAX flavor
-and in a Xerces parseMore() flavor (no threads).  These do away with the
-"race" conditions that occured in the original code, and should make Xalan
-much more robust.<br/><br/></li>
-<li>*Much* more robust XPath itteration.  The "waiting" iterators of old are
-no more, and good riddance.  There is stil lots more we want to do with
-this mechanism.  (There is something here called MatchIterators, but it's
-not being used yet for various reasons.  We will be taking advantage of
-these down the line.)<br/><br/></li>
-<li>A fair amount of XObject creation reduction.  You can now get boolean,
-number, nodeset, and string values directly from an Expression, instead of
-going through an XObject.<br/><br/></li>
-<li>XMLString, which allows us to work with string objects that don't wrap
-Java's String object. These objects get their character data from an array or
-Fast String Buffer.<br/><br/></li>
-<li>Serializers now only do internal buffering if they know they are writing
-to a FileStream.<br/><br/></li>
-<li>The variable stack mechanism has been redisigned, so that it is no
-longer so interpretive, and we believe it is much more robust.<br/><br/></li>
-<li> Some small amount of stylesheet rewriting (but not yet redundent
-expression elimination), in particular to reduce full RTF creation and
-interpretation.</li>
-</ul>
-<p>&xslt4j; implements two DTM performance features that you can control with the TransformerFactory
-<jump href="apidocs/javax/xml/transform/TransformerFactory.html#setAttribute(java.lang.String, java.lang.Object)">setAttribute()</jump>
-method. See <link idref="dtm" anchor="settings">DTM performance settings</link></p>
-     </s2>
-     <s2 title="Changes for &xslt4j; 2.1.0">
-     <p>This release includes a number of bug fixes to &xslt4j; and TrAX. 
-     We have also enhanced the ApplyXSLT servlet. It can now be set up to use a compiled Templates object to respond to multiple
-     client transformation requests involving the same stylesheet.</p>
-<!--This XML fragment contains a list of source code updates to place in an <s2> section of readme.xml--><p>Core source code updates:</p><ul><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>03/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor StylesheetHandler.java
- java/src/org/apache/xpath Expression.java XPath.java
- XPathContext.java
- java/src/org/apache/xpath/compiler Compiler.java
- XPathParser.java<br/><ref>Committer's log entry: </ref>Renamed "assert()" to "assertion()".
-
- Assert can be a keyword, and brake the compilation.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer KeyWalker.java<br/><ref>Committer's log entry: </ref>Throw an error message if the key name in a key function was not defined<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>03/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>Reworked "chunk growth" algorithm again. Growing mode not
- yet adequately tested, but fixed-size mode (which is what Xalan
- is currently using) is simpler code and shows improved performance.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>03/20/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Committer's log entry: </ref>Utility class to check your JVM environment for common problems<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>03/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Committer's log entry: </ref>Added more .jar sizes to jarVersions listing<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>03/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>We've reworked the algorithm again. The fixed-chunk-size mode (initial
- and max. chunk sizes equal) runs essentially unchanged, though with a
- few cycles less overhead. The variable-chunk-size mode now uses a
- recursive-encapsulation scheme, where the first chunk may itself be a
- FastStringBuffer whose total length equals one chunk; every so often
- we push the existing data down one level and restart with a larger
- chunk size. The new scheme has been stress-tested and is apparently
- working. At this writing, however, Xalan uses only the fixed-size
- mode (initial size equals max size), and no effort has been made to
- find the optimial values for the tuning parameters. It does appear
- likely that the best values will vary with usage patterns, but we hope
- to find a good compromise.
-
- I'll probably be putting this aside for a while to work on other things.
- If someone wants to experiment with varying the block sizes and
- how frequently they grow, and suggest good performance/memory
- tradeoff points, go for it!<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>03/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>Minor tweak to the javadoc.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>03/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>reset() versus setLength(0).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemForEach.java<br/><ref>Committer's log entry: </ref>Fix for bug# 1116, getMatchedTemplate throws ClassCastException.
- Don't push template unless it is a xsl:template.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates OutputProperties.java<br/><ref>Committer's log entry: </ref>Patches submitted by Patrick Moore &lt;patrickm@rioport.com&gt;
- on 03/15/2001 01:25 PM:
-
- This proposed change does a number of things:
-
- 1. Problem: HTML output method does not uses XML output properties as
- default.
-
- In both org/apache/xalan/templates/output_html.properties and in the java
- doc for
- org/apache/xalan/templates/OutputProperties#getDefaultMethodProperties(Strin
- g) It specifically states that all OutputProperties use the
- output_xml.properties as a base. In the code this is not true for html. This
- is now changed to match the comments
-
- 2. Problem: unclear IOException.
-
- If there was a problem loading the XML properties file. The wrapped
- exception now will say which file was trying to be loaded. If the file did
- not exist I was getting a very strange "Stream closed" IOException message.
-
- 3. Problem: the streams were not closed after reading the property file.
-
- Fixed.
-
- 4. Problem: the double-check locking mechanism does not work in Java (see
- bug #919)
-
- &lt;http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-toolbox.html&gt;
-
- 5. QUESTION: now if there is a default properties (i.e.
- output_xml.properties has been loaded) but the expected properties file does
- not exist a error message will be printed to System.err and the processing
- will continuing using just the default properties (output_xml.properties) I
- felt that this is the best behavior.
-
- (comment by sboag: I think it's better to
- throw a runtime exception in this case.
- but we can discuss this over time. For now
- the patch was modified to do the runtime exception).<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLTSchema.java
- java/src/org/apache/xalan/stree SourceTreeHandler.java
- java/src/org/apache/xalan/templates ElemForEach.java
- ElemLiteralResult.java
- java/src/org/apache/xalan/transformer QueuedSAXEvent.java
- ResultTreeHandler.java TransformerImpl.java
- java/src/org/apache/xml/utils BoolStack.java
- java/src/org/apache/xpath XPathContext.java<br/><ref>Committer's log entry: </ref>This check-in contains a couple things that overlapped on my
- system, so I'm checking them in together.
- 1) Unfinished (in progress) implementation of TransformSnapshot mechanism,
- which will hopefully allow a result ContentHandler to take a snapshot
- at a given point, and the restart execution from that point at some
- later time. For tooling support.
- 2) Check to make sure SourceTreeHandler isn't being entered twice,
- which is related to the cocoon bug from a couple of weeks ago. This
- will just help diagnose such a problem in the future.
- 3) Removed the error stack trace print from postExceptionFromThread.
- 4) Report exception in SourceTreeHandler#endDocument after
- the join, if we can determine that the posted exception won't be
- caught elsewhere.
- 5) removed some catches that simply rethrew the exception
- (thanks to Patrick Moore &lt;patrickm@rioport.com&gt;).
- See my note on 3/27/2001 to Patrick for more info
- on the last two.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/27/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/transformer TransformSnapshot.java
- TransformSnapshotImpl.java<br/><ref>Committer's log entry: </ref>Unfinished (in progress) implementation of TransformSnapshot mechanism,
- which will hopefully allow a result ContentHandler to take a snapshot
- at a given point, and the restart execution from that point at some
- later time. For tooling support.on the last two.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- ProcessorStylesheetElement.java
- ProcessorTemplateElem.java StylesheetHandler.java
- XSLTElementDef.java XSLTElementProcessor.java
- XSLTSchema.java<br/><ref>Committer's log entry: </ref>Try to catch element order and required element errors during stylesheet 
-object creation. This new code adds an order and a required field to 
-XSLElementDef objects where it is applicable.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>04/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fix bugzilla bug 1170. If we're trying an xsl:apply-imports at the top level 
-(ie there are no
- imported stylesheets), we need to indicate that there is no matching template 
-and prevent and infinite recursion by using the built-in template.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>04/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions MethodResolver.java<br/><ref>Committer's log entry: </ref>Code cleanup submitted by Art Welch &lt;art_w@EASTPOINT.COM&gt;.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils TreeWalker.java<br/><ref>Committer's log entry: </ref>Add locator support to TreeWalker<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>04/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- QueuedStartElement.java<br/><ref>Committer's log entry: </ref>Small fix made for getCurrentNode.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>04/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils TreeWalker.java<br/><ref>Committer's log entry: </ref>Commented out extra call to getData()... this could be a big performance
- improvement for some stylesheets.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformSnapshotImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Additional support for tooling. Allow tools to take a snapshot of context and 
-restart execution at that point.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- XSLTElementProcessor.java
- java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/transformer
- TransformSnapshotImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Misc stuff left out from previous check in<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/functions FuncCurrent.java<br/><ref>Committer's log entry: </ref>Don't assume that the object returned by getSubContextList() is a 
-PredicatedNodeTest object.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor ProcessorInclude.java
- TransformerFactoryImpl.java
- java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java
- java/src/org/apache/xml/utils TreeWalker.java<br/><ref>Committer's log entry: </ref>Create new TreeWalker constructor that takes a systemId parameter. Change 
-TreeWalker to change fields in the locator and not set it for each node.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>04/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath XPath.java<br/><ref>Committer's log entry: </ref>Fix Bugzilla bug:
- PR: 1106
- Submitted by: elharo@metalab.unc.edu<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>04/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql QueryParameter.java
- SQLExtensionError.java XConnection.java<br/><ref>Committer's log entry: </ref>Minor Javadoc updates (add @author name, remove declared but unthrown @throws)<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>04/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql Column.java
- ColumnAttribute.java ColumnData.java
- ColumnHeader.java Row.java RowSet.java
- StreamableNode.java XConnection.java
- XStatement.java<br/><ref>Committer's log entry: </ref>Support for Streamable Mode- John Gentilin<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>04/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/objects XObject.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla bug 1015 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1015&gt;.
- Fix prevents null pointer exceptions when null non-XSLT arguments are
- passed to an extension function.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>04/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions MethodResolver.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla bug 1015 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1015&gt;.
- Fix prevents null pointer exceptions when null non-XSLT arguments are
- passed to an extension function.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Fix copy/paste error. Want to use TransformerFactoryImpl's class loader.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>04/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformSnapshotImpl.java<br/><ref>Committer's log entry: </ref>Keep a copy of current contextNodeList is there is one<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>04/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt EnvironmentCheck.java<br/><ref>Committer's log entry: </ref>Added checkDirForJars() which checks java.ext.dirs as well now<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>04/26/2001<br/><ref>Added: </ref>java/src/javax/xml/transform package.html
- java/src/javax/xml/transform/dom package.html
- java/src/javax/xml/transform/sax package.html
- java/src/javax/xml/transform/stream package.html<br/><ref>Committer's log entry: </ref>Add package.html for each package in javax.xml.transform.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>04/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Resolve bug 1496 &lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1496&gt; 
-where xsl:param statements were not being reset properly if the TransformerImpl 
-was reused.<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>04/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/stree DocImpl.java<br/><ref>Committer's log entry: </ref>Fix for #1561<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>04/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/functions FuncExtFunction.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla bug 1373 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1373&gt;.
- Added code to support return of Integer or Long by an external function.
- Code was contributed by Patrick Moore &lt;patmoore@ieee.org&gt;.<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>05/03/2001<br/><ref>Modified: </ref>java/src/javax/xml/transform/stream StreamResult.java
- StreamSource.java<br/><ref>Committer's log entry: </ref>Small fix to avoid file:////path that may fail on some JDK.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>05/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql package.html<br/><ref>Committer's log entry: </ref>Preliminary updates for John G's work.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>05/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Check for a null contextNodeList before returning its clone<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>05/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/stree StreeDOMBuilder.java<br/><ref>Committer's log entry: </ref>Set the element's level correctly, before we process attributes.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java<br/><ref>Committer's log entry: </ref>Resolve bugzilla 1648 
-(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1648).
- TransformerIdentityImpl was improperly using an old LexicalHandler when 
-invoked for a second transform.
- This bug only affects identity transforms with StreamResults.
- Many thanks to John Keyes &lt;johnkeyes@yahoo.com&gt; for reporting this bug.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>05/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>Updated version number to 2.1.0<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>05/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>Updated version number to 2.1.0<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/functions FuncExtFunction.java<br/><ref>Committer's log entry: </ref>Change submitted by Patrick Moore &lt;patmoore@ieee.org&gt; as part of bugzilla 
-1373 (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1373).
- Return value from extension function is now generalized so that all 
-derivatives of Number are now properly handled.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>05/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLTSchema.java<br/><ref>Committer's log entry: </ref>Set the correct order of xsl:include elements<br/><br/></li><li><ref>Committed by </ref>johng@apache.org<ref> on </ref>05/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql Column.java
- ColumnAttribute.java ColumnData.java
- ColumnHeader.java ConnectionPool.java
- DefaultConnectionPool.java ExtensionError.java
- PooledConnection.java QueryParameter.java Row.java
- RowSet.java SQLExtensionError.java
- StreamableNode.java XConnection.java
- XConnectionPoolManager.java XStatement.java
- package.html<br/><ref>Committer's log entry: </ref>Updates Javadocs
- Submitted by:John Gentilin mailto://johnglinux@eyecatching.com<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Correct typo introduced in revision 1.30 causing problems with transforms on 
-Unix platforms.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemChoose.java<br/><ref>Committer's log entry: </ref>Correct bugzilla bug 1748 
-&lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1748&gt;.
- When evaluating xsl:when, the xsl:choose element was used to resolve 
-namespace prefixes instead of
- the xsl:when element itself. This caused namespace prefixes defined on the 
-xsl:when to be ignored.<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>05/15/2001<br/><ref>Modified: </ref>java/src/javax/xml/parsers DocumentBuilderFactory.java
- SAXParserFactory.java
- java/src/javax/xml/transform TransformerFactory.java<br/><ref>Committer's log entry: </ref>Use the context class loader if available.
-
- The implementation is based on ExtensionHandler, and it's needed in order
- to work in certain environments ( like tomcat ).<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>05/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions ExtensionHandler.java
- ExtensionHandlerGeneral.java<br/><ref>Committer's log entry: </ref>Make getClassForName a public method. There are few other places in xalan
- where Class.forName is used, and this can create problems in some cases
- where the Thread.getContextClassLoader should be used.
-
- getClassForName uses introspection to call getContextClassLoader
- ( so it works in JDK1.1 ).
-
- In ExtensionHandlerGeneral, use the thread loader to find BSF ( it may be
- possible that xalan is installed in CLASSPATH, but BSF is in a webapp ).<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>05/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- CompilingStylesheetHandler.java
- java/src/org/apache/xalan/serialize SerializerFactory.java<br/><ref>Committer's log entry: </ref>2 more instances where Class.forName was used.
-
- Use the method in ExtensionHandler for consistency ( we could move it in
- org.apache.xml.utils, but for now it's easier to just use it as it is )<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>05/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/stree SourceTreeHandler.java
- java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>This is the "thread pooling hook".
-
- It slightly changes the API used to create and wait for the transform thread.
- Instead of using threadCreate() and Thread.start() that creates a new thread
- and thread.join() that waits for a thread to end, we now use a 
-ThreadControler
- class that has the equivalent methods:
- - run( Runnable ) - executes a task in a thread. The default implementation
- is identical with what we had, using new Thread() and start()
- - waitTread() - waits for a task to end. The default impl. is identical with
- the previous code, using thread.join().
-
- Someone wanting to use a thread pool for xalan will have to extend
- the ThreadControler and override the 2 methods, then call setThreadController.
-
- Xalan itself doesn't implement a thread pool right now ( for mosts uses it's
- not even needed - if you just do few transforms for example ), instead
- a server that runs xalan could plug it's own thread pool.<br/><br/></li><li><ref>Committed by </ref>Gary L Peskin &lt;garyp@firstech.com&gt;<ref> on </ref>05/15/2001<br/><ref>Committer's log entry: </ref>
-&gt; Use the context class loader if available.
-&gt;
-&gt; The implementation is based on ExtensionHandler, and it's needed in order
-&gt; to work in certain environments ( like tomcat ).
-&gt;
-&gt;<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>05/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ExtensionError.java<br/><ref>Committer's log entry: </ref>Fixed "conflict" in javadoc comments.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>05/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql package.html<br/><ref>Committer's log entry: </ref>Editing pass.<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>05/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc TransletOutputHandler.java<br/><ref>Committer's log entry: </ref>bug # 1406 fixed, omit xml header implemented<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>05/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Update Javadoc and remove commented out reference to properties file
- PR:Bugzilla1627<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>Resolve bug 1330 &lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1330&gt;.
- setContentHandler failed to also reset m_lexicalHandler if the ContentHandler
- was also a LexicalHandler. This caused the old LexicalHandler to be used 
-which
- was pointing to a previous result tree.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Resolve bug 1762 &lt;http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1762&gt;.
- TransformerFactoryImpl's URIResolver was not propagated to created 
-Transformers.
- Modified code to propagate.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>05/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils TreeWalker.java
- SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Catch SecurityException whenever accessing System.getProperty("user.dir");
- minor javadoc update<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>05/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemCopy.java
- ElemValueOf.java
- java/src/org/apache/xalan/transformer TreeWalker2Result.java
- java/src/org/apache/xpath/functions FuncLast.java<br/><ref>Committer's log entry: </ref>Fix for bugs reported by the Eclipse folks for TransformState, where
- some operations (xsl:value-of, xsl-copy) were not pushing the
- current node on the current node stack. Addresses
- http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1524.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>05/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates OutputProperties.java<br/><ref>Committer's log entry: </ref>Catch SecurityException as needed
- PR: Bugzilla1258<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates OutputProperties.java<br/><ref>Committer's log entry: </ref>Fix to the following bug reported by dims@yahoo.com:
-
- loadPropertiesFile method in org\apache\xalan\templates\OutputProperties.java 
-does not fall back
- to the Thread Context Class Loader to load properties files like 
-output_xml.properties etc. This
- is causing problems in ServletExec_3_1+C2.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates OutputProperties.java<br/><ref>Committer's log entry: </ref>Correct implementation of ContextClassLoader to support case where properties 
-file is to be loaded by a different ClassLoader than the OutputProperties 
-class. Thanks to Davanum Srinivas &lt;dims@yahoo.com&gt; for this code and for 
-reporting this bug.
- loadPropertiesFile should eventually be moved into a thread-specific class.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>05/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java
- java/src/org/apache/xalan/serialize CharInfo.java
- java/src/org/apache/xpath/functions FuncSystemProperty.java<br/><ref>Committer's log entry: </ref>Modify getResourceAsStream calls to use the contextClassLoader, if available.
- This is a temporary fix until we can centralize this function.<br/><br/></li></ul><note>This release includes no updates of the compatibility source code.</note>
- </s2>
- 
-<s2 title="Changes for &xslt4j; 2.0.1">
-<p>This release includes a number of bug fixes to the &xslt4j; and TrAX core and Xalan-Java 1 compability API. We have also</p>
-<ul>
-  <li>Entered all known &xslt4j; 2 <link anchor="bugs">bugs</link> in the Apache Bugzilla database<br/><br/></li>
-  <li>Added support for using custom URIResolver, EntityResolver, and ContentHandler implementations with the <link
-      idref="commandline">command-line utility</link><br/><br/></li> 
-  <li>Upgraded from Ant 1.2 to Ant 1.3 for our <link anchor="build">builds</link> (the new ant.jar is in the bin directory).</li>
-</ul>
-<p>Core source code updates:</p>
-<ul>
-<li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes ChildWalkerMultiStep.java<br/><ref>Committer's log entry: </ref>Fix for bug reported by "Chris P. McCabe" &lt;chris_mccabe@choicehotels.com&gt;
- 02/06/2001 06:55 PM.
- Defensive fix for if the last used walker is null, then don't check to
- see if it is a fast walker! Without this, a null pointer exception is
- very possible.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fixes for exceptions being thrown that weren't being passed through
- the error listener.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes FollowingWalker.java<br/><ref>Committer's log entry: </ref>Fix for bug reported by Dave Haffner &lt;dave.haffner@xmls.com&gt;
- 02/06/2001 04:03 AM
- In parentNode(), don't screen out nextAncestor, since the parent
- is never actually returned. This sets things up correctly for firstChild
- and nextSibling.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes PrecedingWalker.java<br/><ref>Committer's log entry: </ref>Fix for bug reported by Dave Haffner &lt;dave.haffner@xmls.com&gt;
- 02/06/2001 04:03 AM
- In nextSibling(), don't return null if isAncestorOfRootContext, instead
- do next.getFirstChild().<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath SourceTreeManager.java<br/><ref>Committer's log entry: </ref>Fix for bug reported by anders.domeij@uc.se
- 02/07/2001 09:35 AM
- removed extra bogus TransformerException decl in resolveURI<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/stree SourceTreeHandler.java<br/><ref>Committer's log entry: </ref>Fix bug reported by Jason Harrop &lt;jharrop@bigpond.net.au&gt;
- 02/07/2001 08:12 PM
- Don't process comment or whitespace events if inside a startDTD/endDTD
- event.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/axes WalkerFactory.java<br/><ref>Committer's log entry: </ref>In indirect response to bug posted by "Thee Boon Hoo" &lt;theebh@newstakes.com&gt;
- 02/07/2001 09:37 PM
-
- "//table[1]" patterns would give one node
- when they should have given 2, when applied to Boon Hoo's
- source.
- "//table[1]" is equivelent to
- "/descendant-or-self::node()/table[1]",
- and so must return the first table child
- of each table-inst element.
-
- An optimization was optimizing this to
- "/descendant-or-self::table, which is
- fine as long as indexing isn't used. Since
- we can not tell until runtime if indexing
- is being used, we have to turn of this
- optimization for all predicated "//foo[xx]"
- patterns.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor StylesheetPIHandler.java
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Patch for Dmitri IIyin to use the specified URIResolver.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemNumber.java<br/><ref>Committer's log entry: </ref>Number Expression should be evaluated then rounded up.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Create a document fragment for the output node, for -flavor d2d.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler Compiler.java<br/><ref>Committer's log entry: </ref>Better error message when quo is used.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemCallTemplate.java
- ElemChoose.java ElemCopy.java ElemFallback.java
- ElemIf.java ElemLiteralResult.java
- ElemTemplate.java
- java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Remove extra method/call to TransformerImpl.executeChildTemplates()<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/patterns NodeTest.java<br/><ref>Committer's log entry: </ref>Return an empty string instead of null from getLocalName() when the
- nodetest does not have a name. Encountered with the SQL extension,
- in response to bug reported by "Michael Kay" &lt;mhkay@iclway.co.uk&gt;,
- 02/08/2001 08:57 AM.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ColumnData.java<br/><ref>Committer's log entry: </ref>In getData() return an empty string instead of null if there is
- no data to be obtained.
- In response to bug reported by "Michael Kay" &lt;mhkay@iclway.co.uk&gt;,
- 02/08/2001 08:57 AM.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>02/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/extensions MethodResolver.java<br/><ref>Committer's log entry: </ref>Correct ConversionInfo array for Node-Set and RTF. Remove DocumentFragment 
-from RTF and replace with NodeList. Remove duplicate Boolean from both. Fix 
-Boolean conversion to make java.lang.Boolean higher than string.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ColumnHeader.java
- RowSet.java XStatement.java<br/><ref>Committer's log entry: </ref>Use null nodetest to mean the same as "node()". This fixes a bug reported
- by "Voytenko, Dimitry" &lt;DVoytenko@SECTORBASE.COM&gt;
- where &lt;xsl:copy-of select="sql:query(...)"/&gt;
- crashes with NullPointerException, i.e.
- there are cases where we really don't want
- to set the NodeTest.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/compiler XPathParser.java<br/><ref>Committer's log entry: </ref>Check for null token before checking if it is a letter<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java<br/><ref>Committer's log entry: </ref>Fix made for bug reported by "Glencross, Christian" 
-&lt;Christian.Glencross@gs.com&gt;
- on 02/16/2001 10:18 AM.
- Xerces 1.2.3 SAX parser calls
- handler.setDocumentLocator() before handler.startDocument().
- TransformerIdentityImpl.m_resultContentHandler isn't initialised until
- TransformerIdentityImpl.startDocument() is called.
- Added lazy construction of result handler
- in setDocumentLocator, in addition to
- startDocument.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>02/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Extensions.java<br/><ref>Committer's log entry: </ref>Correct implementation of string value of a node.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>02/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql Column.java
- ColumnAttribute.java ColumnData.java
- ColumnHeader.java Row.java RowSet.java
- StreamableNode.java XConnection.java
- XStatement.java package.html<br/><ref>Committer's log entry: </ref>Added experimental usage metatag to all classes in this package,
- and an explanatory note to package.html.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/stree ElementImpl.java<br/><ref>Committer's log entry: </ref>Bug fix attributed to Norman Walsh &lt;ndw@nwalsh.com&gt;, on
- 02/20/2001 09:50 AM. if the attribute 'name' doesn't occur in the AttList, 
-the
- result of getIndex(name) is -1, but
- getChildAttribute() would incorrectly
- return the first attribute. Fix returns
- null if index &lt; 0.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToXML.java
- java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java<br/><ref>Committer's log entry: </ref>Implement DeclHandler for identity transforms<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>02/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fix for bug originally reported by Daryl Beattie &lt;DarylB@screamingmedia.com&gt;
- on 02/14/2001 04:16 PM. A hang was occuring inside the use
- of a Result Tree Fragment. When the result tree fragement was
- being created, the Redirect extension was being called, which
- called createResultContentHandler which set the ContentHandler
- in the Transformer, but not in the ResultTreeHandler. Then, Redirect
- called Transformer#executeChildTemplates(
- ElemTemplateElement elem, Node sourceNode, QName mode, 
-ContentHandler handler)
- which saves the reference to the original content handler in
- the transformer, and then sets the new one by calling setContentHandler,
- which sets the ContentHandler in the ResultTreeHandler as well
- as the Transformer. When it tried to restore the old ContentHandler,
- it restored the value in the ResultTreeHandler to a Serializer, instead
- of the correct ContentHandler. When transformToRTF then called
- endDocument on it's resultTreeFragment, the event was sent
- to the Serializer instead of the SourceTreeHandler, and thus the
- isComplete flag was not set, and thus the hang. (whew!)
- The fix is in executeChildTemplates save the value of the
- resultTreeHandler's contentHandler as well as Transformer's
- content handler, and restore them both. A more architectual fix
- could be made, but not without high risk, so I think this is the best
- and safest way to fix it.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>02/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTInfo.properties<br/><ref>Committer's log entry: </ref>Changed version to 2.0.1<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>02/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor XSLProcessorVersion.java<br/><ref>Committer's log entry: </ref>Changed version to 2.0.1<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>02/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTErrorResources.java<br/><ref>Committer's log entry: </ref>Update text of error messages
- Submitted by: Andreas Zehnpfund<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>02/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Update printArgOptions() with better text and to better reflect actual
- options that are currently supported; catch missing -IN argument<br/><br/></li><li><ref>Committed by </ref>jkesselm@apache.org<ref> on </ref>03/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/client XSLTProcessorApplet.java
- java/src/org/apache/xalan/processor StylesheetHandler.java
- TransformerFactoryImpl.java
- java/src/org/apache/xalan/stree DocImpl.java
- StreeDOMBuilder.java TextImpl.java
- java/src/org/apache/xalan/templates OutputProperties.java
- java/src/org/apache/xalan/xslt Process.java
- java/src/org/apache/xml/utils FastStringBuffer.java
- java/src/trax trax.properties<br/><ref>Committer's log entry: </ref>New approach to FastStringBuffer, and changes needed to support it.
- We still need to do some serious work on both the initial values of the
- tuning parameters and the heuristics driving the "chunk growth" algorithms.
- Currently set for fixed-sized chunks of 8Kch in main tree, .5Kch in RTF.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemElement.java
- ElemForEach.java ElemLiteralResult.java
- java/src/org/apache/xalan/transformer
- ClonerToResultTree.java QueuedSAXEvent.java
- QueuedStartDocument.java QueuedStartElement.java
- ResultTreeHandler.java TransformerImpl.java
- TreeWalker2Result.java<br/><ref>Committer's log entry: </ref>Fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=741.
-
- 1) ResultTreeHandler now implements the TransformState interface.
- 2) Queued state such as the current node and the current template is stored 
-as part of QueuedStartElement. Storage will only occur if the ContentHandler 
-implements TransformClient.
- 3) When state is requested (for instance TransformState#getCurrentElement()), 
-if the queued element is null or not pending (for instance, in a characters 
-event), it will get the state from the transformer, otherwise it will get the 
-state from the queued element.
-
- Other fixes were attempted for this problem, including trying to
- get rid of queueing altogether, and flushing a bit earlier before
- the state was pushed on the various stacks, but both of
- these had show-stopping issues (see discussions
- on xalan-dev).
-
- Note that for the moment the ContextNodeList is node
- cloned as it needs to be in order for
- TransformState#getContextNodeList.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>03/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemParam.java
- java/src/org/apache/xpath Arg.java VariableStack.java<br/><ref>Committer's log entry: </ref>The field Arg.isParamVar was attempting to serve two functions: to indicate 
-variable Frame entries which are not currently activated and to indicate Frames 
-containing parameters passed with xsl:with-param. When processing was finished 
-for a node in a node-set, the isParamVar flag was turned on to indicate the 
-Frame slot was available. Unfortunately, this also indicated that the item was 
-passed as a parameter which it wasn't. This fix changes isParamVar into to 
-fields, isAvailable which indicates that the slot is available and 
-isFromWithParam indicating the Frame slot came from an xsl:with-param or a 
-top-level parameter passed in via the tranformerImpl.setParameter() API.
- I have tested this change against the conformance suite and had no 
-regression. I've also submitted a test case which fails on the existing 
-codebase but works okay after this fix.
- It is possible that I've missed something with regard to the API setParameter 
-calls but we can fix those if problems are reported.<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>03/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils FastStringBuffer.java<br/><ref>Committer's log entry: </ref>Correct operation when length of content to be appended is zero.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToXML.java<br/><ref>Committer's log entry: </ref>Fix closing out doctype declaration<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Change SystemIdResolver to default to user.dir if the base URI is null<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>03/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java
- java/src/org/apache/xpath VariableStack.java<br/><ref>Committer's log entry: </ref>Parameters set with setParameter were available to stylesheet as variable 
-references ($myParam) even though there was no xsl:param element to receive it.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer
- TransformerIdentityImpl.java<br/><ref>Committer's log entry: </ref>Check if there is a DeclHandler before calling it.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils WrappedRuntimeException.java<br/><ref>Committer's log entry: </ref>Patch attributed to Patrick Moore &lt;patrickm@rioport.com&gt; on 03/09/2001.
- Adds another constructor to pass in the error message.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemAttribute.java
- ElemElement.java<br/><ref>Committer's log entry: </ref>Checkin addresses http://nagoya.apache.org/bugzilla/show_bug.cgi?id=923.
- elemAttribute now derives from elemElement so the basic name resolution
- code can be shared. Breaks attribset24 test, but I think the newer
- behavior is better. New virtual methods overloaded by elemAttribute are
- constructNode, resolvePrefix, and validateNodeName. Also, in the
- elemAttribute#execute method, checks are made to make sure an
- element is pending.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils SystemIDResolver.java<br/><ref>Committer's log entry: </ref>Added getAbsoluteURI(String url), and merge
- with Myriam's changes.
- Part of fix for problem found when
- investigating http://nagoya.apache.org/bugzilla/show_bug.cgi?id=906.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Call getAbsoluteURI(String url) for the source URL.
- Fix for problem found when
- investigating http://nagoya.apache.org/bugzilla/show_bug.cgi?id=906.
- This tries to force us always having an absolute URL in the processing
- stack as the base URL, which should be OK, I hope.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer TransformerImpl.java<br/><ref>Committer's log entry: </ref>Call getAbsoluteURI(String url) for the source URL.
- Fix for problem found when
- investigating http://nagoya.apache.org/bugzilla/show_bug.cgi?id=906.
- This tries to force us always having an absolute URL in the processing
- stack as the base URL, which should be OK, I hope.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/transformer QueuedEvents.java
- QueuedStartElement.java ResultTreeHandler.java<br/><ref>Committer's log entry: </ref>The user for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=741 reported
- problems on testing, so these changes are a re-fix. He tested and
- everything seems OK now. There actually may be a slight performance
- improvement involved here.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize SerializerToHTML.java<br/><ref>Committer's log entry: </ref>Applied patches from dmitri.ilyin@memiq.com (Dmitri Ilyin)
- from http://nagoya.apache.org/bugzilla/show_bug.cgi?id=705.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath XPathAPI.java<br/><ref>Committer's log entry: </ref>Applied patch submitted by nboyd@atg.com (Norris Boyd)
- at http://nagoya.apache.org/bugzilla/show_bug.cgi?id=702.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/serialize Encodings.java<br/><ref>Committer's log entry: </ref>Applied patch submitted by havardw@underdusken.no (H嶡rd Wigtil).
- Also added "XXX-X" variants for all "XXX_X" java encoding names.
- I'm not totally confident that this is the right thing to do, but I can't
- see that it will hurt, except to make the table a bit larger. I
- would prefer to be safe and make sure we handle the encoding.
- See my comments in http://nagoya.apache.org/bugzilla/show_bug.cgi?id=718.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates ElemTemplateElement.java
- StylesheetRoot.java<br/><ref>Committer's log entry: </ref>Minor changes to better bottleneck throwing of Runtime exceptions
- during processing.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Catch all exceptions thrown when processing stylesheet, and send
- them to the error listener. There's probably some danger of having
- the same error sent to the error listener multiple times, but better too
- many reports, than none, I guess.
- This addresses http://nagoya.apache.org/bugzilla/show_bug.cgi?id=906.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql XConnection.java
- XStatement.java<br/><ref>Added: </ref>java/src/org/apache/xalan/lib/sql ConnectionPool.java
- DefaultConnectionPool.java ExtensionError.java
- PooledConnection.java QueryParameter.java
- SQLExtensionError.java XConnectionPoolManager.java<br/><ref>Committer's log entry: </ref>These are John Gentilin &lt;johnglinux@eyecatching.com&gt;
- patches for connection pooling and parameterized
- queries. These should be considered to be unstable
- right now, as we are still working on some things.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor ProcessorInclude.java
- TransformerFactoryImpl.java
- java/src/org/apache/xalan/serialize SerializerToXML.java
- java/src/org/apache/xalan/stree StreeDOMHelper.java
- java/src/org/apache/xalan/transformer ResultTreeHandler.java
- TransformerIdentityImpl.java TreeWalker2Result.java
- java/src/org/apache/xml/utils AttList.java TreeWalker.java
- java/src/org/apache/xpath DOM2Helper.java XPathContext.java<br/><ref>Committer's log entry: </ref>The DOM2Helper#isNodeAfter(Node node1, Node node2) method
- has been fixed so that it no longer does the try/catch thing if one
- of the nodes doesn't implement DOMOrder, but instead does an
- instanceof test. In StreeDOMHelper, it overloads this method and
- *does* do the try/catch business, since almost always both nodes
- will implement DOMOrder in this case, and this will be faster than
- an instanceof test. Also, in various classes, I did some stuff to try
- and make sure that a DOM2Helper wasn't being created and used
- when a StreeDOMHelper is needed.
-
- This addresses http://nagoya.apache.org/bugzilla/show_bug.cgi?id=800
- and should give a good performance fix for foreign DOM processing.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath/patterns NodeTest.java<br/><ref>Committer's log entry: </ref>Xerces at some point decided to use "" instead
- of null for null namespaces. There has been a
- discussion between Gary Peskin in
- Joe Kessleman on xalan-dev about this,
- but I hadn't been fully keeping up the the
- thread that well, and missed it's relation to
- this problem. I include some of the discussion
- at the end of this note. I made Xalan be able to
- compare a "" namespace to null for now, until
- we get this resolved.
-
- The gist of the discussion on xalan-dev regarding this is:
-
- &gt;&gt;1. Declare the Xerces-J support of schemas to have a bug and ask that
- &gt;&gt;Xerces be corrected to always use a null namespace URI to indicate that
- &gt;&gt;there is no default namespace. Even if the Xerces people change this
- &gt;&gt;behavior, is this correct?
- &gt;
- &gt; Yes. If your description of the problem is accurate (you should probably
- &gt; submit a more detailed case so it can be reproduced in the lab), this is a
- &gt; parser/DOM-builder bug.<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>03/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ExtensionError.java<br/><ref>Committer's log entry: </ref>Removed ( commented out ) dump() method and the imports in ExtensionError.
-
- So far the method doesn't seem to be used ( no warning in the compile ).
-
- The problem is that this method is breaking the build with crimson ( since
- it uses xerces-specific classes ). It is possible to implement it on top
- of the serialization classes that are part of xalan - if someone needs the
- method I'll try to port it.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils TreeWalker.java<br/><ref>Committer's log entry: </ref>Added back in the TreeWalker(ContentHandler contentHandler)
- constructor, because I'm worried I'll break more dependent code.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/res XSLTErrorResources.java
- java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Implement new arguments for the command line interface: URIResolver, 
-EntityResolver and ContentHandler<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/templates FuncFormatNumb.java<br/><ref>Committer's log entry: </ref>Fix error message to say that 2 or 3 arguments are required.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>03/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/processor ProcessorLRE.java
- java/src/org/apache/xalan/res XSLTErrorResources.java<br/><ref>Committer's log entry: </ref>Better error message for missing or incorrect XSLT namespace declaration in a 
-stylesheet<br/><br/></li><li><ref>Committed by </ref>garyp@apache.org<ref> on </ref>03/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib Redirect.java
- java/src/org/apache/xalan/transformer TransformerImpl.java
- java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Remember the Result that was used to trigger the transform. Access that 
-result from the Redirect extension to make file references in Redirect relative 
-to the original result URI.
- If this is not available, references are relative to the source URI.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xpath VariableStack.java<br/><ref>Committer's log entry: </ref>Added protection for null pointer exception that I discovered when
- running some Cocoon tests. Since I've never seen this before,
- I assume this is related to the changes that Gary made, but am
- unsure as it's 4:00 in the morning and I'm too tired to look into it deeply.<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>03/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>Remove check for missing -IN arg; there are a number of use
- cases for calling Process.main without an XML document<br/><br/></li><li><ref>Committed by </ref>costin@apache.org<ref> on </ref>03/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xslt Process.java<br/><ref>Committer's log entry: </ref>A (last ? ) place where XMLReaderFactory was used without
- trying jaxp first. I used the same code that is used in all other
- places in xalan.
-
- With this change, the parser defined in XSLTInfo.properties will be used
- only if jaxp is not available.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>03/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xml/utils StringVector.java<br/><ref>Committer's log entry: </ref>Added missing @serial Javadoc tags.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/lib/sql ConnectionPool.java
-                        DefaultConnectionPool.java ExtensionError.java
-                        SQLExtensionError.java XConnection.java
-                        XConnectionPoolManager.java XStatement.java<br/><ref>Committer's log entry: </ref>Update from John Gentilin &lt;johnglinux@eyecatching.com&gt; to
-  fix connection cleanup.<br/><br/></li></ul><p>Compatibility source code updates:</p><ul><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/02/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTInputSource.java
- XSLTResultTarget.java<br/><ref>Committer's log entry: </ref>Implement some more methods for compatibility<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>02/02/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTInputSource.java<br/><ref>Committer's log entry: </ref>Fixed javadoc for api that was just added back.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>02/02/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTResultTarget.java<br/><ref>Committer's log entry: </ref>Fixed javadoc for api that was just added back.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/02/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTEngineImpl.java<br/><ref>Committer's log entry: </ref>Fix problem with calling the processor with a liaison<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/02/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTEngineImpl.java<br/><ref>Committer's log entry: </ref>Fix problem where source file was being parsed more than once and if using an 
-input stream, we would get a read error<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/12/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTEngineImpl.java<br/><ref>Committer's log entry: </ref>Set system id in stylesheet handler<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/14/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTInputSource.java<br/><ref>Committer's log entry: </ref>Call local setSystemId.<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/15/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt XSLTEngineImpl.java<br/><ref>Committer's log entry: </ref>Fix problem with processing an input source created from a reader with no 
-systemId
- Fix problem with reading an input source file twice if it has a PI<br/><br/></li><li><ref>Committed by </ref>mmidy@apache.org<ref> on </ref>02/22/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xslt StylesheetRoot.java<br/><ref>Committer's log entry: </ref>Add getOutputMethod API.<br/><br/></li><li><ref>Committed by </ref>dleslie@apache.org<ref> on </ref>03/07/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xpath/xml
- XMLParserLiaisonDefault.java<br/><ref>Committer's log entry: </ref>Put in Apache copyright.<br/><br/></li><li><ref>Committed by </ref>sboag@apache.org<ref> on </ref>03/13/2001<br/><ref>Modified: </ref>java/compat_src/org/apache/xalan/xpath/xml TreeWalker.java
- java/compat_src/org/apache/xalan/xslt XSLTEngineImpl.java<br/><ref>Committer's log entry: </ref>Made changes for change to API for XalanJ2 TreeWalker, which
- now requires that the DOM helper be created by the caller.</li>
- </ul>
-</s2>
-
-<s2 title="Changes for &xslt4j; version 2.0.0">
-<p>Release 2.0 includes several bug fixes to the &xslt4j; and TrAX core and to the Xalan-Java 1 compatibility API. We also updated bsf.jar to the <resource-ref idref="bsf"/> release candidate 2.2, which fixes a bug running JPython extensions.</p>
-<p><em>Core bug fixes:</em></p>
-<ul>
-  <li>A threading problem showed up when using multiple processors. We fixed it by using a separate XPathContext object to do whitespace node
-   matches (xsl:strip-space).<br/><br/></li>
-  <li>Fixed a bug running Norm Walsh's DocBook stylesheets by not setting the variable stack position if the FilterExprWalker is not owned by a
-  top-level NodeIterator.<br/><br/></li>
-  <li>Fixed a problem with null namespace being passed from xsl:element. This bug also surfaced while processing DocBook
-   stylesheets.<br/><br/></li>
-  <li>In the interest of stability, we now treat "unknown error in XPath" as a fatal error.<br/><br/></li>
-  <li>Added support in stylesheet processing instructions for "text/xml" and "application/xml+xslt" mime types.<br/><br/></li>
-  <li>Fixed tokenizing of stylesheet processing instructions to allow parameters to be passed to server in href attributes.<br/><br/></li>
-  <li>Fixed a bug passing Transformer creation error messages to ErrorListener when an ErrorListener has been set on
-   TransformerFactory.<br/><br/></li>
-  <li>When using an Exception to instantiate a FactoryConfigurationError (extends Error), we now propagate the Exception message to 
-  super().<br/><br/></li>
-  <li>Added defensive code to ElemTemplateElement for handling a null URI.<br/><br/></li>
-  <li>When using an Exception to instantiate a TransformerException (extends Exception), we now propagate the Exception message to super() 
-  rather than a generic message.<br/><br/></li>
-  <li>Fixed a bug (the generation of an unwanted entity reference) performing the identity transformation 
-  (see <link idref="usagepatterns" anchor="serialize">Serializing output</link>) with an XML document containing a DOCTYPE
-   declaration.<br/><br/></li>
-   <li>Message manager modified so that the SourceLocator must always be passed in,
-  which will make a major difference in getting line number information.<br/><br/></li> 
-  <li>xsl:element's handling of namespace attribute and prefix in
-  name attribute changed so that it no longer manufactures prefixes...
-  it always tries its best to match the prefix entered.<br/><br/></li>  
-  <li>Bug fixed with namespace contexts in the stylesheet processor.
-  The bug could cause &lt;a xmlns:a="x"&gt;&lt;b&gt; to produce &lt;a xmlns:a="x"&gt;&lt;b xmlns:a="x"&gt;.<br/><br/></li>  
-  <li>Modified processing of xsl:message to enhance it as a debugging aid. Line numbers are now output with each
-  message. If the terminate attribute is true (the default is false) the message is sent to the console, and an exception is thrown with the
-  message "Stylesheet directed termination".<br/><br/></li>
-  <li>In TransformerException, check that the cause != null when checking for a contained exception.<br/><br/></li>
-  <li>Fixed a problem validating non-namespaced attributes and a problem allowing non-namespaced attributes to be children of the
-   stylesheet element.<br/><br/></li>
-   <li>Fixed checking of number of arguments in document() function.<br/><br/></li>
-   <li>Fixed problem with mutation of templates at run time. Templates resolution now takes place during the compose() method.<br/><br/></li>
-   <li>Fixed some minor threading issues in org.apache.xalan.stree (Child, Parent, ElementImpl, SourceTreeHandler).<br/><br/></li>
-   <li>Synchronized TrAX API functions subject to mutation to prevent mutation during a transformation.<br/><br/></li>
-   <li>Fixed bug reported by Jano Elovirta: substring() was returning an error if the start index is larger than the string.<br/><br/></li>   
-   <li>Set StringKey.toString() to return the underlying String (m_str), thus avoiding a potential symmetry problem with the equals() method
-   reported by Ito Kazumitsu.<br/><br/></li>
-   <li>In response to note from Ito Kazumitsu, changed Java encoding name "EUCJIS" in FormatterToXML to "EUC_JP".<br/><br/></li>
-   <li>When Xalan creates a FileOutputStream, it now closes the stream before exiting.<br/><br/></li>
-   <li>Fixed handling of an exception that can be thrown while building a DOM.<br/><br/></li>
-   <li>Fixed a problem reported by Dimitry Voytenko serializing compiled stylesheets.<br/><br/></li>
-   <li>For support of applets, modified TransformerFactory System.getProperty() calls to catch SecurityExceptions.<br/><br/></li>
-   <li>Fixed a bug reported by Krishna Mohan Meduri setting output properties.<br/><br/></li>
-   <li>Fixed error recovery when xsl:element encounters a bad name or unresolvable prefix.<br/><br/></li>
-   <li>Added AbstractMethodError handling to existing NoSuchMethodError handling as a fallback to the XMLReaderFactory for XML parsers that do
-       not implement the JAXP parsers interface for creating an XMLReader<br/><br/></li>
-   <li>Fixed bug with cloned iterators reported by Tim Sean.<br/><br/></li>
-   <li>Fixed null pointer exception that could occur with getValue("xxx").<br/><br/></li>
-   <li>Fixed bug reported by Tim Sean handling the xml:space attribute.</li>
-</ul>
-<p><em>Bug fixes in the <link idref="usagepatterns" anchor="compat">Xalan-Java 1 compatibility API</link>:</em></p>
-<ul>
-  <li>Fixed ProblemListener (for processing error messages) to derive from &xslt4j; 2 ErrorHandler.<br/><br/></li>
-  <li>Fixed evaluation of stylesheet string parameters to conform to &xslt4j; 1 behavior (expressions for &xslt4j; 1 vs. String objects 
-  for &xslt4j; 2).<br/><br/></li>    
-  <li>Added XPathSupport and XPathSupportDefault, and fixed the derivation of XObject sub-types (XString, etc.).<br/><br/></li>
-  <li>Fixed bug with XSLTProcessor process(xmlIn, null, out) method so that it uses the StylesheetRoot (if one exists) that has been created
-   with the processStylesheet() method.</li>
-</ul>
-<p>For a list of tasks in the &xslt4j2; To-Do list that have been completed, see <jump href="todo.html#release-date-completed">Tasks completed</jump>.</p>
-</s2>
-
-<s2 title="Changes for &xslt4j; version 2.0.D07">
-<p>&xslt4j; 2.0.D07 incorporates a <link idref="usagepatterns" anchor="compat">Xalan-Java 1 compatibility jar</link>, some performance enhancements, and a number of bug fixes for bugs found in version 2.0.D06.</p>
-<ul>
-<li>Fixed handling of disable-output-escaping="no".  Previously, once it was turned on, it could not be turned off.<br/><br/></li>
-<li>Fixed a bug with whitespace handling where Xalan was incorrectly checking for whitespace 
-    stripping before collation of multiple whitespace events into a single text node.<br/><br/></li>
-<li>Whitespace stripping wasn't working with input DOMs before.  This is now fixed.<br/><br/></li>
-<li>Fixed many exception handling problems and problems with error reporting.<br/><br/></li>
-<li>Fixed a bug resetting parameters in Transformer clearParameters().<br/><br/></li>
-<li>Fixed a bug where CDATA sections were not matching the text() node test.<br/><br/></li>
-<li>Made better memory allocation problem with result tree fragments.<br/><br/></li>
-<li>Made result tree fragment parsing of numbers consistent with strings.<br/><br/></li>
-<li>Exceptions thrown from extensions should now be properly reported via the error listener.<br/><br/></li>
-<li>Fixed hard-coded stack dump set off by m_reportInPostExceptionFromThread variable.<br/><br/></li>
-<li>Fixed intermittent threading problem with text nodes being dropped.<br/><br/></li>
-<li>Fixed problem with variable evaluation inside of union expressions.</li>
-</ul>
-</s2>
-<s2 title="Changes for &xslt4j; version 2.0.D06">
-<p>We have fixed the bugs reported in &xslt4j; 2.0.D05. Along with several other enhancements, 
-we have also fixed a number of bugs found by testing and our users:</p>
-<ul>
-<li>Fixed some threading problems and improved support for handling Exceptions thrown in a secondary thread.<br/><br/>
-Note: To support incremental output, &xslt4j; performs the transformation in a second thread while building the source tree in the main thread.<br/><br/></li>
-<li>Fixed problems encountered in piping (utilizing transformation output as input for another transformation).<br/><br/></li>
-<li>Fixed problems handling attributes and adding attributes to result tree.<br/><br/></li>
-<li>Added defensive checking for null entities, null namespaces, and empty strings passed in for URIs and local names.<br/><br/></li>
-<li>We now conform to the SAX convention of representing null namespaces with empty strings.<br/><br/></li>
-<li>Fixed a bug encountered evaluating a variable in a predicate expression applied to child nodes.<br/><br/></li>
-<li>Changed names of serializers from FormatterTo<ref>Xxx</ref> to SerializerTo<ref>Xxx</ref>. See 
-<jump href="apidocs/org/apache/xalan/serialize/package-summary.html">Package org.apache.xalan.serialize</jump>.<br/><br/></li>
-<li>Improved debugging support in a number of areas.</li>
-</ul>
-</s2>
-<s2 title="Changes for &xslt4j; version 2.0.D05">
-<p>All of the bugs reported in &xslt4j; 2.0.D01 have been fixed. The remainder of this section discusses two changes that we believe are of particular importance:</p>
-<p><em>TrAX</em></p>
-<p>The Transformation API for XML (TrAX) that &xslt4j2; implements has undergone substantial revisions since the release of &xslt4j; 2.0.D01. TrAX has joined the Java API for XML Parsing (JAXP) as part of the Sun&reg; <resource-ref idref="jsr063"/>. Accordingly, the TrAX package names have changed. The conceptual organization has also changed somewhat: The primary transformation interfaces are defined in javax.xml.transform, with concrete classes for managing stream input/output, SAX parsers and ContentHandler, and DOM parsers and DOM trees in javax.xml.transform.stream, javax.xml.transform.sax, and javax.xml.transform.dom. For more information, see <link idref="trax">TRaX (Transformation API for XML)</link>, and review <link idref="usagepatterns">Usage Patterns</link>.</p>
-<anchor name="outputprops"/><p><em>Output properties</em></p>
-<p>The handling of xsl:output properties has changed: org.apache.xalan.serialize.OutputFormat and apache.xalan.templates.OutputFormatExtended were removed and replaced with org.apache.xalan.templates.OutputProperties. The SerializerFactory getSerializer() method now takes Properties rather than a String indicating the output method. You can replace <code>getSerializer("xml")</code>, for example, with <code>getSerializer(OutputProperties.getDefaultMethodProperties("xml"))</code>.</p>
-<p>HTML, XML, and text xsl:output properties are specified in property files in org.apache.xalan.templates: output_html.properties, output_xml.properties, and output_text.properties.</p>
-<p>You can start using the output properties defined in these files in your stylesheets. For example, you can turn URL escaping off in HTML output with<br/><code>{http\u003a//xml.apache.org/xslt}use-url-escaping=no</code><br/>
-and you can control indenting with<br/>
-<code>{http\u003a//xml.apache.org/xslt}indent-amount=<ref>n</ref></code></p>
-<note>The colon after the "http" protocol must be escaped.</note>
-<p>Character-to-entity mapping is specified in org.apache.xalan.serialize: HTMLEntities.res and XMLEntities.res. You can override entity ref 
-mapping from a stylesheet. For example:</p>
-<source>&lt;?xml version="1.0"?&gt;
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-         xmlns:xalan="http://xml.apache.org/xslt" version="1.0"&gt;
-
-  &lt;xsl:output xalan:entities="myentities.ent"/&gt;
-
-  &lt;xsl:template match="/"&gt;
-    &lt;out&gt;&amp;#125;&lt;/out&gt;
-  &lt;/xsl:template&gt;
-
-&lt;/xsl:stylesheet&gt;</source>
-<p>=== myentities.ent ===</p>
-<source>quot 34
-amp 38
-lt 60
-gt 62
-lala 125</source>
-<p>The output is:</p>
-<source>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;out&gt;&amp;lala;&lt;/out&gt;</source>
-<p>See also <link idref="usagepatterns" anchor="outputprops">Setting output properties in your stylesheets</link>.</p>
-</s2>
-</s1>
diff --git a/xdocs/sources/xalan/index.xml b/xdocs/sources/xalan/index.xml
deleted file mode 100644
index 0c27330..0000000
--- a/xdocs/sources/xalan/index.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="&xslt4j-current;">
-<!--note>A later Developer release has been posted in the <resource-ref idref="xslt4j-distdir"/>. For the changes that have occurred since &xslt4j-current;, consult the xml-xalan-cvs@apache.org mailing list, or download the release and consult the release notes.</note-->
-  <s2 title="What is it?">
-    <p>Xalan is an XSLT processor for transforming XML documents into HTML, text, or other XML document types. It implements the
-     W3C Recommendations for XSL Transformations (XSLT) and the XML Path Language (XPath). It can be used from the command line,
-     in an applet or a servlet, or as a module in other program.</p>
-  </s2>
-  <s2 title="I've heard of &xslt4j;, but what is version 2?">
-    <p>&xslt4j; version 2 recasts Xalan as an implementation of the <link idref="trax">TRaX (Transformation API for XML)</link> interfaces, part of the <resource-ref idref="jaxp11"/>. TRaX provides a
-    modular framework and a standard API for performing XML transformations, and it utilizes system properties to determine which Transformer and which XML parser to use.</p>
-     <p>&xslt4j; version 2 also builds on <resource-ref idref="sax2"/>, <resource-ref idref="dom2"/>, and the XML parser API in
-     <resource-ref idref="jaxp"/>.</p>
-     <p>For more information, see <link idref="whatsnew">What's new in &xslt4j2;</link>.</p>
-     <note>&xslt4j; version 1 is no longer supported and no longer available from xml.apache.org.</note>
-  </s2>
-  <s2 title="How about this release?">
-  <p>&xslt4j-current; incorporates the <link idref="dtm">DTM (Document Table Model)</link> and has been tested with &xml4j; version 2. As of
-  this release, support for the &xslt4j; release 1 API, which predates the design of the <resource-ref idref="jaxp11"/>JAXP 1.1/<link idref="trax">TrAX
-  </link> interfaces, has been dropped.</p>
-  <p>Starting with 2.2.D12, we have reduced xalan.jar to just include the &xslt4j; implementation, placing the SAX, DOM, 
-  and JAVAX interfaces in xml-apis.jar. These interfaces are shared by a number of tools (&xslt4j;, &xml4j;, etc.), so placing them in a 
-  separate JAR simplifies coordination and reduces risk of duplication. <em>Be sure to put both JAR files on your classpath!</em></p>
-  </s2> 
-  <s2 title="How do I get it?">
-    <p>To get the binary distribution (all you need to use and develop applications with &xslt4j;), download and unzip either of the following:</p>
-    <ul>
-      <li><resource-ref idref="xslt4j-dist-bin-zip"/></li>
-      <li><resource-ref idref="xslt4j-dist-bin-targz"/></li>
-    </ul>
-    <p>To get the &xslt4j; sources (with which you can do your own &xslt4j; build; see <link idref="readme" anchor="build">Build notes</link>), download and unzip either of the following:</p>
-    <ul>
-      <li><resource-ref idref="xslt4j-dist-src-zip"/></li>
-      <li><resource-ref idref="xslt4j-dist-src-targz"/></li>
-    </ul>
-  </s2>
-  
-  <s2 title="Where do I get Xerces?">
-    <p>The Xalan download includes &xml4j-jar; from &xml4j-used;. This is all you need to run Xalan with the Xerces XML parser. 
-    You can, however, download the complete Xerces distribution from the <resource-ref idref="xml4j-distdir"/>. If you are interested in testing
-    or prototyping &xml4j2;, you can run &xslt4j-current; with &xml4j; 2.0.0.beta4.</p>
-    <note>If you plan to use a different XML parser, see <link idref="usagepatterns" anchor="plug">Plugging in a Transformer
-     and XML parser</link>.</note> 
-  </s2>
-  <s2 title="What else do I need?">
-    <p>You need the Java Development Kit or Java Runtime 1.1.8, 1.2.2, or 1.3, which you can obtain from <jump
-    href="http://www.ibm.com/java/jdk">ibm.com/java/jdk/</jump> or <jump href="http://www.java.sun.com">java.sun.com</jump>.</p> 
-  </s2>  
-    <s2 title="For more information...">
-    <p>For more information, go to <link idref="overview">Xalan Overview</link> and <link idref="getstarted">Getting
-    Started</link>. All of the Xalan documentation on this website is included in the Xalan download, as are a number of
-    <link idref="samples">Samples</link> to help you start using &xslt4j2; to transform XML documents.</p>
-  </s2>  
-</s1> 
\ No newline at end of file
diff --git a/xdocs/sources/xalan/overview.xml b/xdocs/sources/xalan/overview.xml
deleted file mode 100644
index c3dd7ec..0000000
--- a/xdocs/sources/xalan/overview.xml
+++ /dev/null
@@ -1,204 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- 
-<s1 title="&xslt4j; Overview">
-<ul>
-<li><link anchor="intro">Introduction</link></li>
-<li><link anchor="features">&xslt4j; Features</link></li>
-<li><link anchor="towork">Getting to work with &xslt4j;</link></li>
-<li><link anchor="uptospeed">Getting up to speed with XSLT</link></li>
-<li><link anchor="glossary">Glossary</link></li>
-</ul><anchor name="intro"/>
-  <s2 title="Introduction">
-    <p>&xslt4j; (named after a rare musical instrument) fully implements the <resource-ref idref="xslt"/> and the 
-    <resource-ref idref="xpath"/>. XSLT is the first part of the XSL stylesheet language for XML. It includes the XSL
-     Transformation vocabulary and XPath, a language for addressing parts of XML documents. For links to background materials, 
-    discussion groups, frequently asked questions, and tutorials on XSLT, see <link anchor="uptospeed">Getting up
-    to speed with XSLT</link>.</p> 
-    <note>XSL also includes a vocabulary for formatting documents, which is not part of &xslt4j;. 
-    For more information, see <resource-ref idref="xslt"/> and the <jump
-    href="http://xml.apache.org/fop">Apache XML FOP (Formatting Objects Project)</jump>.</note>
-    <p>You use the XSLT language to compose XSL stylesheets. An XSL stylesheet contains instructions for
-     transforming XML documents from one document type into another document type (XML, HTML, or other). In structural
-     terms, an XSL stylesheet specifies the transformation of one tree of nodes (the XML input) into another tree of nodes 
-     (the output or transformation result).</p>
-    <note>The XSL stylesheet may generate and refer to cascading style sheets (<jump
-    href="http://www.w3.org/Style/CSS/">CSS</jump>) as part of its output.</note> 
-    <p>In the following example, the foo.xsl stylesheet is used to transform foo.xml into foo.out:</p>
-    <p>foo.xml:</p>
-        <source>&lt;?xml version="1.0"?>
-&lt;doc>Hello&lt;/doc></source>
-        <p>foo.xsl:</p>
-        <source>&lt;?xml version="1.0"?> 
-&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-&lt;xsl:template match="doc">
-&lt;out>&lt;xsl:value-of select="."/>&lt;/out>
-&lt;/xsl:template>
-&lt;/xsl:stylesheet></source>
-<p>foo.out:</p>
-<source>&lt;out>Hello&lt;/out></source>
-<p>By default, &xslt4j; uses &xml4j;, and it may be configured with system properties to work with other XML parsers (see <link idref="usagepatterns" anchor="plug">Plugging in a Transformer and XML parser</link>). The input may be submitted in the form of a stream of XML markup (from a URI, a character or byte stream, or another transformation), a SAX InputStream, or a DOM Node.</p>
-<p>&xslt4j; performs the transformations specified in the XSL stylesheet and packages a sequence of SAX events that may be serialized to an output stream or writer, used to build a DOM tree, or forwarded as input to another transformation.</p>
-      </s2><anchor name="features"/>
-   	  <s2 title="&xslt4j; Features">
-	    <ul> 
-		    <li>Implements the relevant W3C specifications: <resource-ref idref="xslt"/> and <resource-ref idref="xpath"/>.<br/><br/></li>
-        <li>Implements <link idref="trax">TRaX (Transformation API for XML)</link>, now part of <resource-ref idref="jaxp"/>, and builds on
-         <resource-ref idref="sax2"/> and <resource-ref idref="dom2"/>.<br/><br/></li>
-    	  <li>May be configured to work with any XML parser, such
-        <jump href="http://xml.apache.org/xerces-j/index.html">&xml4j;</jump>, that implements <resource-ref
-        idref="jaxp"/> (see <link idref="usagepatterns" anchor="plug">Plugging in an XML
-         parser</link>).<br/><br/></li>
-    	  <li>Can process Stream, SAX or DOM input, and output to a Stream, SAX or DOM.<br/><br/></li>
-        <li>Transformations may be chained (the output of one transformation may be the input for
-         another).<br/><br/></li>
-        <li>May be run from the <link idref="commandline">command line</link> for convenient file-to-file
-            transformations.<br/><br/></li>
-    	  <li>Includes an <link idref="usagepatterns" anchor="applet">applet wrapper</link>.<br/><br/></li>
-        <li>May be used in a <link idref="samples" anchor="servlet">servlet</link> to transform XML documents into
-        HTML and serve the results to clients.<br/><br/></li>
-        <li>Supports the creation of <link idref="extensions">Java and scripting language extensions</link>. and
-         provides a growing library of extension elements and functions.</li>
-	    </ul> 
-	  </s2><anchor name="towork"/>
-    <s2 title="Getting to work with &xslt4j;">
-     <p>For instructions and some suggestions about how to get started using &xslt4j;, see 
-     <link idref="getstarted">Getting Started</link>.</p>
-    </s2><anchor name="uptospeed"/>
-    <s2 title="Getting up to speed with XSLT">
-    <p>If you are still working through the details of the XSLT spec (the W3C 1.0 Recommendation), you may want 
-    to consult one or more of the following:</p>
-    <ul>
-        <li>XSLT - XSL Transformations in 
-        <jump href="http://www.brics.dk/~amoeller/XML/">The XML Revolution: Technologies for the future Web</jump> by
-        Anders M&oslash;ller and Michael I. Schwartzbach (Web pages, but designed for sequential reading)</li>
-        <li>Crane Softwright's <jump href="http://www.CraneSoftwrights.com/training/">Free preview of Practical
-         Transformation Using XSLT and XPath</jump><br/><br/></li>
-       <li>Doug Tidwell's <jump href="http://www.oreilly.com/catalog/xslt/">XSLT</jump>, O'Reilly, 2001<br/><br/></li>                 
-       <li>Bob Ducharme's <jump href="http://www.manning.com/ducharme/index.html">XSLT Quickly</jump>, Manning Publications,
-        2001<br/><br/></li>                 
-       <li>John Robert Gardner and Zarella Rendon's 
-       <jump href="http://vig.prenhall.com/catalog/academic/product/1,4096,0130404462,00.html">XSLT and XPath: A Guide to
-        Transformations</jump>, Prentice-Hall, 2001<br/><br/></li>                 
-       <li>Michael Kay's <jump href="http://www.wrox.com/Books/Book_Details.asp?ISBN=1861005067">XSLT Programmer's
-       Reference</jump>, 2nd ed., Wrox Press, 2001<br/><br/></li>
-       <li>Steven Holzner's <jump href="http://www.newriders.com/books/title.cfm?isbn=0735711364">Inside XSLT</jump>, 
-       New Riders, 2001<br/><br/></li>                 
-       <li>Neil Bradley's <jump href="http://www.awlonline.com/product/0,2627,0201674874,00.html">XSL Companion</jump>,
-        Addison-Wesley, 2000<br/><br/></li>                 
-       <li>Khun Yee Fung's <jump href="http://www.awlonline.com/product/0,2627,0201711036,00.html">XSLT: Working with XML and
-        HTML</jump>, Addison-Wesley, 2001<br/><br/></li>                 
-        <li>Dave Pawson's <resource-ref idref="dpawsonxslfaq"/> to search out particular answers and techniques<br/><br/></li>
-         <li>Miloslav Nic's <jump href="http://zvon.vscht.cz/HTMLonly/XSLTutorial/Books/Book1/index.html">XSL Tutorial</jump>,
-         a collection of stylesheet examples<br/><br/></li>
-        <li>Elliotte Rusty Harold's <jump href="http://metalab.unc.edu/xml/books/bible/updates/14.html">Chapter 14 of 
-        the XML Bible: XSL Transformations</jump><br/><br/></li>
-        <li>The Mulberry <jump href="http://www.mulberrytech.com/xsl/xsl-list/">XSL-List -- Open Forum on XSL</jump> 
-        (of interest to XSL users at all levels)<br/><br/></li>
-        <li>Objects by Design's <jump href="http://www.objectsbydesign.com/projects/xmi_to_html.html">Transforming XMI to
-         HTML</jump> (oriented towards XMI, "an XML-based, stream representation of a UML model," but also covers "generic"
-         XML transformations) and their related <jump href="http://objectsbydesign.com/projects/xslt/xslt_by_example.html">XSLT
-         by Example</jump><br/><br/></li>         
-         <li>OASIS (the Organization for the Advancement of Structured Information Standards): 
-         <jump href="http://www.oasis-open.org/cover/xsl.html">Extensible Stylesheet Language (XSL)</jump> by Robin
-         Cover<br/><br/></li>
-         <li>Donald Ball's <jump href="http://www.webslingerZ.com/balld/xsl/designer_manual.xml">A Guide to XML and XSL for
-         Designers</jump><br/><br/></li>         
-    </ul>
-    <p>When you come across other useful introductory or background materials, please email <human-resource-ref
-     idref="xalandev"/>, so we can add them to this list.</p>
-    
-    </s2><anchor name="glossary"/>
-    <s2 title="Glossary">
-      <gloss>
-        <label>XSLT Namespace</label>
-        <item>The <jump href="http://www.w3.org/TR/REC-xml-names/">XML namespace</jump> for XSLT. An XML namespace is a 
-        collection of element and attribute names, identified by a Unique Resource Identifier (URI), which often takes the form of
-        a URL, but is really just a unique string, not a pointer to a web page. The XSLT namespace URI is
-        http://www.w3.org/1999/XSL/Transform. In each XSLT stylesheet, you must declare this namespace in the stylesheet element
-        tag and bind it to a local prefix. Like the XSLT specification, we always use xsl as the XSLT namespace prefix in our
-        descriptions and examples, although you are free to bind any prefix to this namespace.<br/><br/></item>
-        
-        <label>XSL Instruction</label>
-        <item>Any tag associated with the XSLT namespace.<br/><br/></item>
-        
-        <label>Template</label>
-        <item>An element, usually with child elements, that specifies a "rule" or set of 
-        instructions to perform when a particular kind of node is encountered in the source tree.<br/><br/></item>
-                
-        <label>XSL Template Instruction</label>
-        <item>Any tag that occurs inside an xsl:template element and is associated with the XSLT namespace.<br/><br/></item>
-                   
-        <label>Source Tree</label>
-        <item>The XML tree input to the XSL process.<br/><br/></item>
-        
-        <label>Result Tree</label>
-        <item>The tree that is output by the XSL process.<br/><br/></item>
-                
-        <label>Match Pattern</label>
-        <item>The part of a template that defines the kind(s) of nodes to which the template applies.<br/><br/></item>
-
-      </gloss>
-      <p>For more definitions of XSLT terminology, see Dave Pawson's 
-      <jump href="http://www.dpawson.co.uk/xsl/vocab.html">XSLT Terminology
-      Clarification</jump> and the Glossary in Michael Kay's 
-      <jump href="http://www.wrox.com/Consumer/Store/Details.asp?ISBN=1861003129">XSLT Programmer's Reference</jump>.</p>
-    </s2>
-</s1> 
diff --git a/xdocs/sources/xalan/readme.xml b/xdocs/sources/xalan/readme.xml
deleted file mode 100644
index 4cc0af8..0000000
--- a/xdocs/sources/xalan/readme.xml
+++ /dev/null
@@ -1,333 +0,0 @@
-<?xml version="1.0" standalone="no"?> 
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd"[
-<!ENTITY done-j SYSTEM "DONE">]>
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="Release Notes">
-<p>&xslt4j-current;</p>
-
- <ul>
-  <li><link anchor="status0">Status</link></li>&xsltcreleasenotesentry;
-  <li><link anchor="build">Build Notes</link></li>
-  <li><link anchor="contact">Getting in touch</link></li>
-  <li><link idref="history">History of software changes</link></li>
- </ul><anchor name="status0"/>
-  <s2 title="Status">
-   <ul>
-    <li><link anchor="done">Changes since version 2.2.D14</link></li>
-    <li><link anchor="other">Other points of interest</link></li>
-    <li><link anchor="bugs">Bugs</link></li>
-    <li><link anchor="status">Version of Xerces to use</link></li>
-    <li><link anchor="developer-list">Xalan developers</link></li>
-   </ul>
-     <anchor name="done"/>
-     <s3 title="Changes since &xslt4j; 2.2">
-     <p>This release does not include support for the deprecated &xslt4j; 1 compatability API.</p>
-     <p>This release is integrated with release 2 of &xml4j;.</p>
-     <note>The &xslt4j; 1 compatability code does NOT compile with &xml4j2;</note>
-     &done-j;
-     </s3>
-     <anchor name="other"/>
-     <s3 title="Other points of interest">
-     <ul>
-     <li>If an attempt is made to coerce a different namespace onto a prefix already in use in xsl:attribute, the attribute will come out 
-     in the wrong namespace. Workaround: either provide an NCName instead of a QName for the attribute, or provide a QName with a prefix not
-     used elsewhere.<br/><br/></li>
-     <li>Handling xsl:namespace-alias declarations: In release 2.0.D01, we reported the need to do some research concerning exactly how Xalan
-     should handle xsl:namespace-alias declarations. As a result of discussions among members of the W3C Working Group on XSL, we have reached a
-     more precise consensus on how namespaces should be represented when an xsl:namespace-alias declaration is in effect.<br/><br/>
-     If a literal result element has a namespace prefix, the prefix will be preserved and the namespace URI of the element will be as
-     specified in the xsl:namespace-alias element, but the result-prefix is not required to appear in the result. This also applies to the
-     two other cases of "Literal namespace URI" mentioned in the XSLT Recommendation on 
-     <jump href="http://www.w3.org/TR/xslt#literal-result-element">Literal Result Elements</jump>. More simply, if the stylesheet calls for
-     &lt;axsl:foo&gt; to be output as a literal result element, then it will be output as &lt;axsl:foo&gt; in the result, but the namespace
-     associated with this "axsl" prefix will be as designated in the xsl:namespace-alias declaration.<br/><br/></li>
-     <li>For HTML output, &xslt4j2; outputs character entity references (&amp;copy; etc.) for the special characters designated in  
-     <jump href="http://www.w3.org/TR/xhtml1/#dtds">Appendix A. DTDs of the XHTML 1.0: The Extensible HyperText Markup
-     Language</jump>. &xslt4j; 1.x, on the other hand, outputs literal characters for some of these special characters.<br/><br/></li>
-     <li>In conformance with the <jump href="http://www.w3.org/TR/xslt#section-HTML-Output-Method">XSLT Recommendation on the HTML 
-     Output Method</jump> and <jump href="http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.1">Section B.2.1 of the HTML 4.0
-     Recommendation</jump>, &xslt4j2; uses %hh encoding for each byte of the UTF-8 representation of non-ASCII characters in HTML URI
-     attributes.<br/><br/></li>
-     <li>When your stylesheet asks for an explicit carriage-return character (&amp;#13;) to be inserted into the output, it is output during
-     the serialization process in escaped form unless escaping has been disabled.  When your stylesheet asks for an explicit line-feed character
-     (&amp;#10;) to be output, the system-default line-break character(s) is/are output during the serialization process.  Also keep in mind that
-     the XML parser normalizes line-breaks to line-feeds when it sends character events to the processor.<br/><br/></li>
-     <li>If your XML input is a DOM, use the javax.xml.parsers.DocumentBuilderFactory setCoalescing() method to set coalescing to true (it is
-     false by default), if you want to append CDATA sections to adjacent text sections to form a single text node (as the XPath standard calls
-      for), and if the XML parser supports this feature (&xml4j-used; does not).<br/><br/></li>
-     <li>When you traverse the namespace axis for a collection of element nodes, &xslt4j; includes <em>one</em> namespace node for each namespace in scope 
-     for one or more of the nodes in that collection. The XPath expression does not return additional (redundant) namespace nodes for each element
-     for which the namespace nodes are in scope.<br/><br/></li>
-     <li>See <jump href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2291">Bugzilla bug 2291</jump> for a discussion of issues surrounding
-     use of the default character encoding to read META-INF/Services.<br/><br/></li>
-     <li>As <jump href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1800">Bugzilla bug 1800</jump> reports, the Transformer does not get the 
-     setTransformState event until after the startDocument event. This could present a problem for tools developers, and we do intend to fix this 
-     bug.</li> 
-     </ul>
-     </s3><anchor name="bugs"/>
-     <s3 title="Bugs">
-     <p>All known &xslt4j; bugs are listed in <resource-ref idref="bugzilla"/>. For a list of open bugs with links to each bug
-      report, see <resource-ref idref="buglist"/>. If you find a new bug, please enter a XalanJ2 bug report in this
-      database.</p>
-     <note>Before you can enter your first bug report, you must submit your email address to Bugzilla and receive a password.</note> 
-     <p>We strongly encourage you write patches for problems you find and submit them to
-      xalan-dev@xml.apache.org. We review the patches we receive to make sure they do not break something else, and (assuming they 
-     do not) include them in our next release. In the interest of fixing bugs, adding enhancements, and addressing outstanding design
-     issues, we sincerely want (and need!) your active participation in the ongoing development of Xalan.</p>
-     </s3>     
-     <anchor name="status"/>
-     <s3 title="Version of Xerces to use"> 
-       <p>The &xslt4j-current; has been tested with &xml4j-used;. &download; For information about including &xml4j-jar; on the system class path, see <link idref="getstarted" anchor="classpath">Setting up the system class path</link>.</p>
-       <note>You may also use &xslt4j-current; for prototyping or beta testing with &xml4j; 2.0.0.beta3. <em>You may not use the 
-       <link idref="usagepatterns" anchor="compat">&xslt4j; version 1 API (deprecated)</link> with &xml4j; 2.0.0.beta3.</em></note>
-       <p><em>Important</em> You may experience unpredictable anomalies if your Xalan and Xerces builds are not in synch. If you download an update to Xalan, check the release notes to determine which version of Xerces you should use.</p>
-       <note>You can use Xalan with other XML parsers that implement the <resource-ref idref="jaxp"/>. See 
-       <link idref="usagepatterns" anchor="plug">Plugging in the Transformer and XML parser</link>.</note>
-     </s3>
-     <anchor name="to-do"/>
-     <s3 title="To-do tasks">
-       <p>For a list of goals, tasks, and target dates for completion, see <jump href="todo.html">Xalan-Java Version 2: Things To Do</jump>. 
-       As tasks are completed, they are moved from the to-do list to 
-       <jump href="todo.html#release-date-completed">Completed</jump>.</p>
-       <p>The source document for the to-do list is an active document in the Apache CVS repository: 
-       <jump href="http://xml.apache.org/websrc/cvsweb.cgi/xml-xalan/java/todo.xml">xml-xalan/java/todo.xml</jump>.</p>
-      </s3> 
-  </s2>
-  <anchor name="build"/>  
-  <s2 title="Build Notes">
-  <p>We provide two distributions: a binary distribution, and a source distribution. See <link idref="getstarted" anchor="download">Downloading
-  what you need</link>. If you have downloaded the binary distribution, you already have a build. If you downloaded the source
-  distribution, you can use Ant to build &xslt4j;, including xalan.jar, xalansamples.jar, xalanservlet.jar, the
-  user documentation, and the Javadoc API documentation. You need the source distribution to do builds. Keep in mind that if you have also
-  downloaded the binary distribution, any builds you run will overwrite that binary distribution.</p>
-<ul>
-<li><link anchor="ant">Using Ant</link></li>
-<li><link anchor="jar">Building xalan.jar</link></li>
-<li><link anchor="samples">Building sample applications</link></li>
-<li><link anchor="doc">Building the &xslt4j; documentation</link></li>
-</ul>
-<anchor name="ant"/>
-   <s3 title="Using Ant">
-     <p>Apache <resource-ref idref="ant"/> is a flexible, powerful, and easy-to-use Java build tool that we include with the
-     &xslt4j; distribution. The Ant JAR file is in the bin directory, and the cross-platform XML build file (build.xml) is in 
-     the root directory along with a Windows32 batch file (build.bat) and a UNIX shell file (build.sh). The build file defines 
-     the "targets" that you can use Ant to build. The batch and shell files set up the classpath and launch Ant with the target 
-     (and any other arguments) you provide.</p>
-     <p><em>Instructions for using Ant</em></p>
-     <ol>
-       <li>Set the JAVA_HOME environment variable to the JDK root directory.<br/><br/>
-       If you are using JDK 1.1.8, you must also put classes.zip in the JDK bin directory on the classpath. You can use Ant 
-       with JDK 1.1.8 to compile and jar the &xslt4j; source files, but you must have JDK 1.2.2 or higher to build the
-       documentation.<br/><br/></li>
-       <li>Depending on your environment, run the batch file (build.bat) or shell file (build.sh) from the &xslt4j; root
-       directory, optionally with arguments (see the table of targets below).<br/><br/>
-       The batch/shell file adds several JAR files to the classpath and launches Ant with any arguments you provide. If you
-       provide no target, Ant compiles the source files and rebuilds xalan.jar (the "jar" target).</li>
-     </ol>
-     <p>You can also set up your classpath manually (see build.bat or build.sh for the details), and then run Ant as
-     follows:<br/><br/>
-     <code>java org.apache.tools.ant.Main <ref>target</ref></code><br/><br/>
-     where <ref>target</ref> is nothing (for the default target) or one of the following.</p>
-     <table>
-       <tr><td><em>Target</em></td><td><em>What Ant does</em></td></tr>
-       <tr><td>compile</td><td>compiles Xalan-Java in build/classes.</td></tr>
-       <tr><td>jar (the default)</td><td>creates xalan.jar in the build directory</td></tr>
-       <tr><td>samples</td><td>compiles and jars the sample apps in build/xalansamples.jar</td></tr>
-       <tr><td>servlet</td><td>compiles and jars the sample servlet in build/xalanservlet.jar</td></tr>       
-       <tr><td>docs</td><td>creates the HTML User's Guide in build/docs</td></tr>
-       <tr><td>javadocs</td><td>generates the API documentation in ./build/docs/apidocs</td></tr>
-       <tr><td>dist</td><td>generates a complete distribution tree with zip and tar.gz distribution files in build</td></tr>
-       <tr><td>clean</td><td>purges the build and distribution</td></tr> 
-  </table>
-  <p>If you build a target that depends on other targets, Ant creates those other targets in the correct order.</p>
-   </s3><anchor name="jar"/> 
-   <s3 title="Building &xslt4j;">
-     <p>The &xslt4j; build is in xalan.jar. The &xslt4j; source code tree is in the src directory.</p>
-     <p>If you are using Ant, the target is jar (the default). For more information, see <link anchor="ant">Using
-     Ant</link>.</p>
-     <p>If you want to do the build without Ant, keep the following in mind:</p>
-     <ul>
-     <li>Set the classpath to include the src directory, &xml4j-jar;, bsf.jar, and bsfengines.jar.</li>
-     <li>Use a Java compiler (such as the IBM Just-In-Time compiler or the Sun javac) to compile all the .java files in the src
-     tree. </li>
-     <li>Use the Sun jar utility to store the resulting .class files in xalan.jar</li>
-     </ul>
-   </s3><anchor name="samples"/>
-   <s3 title="Rebuilding a sample application">
-   <p>If you modify a sample and want to recompile it, you can run the Java compiler in the directory containing the
-   example. Be sure xalan.jar and &xml4j-jar; are on the classpath. To recompile (and run!) the class files in the
-   Servlet subdirectory, the javax.servlet and javax.servlet.http packages must also be on the classpath. Sun
-   distributes these packages in the JSWDK 1.0.1 servlet.jar file.</p> 
-   <p>After recompiling a sample, you can use the Sun jar utility to place your new .class files in
-    xalansamples.jar.</p>
-    <p>You can use Ant with the samples target to recompile the samples and place the unpackaged class files in xalansamples.jar.
-     For more information, see <link anchor="ant">Using Ant</link>.</p>
-    <note>To rebuild (and to run) the sample servlet, the javax.servlet and javax.servlet.http packages must be on your
-    classpath.</note>
-   </s3><anchor name="doc"/>
-   <s3 title="Rebuilding the &xslt4j; documentation">
-     <p>&xslt4j; includes a number of XML source files, XSL stylesheets, document type definition (DTD)
-      files, entity relationship (ENT) files, graphics, and a JavaScript file that provide the input for the Xalan
-      HTML User's Guide, and the overview and package-level documents used during the generation of Javadoc.</p>
-      <p>To rebuild the documentation, you must use the StyleBook tool and the JDK 1.2.2 java and javadoc
-      tools. StyleBook (which uses Xalan and Xerces) is in stylebook-1.0-b2.jar. Some of the document definition files,
-      stylesheets, and resources are stored in xml-site-style.tar.gz, and are unzipped when you run Ant as described
-       below.</p>
-      <p>You can use Ant with the docs target to regenerate the User's Guide and with the javadocs target to regenerate the
-      Javadoc API documentation. For more information, see <link anchor="ant">Using Ant</link>.</p>
-      <p>If you want to rebuild the documentation without using Ant, keep the following in mind:</p>
-       <ul>
-       <li>Unzip xml-site-style.tar.gz into the xdocs directory (the operation places files in a number of subdirectories).
-       <br/><br/></li>
-       <li>Be sure stylebook-1.0-b2.jar, xalanjdoc.jar, xalan.jar, bsf.jar, bsfengines.jar, and &xml4j-jar; are on the class
-       path.<br/><br/></li>
-       <li>To build doc in a build/docs subdirectory, run StyleBook from the xdocs directory as follows:<br/><br/>
-       <code>java org.apache.stylebook.StyleBook "targetDirectory=../build/docs/" sources/xalanLocal.xml style</code>
-       <br/><br/></li>
-       <li>To build the HTML source files that javadoc needs for the TrAX top-level and package-level documentation, add
-       a build/docs/apdidocs/javax/xml/transform directory and run the Xalan command-line utility from the xdocs directory 
-       as follows (all one line):<br/><br/>
-<code>
-java org.apache.xalan.xslt.Process 
-  -in sources/trax/trax.xml
-  -param package-root '../../../src/'
-  -xsl style/stylesheets/spec.xsl 
-  -out build/docs/apidocs/javax/xml/transform/trax.html</code><br/><br/></li>
-        <li>Before you run javadoc, make sure the following directory structure exists under the Xalan root
-         directory: build/docs/apidocs.<br/><br/></li>
-       <li>To build the API documentation, run the JDK 1.2.2 javadoc tool from the xdocs directory (all one line):<br/><br/>
-<code>
-javadoc -doclet xalanjdoc.Standard 
- -docletpath ../bin/xalanjdoc.jar 
- -private
- -overview ../src/javadocOverview.html -sourcepath ../src 
- -group TrAX "javax.xml.transform*" 
- -group Xalan_Core "org.apache.xalan.processor:
-        org.apache.xalan.templates:
- org.apache.xalan.transformer"
- -group XPath "org.apache.xpath*"
- -group Utilities "org.apache.xml.utils*"
- -group Xalan_Other "org.apache.xalan.client:
-        org.apache.xalan.dtm:
- org.apache.xalan.extensions:org.apache.xalan.res:
- org.apache.xalan.stree:org.apache.xalan.trace:
- org.apache.xalan.xslt" 
- -group Xalan_Extensions "org.apache.xalan.lib*" 
- -group Serializers "org.apache.xalan.serialize" 
- org.apache.xalan.client org.apache.xalan.dtm 
- org.apache.xalan.extensions org.apache.xalan.lib 
- org.apache.xalan.lib.sql org.apache.xalan.processor 
- org.apache.xalan.res org.apache.xalan.stree 
- org.apache.xalan.templates org.apache.xalan.trace 
- org.apache.xalan.transformer org.apache.xalan.xslt 
- org.apache.xpath org.apache.xpath.axes 
- org.apache.xpath.compiler org.apache.xpath.functions 
- org.apache.xpath.objects org.apache.xpath.operations 
- org.apache.xpath.patterns org.apache.xpath.res
- org.apache.xalan.serialize javax.xml.transform  
- javax.xml.transform.dom javax.xml.transform.sax 
- javax.xml.transform.stream javax.xml.parsers
- -d ../build/docs/apidocs -windowtitle "Xalan-Java 2" 
- -doctitle "Xalan-Java 2" -bottom "Copyright &#169; 
-  2000 Apache XML Project. All Rights Reserved."
-</code></li>
-</ul>
-  </s3>    
- </s2><anchor name="contact"/>
- <s2 title="Getting in Touch">
-  <p>Your feedback is more than welcome. Offers of help are even more so! Perhaps you would like to take on an active role in the ongoing development, testing, and documentation of &xslt4j;?</p> 
-<p>Please email your comments, questions, suggestions, and offers to join the Xalan team to <human-resource-ref idref="xalandev"/>.</p>
- </s2><anchor name="developer-list"/>
- <s2 title="Developers">
-<p>A list of some of people currently working on working on &xslt4j;:</p>
-  <!-- in alphabetical order, by last name -->
-  <ul>
-  <li><human-resource-ref idref="sboag"/>
-    <br/>Xalan architect, lead developer on Xalan-J 2.x.
-  </li>
-  <li><human-resource-ref idref="scurcuru"/>
-    <br/>Lead tester for API issues, automation framework.
-  </li>
-  <li><human-resource-ref idref="pdick"/>
-    <br/>XSLT Conformance stylesheet issues and Xalan-C testing.
-  </li>
-  <li><human-resource-ref idref="jkesselman"/>
-    <br/>Xalan-J 2.x developer, compiling/compiled stylesheets experiments.
-  </li>
-  <li><human-resource-ref idref="dleslie"/>
-    <br/>Xalan-J and -C documentation, servlets, applets, and samples.
-  </li>
-  <li><human-resource-ref idref="cmanolache"/>
-    <br/>Xalan-J 2.x developer and JAXP expert.
-  </li>
-  <li><human-resource-ref idref="dmarston"/>
-    <br/>Lead tester for XSLT Conformance stylesheet issues.
-  </li>
-  <li><human-resource-ref idref="mmidy"/>
-    <br/>Xalan-J 1.x and 2.x developer.
-  </li>
-  <li><human-resource-ref idref="gpeskin"/>
-    <br/>Xalan-J 1.x and 2.x developer, especially extension mechanisim.
-  </li>
-  <li><human-resource-ref idref="jgentilin"/>
-    <br/>Major work on the SQL extensions library.
-  </li>
- </ul>
- </s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/resources.xml b/xdocs/sources/xalan/resources.xml
deleted file mode 100644
index 27a9e37..0000000
--- a/xdocs/sources/xalan/resources.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="US-ASCII"?>
-<!DOCTYPE resources [
-  <!ENTITY % externalEntity SYSTEM "../entities.ent">
-  %externalEntity;
-  <!ELEMENT resources (resource|human-resource)+>
-  <!ELEMENT resource EMPTY>
-  <!ATTLIST resource 		
-        id CDATA #IMPLIED
-				title CDATA #IMPLIED
-				location CDATA #IMPLIED>
-  <!ELEMENT human-resource EMPTY>
-  <!ATTLIST human-resource 	
-        id CDATA #IMPLIED
-				name CDATA #IMPLIED
-				mailto CDATA #IMPLIED>
-   ]>  
-<resources> 	
-  <resource id="xslt4j-current" 
-            title="&xslt4j-current;" 
-            location="http://xml.apache.org/xalan"/>
-
-  <resource id="xslt4j-distdir" 
-            title="xalan-j distribution directory" 
-            location="&xslt4j-distdir;"/>
-
-  <resource id="xslt4j-dist-zip" 
-            title="&xslt4j-dist;.zip" 
-            location="&xslt4j-distdir;&xslt4j-dist;.zip"/>
-  <resource id="xslt4j-dist-targz" 
-            title="&xslt4j-dist;.tar.gz" 
-            location="&xslt4j-distdir;&xslt4j-dist;.tar.gz"/>
-
-  <resource id="xslt4j-dist-bin-zip" 
-            title="&xslt4j-dist-bin;.zip" 
-            location="&xslt4j-distdir;&xslt4j-dist-bin;.zip"/>
-  <resource id="xslt4j-dist-bin-targz" 
-            title="&xslt4j-dist-bin;.tar.gz" 
-            location="&xslt4j-distdir;&xslt4j-dist-bin;.tar.gz"/>
-  <resource id="xslt4j-dist-src-zip" 
-            title="&xslt4j-dist-src;.zip" 
-            location="&xslt4j-distdir;&xslt4j-dist-src;.zip"/>
-  <resource id="xslt4j-dist-src-targz" 
-            title="&xslt4j-dist-src;.tar.gz" 
-            location="&xslt4j-distdir;&xslt4j-dist-src;.tar.gz"/>
-
-  <resource id="xml4j-used" 
-            title="&xml4j-used;" 
-            location="http://xml.apache.org/xerces-j/index.html"/>
-  <resource id="xml4j-distdir" 
-            title="xerces-j distribution directory" 
-            location="http://xml.apache.org/dist/xerces-j/"/>
-  <resource id="ant" title="Ant" 
-            location="http://jakarta.apache.org/ant/index.html"/>
-  <resource id="ApacheLicense" 
-            title="The Apache Software License, Version 1.1" 
-            location="http://xml.apache.org/dist/LICENSE.txt"/>
-  <resource id="bugzilla"
-            title="Bugzilla (the Apache bug database)"
-            location="http://nagoya.apache.org/bugzilla"/>
-  <resource id="buglist"
-            title="XalanJ2 open bugs"         
-            location="http://nagoya.apache.org/bugzilla/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=&amp;emailtype1=substring&amp;emailassigned_to1=1&amp;email2=&amp;emailtype2=substring&amp;emailreporter2=1&amp;bugidtype=include&amp;bug_id=&amp;changedin=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;product=XalanJ2&amp;short_desc=&amp;short_desc_type=substring&amp;long_desc=&amp;long_desc_type=substring&amp;bug_file_loc=&amp;bug_file_loc_type=substring&amp;keywords=&amp;keywords_type=anywords&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=&amp;cmdtype=doit&amp;order=%27Importance%27"/>                   
-  <resource id="bsf"
-            title="Bean Scripting Framework (BSF)"
-            location="http://oss.software.ibm.com/developerworks/projects/bsf"/>     
-	
-  <resource id="Readme" 
-            title="Xalan Repository Release Notes" 
-            location="http://www.apache.org/websrc/cvsweb.cgi/xml-xalan/README"/>
-            
-  <resource id="dpawsonxslfaq" title="XSL Frequently Asked Questions" location="http://www.dpawson.co.uk/xsl/xslfaq.html"/>
-  
-  <resource id="xslt" 
-            title="W3C Recommendation XSL Transformations (XSLT) Version 1.0"
-            location="http://www.w3.org/TR/xslt"/>
-  
-  <resource id="xpath" 
-            title="XML Path Language (XPath) Version 1.0" 
-            location="http://www.w3.org/TR/xpath"/>            
-            
-  <resource id="dom" 
-            title="DOM" 
-            location="http://www.w3.org/DOM"/>
-  <resource id="dom2" 
-            title="DOM level 2" 
-            location="http://www.w3.org/TR/DOM-Level-2/"/>
-
-  <resource id="sax" 
-            title="SAX" 
-            location="http://www.megginson.com/SAX/sax.html"/>
-  <resource id="sax2" 
-            title="SAX 2" 
-            location="http://www.megginson.com/SAX/Java/index.html"/>
-  <resource id="jaxp" 
-            title="Java API for XML Parsing 1.0" 
-            location="http://java.sun.com/xml/docs/api/index.html"/>
-  <resource id="jaxp11" 
-            title="Java API for XML Processing 1.1 Public Review 2" 
-            location="http://java.sun.com/aboutJava/communityprocess/review/jsr063/jaxp-pd2.pdf"/>
-  <resource id="jsr063"
-            title="Java Specification Request 63"
-            location="http://java.sun.com/aboutJava/communityprocess/review/jsr063"/>
-            
-  <resource id="xmlapirepository"
-            title="xml-commons/java/external/src"
-            location="http://cvs.apache.org/viewcvs.cgi/xml-commons/java/external/src/"/>
-            
-           
-  <human-resource id="xalandev" 
-                  name="Xalan Development Mailing List" 
-                  mailto="xalan-dev@xml.apache.org"/>
-                  
-  <human-resource id="sboag"
-                  name="Scott Boag"
-                  mailto="scott_boag@us.ibm.com"/>
-  <human-resource id="scurcuru"
-                  name="Shane Curcuru"
-                  mailto="Shane_Curcuru@us.ibm.com"/>
-  <human-resource id="pdick"
-                  name="Paul Dick"
-                  mailto="Paul_Dick@us.ibm.com"/>
-  <human-resource id="jkesselman"
-                  name="Josepah Kesselman"
-                  mailto="keshlam@us.ibm.com"/>
-  <human-resource id="dleslie"
-                  name="Donald Leslie"
-                  mailto="donald_leslie@us.ibm.com"/>
-  <human-resource id="cmanolache"
-                  name="Costin Manolache"
-                  mailto="cmanolache@yahoo.com"/>
-  <human-resource id="dmarston"
-                  name="David Marston"
-                  mailto="David_Marston@us.ibm.com"/>
-  <human-resource id="mmidy"
-                  name="Myriam Midy"
-                  mailto="myriam_midy@us.ibm.com"/>
-  <human-resource id="gpeskin"
-                  name="Gary L Peskin"
-                  mailto="garyp@firstech.com"/>
-  <human-resource id="jgentilin"
-                  name="John Gentilin"
-                  mailto="johng@apache.org"/>
-                  
-</resources>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/samples.xml b/xdocs/sources/xalan/samples.xml
deleted file mode 100644
index d12a7f4..0000000
--- a/xdocs/sources/xalan/samples.xml
+++ /dev/null
@@ -1,498 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="&xslt4j2; Samples">
-<ul>
-<li><link anchor="simpletransform">SimpleTransform</link></li>
-<li><link anchor="usestylesheetpi">UseStylesheetPI</link></li>
-<li><link anchor="usestylesheetparam">UseStylesheetParam</link></li>
-<li><link anchor="sax2sax">SAX2SAX</link></li>
-<li><link anchor="dom2dom">DOM2DOM</link></li>
-<li><link anchor="pipe">Pipe</link></li>
-<li><link anchor="usexmlfilters">UseXMLFilters</link></li>
-<li><link anchor="applyxpath">ApplyXPath</link></li>
-<li><link anchor="appletxmltohtml">AppletXMLtoHTML</link></li>
-<li><link anchor="get-trax">get-trax</link></li>
-<li><link anchor="servlet">servlet</link></li>
-<li><link anchor="extensions">Extensions</link></li>
-<li><link anchor="trace">Trace</link></li>
-<li><link anchor="validate">Validate</link></li>
-<li><link anchor="trax">trax</link></li>&xsltcsampleshead;
-</ul>  
-	  <s2 title="Samples to help you get started">
-    <p>Each of the subdirectories in the &xslt4j; java/samples directory contains the source files for one or more
-     sample applications. The class files for the samples are in xalansamples.jar (everything except the servlet) and xalanservlet.jar, so to run the samples, you should place these JAR files on the system classpath.</p>
-     <p>With most of the samples, you can use the following procedure:</p>
-     <ol>
-     <li>Be sure xalan.jar, xalansamples.jar, and &xml4j-jar; are on the system class
-      path. For the extension examples, bsf.jar and (for the JavaScript extensions) js.jar must also be on the class
-      path.</li>
-     <li>Be sure the java executable is on your path.</li>
-     <li>Go to the samples subdirectory containing the sample (use the DOS shell if you are running Windows).</li>
-     <li>Run the sample from the command line (as indicated below).</li>
-    <li>Examine the application source files. You may also want to modify the source files. Remember that if you
-     modify a java file, you must recompile the class and place it on the classpath before you can run the
-     modified application.</li>
-     </ol>      
-    <p>The basic command line for running most of the samples is </p> 
-    <p><code>java <ref>classname args</ref></code></p>
-    <p>where <ref>classname</ref> is the sample class and <ref>args</ref> are the arguments, if any. As described in
-     the following sections, some samples take no arguments. The UseStylesheetParam sample takes an
-     additional argument. Several samples in extensions use the &xslt4j; 
-     <link idref="commandline">command-line utility</link>, so they take arguments for the XML source
-     file and the XSL stylesheet.</p>
-  	</s2><anchor name="simpletransform"/>
-    <s2 title="SimpleTransform">
-    <p>What it does: The SimpleTransform class uses the birds.xsl stylesheet to transform birds.xml, and prints the
-     output to birds.out.</p>
-    <p>You can run it from the SimpleTransform subdirectory with</p>
-    <p><code>java SimpleTransform</code></p>
-    </s2><anchor name="usestylesheetpi"/>
-    <s2 title="UseStylesheetPI">
-    <p>What it does: The UseStylesheetPI class uses the stylesheet processing instruction in the XML source document to determine
-     which stylesheet to use to perform the transformation.</p>
-     <p>You can run it from the UseStylesheetPI subdirectory with</p>
-     <p><code>java UseStylesheetPI</code></p>
-     <p>For more information, see <link idref="usagepatterns" anchor="embed">Working with embedded stylesheets</link>.</p>
-    </s2><anchor name="usestylesheetparam"/>
-    <s2 title="UseStylesheetParam">
-      <p>What it does: The UseStyleSheetParam class uses foo.xsl and a stylesheet parameter to transform foo.xml,
-       and prints the output to System.out. The stylesheet parameter appears as a text node in the output.</p>
-    <p>Run this sample from the UseStylesheetParam subdirectory with</p> 
-    <p><code>java UseStylesheetParam <ref>param</ref></code></p>
-    <p>where <ref>param</ref> is the stylesheet parameter value (a string of your choice).</p>  
-    </s2><anchor name="sax2sax"/>
-  <s2 title="SAX2SAX">
-  <p>What it does: Explicitly set the SAX XMLReader and SAX ContentHandler for processing the stylesheet (birds.xsl), processing the XML input (birds.xml), and producing the output (birds.out).</p>
-  <p>Run this sample from the SAX2SAX subdirectory with</p>
-   <p><code>java SAX2SAX</code></p>
-    </s2><anchor name="dom2dom"/>
-    <s2 title="DOM2DOM">
-    <p>What it does: the DOM2DOM class uses the birds.xsl stylesheet to transform a DOM Document generated from birds.xml,
-     produces an output DOM, and traverses the DOM, printing the traversal to System.out. In contrast to SimpleTransform,
-      DOM2DOM illustrates the procedure for processing an input DOM and creating an output DOM that is available for
-      further processing.</p>
-   <p>You can run it from the DOM2DOM subdirectory with</p>
-    <p><code>java DOM2DOM</code></p>
-    </s2><anchor name="pipe"/>
-    <s2 title="Pipe">
-    <p>What it does: Pipes the output from one transformation to a second transformation, then from the second
-    transformation to the third transformation. Transformer1 is the ContentHandler for the XMLReader (which parses the
-    input document). Transformer2 provides the ContentHandler for Transformer1, and Transformer3 for Transformer2.</p>
-    <note>Pipe and UseXMLFilters illustrate two strategies for using the output of one transformation as the input for
-    another transformation. The Pipe sample incorporates a "push" model -- Transformer1 "pushes" its output to
-    Transformer2, and so on -- whereas in the UseXMLFilters sample, Transformer3 "pulls" its input from Transformer2,
-    and so on.</note>
-    <p>Run this sample from the Pipe subdirectory with</p> 
-    <p><code>java Pipe</code></p>
-    </s2><anchor name="usexmlfilters"/>
-    <s2 title="UseXMLFilters">
-    <p>What it does: Chains together the same transformations as the preceding Pipe sample. Using each Transformer
-     object as an extension of the SAX XMLFilter interface, sets the XMLReader as the parent of filter1,
-     filter1 as the parent of filter2, and filter2 as the parent of of filter3.</p>
-     <p><img src="xmlfilters.gif" alt="xmlfilters.gif"/></p>
-      <p>Run this sample from the UseXMLFilters subdirectory with</p>
-   <p><code>java UseXMLFilters</code></p>
-    </s2><anchor name="applyxpath"/>
-    <s2 title="ApplyXPath">
-    <p>What it does: ApplyXPath uses the <jump href="apidocs/org/apache/xpath/XPathAPI.html">XPathAPI</jump> convenience methods to
-    execute an XPath expression against an XML document and return the nodes (if any) it finds.</p>
-     <note>You can use this sample as an aid when you want to find out what a given XPath expression returns from a
-     given XML file. Keep in mind that the context node (base point of evaluation) for the XPath expression is the document
-     root.</note>
-    <p>Run this sample from the ApplyXPath subdirectory with</p> 
-    <p><code>java ApplyXPath <ref>XMLFile XPathExpression</ref></code></p>
-    <p>where <ref>XMLFile</ref> is an XML source file and <ref>XPathExpression</ref> is an XPath expression to
-     apply to that file. The ApplyXPath subdirectory contains an XML file named foo.xml --<br/>
-     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>&lt;doc&gt;&lt;name first="David" last="Marston"/&gt;...&lt;/doc></code><br/> -- so you can try command
-     lines like</p>
-    <p><code>java ApplyXPath foo.xml /</code></p>
-    <p>and</p>
-    <p><code>java ApplyXPath foo.xml /doc/name/@first</code></p>
-    <p>For more information, see <link idref="usagepatterns" anchor="xpath">Working with XPath expressions</link>.</p>
-    </s2><anchor name="appletxmltohtml"/>
-    <s2 title="AppletXMLtoHTML">
-    <p>The applet uses a stylesheet to transform an XML document into HTML. It displays the XML document, the
-     stylesheet, and the HTML output.</p>
-    <p>How to run it: Open appletXMLtoHTML.hmtl in the Internet Explorer 5 browser.</p>
-    <note>For information about running &xslt4j; applets in Netscape Communicator, see <link idref="usagepatterns" anchor="netscape">Problems
-    with Netscape</link>.<br/><br/>
-    Both applets look for xalan.jar, xml-apis.jar, and xercesImpl.jar (Xerces-J2) or xerces.jar (Xerces-J 1) in the bin 
-    subdirectory. If you have placed these JAR files
-    elsewhere, adjust the applet archive setting in client.html and get-trax.html accordingly.</note>
-    </s2><anchor name="get-trax"/>
-    <s2 title="get-trax">
-    <p>This applet uses spec.xsl to transform trax.xml and display the result. The XML source (trax.xml) is part of a draft
-    for the TrAX (Transformation API for XML) specification written by Scott Boag. It contains a useful overview of what
-    was to become the JAXP 1.1 interface for performing XML transformations.</p>
-     <p>How to run it: Open get-trax.html in the Internet Explorer 5 browser.</p>
-    </s2><anchor name="servlet"/>
-    <s2 title="servlet">
-   <p>For a general introduction, see <link idref="usagepatterns" anchor="servlet">Using &xslt4j; in a servlet</link>.</p>
-    <p>The servlet subdirectory contains four sample servlets that use &xslt4j; to perform transformations. These servlets 
-    are in a package named servlet and are compiled in xalanservlet.jar. To run these samples, you must place 
-    xalanservlet.jar, and any XML and XSL files you want to use on a web server with a servlet engine, place 
-    xalanservlet.jar, xalan.jar, and &xml4j-jar; on the servlet engine class path, and configure the servlet engine to
-    locate the XML and XSL files, and the properties file used by ApplyXSL.</p>
-    <p><link anchor="simplexsltservlet">servlet.SimpleXSLTServlet</link> applies a particular stylesheet to a particular 
-    XML document.</p> 
-    <p><link anchor="usestylesheetparamservlet">servlet.UseStylesheetParamServlet</link> sets a stylesheet parameter 
-    (the parameter name is hardwired into the servlet), and requires the user to supply parameters for the 
-    XML document and XSL stylesheet.</p>
-    <p><link anchor="jspsample">jspSample.jsp</link> is a Java ServerPage that sets a stylesheet parameter and applies the
-     stylesheet to the XML document.</p>
-    <p><link anchor="xsltservletwithparams">servlet.XSLTServletWithParams</link> accepts parameters for the XML document, 
-    the XSL stylesheet, and any number of stylesheet parameters.</p>
-    <p><link anchor="applyxslt">servlet.ApplyXSLT</link> (and associated classes) is closer to a production level servlet. It accepts parameters, provides a 
-    listener for capturing and reporting debugger messages, and supports  use of a property file to determine which 
-    stylesheet to apply based on the identity of the client browser/device.</p>
-    <anchor name="simplexsltservlet"/>
-    <s3 title="servlet.SimpleXSLTServlet">
-    <p>What it does: servlet.SimpleXSLTServlet applies the spec.xsl stylesheet to trax.xml (see the <link anchor="get-trax">
-    get-trax applet</link>) and returns the transformation result to the HTTP client.</p>
-    <p>To run this servlet: place spec.xsl and trax.xml (from the samples/AppletXMLtoHTML directory) in the directory where your servlet engine
-    looks for HTTP documents, place xalanservlet.jar on the servlet engine classpath, and set up an HTML page to call the servlet as
-    follows:</p>
-<gloss><label>http://localhost/servlethome/servlet.SimpleXSLTServlet</label></gloss>
-     </s3><anchor name="usestylesheetparamservlet"/>
-     <s3 title="servlet.UseStylesheetParamServlet">
-     <note>Paul Campbell &lt;seapwc@halcyon.com&gt; wrote this servlet and the following explanatory text.
-     Thank you, Paul!</note>
-     <p>What it does: The client (perhaps an HTML form ) specifies an XML document, a stylesheet, and a value to be passed
-      to the stylesheet for a stylesheet parameter named "param1". The servlet performs the transformation and returns
-      the output to the client. The client must specify which stylesheet (containing a "param1" stylesheet parameter") 
-      and XML file are to be used.</p>
-     <p>How to run it: Configure your application server (Tomcat, Websphere or JServ, for example)
-     so it can find servlet.UseStylesheetParamServlet (in xalanservlet.jar) as well as the XML document 
-     and XSL stylesheet. For example, you can copy fooparam.xml and fooparam.xsl from samples/servlet to the application 
-     server root directory for documents.</p>
-     <p>Then you can set up an HTML client to call the servlet with arguments along the lines of</p>
-    <gloss><label>http://localhost/servlethome/servlet.UseStylesheetParamServlet?
-    XML=fooparam.xml&amp;XSL=fooparam.xsl&amp;PVAL=GoodBye</label></gloss>
-     <p>In the doGet() method, the servlet obtains the PVAL value "GoodBye") from the servlet request and passes it to the 
-     stylesheet as the paramValue argument in a Transformer setParameter() call:</p>
-      <p><code>String paramValue = httpServletRequest.getParameter("PVAL");</code><br/>
-      <code>...</code><br/>
-     <code>transformer.setParameter("param1", paramValue);</code></p>
- <p>The result is returned to the client:</p>
-<p><code>&lt;html&gt;&lt;body&gt;&lt;p&gt;GoodBye&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</code></p>
-     </s3><anchor name="jspsample"/>
-     <s3 title="jspSample.jsp">
-     <note>Paul Campbell &lt;seapwc@halcyon.com&gt; wrote this Java Server Page.</note>
-     <p>This Java Server Page performs essentially the same operation as 
-     <link anchor="usestylesheetparamservlet">servlet.UseStylesheetParamServlet</link>. It applies a stylesheet parameter 
-      to a stylesheet (fooparam.xsl), applies the stylesheet to an XML source document (fooparam.xml), and returns the
-      result.</p>     
-     </s3><anchor name="xsltservletwithparams"/>
-     <s3 title="servlet.XSLTServletWithParams">
-     <p>What it does: servlet.XSLTServletWithParams takes parameters in the request -- a URL parameter for
-     the XML input document URL and an xslURL parameter for the stylesheet URL.</p>
-     <p>To use XSLTServletWithParams to perform the same transformation as SimplestServlet: 
-     place spec.xsl and trax.xml in the directory where your servlet engine looks for HTTP documents, place
-     xalanservlet.jar on the servlet engine classpath, and set up an HTML page to call the servlet as follows:</p>
-<gloss><label>http://localhost/servlethome/servlet.XSLTServletWithParams?URL=file:trax.xml&amp;
-xslURL=file:spec.xsl</label></gloss>
-     <p>If the XML document contains an associated stylesheet (a stylesheet Processing Instruction) that you want to use, simply omit the
-     xslURL parameter.</p>
-     <p>If the stylesheet takes stylesheet parameters, you can include them in the URL. For example to set set the param1
-     stylesheet parameter to foo, include param1=foo in the URL.</p>
-     </s3><anchor name="applyxslt"/>
-     <s3 title="servlet.ApplyXSLT">
-    <p>What it does: The client (which you must set up) specifies an XML document and a stylesheet. The servlet
-     performs the transformation and returns the output to the client. You can use media.properties to specify 
-    which stylesheet is to be used depending on the client browser/device.</p>
-    <note>The source files for this servlet include ApplyXSLT.java, ApplyXSLTProperties.java, DefaultApplyXSLTProperties.java,
-    ApplyXSLTListener.java, and ApplyXSLTException.java.</note>
-    <p>To run the servlet: put xalanservlet.jar on the servlet engine classpath, configure your servlet engine so it can find the 
-     stylesheets and properties file in the servlet subdirectory (and in xalanservlet.jar), and set up an HTML page to call
-     servlet.ApplyXSLT with arguments as illustrated below.</p>
-     <p>Examples:</p>
-<gloss>
-<label>http://localhost/servlethome/servlet.ApplyXSLT?URL=/data.xml&amp;xslURL=
-/style.xsl</label>
-<item>...applies the style.xsl stylesheet to the data.xml data. Both files are<br/>
-served from the Web server's HTTP document root.<br/><br/></item>
-<label>http://localhost/servlethome/servlet.ApplyXSLT?URL=/data.xml&amp;xslURL=
-/style.xsl&amp;debug=true</label>
-<item>...ensures that XML and XSL processor messages are returned in the event of problems
-applying style.xsl to data.xml<br/><br/></item>
-<label>http://localhost/servlethome/servlet.ApplyXSLT/data.xml?xslURL=/style.xsl</label>
-<item>...applies the style.xsl stylesheet to the data.xml data, just like the first example.
-This is an alternative way of specifying the XML XSLTInputSource by utilizing the HTTP request's path
-information.<br/><br/></item>
-<label>http://localhost/servlethome/servlet.ApplyXSLT/data.xml</label>
-<item>...examines data.xml for an associated XSL stylesheet (a stylesheet Processing Instruction). If multiple XSLs are associated with the data, the stylesheet whose media attribute maps to your browser type will be chosen.  If no mapping is successful, the primary associated stylesheet is used.<br/><br/></item>
-<label>http://localhost/servlet/data.xml</label>
-<item>...provides the same function as the previous example, but this example assumes
-that /servlet/data.xml has been mapped to be executed by this servlet.  The servlet engine may be configured
-to map all or some *.xml files to this servlet through the use of servlet aliases or filters.<br/><br/></item>
-<label>http://localhost/servlet/data.xml?catalog=http://www.xml.org/dtds/oag.xml</label>
-<item>...supplements any servlet-configured XCatalog
-with a catalog of supply chain DTDs residing at the XML.ORG DTD repository.</item>
-</gloss>     
-   </s3>
-     </s2><anchor name="extensions"/>
-    <s2 title="Extensions">
-    <p>For an introduction to the creation and use of extension elements and extension functions, and
-    for information about the extensions library distributed with &xslt4j;, see
-    <link idref="extensions">Extensions</link>.</p>
-    <ul>
-      <li><link anchor="ext1">1-redir</link></li>
-      <li><link anchor="ext2">2-basicJscript</link></li>
-      <li><link anchor="ext3">3-java-namespace</link></li>
-      <li><link anchor="ext4">4-numlistJava</link></li>
-      <li><link anchor="ext5">5-numlistJScript</link></li>
-      <li><link anchor="sql">SQL library extensions</link></li>
-    </ul>
-    <p>The extensions subdirectory contains six samples with &xslt4j; extensions. Two of the samples use
-     extensions implemented in JavaScript, and four of the samples use extensions implemented in Java.</p>
-     <p>To run these examples, you must place bsf.jar (distributed with &xslt4j;), and js.jar
-      (version 1.5, available from 
-      <jump href="http://www.mozilla.org/rhino">http://www.mozilla.org/rhino</jump>) on the classpath. 
-     You do not need js.jar on the classpath for the samples that use Java extensions. </p>
-     <p>Use java.org.apache.xalan.xslt.Process, the &xslt4j; command-line utility, to run most of these samples from
-      the <link idref="commandline">command line</link>. The command line must include an -in flag with the 
-      XML source and an -xsl flag with the XSL stylesheet. If you want the output to be written to a file, rather
-      than to the screen, add an -out flag with the output file name.</p>
-      <p>Run these samples from the extensions directory as follows (each of the following is a single command
-       line):</p> 
-
-      <anchor name="ext1"/>
-      <s3 title="1-redir">
-      <p>What it does: Uses the Redirect extension elements shipped with &xslt4j; to direct output to two output
-        files.</p>
-      <p>Run this sample from the extensions subdirectory with</p> 
-       <p><code>java org.apache.xalan.xslt.Process -in 1-redir.xml</code><br/>
-       &nbsp;&nbsp;<code>-xsl 1-redir.xsl</code></p>
-      <p>The standard (non-redirected) output is written to the screen. The redirected output is written to 1-redir-out, or
-      whatever filename you assign to the doc/foo @file attribute in 1-redir.xml. The stylesheet gets the file name for
-      redirected output from the XML input file.</p>
-      </s3><anchor name="ext2"/>
-      <s3 title="2-basicJscript">
-      <p>What it does: Uses an extension element and extension function implemented in JavaScript to compute a
-      deadline for responding to a customer inquiry.</p>
-      <note>js.jar must be on the classpath.</note>
-      <p>Run this sample from the extensions subdirectory with</p>
-      <p><code>java org.apache.xalan.xslt.Process -in 2-basicJscript.xml</code>
-         <br/>&nbsp;&nbsp;<code>-xsl 2-basicJscript.xsl</code></p>     
-      </s3><anchor name="ext3"/>
-      <s3 title="3-java-namespace">
-      <p>What it does: Uses extension functions to format dates. This sample illustrates use of the predefined java
-        extension namespace to provide ready access to extensions implemented in Java.</p>
-      <p>Run this sample from the extensions subdirectory with</p> 
-      <p><code>java org.apache.xalan.xslt.Process -in 3-java-namespace.xml</code>
-         <br/>&nbsp;&nbsp;<code>-xsl 3-java-namespace.xsl</code></p>    
-      </s3><anchor name="ext4"/>
-      <s3 title="4-numlistJava">
-      <p>What it does: Uses a Java extension to transform a set of name elements into a numbered and alphabetized
-       list.</p>
-      <p>Run this sample from the extensions subdirectory with</p> 
-      <p><code>java org.apache.xalan.xslt.Process -in numlist.xml</code> 
-        <br/>&nbsp;&nbsp;<code>-xsl 4-numlistJava.xsl</code></p>    
-      </s3><anchor name="ext5"/>
-      <s3 title="5-numlistJscript">
-      <p>What it does: Uses a JavaScript  extension to transform a set of name elements into a numbered and
-      alphabetized list. This sample performs the same operations as the preceding Java extension.</p>
-      <note>js.jar must be on the classpath.</note>
-    <p>Run this sample from the extensions subdirectory with</p>
-      <p><code> java org.apache.xalan.xslt.Process -in numlist.xml</code>
-        <br/>&nbsp;&nbsp;<code>-xsl 5-numlistJscript.xsl</code></p>
-      </s3>
-      </s2><anchor name="sql"/>
-      <s2 title="SQL Library extensions">
-      <p>The SQL Library extension samples use <link idref="extensionslib" anchor="sql">SQL library XConnection
-      extension</link>to connect to an InstantDB datasource, perform queries, and return query result sets.</p>
-      <note>To run these samples, you must include idb.jar on the classpath. We have placed a copy of idb.jar from
-      InstantDB version 3.25 in samples/extensions/instantdb. For information about InstantDB, see
-      <jump href="http://instantdb.enhydra.org/software/documentation/index.html">InstantDB</jump>
-      and the <jump href="http://instantdb.enhydra.org/software/license/index.html">Enydra Public
-      License</jump>.</note>      
-      <ul>
-      <li><link anchor="ext6">6-sqllib-instantdb</link></li>
-      <li><link anchor="basic-conn">Basic Connections</link></li>      
-      <li><link anchor="ext-conn">ExternalConnection</link></li>      
-      <li><link anchor="pquery">Parameterized query</link></li>
-      <li><link anchor="streamable">Streamable</link></li>
-      <li><link anchor="showerror">Show-error</link></li>
-      </ul>
-      <note>Except for 6-sqllib-instantdb, all these samples have been created by John Gentilin 
-      (johnglinux@eyecatching.com) to take illustrate the rich feature set he has contributed to the SQL Library. 
-      To run each of these samples, be sure  you are in the appropriate extensions/sql subdirectory.</note>
-     <anchor name="ext6"/>
-      <s3 title="6-sqllib-instantdb">
-      <p>What it does: Uses the SQL library XConnection extension to connect to the InstantDB sample database, 
-      performs a query, and returns the query result in an HTML table.</p>
-      <p>Add idb.jar to the classpath, and run this sample from the extensions subdirectory:</p>
-      <p><code>java org.apache.xalan.xslt.Process</code>
-      <br/>&nbsp;&nbsp;<code>-xsl 6-sqllib-instantdb.xsl -out import1.html</code></p>
-      </s3><anchor name="basic-conn"/>
-      <s3 title="Basic-Connection">
-      <p><em>Contributed by John Gentilin (johnglinux@eyecatching.com).</em></p>
-      <p>What it does: illustrates two strategies for connecting to a database, executing a static query, and returning 
-      the query result.</p>
-      <p>The first strategy is to get connection information along with the static query from the stylesheet (dbtest.xsl)\
-      in the form of stylesheet parameters.</p>      
-      <p>The second strategy is to get connection information from a nodeset in an XML source document (dbInfo.xml).</p>
-      
-      <p>Add extensions/instantdb/idb.jar to the classpath, and run this sample from the extensions/sql/basic-connection 
-       directory.</p>
-       <p>1. To get connection information from the stylesheet:</p>
-      <p><code>java org.apache.xalan.xslt.Process</code>
-      <br/>&nbsp;&nbsp;<code>-xsl dbtest.xsl -out import1.html</code></p>
-      <p>2. To get connection information in the form of a nodeset from the XML source document:</p>      
-      <p><code>java org.apache.xalan.xslt.Process</code>
-      <br/>&nbsp;&nbsp;<code>-in dbinfo.xml -xsl dbtest-cinfo.xsl</code> 
-      <br/>&nbsp;&nbsp;<code>-out import1.html</code></p>
-      <p>3. To get connection information from the stylesheet and dump the raw result set to an XML file:</p>
-      <p><code>java org.apache.xalan.xslt.Process</code>
-      <br/>&nbsp;&nbsp;<code>-xsl DumpSQL.xsl -out import1.xml</code></p>
-    </s3> <anchor name="ext-conn"/>
-    <s3 title="ExternalConnection">
-    <p><em>Contributed by John Gentilin (johnglinux@eyecatching.com).</em></p>
-    <p>What it does: The ExternalConnection classes uses the default implementation of the ConnectionPool interface 
-    to create a pool of connections. A stylesheet in turn uses a connection from this pool to instantiate an 
-    XConnection object and connect to a datasouce.</p>
-    <p>The stylesheet uses this named connection pool to instantiate an XConnection object and connect to the datasource.</p>
-    <p>The ExternalConnection class is in xalansamples.jar. Be sure xalansamples.jar and idb.jar are on the classpath, and 
-    run this sample from the extensions/sql/ext-connection directory:</p>
-    <p><code>java ExternalConnection</code></p>
-    <p>ExternalConnection creates the ConnectionPool, and performs a transformation wiht dbtest.xsl, which draws 
-    from the pool to instantiate an XConnection object, connect to the datasource, execute a static query, and return the
-    query result.</p>
-    </s3><anchor name="pquery"/>
-    <s3 title="Parameterized query">
-    <p><em>Contributed by John Gentilin (johnglinux@eyecatching.com).</em></p>
-    <p>What it does: connect to a datasource, execute a parameterized query, and return the result. The XML source document
-    provides the parameter value as well as the connection information. The parameter value is in a node in the XML source.</p>
-    <p>The stylesheet gets the required connection and parameter information from the XML source, sets up and executes the
-    parameterized query, and retuns the query result set.</p>
-    <p>Be sure idb.jar is on the classpath, and run this sample from the sql/pquery subdirectory:</p>
-    <p><code>java org.apache.xalan.xslt.Process -in dbInfo.xml</code>
-    <br/><code>-xsl dbTest.xsl -out dbTest.html</code></p>    
-    </s3><anchor name="streamable"/>
-    <s3 title="Streamable">
-    <p><em>Contributed by John Gentilin (johnglinux@eyecatching.com).</em></p>    
-    <p>What it does: Illustrates enabling and disabling of caching the streamable result set returned by a query.</p>
-    <p>The stylesheets use the XConnection enableCacheNodes() and disableCacheNodes() methods.</p>
-    <p>Be sure idb.jar is on the classpath, and run these samples from the sql/streamable subdirectory.</p>
-    <p>1. To turn caching on:</p>
-    <p><code>java org.apache.xalan.xslt.Process</code>
-    <br/><code>-xsl cachedNodes.xsl</code></p>
-    <p>1. To turn caching off:</p>
-    <p><code>java org.apache.xalan.xslt.Process</code>
-    <br/><code>-xsl streamNodes.xsl</code></p>
-    <p>3. <ref>To be added</ref></p>
-    </s3><anchor name="showerror"/>
-    <s3 title="Show-error">
-    <p><em>Contributed by John Gentilin (johnglinux@eyecatching.com).</em></p>
-    <p>What it does: use the SQL library ExtensionError class to return an error message in the output stream. The stylesheet
-    calls a template with a select statement that returns a nodeset when an error occurs.</p>
-    <source>&lt;xsl:variable name="table" select='sql:query($db, $query)'/&gt;
-  &lt;xsl:apply-templates select="$table/row-set" /&gt;	
-  &lt;xsl:apply-templates select="$table/ext-error"/&gt;</source>
-  <p>With idb.jar on the classpath, run this sample from the extensions/sql/show-error subdirectory:</p>
-  <p><code>java org.apache.xalan.xslt.Process</code>
-  <br/><code> -xsl <ref>invalidSomething.xsl</ref> -out dbtestout.html</code></p>
-  <p>where <ref>invalidSomething.xsl</ref> is <code>invalidConn.xsl</code> (specifies a database that does not exist), 
-  <code>invalidQuery.xsl</code> (specifies a table that does not exist), or <code>invalidPQuery.xsl</code> (includes
-  too many parameters for the parameterized query).</p>
-    </s3>
-    </s2><anchor name="trace"/>
-    <s2 title="Trace">
-      <p>What it does: Trace uses the TraceListener and TraceManager classes to log transformation events.</p>
-      <p>Run this sample from the Trace subdirectory with</p>
-      <p><code>java Trace</code></p>
-      <p>and examine the result in events.log. For more information, see <link idref="usagepatterns" anchor="debugging">Debugger
-      Interface</link></p>
-     </s2><anchor name="validate"/>
-     <s2 title="Validate">
-     <ul>
-     <li><link anchor="validatexmlinput">ValidateXMLInput</link></li>
-     <li><link anchor="validateutility">Validate utility</link></li>
-     </ul><anchor name="validatexmlinput"/>
-     <s3 title="ValidateXMLInput">
-     <p>What it does: Uses <jump href="apidocs/javax/xml/parsers/SAXParserFactory.html">SAXParserFactory</jump> to turn on validation, and 
-     <jump href="apidocs/org/xml/sax/XMLReader.html">XMLReader</jump> to parse the XML input and report errors and warnings to a SAX event
-     handler. The XML input (birds.xml) contains an internal DOCTYPE declaration, and a few minor document type violations, which you are 
-     invited to fix, add to, and vary in any way you find useful.</p>
-     <p>Run this sample from the Validate subdirectory with</p>
-     <p><code>java ValidateXMLInput</code></p>
-     </s3><anchor name="validateutility"/>
-     <s3 title="Validate utility">
-     <p>What it does: Uses the <jump href="apidocs\javax\xml\parsers\SAXParser.html">JAXP SAXParser</jump> with a SAX event handler 
-     (extends <jump href="apidocs/org/xml/sax/helpers/DefaultHandler.html">DefaultHandler</jump> and implements 
-     <jump href="apidocs/org/xml/sax/ext/LexicalHandler.html">LexicalHandler</jump>) to verify that XML files conform to their declared 
-     document type. You can use this utility to verify that an individual file or all the .xml files in a directory are
-     well-formed and valid. Each .xml file should contain a DOCTYPE declaration.</p>
-     <p>Run this sample from any directory with</p>
-     <p><code>java Validate <ref>file-or-dir-name</ref> [<ref>logfile</ref></code>]</p>
-     <p>where <ref>file-or-dir-name</ref> is an XML file or directory pathname, and <ref>logfile</ref> designates a log.
-     If you omit the second argument, Validate reports its findings to the screen.</p>
-     <note>A limitation: Files containing document parts appear to fail if you check them with Validate. Check readme.xml, 
-     which "includes" by entity reference a number of files, and it passes. The parse operation scans the entire document
-     with the includes. Check an "included" file (such as history.xml) as if it were an independent document and it fails.</note>
-     </s3>
-     </s2>
-     <anchor name="trax"/>
-     <s2 title="trax">
-     <p>What it does: run a number of samples illustrating uses of the <link idref="trax">TRaX (Transformation API for XML)</link> interfaces.</p>
-     <p>Run this sample from the trax subdirectory with</p>
-     <p><code>java Examples</code></p>
-     <p>and examine the source in Examples.java and ExampleContentHandler.java.</p>
-     </s2>&xsltcsamples;
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/trax.xml b/xdocs/sources/xalan/trax.xml
deleted file mode 100644
index d688da5..0000000
--- a/xdocs/sources/xalan/trax.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="Transformation API For XML">
-<ul>
- <li><link anchor="intro">Introduction</link></li>
- <li><link anchor="terminology">General Terminology</link></li>
- <li><link anchor="requirements">Requirements</link></li>
- <li><link anchor="model">Model</link></li>
- <li><link anchor="patterns">Patterns</link></li> 
-</ul><anchor name="intro"/>
-<s2 title="Introduction">   
-<p>This document describes the transformation API for XML (TrAX), the set of APIs contained in
-	 <jump href="apidocs/javax/xml/transform/package-summary.html">javax.xml.transform</jump>, <jump href="apidocs/javax/xml/transform/stream/package-summary.html">javax.xml.transform.stream</jump>, <jump href="apidocs/javax/xml/transform/dom/package-summary.html">javax.xml.transform.dom</jump>, and <jump href="apidocs/javax/xml/transform/sax/package-summary.html">javax.xml.transform.sax</jump>.</p> 
-  
-<p>There is a broad need for Java applications to be able to transform XML
-	 and related tree-shaped data structures. In fact, XML is not normally very
-	 useful to an application without going through some sort of transformation,
-	 unless the semantic structure is used directly as data. Almost all XML-related
-	 applications need to perform transformations. Transformations may be described
-	 by Java code, Perl code, <jump href="http://www.w3.org/TR/xslt">XSLT</jump>
-	 Stylesheets, other types of script, or by proprietary formats. The inputs, one
-	 or multiple, to a transformation, may be a URL, XML stream, a DOM tree, SAX
-	 Events, or a proprietary format or data structure. The output types are the
-	 pretty much the same types as the inputs, but different inputs may need to be
-	 combined with different outputs.</p> 
-  
-<p>The great challenge of a transformation API is how to deal with all the
-	 possible combinations of inputs and outputs, without becoming specialized for
-	 any of the given types.</p> 
-  
-<p>The Java community will greatly benefit from a common API that will
-	 allow them to understand and apply a single model, write to consistent
-	 interfaces, and apply the transformations polymorphically. TrAX attempts to
-	 define a model that is clean and generic, yet fills general application
-	 requirements across a wide variety of uses. </p> 
-   
-</s2><anchor name="terminology"/>	 
-<s2 title="General Terminology"> 
-	 
-<p>This section will explain some general terminology used in this
-		document. Technical terminology will be explained in the Model section. In many
-		cases, the general terminology overlaps with the technical terminology.</p> 
-	 
-<gloss>
-<label>Tree</label>
-<item>This term, as used within this document, describes an
-			 abstract structure that consists of nodes or events that may be produced by
-			 XML. A Tree physically may be a DOM tree, a series of well balanced parse
-			 events (such as those coming from a SAX2 ContentHander), a series of requests
-			 (the result of which can describe a tree), or a stream of marked-up
-			 characters.</item>
-
-<label>Source Tree(s)</label>
-<item>One or more trees that are the inputs to the
-			 transformation.</item>
-
-<label>Result Tree(s)</label>
-<item>One or more trees that are the output of the
-			 transformation.</item>
-
-
-
-<label>Transformation</label>
-<item>The process of consuming a stream or tree to produce
-			 another stream or tree.</item>
-
-
-
-<label>Identity (or Copy) Transformation</label>
-<item>The process of transformation from a source to a result,
-			 making as few structural changes as possible and no informational changes. The
-			 term is somewhat loosely used, as the process is really a copy. from one
-			 "format" (such as a DOM tree, stream, or set of SAX events) to
-			 another.</item>
-
-
-
-<label>Serialization</label>
-<item>The process of taking a tree and turning it into a stream. In
-			 some sense, a serialization is a specialized transformation.</item>
-
-
-
-<label>Parsing</label>
-<item>The process of taking a stream and turning it into a tree. In
-			 some sense, parsing is a specialized transformation.</item>
-
-
-
-<label>Transformer</label>
-<item>A Transformer is the object that executes the transformation.
-			 </item>
-
-
-
-<label>Transformation instructions</label>
-<item>Describes the transformation. A form of code, script, or
-			 simply a declaration or series of declarations.</item>
-
-
-
-<label>Stylesheet</label>
-<item>The same as "transformation instructions," except it is
-			 likely to be used in conjunction with <jump href="http://www.w3.org/TR/xslt">XSLT</jump>.</item>
-
-
-
-<label>Templates</label>
-<item>Another form of "transformation instructions." In the TrAX
-			 interface, this term is used to describe processed or compiled transformation
-			 instructions. The Source flows through a Templates object to be formed into the
-			 Result.</item>
-
-
-
-<label>Processor</label>
-<item>A general term for the thing that may both process the
-			 transformation instructions, and perform the transformation.</item>
-
-       
-
-
-<label>DOM</label>
-<item>Document Object Model, specifically referring to the
-			 <jump href="http://www.w3.org/TR/DOM-Level-2%20">Document Object Model
-			 (DOM) Level 2 Specification</jump>.</item>
-
-
-<label>SAX</label>
-<item>Simple API for XML, specifically referring to the
-			 <jump href="http://www.megginson.com/SAX/SAX2">SAX 2.0
-			 release</jump>.</item>
-</gloss> 
-</s2> <anchor name="requirements"/>
-<s2 title="Requirements"> 
-  
-<p>The following requirements have been determined from broad experience
-	 with XML projects from the various members participating on the JCP.</p> 
-  
-<ul>
-<li>TrAX must provide a clean, simple
-		interface for simple uses.</li>
-<li>TrAX must be powerful enough to be
-		applied to a wide range of uses, such as, e-commerce, content management,
-		server content delivery, and client applications.</li>
-<li>A processor that implements a TrAX
-		interface must be optimizeable. Performance is a critical issue for most
-		transformation use cases.</li>
-<li>As a specialization of the above
-		requirement, a TrAX processor must be able to support a compiled model, so that
-		a single set of transformation instructions can be compiled, optimized, and
-		applied to a large set of input sources.</li>
-<li>TrAX must not be dependent an any
-		given type of transformation instructions. For instance, it must remain
-		independent of <jump href="http://www.w3.org/TR/xslt">XSLT</jump>.</li>
-<li>TrAX must be able to allow processors
-		to transform DOM trees.</li>
-<li>TrAX must be able to allow processors to
-		produce DOM trees.</li>
-<li>TrAX must allow processors to transform
-		SAX events.</li>
-<li>TrAX must allow processors to produce SAX
-		events.</li>
-<li>TrAX must allow processors to
-		transform streams of XML.</li>
-<li>TrAX must allow processors to produce
-		XML, HTML, and other types of streams.</li>
-<li>TrAX must allow processors to
-		implement the various combinations of inputs and outputs within a single
-		processor.</li>
-<li>TrAX must allow processors
-		to implement only a limited set of inputs. For instance, it should be possible
-		to write a processor that implements the TrAX interfaces and that only
-		processes DOM trees, not streams or SAX events.</li>
-<li>TrAX should allow a
-		processor to implement transformations of proprietary data structures. For
-		instance, it should be possible to implement a processor that provides TrAX
-		interfaces that performs transformation of JDOM trees.</li>
-<li>TrAX must allow the setting
-		of serialization properties, without constraint as to what the details of those
-		properties are.</li>
-<li>TrAX must allow the setting
-		of parameters to the transformation instructions.</li>
-<li>TrAX must support the
-		setting of parameters and properties as XML Namespaced items (i.e., qualified
-		names).</li>
-<li>TrAX must support URL
-		resolution from within the transformation, and have it return the needed data
-		structure.</li>
-<li>TrAX must have a mechanism for
-		reporting errors and warnings to the calling application.</li>
-</ul>  
-   
-</s2> <anchor name="model"/>
-<s2 title="Model"> 
-  
-<p>The section defines the abstract model for TrAX, apart from the details
-	 of the interfaces.</p> 
-  
-<p>A TRaX <link anchor="pattern-TransformerFactory">TransformerFactory</link> is an object
-	 that processes transformation instructions, and produces
-	 <link anchor="pattern-Templates">Templates</link> (in the technical
-	 terminology). A <link anchor="pattern-Templates">Templates</link>
-	 object provides a <link anchor="pattern-Transformer">Transformer</link>, which transforms one or
-	 more <link anchor="pattern-Source">Source</link>s into one or more
-	 <link anchor="pattern-Result">Result</link>s.</p> 
-  
-<p>To use the TRaX interface, you create a
-	 <link anchor="pattern-TransformerFactory">TransformerFactory</link>,
-	 which may directly provide a <link anchor="pattern-Transformer">Transformers</link>, or which can provide
-	 <link anchor="pattern-Templates">Templates</link> from a variety of
-	 <link anchor="pattern-Source">Source</link>s. The
-	 <link anchor="pattern-Templates">Templates</link> object is a processed
-	 or compiled representation of the transformation instructions, and provides a
-	 <link anchor="pattern-Transformer">Transformer</link>. The
-	 <link anchor="pattern-Transformer">Transformer</link> processes a
-	 <link anchor="pattern-Transformer">Source</link> according to the
-	 instructions found in the <link anchor="pattern-Templates">Templates</link>, and produces a
-	 <link anchor="pattern-Result">Result</link>.</p> 
-  
-<p>The process of transformation from a tree, either in the form of an
-	 object model, or in the form of parse events, into a stream, is known as
-	 <ref>serialization</ref>. We believe this is the most suitable term for
-	 this process, despite the overlap with Java object serialization.</p> 
-</s2><anchor name="patterns"/>
-<s2 title="TRaX Patterns">
-<p>The intent, responsibilities, and thread safety of TrAX objects:</p>
-<ul>
-  <li><link anchor="pattern-Processor">Processor</link></li>
-  <li><link anchor="pattern-TransformerFactory">TransformerFactory</link></li>
-  <li><link anchor="pattern-Templates">Templates</link></li>
-  <li><link anchor="pattern-Transformer">Transformer</link></li>
-  <li><link anchor="pattern-Source">Source</link></li>
-  <li><link anchor="pattern-Result">Result</link></li>  
-</ul>
-<anchor name="pattern-Processor"/><s3 title="Processor">
-<gloss>
-<label>Intent</label>
-<item>Generic concept for the
-  set of objects that implement the TrAX interfaces.</item>
-<label>Responsibilities</label>
-<item>Create compiled transformation instructions, transform
-  sources, and manage transformation parameters and
-  properties.</item>
-<label>Thread safety</label>
-<item>Only the Templates object can be
-  used concurrently in multiple threads. The rest of the processor does not do
-  synchronized blocking, and so may not be used to perform multiple concurrent
-  operations.</item>
-</gloss>
-</s3> <anchor name="pattern-TransformerFactory"/>
-<s3 title="TransformerFactory">
-<gloss>
-<label>Intent</label>
-<item>Serve as a vendor-neutral Processor interface for
-  <jump href="http://www.w3.org/TR/xslt">XSLT</jump> and similar
-  processors.</item>
-<label>Responsibilities</label>
-<item>Serve as a factory for a concrete
-  implementation of an TransformerFactory, serve as a direct factory for
-  Transformer objects, serve as a factory for Templates objects, and manage
-  processor specific features.</item>
-<label>Thread safety</label>
-<item>A TransformerFactory may not perform mulitple concurrent
-  operations.</item>
-</gloss>  
-</s3><anchor name="pattern-Templates"/>
-<s3 title="Templates">
-<gloss>
-<label>Intent</label>
-<item>The runtime representation of the transformation instructions.</item>
-<label>Responsibilities</label>
-<item>A data bag for transformation instructions; act as a factory
-  for Transformers.</item>
-<label>Thread safety</label>
-<item>Threadsafe for concurrent
-  usage over multiple threads once construction is complete.</item>
-</gloss>  
-</s3><anchor name="pattern-Transformer"/>
-<s3 title="Transformer">
-<gloss>
-<label>Intent</label>
-<item>Act as a per-thread
-  execution context for transformations, act as an interface for performing the
-  transformation.</item>
-<label>Responsibilities</label>
-<item>Perform the
-  transformation.</item>
-<label>Thread safety</label>
-<item>Only one instance per thread
-  is safe.</item>
-</gloss>  
-<note>The Transformer is bound to the Templates
-  object that created it.</note>
-</s3><anchor name="pattern-Source"/>
-<s3 title="Source">
-<gloss>
-<label>Intent</label>
-<item>Serve as a
-  single vendor-neutral object for multiple types of input.</item>
-<label>Responsibilities</label>
-<item>Act as simple data holder for System IDs, DOM nodes, streams,
-  etc.</item>
-<label>Thread safety</label>
-<item>Threadsafe concurrently over multiple
-  threads for read-only operations; must be synchronized for edit
-  operations.</item>
-</gloss>  
-</s3><anchor name="pattern-Result"/>
-<s3 title="Result">
-<p>Alternative name: ResultTarget.</p>
-<gloss>
-<label>Intent</label>
-<item>Serve
-  as a single object for multiple types of output, so there can be simple process
-  method signatures.</item>
-<label>Responsibilities</label>
-<item>Act as simple data holder for
-  output stream, DOM node, ContentHandler, etc.</item>
-<label>Thread safety</label>
-<item>Threadsafe concurrently over multiple threads for read-only,
-  must be synchronized for edit.</item>
-</gloss>
-</s3> 
- </s2>
- </s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/usagepatterns.xml b/xdocs/sources/xalan/usagepatterns.xml
deleted file mode 100644
index cb7fb52..0000000
--- a/xdocs/sources/xalan/usagepatterns.xml
+++ /dev/null
@@ -1,534 +0,0 @@
-<?xml version="1.0" standalone="no"?> 
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="Basic usage patterns">
-<ul>
-<li><link anchor="basic">Basic steps</link></li>
-<li><link anchor="plug">Plugging in the Transformer and XML parser</link></li>
-<li><link anchor="outputprops">Setting output properties in your stylesheets</link></li>
-<li><link anchor="outputencoding">Caution: setting output encoding in the stylesheet</link></li>
-<li><link anchor="embed">Working with embedded stylesheets</link></li>
-<li><link anchor="params">Setting stylesheet parameters</link></li>
-<li><link anchor="serialize">Serializing output</link></li>
-<li><link anchor="sax">Explicitly working with SAX</link></li>
-<li><link anchor="outasin">Using transformation output as input for another transformation</link></li>
-<li><link anchor="dom">Processing and producing DOM trees</link></li>
-<li><link anchor="xpath">Working with XPath expressions</link></li>
-<li><link anchor="applet">Using the &xslt4j; applet wrapper</link></li>
-<li><link anchor="servlet">Using &xslt4j; in a servlet</link></li>
-<li><link anchor="extensions">Creating and using extensions</link></li>
-<li><link anchor="multithreading">Multithreading</link></li>
-<li><link anchor="debugging">Debugger interface</link></li>
-</ul>
-<anchor name="basic"/>
-  <s2 title="Basic steps">
-    <ol>
-    <li><link anchor="transformerfactory">Instantiate a TransformerFactory</link></li>
-    <li><link anchor="transformer">Process the stylesheet and generate a Transformer</link></li>
-    <li><link anchor="transformation">Perform the transformation</link></li>
-  </ol>
-    <p>The following example illustrates the three basic steps involved in performing a transformation.</p>
-    <source>// 1. Instantiate a TransformerFactory.
-javax.xml.transform.TransformerFactory tFactory = 
-                  javax.xml.transform.TransformerFactory.newInstance();
-
-// 2. Use the TransformerFactory to process the stylesheet Source and
-//    generate a Transformer.
-javax.xml.transform.Transformer transformer = tFactory.newTransformer
-                (new javax.xml.transform.stream.StreamSource("foo.xsl");
-
-// 3. Use the Transformer to transform an XML Source and send the
-//    output to a Result object.
-transformer.transform
-    (new javax.xml.transform.stream.StreamSource("foo.xml"), 
-     new javax.xml.transform.stream.StreamResult( new
-                                  java.io.FileOutputStream("foo.out")));</source>
-  <note>For a working example of this model at its simplest, see SimpleTransform.java in the java/samples/SimpleTransform subdirectory.</note>
-  </s2><anchor name="transformerfactory"/>
-  <s2 title="1. Instantiate a TransformerFactory">
-  <p><jump href="apidocs/javax/xml/transform/TransformerFactory.html">TransformerFactory</jump> is an abstract class with a static newInstance() method that instantiates the concrete subclass designated by the javax.xml.transform.TransformerFactory system property.</p>
-  <p>The default setting for this system property is <jump href="apidocs/org/apache/xalan/processor/TransformerFactoryImpl.html">org.apache.xalan.processor.TransformerFactoryImpl</jump>.</p>
-</s2><anchor name="transformer"/>
-  <s2 title="2. Use the TransformerFactory to process the stylesheet Source and produce a Transformer">
-<p>The TransformerFactory <jump href="apidocs/javax/xml/transform/TransformerFactory.html#newTransformer(javax.xml.transform.Source)">newTransformer(Source xslSource)</jump> method processes the stylesheet Source into a Templates object and returns a Transformer that you can use to perform a transformation (apply the Templates object to an XML Source).</p>
-<p>You may provide the stylesheet Source in the form of a stream of XML markup (<jump href="apidocs/javax/xml/transform/stream/StreamSource.html">StreamSource</jump>), a DOM Node (<jump href="apidocs/javax/xml/transform/dom/DOMSource.html">DOMSource</jump>), or a SAX InputSource (<jump href="apidocs/javax/xml/transform/sax/SAXSource.html">SAXSource</jump>). To specify a StreamSource, you may use a system ID or file name (using URI syntax), a java.io.InputStream, or a java.io.Reader. The use of DOMSource and SAXSource are illustrated in subsequent sections.</p>
-<note>If you plan to use the stylesheet Source to transform multiple XML Sources, you should use the TransformerFactory <jump href="apidocs/javax/xml/transform/TransformerFactory.html#newTemplates(javax.xml.transform.Source)">newTemplates(Source xslSource)</jump> method to explicitly generate a Templates object. For each transformation, use the Templates object to generate a new Transformer. For the details, see <link anchor="multithreading">Multithreading</link>.</note>
-</s2><anchor name="transformation"/>
-<s2 title="3. Use the Transformer to perform a transformation">
-<p>Use the Transformer <jump href="apidocs/javax/xml/transform/Transformer.html#transform(javax.xml.transform.Source,javax.xml.transform.Result">transform(Source xmlSource, Result transformResult)</jump> method to transform  the XML Source and place the transformation output in a Result object.</p>
-<p>Just as with the stylesheet, you can supply the XML Source in the form of a <jump href="apidocs/javax/xml/transform/stream/StreamSource.html">StreamSource</jump>, <jump href="apidocs/javax/xml/transform/dom/DOMSource.html">DOMSource</jump>, or <jump href="apidocs/javax/xml/transform/sax/SAXSource.html">SAXSource</jump>. Likewise, the Result may be a <jump href="apidocs/javax/xml/transform/stream/StreamResult.html">StreamResult</jump>, <jump href="apidocs/javax/xml/transform/dom/DOMResult.html">DOMResult</jump>, or <jump href="apidocs/javax/xml/transform/sax/SAXResult.html">SAXResult</jump>.</p>
-<p>For each node in the XML source, the Transformer uses the transformation instructions in the Templates object to determine which template to apply: one of the templates in the Templates object, a default template rule as specified in the XSLT spec, or none.</p>
-</s2><anchor name="plug"/>
-<s2 title="Plugging in a Transformer and XML parser">
-<p>The Java API for XML Processing interfaces enable you to isolate your application from the internal implementation details of a given Transformer, SAX parser, or DOM parser. For each of these objects, there is an abstract Factory class with a static newInstance() method that instantiates a concrete Factory which wraps the underlying implementation. These newInstance() methods use system property settings to determine which implementation to instantiate.</p>
-<p>&xslt4j; is distributed with a system property setting for the Xalan XSLT Transformer. This setting is in xalan.jar in META-INF/services (see src/META-INF/services).</p>
-<gloss>
-  <label>System property</label>
-    <item>Setting</item>
-  <label><code>javax.xml.transform.TransformerFactory</code></label>
-   <item><code>org.apache.xalan.processor.TransformerFactoryImpl</code></item>
-</gloss>
-<p>If you are using Xerces, the XML parser factory settings are as follows:</p>
-<gloss>
-  <label>System property</label>
-    <item>Setting</item>
-  <label><code>javax.xml.parsers.DocumentBuilderFactory</code></label>
-   <item><code>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</code></item>    
-  <label><code>javax.xml.parsers.SAXParserFactory</code></label>
-   <item><code>org.apache.xerces.jaxp.SAXParserFactoryImpl</code></item>
- </gloss>
-<p>You can change any of these settings as follows (in order of precedence):</p>
-<ol>
-  <li>Set the system property from the command line when you launch Java or from within your application.<br/><br/></li>
-  <li>Set the system property in jaxp.properties in the JAVA_HOME/lib directory, where JAVA_HOME is the root of the JDK.<br/><br/></li>
-  <li>Revise the entry in src/META-INF/services and rebuild xalan.jar or &xml4j-jar;, depending on which entry you have changed.<br/><br/></li>
-</ol>
-<p>For example, to use the Crimson XML parser in place of the Xerces XML parser, place Crimson on the class path and set the 
-<code>javax.xml.parsers.SAXParserFactory</code> system property to <code>org.apache.crimson.jaxp.SAXParserFactoryImpl</code>.</p>
-<p>For more information about the mechanism used to determine system property values and how you can plug other implementations into your applications, see "Section 3: Plugability Layer" in the <ref>Java API for XML Processing</ref> at 
-<jump href="http://java.sun.com/aboutJava/communityprocess/review/jsr063/index.html">JSR-000063 1.1</jump>.</p> 
-</s2><anchor name="outputprops"/>
-<s2 title="Setting output properties in your stylesheets">
-<p>Output properties for XML, HTML, and Text transformation output are defined in property files in the org.apache.xalan.templates package.</p>
-<p>You can change these settings as follows:</p>
-<ol>
-  <li>Declare the xalan namespace in your stylesheet element (xmlns:xalan="http://xml.apache.org/xslt").<br/><br/></li>
-  <li>Use the namespace prefix you assign (for example, "xalan") to redefine properties of interest in the stylesheet xsl:output
-      element (for example, xalan:indent-amount="5").</li>
-</ol>
-<p>The following stylesheet fragment declares the xalan namespace and sets indent-amount to 2:</p>
-<source>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;xsl:stylesheet version="1.0" 
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:xalan="http://xml.apache.org/xslt"&gt;
-                
-  &lt;xsl:output method="xml" 
-              encoding="UTF-8"
-              indent="yes" 
-              xalan:indent-amount="2"/&gt;</source>
-  <p>If you want to change the property settings globally, edit the values in the property files in src/org/apache/xalan/templates, 
-  and use Ant to <link idref="readme" anchor="jar">rebuild xalan.jar</link>.</p>
-<p>The properties files define the following properties:</p>
-<p><ref>output_xml.properties</ref>:</p>
-<table>
-  <tr>
-    <th>Property</th>
-    <th>Default value</th>
-  </tr>  
-  <tr>
-    <td>xalan:indent-amount</td>
-    <td>0</td>
-  </tr>
-  <tr>
-    <td>xalan:content-handler</td>
-    <td>org.apache.xalan.serialize.SerializerToXML</td>
-  </tr>
-</table>
-<p><ref>output_html.properties</ref>:</p>
-<table>
-  <tr>
-    <th>Property</th>
-    <th>Default value</th>
-  </tr>  
-  <tr>
-    <td>xalan:indent-amount</td>
-    <td>0</td>
-  </tr>
-  <tr>
-    <td>xalan:content-handler</td>
-    <td>org.apache.xalan.serialize.SerializerToHTML</td>
-  </tr>
-  <tr>
-    <td>xalan:entities</td>
-    <td>HTMLEntities.res</td>
-  </tr>
-  <tr>
-    <td>xalan:use-url-escaping</td>
-    <td>yes</td>
-  </tr>
-  <tr>
-    <td>xalan:omit-meta-tag</td>
-    <td>no</td>
-  </tr>
-</table>
-<note>You can also create your own HTML entity file (mapping characters to entities) 
-or edit src/org/apache/xalan/serialize/HTMLEntities.res and rebuild xalan.jar.</note>
-<p><ref>output_text.properties</ref>:</p>
-<table>  
-  <tr>
-    <th>Property</th>
-    <th>Default value</th>
-  </tr>
-  <tr>
-    <td>xalan:content-handler</td>
-    <td>org.apache.xalan.serialize.SerializerToText</td>
-  </tr>
-</table>
-</s2><anchor name="outputencoding"/>
-<s2 title="Caution: setting output encoding in the stylesheet">
-<p>When you use the &lt;xsl:output&gt; encoding attribute to set output character encoding, you should not 
-use StreamResult(java.io.Writer) to construct a 
-<jump href="apidocs/javax/xml/transform/stream/StreamResult.html">StreamResult</jump> object to hold the transformation result.
-If you do, the Writer uses its own encoding rather than the encoding specified in the stylesheet.</p>
-<p>If you want to use a Writer, you can specify an encoding when you create the Writer (java.io.OutputStreamWriter). Once the 
-Writer exists, you cannot reset the encoding it uses.</p>
-</s2><anchor name="embed"/>
-<s2 title="Working with embedded stylesheets">
-<p>An XML Source may include an <jump href="http://www.w3.org/TR/xml-stylesheet/">xml-stylesheet processing instruction</jump> which identifies the stylesheet to be used to process the document. As indicated by the processing instruction <ref>href</ref> attribute, the stylesheet itself may be embedded in the XML document or located elsewhere.</p>
-<p>Suppose you have an XML document (foo.xml) with the following xml-stylesheet processing instruction:</p>
-<p><code>&lt;?xml-stylesheet type="text/xml" href="foo.xsl"?&gt;</code></p>
-<p>The following fragment, uses this instruction to locate the stylesheet (foo.xsl in the same directory as foo.xml) and create a Templates object. Note the use of the TransformerFactory getAssociatedStylesheet() in step 2a.</p>
-<note>An XML document may include more than one xml-stylesheet processing instruction, hence the support for working with multiple stylesheets. If more than one stylesheet is returned, the other stylesheets are imported into the first stylesheet.</note>
-<source>// 1. Instantiate the TransformerFactory.
-javax.xml.transform.TransformerFactory tFactory = 
-                    javax.xml.transform.TransformerFactory.newInstance();
-// 2a. Get the stylesheet from the XML source.
-String media = null , title = null, charset = null;
-javax.xml.transform.Source stylesheet = tFactory.getAssociatedStylesheet
-                   (new StreamSource("foo.xml"),media, title, charset);
-
-// 2b. Process the stylesheet and generate a Transformer.
-Transformer transformer = tFactory.newTransformer(stylesheet);
-
-// 3. Use the Transformer to perform the transformation and send the
-//    the output to a Result object.
-transformer.transform
-             (new javax.xml.transform.stream.StreamSource("foo.xml"),
-              new StreamResult (new java.io.FileOutputStream("foo.out")));</source>
-<p>For a sample that uses this technique, see <link idref="samples" anchor="usestylesheetpi">UseStylesheetPI</link>.</p>
-<p>You can also instruct the <link idref="commandline">command-line utility</link> to use stylesheet processing
-instructions:</p>
-<ol>
-  <li>Include the <code>-in</code> flag with an XML source that contains a stylesheet processing instruction.<br/><br/></li>
-  <li>Do not include the <code>-xsl</code> flag.</li>
-</ol>
-</s2><anchor name="serialize"/>
-<s2 title="Serializing output">
-<p>In some cases, you may want to "transform" a DOM tree into a stream, which the XML community calls serialization. <link idref="trax">TRaX (Transformation API for XML)</link> and the &xslt4j; Transformer implementation provide direct support for this operation. Simply use the TransformerFactory newTransformer() method (no arguments) to create a Transformer that you can use to "copy" a DOMSource to a StreamResult. For examples, see Examples.exampleDOM2DOM(), Examples.exampleSerializeNode(), and Examples.exampleAsSerializer() in the <link idref="samples" anchor="trax">trax sample</link>.</p>
-</s2><anchor name="params"/>
-<s2 title="Setting stylesheet parameters">
-<p>An XSLT stylesheet may include parameters that are set at run time each time a transformation is performed. To set a stylesheet parameter, use the Transformer 
-<jump href="apidocs/javax/xml/transform/Transformer.html#setParameter(java.lang.String,java.lang.Object)">setParameter(String name, Object value)</jump> method. For a working example, see UseStylesheetParam.java in the samples/UseStylesheetParam subdirectory.</p>
-<p>You can also set a parameter with the command-line utility by including the <code>-param</code> flag. For example:</p>
-<p><code>java org.apache.xalan.xslt.Process -in foo.xml -xsl foo.xsl -param param1 foobar</code></p>
-<p>where <code>param</code> is the parameter name and <code>foobar</code> is the parameter value. The parameter namespace is null.</p>
-<note>&xslt4j2; processes string parameters. You are no longer required (as you were with &xslt4j; version 1) to enclose strings in single 
-quotes (') as string expressions.</note>
-</s2><anchor name="sax"/>
-<s2 title="Explicitly working with SAX">
-  <p>&xslt4j; uses the SAX event model to process stylesheets, to parse XML input documents, and to produce output. For each of these operations, an XMLReader reads input, firing parse events, and a ContentHandler listens to the XMLReader and executes parse event methods.</p>
-<p>When you use the basic procedure described above for performing transformations, &xslt4j; takes care of many of the SAX details under the covers. You are free to make these details explicit, which simply means that you can intervene in the procedure to accommodate the precise environment in which your application operates.</p>
-<p>Suppose, for example, you are using a custom XMLReader, perhaps doing more than just parsing static XML documents) to generate &xslt4j; SAX parse events. You might even have a custom reader for producing/processing stylesheets. You can cast the TransformerFactory to a SAXTransformerFactory, which provides access to a TransformerHandler, which you can set as the ContentHandler for this reader.</p>
-  <p>The following example explicitly sets up the XMLReader and ContentHandlers, and replicates the <link anchor="basic">basic steps</link> described above.</p>
-  <source>// Instantiate a TransformerFactory.
-javax.xml.transform.TransformerFactory tFactory = 
-                    javax.xml.transform.TransformerFactory.newInstance();
-// Verify that the TransformerFactory implementation you are using
-// supports SAX input and output (&xslt4j; does!).
-if (tFactory.getFeature(javax.xml.transform.sax.SAXSource.FEATURE) &amp;&amp; 
-    tFactory.getFeature(javax.xml.transform.sax.SAXResult.FEATURE))
-  { 
-    // Cast the TransformerFactory to SAXTransformerFactory.
-    javax.xml.transform.sax.SAXTransformerFactory saxTFactory = 
-                   ((javax.xml.transform.SAXTransformerFactory) tFactory);
-    // Create a Templates ContentHandler to handle parsing of the 
-    // stylesheet.
-    javax.xml.transform.sax.TemplatesHandler templatesHandler = 
-                                        saxTFactory.newTemplatesHandler();
-
-    // Create an XMLReader and set its ContentHandler.
-    org.xml.sax.XMLReader reader = 
-                   org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
-    reader.setContentHandler(templatesHandler);
-    
-    // Parse the stylesheet.                       
-    reader.parse("foo.xsl");
-
-    // Get the Templates object (generated during the parsing of the stylesheet)
-    // from the TemplatesHandler.
-    javax.xml.transform.Templates templates = 
-                                          templatesHandler.getTemplates();
-    // Create a Transformer ContentHandler to handle parsing of 
-    // the XML Source.  
-    javax.xml.transform.sax.TransformerHandler transformerHandler 
-                           = saxTFactory.newTransformerHandler(templates);
-    // Reset the XMLReader's ContentHandler to the TransformerHandler.
-    reader.setContentHandler(transformerHandler);
-
-    // Set the ContentHandler to also function as a LexicalHandler, which
-    // can process "lexical" events (such as comments and CDATA). 
-    reader.setProperty("http://xml.org/sax/properties/lexical-handler", 
-                        transformerHandler);
-
-    // Set up a Serializer to serialize the Result to a file.
-    org.apache.xalan.serialize.Serializer serializer = 
-    org.apache.xalan.serialize.SerializerFactory.getSerializer
-    (org.apache.xalan.templates.OutputProperties.getDefaultMethodProperties
-                                                                   ("xml"));
-    serializer.setOutputStream(new java.io.FileOutputStream("foo.out"));
-    // The Serializer functions as a SAX ContentHandler.
-    javax.xml.transform.Result result =
-      new javax.xml.transform.sax.SAXResult(serializer.asContentHandler());
-    transformerHandler.setResult(result);
-      
-    // Parse the XML input document.
-    reader.parse("foo.xml");</source>
-    <note>If you want to perform multiple transformations with the same Templates object and a TransformerHandler, you must create a new
-    TransformerHandler for each transformation. The &xslt4j; implementation of TransformerHandler 
-    (<jump href="src/org/apache/xalan/transformer/TransformerHandlerImpl.html">TransformerHandlerImpl</jump> fails to respond 
-    to events after the first endDocument event occurs.</note>
-</s2><anchor name="outasin"/>
-<s2 title="Using transformation output as input for another transformation">
-
-<p>You can chain together a series of transformations such that the output of each transformation provides input for the next transformation. &xslt4j; supports two basic strategies for chaining a series of transformations:</p>
-<ul>
-  <li>Use the SAXTransformerFactory to process the stylesheet and create a TransformerHandler for each transformation. Then you can set
-the first TransformerHandler as the ContentHandler for the XMLReader that parses the input, make the second TransformerHandler the ContentHandler for the output of the first TransformerHandler, and so on. For more detail and an example, see the <link idref="samples" anchor="pipe">Pipe</link> sample.<br/><br/></li>
-  <li>Use the SAXTransformerFactory to process the stylesheet and create a SAX XMLFilter for each transformation. Set an XMLReader as the parent of the first XMLFilter, the first XMLFilter as the parent of the second XMLFilter, and so on. You launch the series of transformations by instructing the last XMLFilter to parse the XML Source for the first transformation. For more detail and an example, see the <link idref="samples" anchor="usexmlfilters">UseXMLFilters</link> sample.</li>
-</ul>
-</s2><anchor name="dom"/>
-<s2 title="Processing and producing DOM trees">
-  <p>In some cases, the input and/or desired output for a transformation may be a DOM tree object. The javax.xml.transform.DOM package provides <jump href="apidocs/javax/xml/transform/dom/DOMSource.html">DOMSource</jump> and a <jump href="apidocs/javax/xml/transform/dom/DOMResult.html">DOMResult</jump>, either or both of which you can use when you perform a transformation.</p>
-<p>In some cases, your application provides input in the form of a DOM tree, which accelerates the transformation process, since the input has in effect already been processed. To produce DOM input from a stream, you can use a <jump href="apidocs/javax/xml/parsers/DocumentBuilderFactory.html">DocumentBuilderFactory</jump> to produce a <jump href="apidocs/javax/xml/parsers/DocumentBuilder.html">DocumentBuilder</jump> with which you can parse the XML input into a DOM Document, as illustrated below.</p>
-<source>// Instantiate a DocumentBuilderFactory.
-javax.xml.parsers.DocumentBuilderFactory dfactory =
-                    javax.xml.parsers.DocumentBuilderFactory.newInstance();
-// Use the DocumentBuilderFactory to provide access to a DocumentBuilder.
-javax.xml.parsers.DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
-// Use the DocumentBuilder to parse the XML input.
-org.w3c.dom.Document inDoc = dBuilder.Parse("foo.xml");</source>
-<p>To produce DOM output, simply use a Transformer to transform to a DOMResult object.</p>
-<source>// Generate a Transformer.
-javax.xml.transform.Transformer transformer = tFactory.newTransformer
-                  (new javax.xml.transform.Stream.StreamSource("foo.xsl"));
-// Create an empy DOMResult object for the output.
-javax.xml.transform.dom.DOMResult domResult =
-                                   new javax.xml.transform.dom.DOMResult();
-// Perform the transformation.
-transformer.transform(new javax.xml.transform.dom.DOMSource(inDoc)
-                      domResult;
-// Now you can get the output Node from the DOMResult.
-org.w3c.dom.Node node = domResult.getNode();</source>
-<note>Create a new DOMResult object or use DOMResult.setNode() to assign a new container each time you want to perform a transformation 
-and place the output in a DOMResult object.</note>
-<p>The <link idref="samples" anchor="dom2dom">DOM2DOM</link> illustrates both procedures, and serializes the DOMResult to System.out.</p>
-</s2><anchor name="xpath"/>
-<s2 title="Working with XPath expressions">
-<p>XSLT stylesheets use XPath expressions to select nodes, specify conditions, and generate text for the result tree. XPath provides an API that you can call directly. For example, you may want to select nodes programmatically and do your own processing without a stylesheet.</p>
-<p>XPath is an independent entity, with clients other than XSLT processors (such as XPointer). Accordingly, &xslt4j2; has packaged XPath as a separate module (org.apache.xpath and its subpackages), although concurrently this module does use some utility classes packaged in org.apache.xalan.utils. The org.apache.xpath.XPathAPI class contains convenience methods that you can use to return single DOM Nodes, NodeIterators, and XObjects. Apart from their own functionality, these methods also provide a path into the lower-level XPath API that you may find useful.</p>
-<p>For an example that uses the XPathAPI convenience methods to execute XPath expressions against XML source files, see <link idref="samples" anchor="applyxpath">ApplyXPath</link>.</p>
-</s2><anchor name="applet"/>
-<s2 title="Using the &xslt4j; applet wrapper">
-<ol> 
-<li>Include <jump href="apidocs/org/apache/xalan/client/XSLTProcessorApplet.html">XSLTProcessorApplet</jump> in an HTML client.<br/><br/></li>
-<li>Specify the XML source document and XSL stylesheet.<br/><br/>
-You can use the DocumentURL and StyleURL PARAM tags or the <jump href="apidocs/org/apache/xalan/client/XSLTProcessorApplet.html#setDocumentURL(java.lang.String)">setdocumentURL()</jump> and <jump href="apidocs/org/apache/xalan/client/XSLTProcessorApplet.html#setStyleURL(java.lang.String)">setStyleURL()</jump> methods. If the XML document contains a stylesheet Processing Instruction (PI), you do not need to specify an XSL stylesheet.<br/><br/></li>
-<li>Call the <jump href="apidocs/org/apache/xalan/client/XSLTProcessorApplet.html#transformToHtml(java.lang.String,java.lang.String)">transformToHtml()</jump> or <jump href="apidocs/org/apache/xalan/client/XSLTProcessorApplet.html#getHtmlText()">getHtmlText()</jump> method, which performs the transformation and returns the new document as a String.</li></ol>
-<note>The transformToHTML() method takes arguments for the XML source document and XSL stylesheet. The getHtmlText() method takes no arguments: it uses property or parameter settings, as in the example below.</note>
-<p>For an example, see the <link idref="samples" anchor="appletxmltohtml">AppletXMLtoHTML</link> sample applet. The &lt;applet&gt; tag is in samples/AppletXMLtoHTML/client.html:</p>
-<source>&lt;applet  
-    name="xslControl"
-    code="org.apache.xalan.client.XSLTProcessorApplet.class"
-    archive="../../bin/xalan.jar,../../bin/xml-apis.jar,../../bin/xercesImpl.jar"
-    height="0"
-    width"0">
-    &lt;param name="documentURL" value="xalanApplets.xml"/&gt;
-    &lt;param name="styleURL" value="s1ToHTML.xsl"/&gt;
-&lt;/applet&gt;</source>
-<p>When the user clicks the Transform button, the HTML client calls the getHtmlText() method, and puts the returned HTML text in a frame for the user to view.</p>
-<p>For samples, see <link idref="samples" anchor="applet">AppletXMLtoHTML</link>.</p>
-<anchor name="netscape"/><s3 title="Problems with Netscape">
-    <p>The JAXP strategy of reading system properties 
-    generates SecurityExceptions when you attempt to run &xslt4j; applets in the Netscape Communicator 4.7.</p> 
-    <p>Stuart Connell 
-    &lt;Stuart.Connell@compuware.com&gt; reports that the &xslt4j; applet wrapper does work in Netscape Communicator 6, 
-    provided that you avoid calls to the AppletContext showStatus() method. In other words, you can remove the showStatus() calls
-    from org.apache.xalan.client.XSLTProcessorApplet, and run &xslt4j; applets from Netscape Communicator 6. This appears to be a
-    Netscape bug, which hopefully will be fixed soon. For more information, see 
-    <jump href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3231">Bugzilla bug 3231</jump>.</p>
-</s3>    
-</s2><anchor name="servlet"/>
-<s2 title="Using &xslt4j; in a servlet">
-<p>You can set up a servlet to use &xslt4j; to respond to requests for XML documents by transforming those documents into HTML and serving them to web browsers. To respond to HTTP GET requests, all you need to do is overwrite the HttpServlet doGet() method with a procedure that instantiates a Transformer and uses it to perform a transformation. As the following example shows, you can generate a ResultStream that a PrintWriter writes to the HttpResponse OutputStream, returning the transformation output to the web browser.</p>
-<source>
-public class SampleXSLTServlet extends javax.servlet.http.HttpServlet {
-  
-  // Respond to HTTP GET requests from browsers.
-  public void doGet (javax.servlet.http.HttpServletRequest request,
-                     javax.servlet.http.HttpServletResponse response)
-    throws javax.servlet.ServletException, java.io.IOException
-  {
-    // Set content type for HTML.
-    response.setContentType("text/html; charset=UTF-8");    
-    // Output goes to the response PrintWriter.
-    java.io.PrintWriter out = response.getWriter());
-    try
-    {	
-      javax.xml.transform.TransformerFactory tFactory = 
-                javax.xml.transform.TransformerFactory.newInstance();
-      // Get the XML input document and the stylesheet, both in the servlet
-      // engine document directory.
-      javax.xml.transform.Source xmlSource = 
-                new javax.xml.transform.stream.StreamSource
-                             (new java.net.URL("file:foo.xml").openStream());
-      javax.xml.transform.Source xslSource = 
-                new javax.xml.transform.stream.StreamSource
-                             (new java.net.URL("file:foo.xsl").openStream());
-      // Generate the transformer.
-      javax.xml.transform.Transformer transformer = 
-                             tFactory.newTransformer(xslSource);
-      // Perform the transformation, sending the output to the response.
-      transformer.transform(xmlSource, 
-                           new javax.xml.transform.stream.StreamResult(out));
-    }
-    // If an Exception occurs, return the error to the client.
-    catch (Exception e)
-    {
-      out.write(e.getMessage());
-      e.printStackTrace(out);    
-    }
-    // Close the PrintWriter.
-    out.close();
-  }  
-}</source>
-<p>For a working sample, see <link idref="samples" anchor="simplexsltservlet">SimpleXSLTServlet</link>.</p>
-<p>In the preceding example, the URLs for the XML document and XSL stylesheet are hardcoded in the servlet. You can also create a servlet that parses the request URL for input parameters specifying the XML document, XSL stylesheet, and any relevant stylesheet parameters. For samples, see <link idref="samples"
-anchor="usestylesheetparamservlet">UseStylesheetParamServlet</link> and <link idref="samples" anchor="xsltservletwithparams">XSLTServletWithParams</link>. For a more robust and complex sample that also employs a properties file to determine which stylesheet to use depending on the client browser/device, see <link idref="samples" anchor="applyxslt">ApplyXSLT</link>.</p>
-</s2><anchor name="extensions"/>
-<s2 title="Creating and using extensions">
-<p>For those cases where you want to be able to call procedural code from within a stylesheet, the &xslt4j; Extensions facility supports the creation of extension elements and extension functions. See <link idref="extensions">Extensions</link> and <link idref="samples" anchor="extensions">Extensions samples</link>.</p>
-</s2><anchor name="multithreading"/>
-<s2 title="Multithreading">
-<p>A given Templates object may be used repeatedly and even in multiple threads running concurrently for the transformation of XML input, but you should use the Templates object to instantiate a separate Transformer for each transformation you perform. The Templates object is an immutable runtime representation of the structure and content of a stylesheet (which may include and import multiple stylesheet sources). A Transformer, on the other hand, is a lightweight object that tracks state information during the transformation, and should only be used to perform a single transformation.</p>
-
-<p>If you want to perform multiple transformations (sequentially or concurrently) with the same stylesheet instructions, do the following:</p>
-<ol>
-  <li>Use the TransformerFactory <jump href="apidocs/javax/xml/transform/TransformerFactory.html#newTemplates(javax.xml.transform.Source)">newTemplates(Source xslSource)</jump> method to create a Templates object.<br/><br/></li>
-<li>For each transformation, use the Templates object <jump href="apidocs/javax/xml/transform/Templates.html#newTransformer()">newTransformer()</jump> method to create a Transformer, and use that Transformer's 
-<jump href="apidocs/javax/xml/transform/Transformer.html#transform(javax.xml.transform.Source,javax.xml.transform.Result)">transform(Source xmlSource, Result transformResult)</jump> method to perform the transformation.</li>
-</ol>
-<p>For an example, see Examples.exampleUseTemplatesObj() in the <link idref="samples" anchor="trax">trax sample</link>.</p>
-</s2><anchor name="debugging"/>
-<s2 title="Debugger Interface">
-		<p>&xslt4j; contains a debugger interface in the org.apache.xalan.xslt.trace package:</p> 
-		<ul>
-		  <li><jump href="apidocs/org/apache/xalan/trace/TraceListener.html">TraceListener</jump> is an interface that debuggers 
-		  can implement. Or, like the <link idref="commandline">command-line utility</link>, you can use the <jump
-      href="apidocs/org/apache/xalan/trace/PrintTraceListener.html">PrintTraceListener</jump> implementation of that interface.
-      <br/><br/></li>
-      <li>You can register a TraceListener with the 
-      <jump href="apidocs/org/apache/xalan/trace/TraceManager.html">TraceManager</jump> associated
-      with the Transformer that will perform a given transformation.<br/><br/></li>
-		  <li><jump href="apidocs/org/apache/xalan/trace/TracerEvent.html">TracerEvent</jump> is an event that is 
-		  passed to the TraceListener.trace function. It is called before a node is 'executed' in the stylesheet.<br/><br/></li>
-		  <li><jump href="apidocs/org/apache/xalan/trace/GenerateEvent.html">GenerateEvent</jump> is an event that is 
-		  passed to the TraceListener.generated() function. It is called after an event occurs to create something in the result
-      tree.<br/><br/></li>
-      <li><jump href="apidocs/org/apache/xalan/trace/SelectionEvent.html">SelectionEvent</jump> is an event triggered by the
-       selection of a stylesheet node.</li>
-		</ul>
-    <p>The <link idref="commandline">command-line utility</link> uses the debugger interface when you include one or more of the
-     following switches: <code>-TT</code>, <code>-TG</code>, <code>-TS</code>, <code>-TTC</code>.</p>
-    <p>Example:</p>
-<source>import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.trace.TraceManager;
-import org.apache.xalan.trace.PrintTraceListener;
-...
-// Set up a PrintTraceListener object to print to a file.
-java.io.FileWriter fw = new java.io.FileWriter("events.log");
-java.io.PrintWriter pw = new java.io.PrintWriter(fw);
-PrintTraceListener ptl = new PrintTraceListener(pw);
-
-// Print information as each node is 'executed' in the stylesheet.
-ptl.m_traceElements = true;
-// Print information after each result-tree generation event.
-ptl.m_traceGeneration = true;
-// Print information after each selection event.
-ptl.m_traceSelection = true;
-// Print information whenever a template is invoked.
-ptl.m_traceTemplates = true;
-
-// Set up the transformation    
-javax.xml.transform.TransformerFactory tFactory = 
-                     javax.xml.trnasform.TransformerFactory.newInstance();
-javax.xml.transform.Transformer transformer = 
-  tFactory.newTransformer(new javax.xml.transform.stream.StreamSource
-                                                             ("foo.xsl"));
-
-// Cast the Transformer object to TransformerImpl.
-if (transformer instanceof TransformerImpl) {
-  TransformerImpl transformerImpl = (TransformerImpl)transformer;
-  
-  // Register the TraceListener with the TraceManager associated 
-  // with the TransformerImpl.
-  TraceManager trMgr = transformerImpl.getTraceManager();
-  trMgr.addTraceListener(ptl);
-  
-  // Perform the transformation --printing information to
-  // the events log during the process.
-  transformer.transform
-      ( new javax.xml.transform.stream.StreamSource("foo.xml"), 
-        new javax.xml.transform.stream.StreamResult
-                                    (new java.io.FileWriter("foo.out")) );
-}
-// Close the PrintWriter and FileWriter.
-pw.close();
-fw.close();</source>
-<p>For a sample application that uses this technique, see <link idref="samples" anchor="trace">Trace</link>.</p>
-</s2>
-</s1>
diff --git a/xdocs/sources/xalan/whatsnew.xml b/xdocs/sources/xalan/whatsnew.xml
deleted file mode 100644
index 72fd573..0000000
--- a/xdocs/sources/xalan/whatsnew.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="What's new in &xslt4j2;">
-<ul>
-     <li><link anchor="design">New design</link></li>
-     <li><link anchor="dtm">Document Table Model (DTM)</link></li>
-  </ul><anchor name="design"/>
-  <s2 title="New Design">
-  <p>&xslt4j2; represents a fundamental redesign of Xalan. The primary objective of this redesign is an easier-to-use, more understandable, and more modular API that encourages wider participation in its ongoing development by the open-source XML developer community, and that lends itself to "streaming," the production of transformation output while the input is still being parsed.</p>
-<p>&xslt4j2; builds on <resource-ref idref="sax2"/>, <resource-ref idref="dom2"/>, and the <resource-ref idref="jaxp"/>. For example, &xslt4j2; incorporates the SAX parsing event model in its support for the incremental production of transformation output. &xslt4j2; also implements the  standard TrAX API (see below) that enables you to code your XML applications without reference to the internal details of a particular Transformer or XML parser.</p>
-<p>Given the scope of the redesign, the changes with respect to <jump href="http://xml.apache.org/xalan/index.html">&xslt4j; 1.x</jump> are global in nature. For an introduction to the &xslt4j2; usage patterns, see <link idref="usagepatterns">Basic Usage Patterns</link>.</p>
-<p>&xslt4j2; implements the <link idref="trax">TRaX (Transformation API for XML)</link> interfaces. The product of extensive open-source collaboration by members of the XML developer community, TrAX provides a conceptual framework and a standard API for performing XML transformations. During its evolution, the TrAX API has undergone several revisions. We believe this API has now reached or is very close to final form. In November 2000, TrAX was incorporated into <resource-ref idref="jsr063"/>, the Java API for XML Processing 1.1 , which has been published for public review (see <resource-ref idref="jaxp11"/>). We strongly encourage you to utilize the TrAX framework when you use &xslt4j2; to perform XML transformations.</p>
-<p>The basic organization of TrAX is quite simple: use a TransformerFactory to process transformation instructions and generate a Transformer, with which you can apply the processed transformation instructions to your XML Source, producing a transformation Result. For more detail, see <link idref="usagepatterns" anchor="basic">Basic steps</link>.</p>
-<p>As part of the Java API for XML Processing, TraX provides a stable framework for plugging Transformers (like &xslt4j;) and XML parsers (like &xml4j;) into your applications without tying yourself to the internal details of those implementations. See <link idref="usagepatterns" anchor="plug">Plugging in a Transformer and XML parser</link>.</p>
-</s2><anchor name="dtm"/>
-<s2 title="&xslt4j; DTM">
-<p>In place of the DOM object tree of nodes, the Document Table Model (DTM) uses integer arrays and string pools to represent the structure and content of the XML document to be transformed. The motivation behind this model is to optimize performance and minimize storage. For more information, see <link idref="dtm">DTM</link>.</p>
-</s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/xmlfilters.gif b/xdocs/sources/xalan/xmlfilters.gif
deleted file mode 100644
index 2b4d640..0000000
--- a/xdocs/sources/xalan/xmlfilters.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xalan/xsltc_constraints.xml b/xdocs/sources/xalan/xsltc_constraints.xml
deleted file mode 100644
index 9f997d4..0000000
--- a/xdocs/sources/xalan/xsltc_constraints.xml
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd"[
-<!ENTITY xsltcdone SYSTEM "XSLTCDONE">
-<!ENTITY xsltc_history SYSTEM "xsltc_history.xml">]>
-
-<s1 title="XSLTC Release Notes">
-<p>For this release, please note the following changes, additions, omissions, problems, procedures for running demos, 
-and new support for the TrAX API.</p>
-<p>For an introduction to XSLTC, see <link idref="xsltc_usage">Using XSLTC</link>.</p>
-<ul>
-  <li><link anchor="xsltcnew">Changes and New Features</link></li>
-  <li><link anchor="xsltcconf">Conformance</link></li>
-  <li><link anchor="xsltcknownproblems">Known Problems</link></li>
-  <li><link anchor="xsltcdemos">Running Demos</link></li>  
-  <li><link anchor="xsltctrax">Translets and TrAX</link></li>
-  <li><link idref="xsltc_history">History of XSLTC software changes</link></li>
-</ul>
-<anchor name="xsltcnew"/>
-<s2 title="Changes since &xslt4j; 2.2.D14">
-&xsltcdone;
-</s2>
-<anchor name="xsltcconf"/>
-<s2 title="XSLT 1.0 Conformance and Extensions">
-<p>XSLTC does not yet support the following feature of the <resource-ref idref="xslt"/>:</p>
-<ul>
-  <li>The namespace axis is not implemented. You cannot get a node set containing the namespace nodes
-    in scope from a context node in the document tree. Otherwise, namespace functionality is implemented.</li>
-</ul>
-<p>XSLTC does not support a number of features that are not required by the XSLT 1.0 specification,
-but which are supported by a number of other XSLT processors:</p>
-<ul>
-  <li>Incomplete support for extension elements and external Java functions. Currently you can set up an extension function
-    to call a static Java function. For the extension namespace, use<br/>
-    &nbsp;&nbsp;&nbsp;&nbsp;http://xml.apache.org/xalan/xsltc/java/&lt;class&gt;<br/>
-    where &lt;class&gt; identifies the class with the static method.</li>
-  <li>Lack of support for the redirection of output to multiple
-    output files from within a stylesheet (equivalent to xalan:redirect or
-    saxon:output).</li>
-  <li>XSLTC does not implement a node-set extension to convert result tree fragments to
-    node-sets. This would enable sorting and grouping of nodes assigned to a tree </li>
-</ul>
-</s2>
-<anchor name="xsltcknownproblems"/>
-<s2 title="Known Problems">
-<ul>
-  <li>Casting variables: XSLTC requires you to explicitly type cast values 
-  returned by variables or expressions, when you use them in tests. Always a good
-  practice, but it may seem like overkill in some in contexts, where other XSLT processors
-  automatically assume or convert to the correct type. For example. unless you cast $country
-  to a string in the following apply-templates, entry nodes whose &lt;country&gt; elements
-  contain a string matching the global $country parameter are NOT selected.<br/><br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<code>&lt;xsl:apply-templates select="entry[country=string($country)]"/&gt;</code></li>
-  <li>Order dependency of conditions within a predicate: If you have a predicate in a select or match
-  expression that has multiple conditions, one of which contains a union (X or Y), put it last. 
-  Otherwise, the predicate fails to match node that it should.</li>
-  <li>When using DOM caching, as shown in the Servlet demo, if the source document is local to the 
-  server, the cache is not refreshed when the source XML document is modified. This 
-  problem does not apply when the source is associated with a URL.</li>
-  <li>If you have a list of references included or imported stylesheets, put any with 
-  a relative path last; otherwise, stylesheets in the current directory are not found.</li>
-  <li>[1] should be treated equivalent to position()=1, but it is not. Therefore, if 
-  you get unexpected results using such shortcut positional predicates, substitute the 
-  full postion()= version.</li>
-  <li>XSLTC fails to match existing nodes when match expressions have 
-  multiple steps with predicates containing the position function.
-  The following examples are taken from the XSLTMark oddtemplates.xsl test:<br/><br/>
-  <code>&nbsp;&nbsp;&nbsp;&nbsp;match='top/*[position()=2]'</code><br/>
-  <code>&nbsp;&nbsp;&nbsp;&nbsp;match='top/*[6]/kid[2]'</code><br/>
-  <code>&nbsp;&nbsp;&nbsp;&nbsp;match='top/*[position()=last()]'</code><br/></li>
-  <li>XSTLC has problems with output escaping, see bug 1403.</li>
-  <li>Case-order option with sorting is ignored.</li>
-  <li>As a minor side-effect of implementing simplified stylesheets, if you inadvertenly 
-  go to compile a stylesheet and give the name of the .xml doc instead of the .xsl doc,
-  it may compile without a warning. In some cases, the compiler aborts with an error 
-  about too many branches.</li>
-</ul>
-</s2>
-<anchor name="xsltcdemos"/>
-<s2 title="Running Demos">
-<p>XSLTC provides demos for using XSLTC as a servlet and as a handler for 
-Brazil (a new and powerful Web techology from Sun labs). To run these demos,
-download Brazil from sunlabs:</p>
-<p><code>&nbsp;&nbsp;&nbsp;&nbsp;<jump href="http://research.sun.com/research/download/index.html">http://research.sun.com/research/download/index.html</jump></code></p>
-<p>and the java extensions for servlets from Sun:</p>
-<p><code>&nbsp;&nbsp;&nbsp;&nbsp;
-<jump href="http://java.sun.com/products/servlet/download.html">
-http://java.sun.com/products/servlet/download.html</jump>
-</code></p>
-<p>The translet must be specified as a pure class name, accessible
-through the Brazil handler's classpath. For example:</p>
-<p><code>&nbsp;&nbsp;&nbsp;&nbsp;translet=mk054</code></p>
-<p>The document must be specified as a valid URL. For example:</p>
-<p><code>&nbsp;&nbsp;&nbsp;&nbsp;document=http://server/path/to/filename.xml</code></p>
-<p>If the file is local to the Brazil handler, it has to be
-specified using the "file:filename.xml" format.</p>
-<note>You also need to make the Brazil and javax classes available from your classpath</note>
-<p>See also: <link idref="samples" anchor="translets">sample JAXP translets</link>.</p>
-</s2>
-
-<anchor name="xsltctrax"/>
-<s2 title="Translets and TrAX">
-<p>
-The Translet API has been extended to conform with the JAXP1.1 TrAX model.
-This release contains the first implementation of that extension. Two
-new classes have been added to the Translet XSLT codebase, they are:</p>
-<p>(1) <code>org.apache.xalan.xsltc.trax.TransformerFactoryImpl</code> -<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;the Translet implementation of a SAXTransformerFactory.</p>
-<p>(2) <code>org.apache.xalan.xsltc.runtime.TransletTemplates</code> -
-&nbsp;&nbsp;&nbsp;&nbsp;the Translet implementation of a Templates object.</p>
-<p>
-The existing XSLT class 'org.apache.xalan.xsltc.runtime.AbstractTranslet'
-that implements the Translet interface is now also extending the 
-javax.xml.transform.Transformer abstract class.
-</p>
-<p>
-This implementation is only a partial implementation, with many limitations.
-These limitations include:
-</p>
-<ol>
-<li>Currently  'StreamSource' and 'StreamResult' are the only
- TrAX Sources and Results that are supported.</li>
-<li>The translet is compiled everytime a call is made to the<br/>
-<code>TransformerFactoryImpl 'newTransformer()'</code> method.</li>
-<li>The translet is compiled everytime a call is made to the <br/>
-<code>TemplateFactoryImpl 'newTransformer()'</code> method.</li>
-<li>Translet are currently not cached. (See (2) and (3)).</li>
-<li>Several abstract methods from SAXTransformerFactory still need to
-be implemented in the xsltc.runtime.TransformerFactoryImpl class:<br/><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;TemplatesHandler newTemplatesHandler()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;TransformerHandler newTransformerHandler()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;TransformerHandler newTransformerHandler(Source src)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;TransformerHandler newTransformerHandler(Templates templates)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;XMLFilter newXMLFilter(Source src)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;XMLFilter newXMLFilter(Templates templates)</code></li>
-<li>Several abstract methods from Transformer still need to be implemented in the 
-AbstractTranslet class:<br/><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;ErrorListener getErrorListener()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setErrorListener(ErrorListener)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;Properties getOutputProperties()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;String getOutputProperty(String name)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setOutputProperties(Properties props)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setOutputProperty(String name, String value)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;URIResolver getURIResolver()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setURIResolver(URIResolver resolver)</code></li>
-<li>Abstract method from Templates still need to be implemented in the TransletTemplates class:<br/><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;Properties getOutputProperties()</code></li>
-<li>Several abstract methods from TransformerFactory still need to be implemented 
-in the <code>xsltc.runtime.TransformerFactoryImpl</code> class:<br/><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;ErrorListener getErrorListener()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setErrorListener(ErrorListener listener)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;Object getAttribute(String name)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setAttribute(String name, Object value)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;boolean getFeature(String name)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;URIResolver getURIResolver()</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;void setURIResolver(URIResolver resolver)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;Source getAssociatedStylesheet(Source src, String media, String title,</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String charset)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;Templates newTemplates(Source xslSrc)</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;Transformer newTransformer()</code></li>
-<li>Whenever possible, the required methods that are currently unimplemented will throw an 
-exception if someone tries to call them- this will alert the user that the method is not implemented. 
-The message is of the form:<br/><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&lt;Class Name&gt;:&lt;Method Name&gt;( &lt;args&gt; ) not implemented yet.&quot;</code>
-</li>
-</ol>
-</s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/xsltc_history.xml b/xdocs/sources/xalan/xsltc_history.xml
deleted file mode 100644
index 0d88b1a..0000000
--- a/xdocs/sources/xalan/xsltc_history.xml
+++ /dev/null
@@ -1,2264 +0,0 @@
-<?xml version="1.0" standalone="no"?> 
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<s1 title="XSLTC software changes">
-<p>The following sections list <link idref="xsltc_usage">XSLTC</link> changes back to the incorporation of XSLTC into &xslt4j;.</p>
-<s2 title="Changes for &xslt4j; 2.2">
-<p>XSLTC source code updates:</p><ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>A fix to the XPath parser to make sure (again!) that non-prefixed elements
- in XPath expressions/patterns are not assigned the default namespace but
- rather the null namespace.
- PR: bugzilla 4904
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>Modified the order in which top-level elements are parsed. This to make sure
- that xsl:namespace-alias elements are parsed before xsl:import and include,
- so that namespace aliases are global to all included stylesheets.
- PR: bugzilla 4876
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java
- xpath.lex<br/><ref>Committer's log entry: </ref>
-
-
-<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc NodeIterator.java
- java/src/org/apache/xalan/xsltc/dom AbsoluteIterator.java
- CurrentNodeListIterator.java DOMImpl.java
- FilterIterator.java FilteredStepIterator.java
- KeyIndex.java MatchingIterator.java MultiDOM.java
- NodeIteratorBase.java NthIterator.java
- StepIterator.java UnionIterator.java<br/><ref>Committer's log entry: </ref>A fix for the various node iterators cloneIterator() method. This method
- should clear the _isRestartable flag to prevent iterators contained within
- variables and parameters from changing their value. This flag is now wrapped
- inside a setRestartable(boolean flag) method so that the call can be
- propagated down a stack of iterators. This seems to solve many of our
- iterator problems.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apaceh.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler SyntaxTreeNode.java
- XslElement.java<br/><ref>Committer's log entry: </ref>Added a method to the SyntaxTreeNode base class that can be used to check
- the existence of an attribute in the input document: hasAttribute(String 
-name).
- This method is used in the XslElement class to verify the existence of a
- 'namespace' attribute with an empty value.
- PR: bugzilla 4983
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Updated the realToString() method in the runtime library to always output
- numbers on decimal form (and not on Java's "computerized scientific notation."
- PR: bugzilla 4199
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/04/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- RoundCall.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Changed the return-type of the round() function form int to double. The result
- is still rounded (of course), but it is returned as a double to be able to
- return NaN and infinite values.
- PR: bugzilla 2805
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java<br/><ref>Committer's log entry: </ref>I am still fiddling around with predicates containing variable references
- and position filters.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.lex<br/><ref>Committer's log entry: </ref>Reverting previous putback.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Output.java
- java/src/org/apache/xalan/xsltc/compiler/util
- ErrorMessages.java ErrorMessages_no.java
- ErrorMsg.java
- java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Added a warning message for unsupported output encodings.
- PR: bugzilla 5139
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.lex<br/><ref>Committer's log entry: </ref>fixed typo<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>A fix for global parameters whose names contain dots or dashes.
- PR: bugzilla 5328
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>A fix for a bug in the XPath parser. The parser would choke on some XPath
- expressions that contained references to element names that were identical
- to axis names.
- PR: bugzilla 3502
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Added another fix to properly convert ver small floating point numbers to
- strings.
- PR: bugzilla 4199
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>Added a fix for global variables declared in included/imported stylesheets.
- PR: bugzilla 5327
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- MethodGenerator.java<br/><ref>Committer's log entry: </ref>Fix for use of XPath expressions in contexts where there is no 'current'
- node (ie. in top-level elements such as variables and attribute sets).
- PR: bugzilla 5194
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- ResultTreeType.java<br/><ref>Committer's log entry: </ref>A fix for passing result tree fragments and node-sets to external Java
- methods. Node sets and RTFs can both be handled as org.w3c.dom.Node or
- org.w3c.dom.NodeList in the called method.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- ResultTreeType.java<br/><ref>Committer's log entry: </ref>A fix for passing result tree fragments and node-sets to external Java
- methods. Node sets and RTFs can both be handled as org.w3c.dom.Node or
- org.w3c.dom.NodeList in the called method.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added factory creation methods and checks<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>new prototype class, work in progress<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>look for xsltc specific attributes<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>store error listener and or uri resolver locally
- set in real factory when needed<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>12/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- SmartTransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>fixed scope of internal method<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java<br/><ref>Committer's log entry: </ref>Removed some stupid debug timing-loop in the command line Transform tool.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>Removed the main() method from the XSLTC class. This class represents the
- native API of the compiler.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>12/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/dom DTDMonitor.java<br/><ref>Committer's log entry: </ref>A small cleanup in our native API.
- Submitted by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>01/07/2002<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>fixed problem with output content handler creation
- (while running xalan conf tests) in method getOutputHandler(Result).<br/><br/></li></ul>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D14">
-<p>XSLTC source code updates:</p><ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslAttribute.java<br/><ref>Committer's log entry: </ref>Fixed bug for xsl:attribute
- PR: 4175
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Fix for properly creating a SAX InputSource from a TrAX InputStream for
- encapsulating a stylesheet before it is compiled.
- PR: bugzilla 4711 (I hope to God)
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Fix for last putback.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>This fix should take care of a regression introduced by the code that was
- added on the 29.10.2001 to take care of forward referenced variables.
- This little patch ensures that variables that do not have any dependencies
- are kept in order.
- PR: bugzilla 4779
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>Fixed a minor regression after the fix for 3592. A literal number zero was
- always interpreted as an integer zero and never as a double -0 opr 0.0.
- PR: bugzill 4810
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fixed the code that prevents escaping of text inside &lt;script&gt; and &lt;style&gt;
- elements in HTML. The code did not handle upper case element names.
- PR: bugzilla 2517
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>11/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>bug fix 4906<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java
- Template.java xpath.cup<br/><ref>Committer's log entry: </ref>Fix for nested parent location paths / filter parent paths with key() or
- id() root. These paths would in some case returnt he root node when they
- should not.
- PR: bugzilla 4781
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Sort.java<br/><ref>Committer's log entry: </ref>Fix for a big in the &lt;xsl:sort&gt; implementation. The element would not always
- work properly in the innermost loop in nested &lt;xsl:for-each&gt; elements.
- PR: bugzilla 4921
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyTemplates.java
- Sort.java<br/><ref>Committer's log entry: </ref>A fix for a regression introduced by a fix for &lt;xsl:sort/&gt; and nested
- &lt;xsl:for-each/&gt; elements.
- PR: bugzilla 4921
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix to ensure that double quotes are escaped inside attribute values in
- HTML output.
- PR: bugzilla 4845
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyTemplates.java<br/><ref>Committer's log entry: </ref>Fix for a bug caused by &lt;xsl:apply-templates/&gt; not always passing parameters 
-to
- the invoked template(s). Parameters would not be put on the stack if the
- 'select' attribute contained wildcards.
- PR: bugzilla 4718
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- StringType.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Fixed conversion between strings and numbers. Empty strings should return
- 0 and not NaN.
- PR: bugzilla 4783
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Choose.java
- Parser.java SyntaxTreeNode.java Text.java
- java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix for a whole wack of bugs related to text-nodes and handling of whitespace
- and special characters.
- PR: bugzilla 1403, 1520, 3005, 3418 and 3690
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Prevented the namespace-uri() from returning anything for namespace nodes.
- PR: bugzilla 4896
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslElement.java<br/><ref>Committer's log entry: </ref>Added test in &lt;xsl:element&gt; to verify that the local name of the created
- element is legal (must have contents, but no whitespaces or colon).
- PR: bugzilla 4894
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>A small fix for the substring() function to output an empty string if the
- start index is an infinite value.
- PR: bugzilla 4813
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Constants.java
- Stylesheet.java<br/><ref>Committer's log entry: </ref>Fix for XHTML output.
- PR: bugzilla 4904
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Message.java<br/><ref>Committer's log entry: </ref>A cleanup in the Message class. Making way for a fix for 4874
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java<br/><ref>Committer's log entry: </ref>A fix for position predicates used within parameters and variables.
- PR: bugzilla 4783
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslAttribute.java<br/><ref>Committer's log entry: </ref>A small fix needed after a fix for stripping/preserving text nodes. The fix
- for text-nodes caused us to insert text nodes before &lt;xsl:attribute&gt; elements
- in the AST, which again caused the XslAttribute class to complain.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler Message.java
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java MultiDOM.java<br/><ref>Committer's log entry: </ref>Added a new method to the DOM interface for retrieving the DOM as a single
- string. This method is different from the existing getStringValue() in the
- way that it generates element brackets and copies PIs and comments.
- PR: bugzilla 4874
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- FilteredStepIterator.java StepIterator.java
- UnionIterator.java<br/><ref>Committer's log entry: </ref>Updated the StepIterator and FilteredStepIterator's cloneIterator() and
- reset() methods so that the _isRestartable flag is set correctly.
- PR: bugzilla 4905
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java<br/><ref>Committer's log entry: </ref>Another fix for 3005 (special characters inside CDATA).
- PR: bugzilla 3005
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>A fix for decimal formatting
- PR: bugzilla 4901
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler AttributeSet.java<br/><ref>Committer's log entry: </ref>A fix for a regression introduced by a fix for whitespace handling.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler FilterExpr.java
- Predicate.java VariableRefBase.java
- java/src/org/apache/xalan/xsltc/dom
- CurrentNodeListIterator.java DOMImpl.java
- FilteredStepIterator.java KeyIndex.java
- MatchingIterator.java MultiDOM.java
- NthIterator.java StepIterator.java
- UnionIterator.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>A fix for trees of step iterators stored inside variables.
- Also some fixes for recently introduced regressions.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.iorg<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java<br/><ref>Committer's log entry: </ref>A fix for the TrAX API when used from within an environment that does _not_
- use one of the standard classloaders.
- PR: bigzilla 5130
- Obtained from: n/a
- Submitted by: Jochen.Cordes@t-online.de
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Sort.java
- java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java<br/><ref>Committer's log entry: </ref>A fix for multilevel sort-keys. If a set of translets (representing different
- stylesheets) are running one the same JVM, and two or more of these translets
- use NodeSortRecord objects to represent &lt;xsl:sort/&gt; elements, then the number
- of sort keys would be set in the NodeSortRecord _class_ constructor instead of
- being set locally for each occurance of &lt;xsl:sort/&gt;.
- PR: bugzilla 4755
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler CastExpr.java
- EqualityExpr.java Expression.java LastCall.java
- Predicate.java VariableRefBase.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- StepIterator.java<br/><ref>Committer's log entry: </ref>A fix for resetting the source iterator of a node-value iterator.
- PR: bugzilla 5152
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- DecimalFormatting.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>A fix for a few regressions from yesterday.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>A fix to the XPath parser to make sure (again!) that non-prefixed elements
- in XPath expressions/patterns are not assigned the default namespace but
- rather the null namespace.
- PR: bugzilla 4904
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>Modified the order in which top-level elements are parsed. This to make sure
- that xsl:namespace-alias elements are parsed before xsl:import and include,
- so that namespace aliases are global to all included stylesheets.
- PR: bugzilla 4876
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li></ul>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D12 and 2.2.D13">
-<p>XSLTC source code updates:</p><ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>Changed the values for the output properties "OMIT_XML_DECLARATION" and
- "INDENT" from "true" and "false" to "yes" and "no".
- PR: bugzilla 4039
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Updated the getAttribute() method to throw an IllegalArgumentException
- for unknown attributes.
- PR: bugzilla 4046
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler NameBase.java<br/><ref>Committer's log entry: </ref>Fixed a bug in the name() and local-name() functions. The functions would
- use the current node and not the context node when no arguments were given.
- PR: bugzilla 3322
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Updated Mode.java to properly handle patterns matching on node(), comment() 
-and
- processing-instruction(). Also had to make a small change to the 
-setStartNode()
- method in the FollowingIterator (inner class of DOMImpl.java) to properly
- handle attribute-nodes as start nodes. Also, I had to change 
-ParentLocationPath
- to remove duplicates that can be produced by the FollowingIterator when
- started with an attribute node.
- PR: bugzilla 2551
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>A small for for the output property OMIT_XML_DECLARATION
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fix to the transformer implementation to allow for namespace-prefixed
- output properties (output property extensions).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom LoadDocument.java<br/><ref>Committer's log entry: </ref>included a more portable way to create an URI from a File<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime DefaultRun.java<br/><ref>Committer's log entry: </ref>ncluded a more portable way to create an URI from a File<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>ncluded a more portable way to create an URI from a File<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>10/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java<br/><ref>Committer's log entry: </ref>ncluded a more portable way to create an URI from a File<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java
- ParentLocationPath.java Parser.java
- RelationalExpr.java SyntaxTreeNode.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java TextOutput.java<br/><ref>Committer's log entry: </ref>A fix for a few regressions.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix for the "*" pattern. Made it include comment and PI nodes.
- PR: bugzilla 4050
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Committer's log entry: </ref>Fix for the last fix.
- PR: bugzilla 4050
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix for the last fix.
- PR: bugzil.la 4050
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>10/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added catch for malformed url<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java<br/><ref>Committer's log entry: </ref>Modified error handling to extract messages from SAXException. This tool
- will also print the stack trace of the SAXException if the '-x' flag is
- specified (debug turned on).
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Added code to prevent index-out-of-bounds exception in the output handler.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler XSLTC.java
- xpath.cup
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java<br/><ref>Committer's log entry: </ref>Added support for the namespace axis.
- PR: bugzilla 1379
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Committer's log entry: </ref>Missing file from last putback.
- PR: bugzilla 1379
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>A few add'ons to the namespace axis implementation. Added support for
- the namespace-uri() function when applied to namespace nodes.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Code cleanup.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Committer's log entry: </ref>Fix to prevent attribute nodes to be included by the node() pattern.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix for the following:: iterator when started with an attribute node.
- PR: bugzilla 2551
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LiteralElement.java
- Mode.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>A fix to a recent regression after a fix for some axis iterators.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup xpath.lex<br/><ref>Committer's log entry: </ref>Added 4 symbols to the lexiographical analyser (xpath.lex) to recognise
- name-tests with whitespace between the NCName and the "()" brackets.
- PR: bugzilla 4208
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslAttribute.java<br/><ref>Committer's log entry: </ref>Fix to prevent xsl:attributes from not compiling itself into the translet 
-code.
- PR: bugzilla 4175
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- FilterParentPath.java<br/><ref>Committer's log entry: </ref>Enabled node ordering for certain filtered parent paths.
- PR: bugzilla 4178
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java<br/><ref>Committer's log entry: </ref>Changed the node sort record base class so that it places NaN values first
- in the sorted list/node-set.
- PR: bugzilla 3517
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Changed the DOM's copy() function to always copy the necessary namespace
- declaration to the output handler.
- PR: bugzilla 3409 (not complete fix)
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler CallTemplate.java
- DecimalFormatting.java Param.java SymbolTable.java
- Template.java Variable.java VariableBase.java
- WithParam.java
- java/src/org/apache/xalan/xsltc/compiler/util ErrorMsg.java<br/><ref>Committer's log entry: </ref>Cleaned up the compiler's symbol table. Added support for detecting multiple
- defined decimal formatting symbols.
- PR: bugzilla 3872
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler CallTemplate.java
- Template.java VariableBase.java WithParam.java
- XSLTC.java
- java/src/org/apache/xalan/xsltc/compiler/util Util.java<br/><ref>Committer's log entry: </ref>Added/checked proper escaping of 
-template/variable/parameter/attribute-set/etc.
- names. Occurances of the characters '.' and '-' are replaced by '$dot$' and
- '$dash$' respectively in method/variable names. The characters are both
- replaced by an underbar ('_') in the translet class name.
- PR: 2399
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix for getting all attributes from the Xerces parser. Xerces and Crimson
- report attributes differently, and we have to take that into account.
- PR: bugzilla 2465
- Obtained from: n/a
- Submitted by: Douglas Sellers &lt;douglasjsellers@hotmail.com&gt;
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- FilterParentPath.java<br/><ref>Committer's log entry: </ref>Added node ordering to FilterParentPath
- PR: bugzilla 4248
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Changed one of the compare() methods in the basis library to properly
- compare node sets.
- PR: bugzilla 4242
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>Fixed the registerAttribute() method so that it always uses the same
- id for an attribute name.
- PR: bugzilla 4243
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/compiler Param.java.orig<br/><ref>Committer's log entry: </ref>Removed file Param.java.orig
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- VariableBase.java<br/><ref>Committer's log entry: </ref>Changed the variable base class to allow variables to be re-defined in
- a different scope.
- PR: bugzilla 3268
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom MultiDOM.java<br/><ref>Committer's log entry: </ref>Added a node-value iterator to the DOM multiplexer to allow for predicates
- in combination with the document() function.
- PR: bugzilla 3402
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom MultiDOM.java<br/><ref>Committer's log entry: </ref>Fix for variables and parameters containing node sets in stylesheets that
- use the document() function. This fix completes the cloneIterator() method
- of the axis iterators returned by the DOM multiplexer.
- PR: bugzilla 3501
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Added the default xml=http://www.w3.org/XML/1998/namespac namespace
- declaration to the root node of our internal DOM.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom LoadDocument.java
- MultiDOM.java<br/><ref>Committer's log entry: </ref>A fix for determining the current working directory when loading XML
- documents using the document() function. The base URI (that gives you
- the CWD) should normally be taken from the context node, but can also
- be determined by the node/node-set defining the document URI.
- PR: bugzilla 3471
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Gave the parent/sibling stacks in the DOM builder dynamic length.
- PR: bugzilla 3066
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java<br/><ref>Committer's log entry: </ref>Added a '-i' option to the command-line compiler to allow stylesheets to be
- passed in through stdin. The '-i' option must be used with the '-o' option
- to specify a translet name.
- PR: bugzilla 4253
- Obtained from: n/a
- Submitted by: johnh@schemasoft.com (John Howard)
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Include.java
- Stylesheet.java XSLTC.java<br/><ref>Committer's log entry: </ref>Cleaned up the include/import precedence code in Import and Include
- PR: bugzilla 2695
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Fixed output formatting of some floating point numbers.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LogicalExpr.java<br/><ref>Committer's log entry: </ref>Fix for logical expressions that have combinations of not() and "and".
- PR: bugzilla 2351
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>10/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added a empty string systemId in cases where it was
- set to null, slight rearrangment of StreamSource handling code as well.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/compiler header.txt<br/><ref>Committer's log entry: </ref>Fix for names templates. Dashes and dots in template names are now
- escaped using '$dash$' and '$dot$'.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>A fix for a recent regression. A no major change. Just a one-line if to
- test for a potential NPE.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyImports.java
- Mode.java Stylesheet.java Template.java<br/><ref>Committer's log entry: </ref>A major fix for &lt;xsl:apply-imports/&gt;. This element was previously treated
- as &lt;xsl:apply-templates/&gt; but is now handled similar to Java's 'super()'
- method. Note that this is not a complete fix. The rest will come tomorrow
- or the day after. I just wanted to make sure that today's efforts were not
- lost and that they are tested overnight.
- PR: bugzilla 1397
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyImports.java
- DocumentCall.java Stylesheet.java
- SyntaxTreeNode.java
- java/src/org/apache/xalan/xsltc/dom LoadDocument.java<br/><ref>Committer's log entry: </ref>Fixed the document() function so that it will load documents relative to
- either the currently loaded document, or if that fails, relative to the
- location of the original stylesheet.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerHandlerImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fixed the TransformerHandler so that it's Transformer instance can be used
- separateely from the handler itself.
- PR: bugzilla 3873
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Import.java
- Include.java<br/><ref>Committer's log entry: </ref>A fix for resulving relative URIs when using &lt;xsl:include/&gt; and &lt;xsl:import/&gt;
- through TrAX without using a URIResolver.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>Fix for a bug that seemed to be triggered by the sequence in which Xerces'
- lexical handler and content handler were set. The lexical handler must be
- set before the content handler, otherwise Xerces will keep generating the
- first startElement() event over and over again.
- PR: bugzilla 2465
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fixed the general handling of the XML namespace mapping.
- PR: bugzilla 4331
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyImports.java
- Mode.java Stylesheet.java<br/><ref>Committer's log entry: </ref>A fix for setting the scope of templates for an &lt;xsl:apply-imports/&gt; element.
- This fix allows for proper "multiple inheritance" in XSLTC.
- PR: bugzilla 1397
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>Fix to ensure that the order of the -o and -p command line options is
- not significant.
- PR: bugzilla 4343
- Obtained from: n/a
- Submitted by: johnh@schemasoft.com (John Howard)
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler FunctionCall.java<br/><ref>Committer's log entry: </ref>Changed our extension for calling external static Java methods to allow
- both the "http://xml.apache.org/xalan/xsltc/java" namespace and the
- "http://xml.apache.org/xslt/java" namespace (Xalan's namespace for Java
- function calls).
- PR: bugzilla 3994
- Obtained from: n/a
- Submitted by: after numerous requests/suggestions on xalan-dev
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler BinOpExpr.java
- Choose.java DocumentCall.java Number.java
- Otherwise.java StepPattern.java Stylesheet.java
- VariableBase.java VariableRef.java
- VariableRefBase.java When.java XSLTC.java xpath.cup
- java/src/org/apache/xalan/xsltc/compiler/util ErrorMsg.java<br/><ref>Committer's log entry: </ref>Implemented code to resolve forward references and dependencies between
- global variables and parameters.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler UnresolvedRef.java<br/><ref>Committer's log entry: </ref>Missing file from last putback.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyTemplates.java
- AttributeSet.java AttributeValueTemplate.java
- BinOpExpr.java CallTemplate.java ConcatCall.java
- ContainsCall.java CopyOf.java
- DecimalFormatting.java DocumentCall.java
- ElementAvailableCall.java Expression.java
- ForEach.java FormatNumberCall.java
- FunctionAvailableCall.java FunctionCall.java
- If.java Import.java Include.java Instruction.java
- Key.java Output.java Param.java Parser.java
- ProcessingInstruction.java RelationalExpr.java
- StartsWithCall.java StringCall.java Stylesheet.java
- Template.java TopLevelElement.java
- TransletOutput.java UnsupportedElement.java
- UseAttributeSets.java ValueOf.java Variable.java
- VariableBase.java When.java Whitespace.java
- WithParam.java XslAttribute.java XslElement.java
- xpath.cup
- java/src/org/apache/xalan/xsltc/compiler/util ErrorMsg.java<br/><ref>Committer's log entry: </ref>Moved all error messages from the various source files into the ErrorMsg
- class in the compiler/util directory.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java
- Transform.java
- java/src/org/apache/xalan/xsltc/compiler/util ErrorMsg.java
- SlotAllocator.java
- java/src/org/apache/xalan/xsltc/dom LoadDocument.java
- NodeSortRecordFactory.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java BasisLibrary.java
- SAXAdapter.java TextOutput.java
- java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
- TransformerFactoryImpl.java
- TransformerHandlerImpl.java TransformerImpl.java
- XSLTCSource.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- ErrorMessages.java ErrorMessages_en.java
- ErrorMessages_no.java<br/><ref>Committer's log entry: </ref>A first stab at i18n'ing XSLTC. Error and warning messages from the compiler
- and TrAX are handled by the compiler/util/ErrorMsg class, while messages
- from the DOM and runtime/translet are handled by the Basis Library class.
- Only the ErrorMsg class has so far been updated to dynamically read its
- messages from a ResourceBundle. Bundles for British English and Norwegian
- are implemented.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- BooleanType.java ErrorMessages.java
- ErrorMessages_no.java ErrorMsg.java IntType.java
- NodeSetType.java NodeType.java RealType.java
- ReferenceType.java ResultTreeType.java
- StringType.java Type.java VoidType.java<br/><ref>Committer's log entry: </ref>Code cleanup.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom AbsoluteIterator.java
- CurrentNodeListIterator.java DOMImpl.java
- FilterIterator.java FilteredStepIterator.java
- MatchingIterator.java MultiDOM.java
- NodeIteratorBase.java StepIterator.java
- UnionIterator.java<br/><ref>Committer's log entry: </ref>Final code cleanup after i18n work.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- ErrorMessages.java<br/><ref>Committer's log entry: </ref>Removed a typo in console output.
- Submitted by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- java/src/org/apache/xalan/xsltc/compiler/util ErrorMsg.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Added "Compiler Warning" text to output.
- Submitted by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Import.java
- Include.java StepPattern.java
- java/src/org/apache/xalan/xsltc/compiler/util
- ErrorMessages_no.java
- java/src/org/apache/xalan/xsltc/dom LoadDocument.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
- java/src/org/apache/xalan/xsltc/trax
- TemplatesHandlerImpl.java
- TransformerFactoryImpl.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- ErrorMessages_en.java<br/><ref>Committer's log entry: </ref>Localised the runtime/dom packages into Norwegian. This proves that the
- internationalisation work is completed. I also fixed a regression that
- was caused by the error handling being changed.
- PR: n/a (i18n and l10n work)
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>Integrated a fix from John Howard for forcing forward slashes in file paths
- in JAR files and in manifests in JAR files.
- PR: bugzilla 4464
- Obtained from: n/a
- Submitted by: John Howard (johnh@schemasoft.com)
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- Stylesheet.java<br/><ref>Committer's log entry: </ref>Fix for simplified stylesheets. A namespace declaration on the root element
- in the stylesheet (xmlns="http://www.w3.org/TR/xhtml1/strict") caused XSLTC
- to try to match elements in this namespace instead of elements in the null
- namespace.
- PR: bugzilla 3664
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>Removed a regression from yesterday ('version' attribute missing).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Committer's log entry: </ref>Removed default behaviour of text() and "*" in &lt;xsl:apply-imports/&gt;.
- (this element should not invoke built-ins).
- PR: bugzilla 1397
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- java/src/org/apache/xalan/xsltc/runtime SAXAdapter.java<br/><ref>Committer's log entry: </ref>Updated the SAXAdapter used to build result tree fragments to handle comments.
- PR: bugzilla 4172
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Fix for the XPath substring() function.
- PR: bugzilla 4201
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Number.java<br/><ref>Committer's log entry: </ref>Removed the last putback - should never have been done. Big mistake!!!
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DTDMonitor.java<br/><ref>Committer's log entry: </ref>Fix for generating IDs for implied attributes.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Enabled character escaping by default for HTML output. We are now able to
- generate the XSLT and XPath specs without any errors at all.
- PR: bugzilla 3065
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/runtime ErrorMessages.java
- ErrorMessages_no.java<br/><ref>Committer's log entry: </ref>Missing resource bundles for error messages for XSLTC's dom and runtime lib.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>10/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Committer's log entry: </ref>Fixed pattern matching on namespace qualified wildcards, such
- as match="@blob:*".
- PR: bugzilla 2582
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java<br/><ref>Committer's log entry: </ref>Added a fix for predicates that test on node values, where the value to
- test agains is stored in a variable or predicate.
- PR: bugzilla 3501
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java<br/><ref>Committer's log entry: </ref>Fix for re-definitions of variables inside templates (in different scopes).
- PR: bugzilla 3406
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>Potential fix for bug 3416. Will not integrate for performance reasons.
- Code change is commented.
- PR: bugzilla 3416
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java<br/><ref>Committer's log entry: </ref>Removed a desperately bad piece of code that caused XSLTC to misinterpret
- some combinations of parent location paths and predicates.
- PR: bugzilla 4249
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NodeCounter.java<br/><ref>Committer's log entry: </ref>Fix for the formatter used with the xsl:count element.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Sort.java<br/><ref>Committer's log entry: </ref>Fix for sort-elements used with apply-templates elements with no select
- attribute.
- PR: bugzilla 3519
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler PositionCall.java
- java/src/org/apache/xalan/xsltc/dom NodeCounter.java
- SingleNodeCounter.java<br/><ref>Committer's log entry: </ref>A fix for the &lt;xsl:number&gt; element.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org / todd.miller@sun.com
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Sort.java
- java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java
- NodeSortRecordFactory.java<br/><ref>Committer's log entry: </ref>Changed the 'order' and 'data-type' attributes of the &lt;xsl:sort&gt; element
- from plain attributes to attribute value templates. This required a change
- not inly in the way we interpret these attributes but also in the time at
- which these attributes are intrepreted. Since these are not treated as AVTs
- we need to wait until runtime before reading the values of the attributes.
- PR: bugzilla 3835
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler PositionCall.java
- StepPattern.java
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java MultiDOM.java NodeSortRecord.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java.old<br/><ref>Committer's log entry: </ref>Fix for patterns on the format "/foo/*/bar" and "/foo/*[n]/bar".
- PR: bugzilla 4604
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java
- java/src/org/apache/xalan/xsltc/dom
- CurrentNodeListIterator.java DOMImpl.java<br/><ref>Committer's log entry: </ref>Fixed the last() function for the typed and untyped ancestor iterators.
- I also updated our node list iterator (used to implement some predicates)
- to handle the last() function properly for reverse-order axes.
- PR: bugzilla 4602
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslAttribute.java<br/><ref>Committer's log entry: </ref>A fix for a regression after a previous fix for bug 3320.
- PR: bugzilla 4656
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler BinOpExpr.java
- CastExpr.java EqualityExpr.java Expression.java
- LastCall.java LogicalExpr.java PositionCall.java
- Predicate.java RelationalExpr.java Step.java
- StepPattern.java UnaryOpExpr.java<br/><ref>Committer's log entry: </ref>Fix for compound predicates used in patterns.
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- AttributeValueTemplate.java Constants.java
- FilterParentPath.java LiteralAttribute.java
- LiteralElement.java LiteralExpr.java Mode.java
- ParentLocationPath.java Parser.java
- SimpleAttributeValue.java SyntaxTreeNode.java
- Text.java UnionPathExpr.java<br/><ref>Committer's log entry: </ref>A bit of a code cleanup. I also added a small fix for ensuring document order
- of node sets returned by union expressions.
- PR: bugzilla 4677
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Sort.java
- java/src/org/apache/xalan/xsltc/compiler/util
- ErrorMessages.java ErrorMessages_no.java
- ErrorMsg.java<br/><ref>Committer's log entry: </ref>Added a test to verify that &lt;xsl:sort/&gt; elements are only used within
- &lt;xsl:apply-templates/&gt; or &lt;xsl:for-each/&gt; elements.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom Axis.java<br/><ref>Committer's log entry: </ref>Added an array to the Axis class to give an easy indication to the direction
- of an axis.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOMCache.java
- java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/compiler FunctionCall.java
- java/src/org/apache/xalan/xsltc/dom
- NodeSortRecordFactory.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/runtime TransletLoader.java<br/><ref>Committer's log entry: </ref>Added a new TransletLoader class to the runtime package. This class will
- be used only when the default Class.forName() call fails. The forName()
- call will fail if XSLTC is packed in a JAR and installed under
- $JAVA_HOME/jre/lib/ext. This is because the extensions class
- loader is used instead of the bootstrap class loader, and that the
- extensions class loader does not load classes for the default class path.
- But, if the extensions class loader is being used, then we know two things:
-
- (1) XSLTC is running on Java 1.2 or later (when extensions were introduced)
- (2) XSLTC has access to the ClassLoader.getSystemClassLoader() method
-
- This class takes advantage of this and uses a privileged call to this
- method to get a reference to the bootstrap class loader. It then uses this
- class loader to load the desired class.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Added a "debug" attribute to the TransformerFactory implementation.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Removed a debug statement that was left behind after last putback.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java
- StepPattern.java XSLTC.java xpath.cup xpath.lex<br/><ref>Committer's log entry: </ref>Added support for processing-instruction() with a literal parameter for
- use in node tests in expressions and patterns.
- PR: bugzilla 2583
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>11/09/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler
- ProcessingInstructionPattern.java<br/><ref>Committer's log entry: </ref>Forgot this in last putback.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>11/09/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler LongExpr.java<br/><ref>Committer's log entry: </ref>bug fix 3592, new class to handle Long expresssion<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>11/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- xpath.cup xpath.lex Constants.java CastExpr.java<br/><ref>Committer's log entry: </ref>bug fix 3592, handles long now<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>11/09/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler/util LongType.java<br/><ref>Committer's log entry: </ref>bug fix 3592, added new class for Long types<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>11/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util Type.java<br/><ref>Committer's log entry: </ref>bug fix 3592, handles Long types<br/><br/></li></ul>
-</s2>
-<s2 title="Changes for &xslt4j; 2.2.D11">
-<p>XSLTC source code updates:</p><ul><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>bug fix # 3424, memory retension fixed, John Howard contributed fix.<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>bug fix 2807, seth ford's fix<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Include.java
- Import.java<br/><ref>Committer's log entry: </ref>bug fix 3426, gunnlaugur briem's fix<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslAttribute.java<br/><ref>Committer's log entry: </ref>bug fix 3320, gunnlaugur briem's fix<br/><br/></li><li><ref>Committed by </ref>"Gunnlaugur Thor Briem" &lt;gthb@dimon.is&lt;<ref> on </ref>09/06/2001<br/><ref>Committer's log entry: </ref>
-&gt; bug fix 3320, gunnlaugur briem's fix
-&gt;
-&gt;<br/><br/></li><li><ref>Committed by </ref>"G. Todd Miller - XML Tech Ctr - Development" &lt;Glenn.Miller@Sun.COM&gt;<ref> on </ref>09/06/2001<br/><ref>Committer's log entry: </ref>
- &gt;&gt;&gt; bug fix 3320, gunnlaugur briem's fix
- &gt;&gt;&gt;
- &gt;&gt;&gt;<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>updated comments from bug fix 2553<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>bug fix 3360, predicate handling added<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java TextOutput.java<br/><ref>Committer's log entry: </ref>I have updated out output handler to treat this in the same manner as XT does.
- We allow AVT's to create namespace mappings between some prefix and the null
- URI. But, whenever an attribute or element uses a prefix that maps to the null
- URI we replace the prefix with the default prefix. So insead of outputting an
- illegal namespace declaration xmlns:ns1="" and ns1:Attr1="Whatsup" we simply
- output Attr1="Whatsup"
- PR: bugzilla 1518
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java<br/><ref>Committer's log entry: </ref>Modified some of the error messages that are reported by this command-line
- tool to include full and correct error messages.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/dom DOMBuilder.java<br/><ref>Committer's log entry: </ref>Added support for comment nodes in the DOM. This support disappeared when
- we upgraded the DOMBuilder's interface from SAX to SAX2. Added a new
- interface for the DOMBuilder that includes SAX's ContentHandler _and_
- LexicalHandler.
- PR: bugzilla namespace30
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Updated the output handler to URL encode href attributes in HTML output.
- I used the URLEncoder class in java.net
- PR: bugzilla 1512
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>Fixed the default output SAX handler so that it does not indent empty HTML
- tags such as &lt;col&gt; and &lt;br&gt;
- PR: bugzilla 1525
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java TextOutput.java<br/><ref>Committer's log entry: </ref>Fix to prevent character escaping inside &lt;script&gt; and &lt;style&gt; elements in
- HTML output.
- PR: bugzilla 2517
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/compiler BooleanCall.java
- StepPattern.java Variable.java
- java/src/org/apache/xalan/xsltc/compiler/util
- ResultTreeType.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix to always return 'true' when result tree fragments are converted to
- boolean values (because a result tree always has at least one node - root).
- PR: bugzilla 2595
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Added some code to the DOM builder to make sure that text nodes are not
- broken up into smaller fragments.
- PR: bugzilla 3506
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NodeIteratorBase.java
- UnionIterator.java<br/><ref>Committer's log entry: </ref>Fix for the count() function and union iterators. Union iterators would not
- reset all the iterators it contained, and it needed a reset() method.
- PR: bugzilla 3504
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>bug fix 3312, //xx/descendant works now<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NodeIteratorBase.java<br/><ref>Committer's log entry: </ref>Removed a debug statement that was left in here by mistake. Bad, bad, bad!
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- ParentLocationPath.java<br/><ref>Committer's log entry: </ref>added test for ParentLocationPath instance<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>bug fix 3312 completed<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LiteralElement.java
- Param.java ParameterRef.java
- ParentLocationPath.java Variable.java
- VariableBase.java VariableRef.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- MatchingIterator.java ReverseIterator.java
- StepIterator.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
- TextOutput.java
- java/src/org/apache/xalan/xsltc/trax DOM2SAX.java<br/><ref>Committer's log entry: </ref>Several bugfixes and fixes for regressions recently introduced by other
- bugfixes.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java<br/><ref>Committer's log entry: </ref>Fix for parameter references used within predicates.
- PR: bugzilla 3405
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java<br/><ref>Committer's log entry: </ref>Added '-s' option to command-line compilaton tool to precent calls to
- System.exit(); This is needed when the command-line tool is invoked by
- our Java-based test harness.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java<br/><ref>Committer's log entry: </ref>Added test in the method that handles stylesheet PIs in embedded stylesheets.
- This method did not properly test for the existence of stylesheets referenced
- in these PIs (ref. Sun's test embed09).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java
- StepPattern.java TestSeq.java<br/><ref>Committer's log entry: </ref>Fix for predicates used in complex match patterns. The compiler failed to
- produce code that would match on patterns like "blob/*[@attr='str']". It
- would also fail to identify some position predicates such as "blob[$param]".
- Nested parameters were not handled properly either. A pattern such as
- "foo[bar[starts-with(@attr, 'baz')]]" would be broken up and actually
- compiled twice - the outer predicate would be compiled first and the inner
- one after that. This fix makes sure that the predicates are handled together
- as one test, and not as two separate tests.
- PR: bugzilla 1376 (was an id/key problem, now predicates)
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java TextOutput.java<br/><ref>Committer's log entry: </ref>Modified the output handler and SAX handler to produce proper HTML output.
- Special characters in &lt;script&gt; and &lt;style&gt; elements are no longer escaped,
- and end-tags are properly produced (sometimes we would forget the last '&gt;').
- PR: bugzilla 2517
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- MatchingIterator.java StepIterator.java<br/><ref>Committer's log entry: </ref>Verious fixes for iterators.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom BitArray.java
- DupFilterIterator.java KeyIndex.java<br/><ref>Committer's log entry: </ref>A fix in the duplicate filter iterator to ensure that the iterator can be
- reset properly. The iterator was using its own variable for tracking the
- current node (not the base class' _position variable) but did not
- implement the reset() method).
- PR: bugzilla 1430
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler VariableRef.java<br/><ref>Committer's log entry: </ref>Forgot to add this file with my fix for bug 1430.
- PR: bugzilla 1430
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LastCall.java
- ParameterRef.java PositionCall.java Predicate.java
- RoundCall.java VariableRefBase.java<br/><ref>Committer's log entry: </ref>Fix for combination of wildcards and position predicates in match patterns.
- PR: bugzilla 1532
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>09/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler RelationalExpr.java<br/><ref>Committer's log entry: </ref>bug fix 2838, (namedtemplate test)<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix to prevent escaping of the '"' character. This character should only
- be escaped inside attribute values, and not in text nodes.
- PR: bug 2952
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix for ChildrenIterator to speed up last() and position() calls.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom AbsoluteIterator.java<br/><ref>Committer's log entry: </ref>This fix may affect a series of bugs. The AbsoluteIterator (/foo/bar/... etc.)
- did not update its _position variable, causing position() to return wrong
- values if called more than once.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- MethodGenerator.java<br/><ref>Committer's log entry: </ref>Added shortcut to call the reset() method on any iterator.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Fix to ensure that node iterators stored inside parameters are clones for
- each time the parameter is referenced. If this is not done then the node
- iterator will be in an unstable state after it has been referenced once.
- PR: bugzilla 3238
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java<br/><ref>Committer's log entry: </ref>A fix for layers of parent location paths and steps representing an
- XPath pattern/expression like /foo/*/bar
- PR: bugzilla 3311
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ParameterRef.java
- ParentLocationPath.java Predicate.java<br/><ref>Committer's log entry: </ref>Removed a change from yesterday that caused a pretty bad regression in
- the position() and last() functions. Also changed a line un Param.java
- to add more information in debug outout.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix to prevent complaints about illegal namespace declarations in output.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler VariableBase.java
- WithParam.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Added escaping of special characters in parameter names when passed to a
- template using &lt;xsl:with param/&gt;.
- PR: bugzilla 3324
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>amiro@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java<br/><ref>Committer's log entry: </ref>minor edit to usuage for -s option<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java<br/><ref>Committer's log entry: </ref>Added functionality behind the '-s' flag in the Transform command-line tool.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java
- Transform.java<br/><ref>Committer's log entry: </ref>Fixed two compile errors (bad, bad, bad).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler LastCall.java
- PositionCall.java
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java MultiDOM.java<br/><ref>Committer's log entry: </ref>Fixed the getTypedPosition() and getTypedLast() methods of the DOM. These
- were used to implement XPath patterns such as /foo/bar[8]/baz.
- PR: bugzilla 2803
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Added a little method to the output post-processor to replace whitespaces
- in URLs by "%20" sequences. This is all the escaping I think we should
- bother our heads doing.
- PR: bugzilla 1512
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler Constants.java
- Step.java
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java MultiDOM.java NthIterator.java<br/><ref>Committer's log entry: </ref>Two fixes in this one. One to make sure that the context-node is set correctly
- when applying templates using an iterator that has a predicate that tests on
- '.' (the current node), such as select="foo/bar[. = 'blob']". The other fix
- is for the nth position iterator, that failed to count to n backwards in
- cases when the underlying iterator was reverse.
- PR: bugzilla 2954 (two bugs in one, really)
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>A fix for CDATA elements. The tags of CDATA sections were passed through the
- output post-processor's character escaping function but should be passed
- directly to the SAX handler.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- NthIterator.java<br/><ref>Committer's log entry: </ref>The fix for 2954 introduced a regression, so I am pulling out the fix.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NthIterator.java<br/><ref>Committer's log entry: </ref>A revised fix for bug 2954, that does not cause the regressions previously
- sown by some tests.
- PR: bugzilla 2954 (revised fix)
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>A fix for the last() function for children iterators.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fixed the descendant iterator so that it does not return text-nodes
- for descendant::*
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Import.java
- Param.java Stylesheet.java<br/><ref>Committer's log entry: </ref>Fix for resolving mutiple defined global parameters and variables. The
- Import class has been fixed to set import precedences properly, and the
- Param class has been changed to use the import precedence to resolve
- between multiple definitions of the same variable/parameter.
- PR: bugzilla 3404
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- ClassGenerator.java<br/><ref>Committer's log entry: </ref>Forgot this file in my last update.
- Submitted by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/24/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- NthIterator.java<br/><ref>Committer's log entry: </ref>Another fix for the preceding-sibling iterator. It appeared that this
- iterator returned its nodes in the wrong order, and this was the reason
- why the position iterator (used to implement preceding-siblling::*[n])
- did not return the correct node. It is quite amazing that this iterator
- has been returning nodes in the wrong order for so long without any of
- us notising, and hopefully this fix will help eliminate a few of our
- open bugs.
- PR: bugzilla 2954
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Param.java
- Stylesheet.java Variable.java VariableBase.java<br/><ref>Committer's log entry: </ref>Fix to resolving multiple defined global variables or parameters.
- PR: bugzilla 3404
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Optimisation for string-2-int and real-2-int conversions.
- PR: bugzilla 3448
- Obtained from: n/a
- Submitted by: John Howard (johnh@schemasoft.com)
- Reviewed by: morten@xml.apache.org<br/><br/></li>
-  <li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Param.java
- Step.java Variable.java VariableBase.java xpath.cup
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Fix for nth-position typed descendant iterators (previously not fully
- implemented).
- PR: bugzilla 3468
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix for our handling of the &lt;xsl:comment? element.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Param.java
- Variable.java<br/><ref>Committer's log entry: </ref>Removed previous attempt to fix forward references in globar vars.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>Fix for allowing LRE as top-level elements in the stylesheet (they will be
- ignored).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java<br/><ref>Committer's log entry: </ref>Fix to make sure all num-numeric values are grouped last in numeric sorts.
- PR: bugzilla 3517
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- NodeIteratorBase.java<br/><ref>Committer's log entry: </ref>A fix to ensure that the current position of any iterator is always kept
- updated. The returnNode() method of the NodeIteratorBase base class updates
- the _position variable for each returned node. This method should be called
- by the next() method of any iterator, except for next() methods that call
- super.next() (because this method calls returnNode() and so _position
- would be incremented twice or more for one returned node).
- PR: bugzilla 3816
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Updated the information returned by the system-property() function.
- xsl:verision returns "1.0"
- xsl:vendor returns "Apache Xalan XSLTC" - must be different from Xalan!!!"
- xsl:vendor-url returns "http://xml.apache.org/xalan-j"
- PR: bugzilla 3470
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>Fix to allow indentation to be turned off XML/HTML output.
- PR: bugzilla 3469
- Obtained from: n/a
- Submitted by: Douglas J. Sellers (douglasjsellers@hotmail.com)
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Output.java
- Parser.java Stylesheet.java<br/><ref>Committer's log entry: </ref>Fix to make sure the one, and only one, xsl:output element is compiled
- per translet (import precedence taken into account).
- PR: bugzilla 3099
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Changed BasisLibrary.formatNumer() (this is the implementation of
- format-number()) so that it correctly formats NaNs into "NaN".
- PR: bugzilla 2890
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Another little update to format-number() to make sure it returns
- "Infinity" and "-Infinity" for infinite numbers.
- PR: bugzilla 2889
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Stylesheet.java<br/><ref>Committer's log entry: </ref>Changed the order in which a stylesheet parses its top-level elements.
- PR: bugzilla 3812
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java
- java/src/org/apache/xalan/xsltc/dom NthIterator.java<br/><ref>Committer's log entry: </ref>Removed a bug in the NthIterator iterator that prevented the iterator from
- properly being reset. This bug manifested itself if the Nth iterator was
- wrapped inside a step iterator.
- PR: bugzilla 3419
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java<br/><ref>Committer's log entry: </ref>Added node-ordering for preceding iterators when used in apply-templates
- or value-of elements.
- PR: bugzilla 3463
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java<br/><ref>Committer's log entry: </ref>Removed debug statement in Step.java
- Submitted by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DupFilterIterator.java<br/><ref>Committer's log entry: </ref>Modified the DupFilterIterator so that it also orders nodes.
- PR: bugzilla 3466
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/26/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Step.java<br/><ref>Committer's log entry: </ref>Fix after a regression for preceding-sibling::* iterator.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li>
- <li><ref>Committed by </ref>morten@apache.org<ref> on </ref>09/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc Translet.java
- java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/dom
- NodeSortRecordFactory.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java
- java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
- TransformerImpl.java<br/><ref>Committer's log entry: </ref>A fix for the problem with loading auxiliary classes for sorting when
- called from TrAX API.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li></ul>
-</s2>
-<s2 title="XSLTC source code updates for &xslt4j; 2.2.D10">
-<p>XSLTC source code updates:</p>
-<ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java<br/><ref>Committer's log entry: </ref>I added a flag to the compiler/Parser class that is set if the outermost 
-element
- in the stylesheet contains a definition of the XSL namespace. The parser 
-already
- has a global variable '_target' that is set if the stylesheet contains a
- &lt;?xml-stylesheet?&gt; PI or not. The compiler will now flag an error if neither
- flags are set after the whole XSL/XML input document has been parsed.
- PR: bugzilla 1780
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler UnionPathExpr.java<br/><ref>Committer's log entry: </ref>Added a small fix that orders the expressions inside a union in such a way 
-that
- expressions with an attribute axis or attribute node type will be put first.
- PR: bugzilla 2921
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java<br/><ref>Committer's log entry: </ref>A small fix that will allow top-level elements of an unknown URI.
- XSLTC now ignored the element(s), while it previously reported an error
- of an unsupported XSLT extension.
- PR: bugzilla 2840
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java DefaultSAXOutputHandler.java
- TextOutput.java<br/><ref>Committer's log entry: </ref>A start on a fix for output DOCTYPE declarations based on the attributes
- of the &lt;xsl:output&gt; element. I also added a fix for bug 2863, to prevent
- us from outputting namespace delcaration that point a prefix to the null
- URI (such as 'xmlns:blob=""').
- PR: bugzilla 2863
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>bug 2553, fixes AbbreviatedAbsoluteLocationPath,
- some relative location paths still give duplicates, will need to filter.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/compiler Output.java
- java/src/org/apache/xalan/xsltc/runtime DefaultRun.java
- DefaultSAXOutputHandler.java TextOutput.java
- java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>Implemented support for the doctype-system and doctype-public attributes
- of the &lt;xsl:output/&gt; element. The translet post-processor (TextOutput) can
- now be instanciated with a ContentHandler and an optional LexicalHandler.
- The LexicalHandler will receive notofications of the DOCTYPE declaration.
- The default SAX output handler now implements both ContentHandler and
- LexicalHandler. The LexicalHandler only handles the startDTD() method,
- by outputting the DOCTYPE declaration, and all other methods are empty.
- The trax.Transformer implementation has also been updated to use the
- LexicalHandler, but I still have not found any way in which a SAX client
- can set the LexicalHandler.
- PR: bugzilla 1504
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslElement.java<br/><ref>Committer's log entry: </ref>A minor change to the class handling the &lt;xsl:element&gt; element to be more
- in-sync with the XSLT 1.0 spec (and M.Kay's book). This in order to make
- it more readable and maintainable. I was trying to debug the code for
- something I thought was a bug, and it was just impossible to navigate.
- This change was necessary, even though the code functioned as it should.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LiteralElement.java
- Parser.java<br/><ref>Committer's log entry: </ref>Fix for outputting all necessary namespace declarations with LREs.
- PR: bugzilla 2863
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom ReverseIterator.java<br/><ref>Committer's log entry: </ref>A fix to allow reverse iterators to be reset (inside nested for-each loops).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/15/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/dom DupFilterIterator.java<br/><ref>Committer's log entry: </ref>bug fix 2553, new iterator to get rid of dups<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/15/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler
- FilteredAbsoluteLocationPath.java<br/><ref>Committer's log entry: </ref>bug fix 2553, new abs location path<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup
- Constants.java<br/><ref>Committer's log entry: </ref>bug fix 2553, updated Constants for dup processing
- and updated CUP rule for AbbreviatedAbsoluteLocationPaths<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom AbsoluteIterator.java
- DOMImpl.java DupFilterIterator.java
- StepIterator.java UnionIterator.java<br/><ref>Committer's log entry: </ref>Implementation of id() and key() pattern - finally!
- Added a small fix to the DOMImpl$DescendantIterator to prevent NPEs.
- PR: bugzilla 1376
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler IdKeyPattern.java
- KeyCall.java Mode.java Output.java Parser.java
- TestSeq.java xpath.cup<br/><ref>Committer's log entry: </ref>Forgot an 'import' in DupFilterIterator
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc TransletOutputHandler.java
- java/src/org/apache/xalan/xsltc/dom DupFilterIterator.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java DefaultSAXOutputHandler.java
- SAXAdapter.java TextOutput.java
- TransletOutputBase.java<br/><ref>Committer's log entry: </ref>missing file<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>Added another fix for the missing DOCTYPE declaration. XSLTC will now output
- DOCTYPE declarations for HTML output if either doctype-system or doctype-
- public is declared in the &lt;xsl:output&gt; element. XSL output will get a
- DOCTYPE declaration only if doctype-system is declared.
- PR: 1504
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom AbsoluteIterator.java<br/><ref>Committer's log entry: </ref>
-
-
-<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>turning on filtering, bug 2553<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DupFilterIterator.java<br/><ref>Committer's log entry: </ref>Removed a bad optimisation in the duplicate filter iterator.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler xpath.cup<br/><ref>Committer's log entry: </ref>re-activated the no dups filtering, dont know how
- this got reverted back to no filtering, but it is fixed again.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler IdKeyPattern.java
- Key.java KeyCall.java Parser.java Sort.java
- xpath.cup
- java/src/org/apache/xalan/xsltc/compiler/util
- CompareGenerator.java NodeSortRecordGenerator.java
- java/src/org/apache/xalan/xsltc/dom DTDMonitor.java
- DupFilterIterator.java KeyIndex.java
- NodeSortRecord.java NodeSortRecordFactory.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java BasisLibrary.java<br/><ref>Committer's log entry: </ref>Major update for id() and key(). Patterns containing id() and key() are
- now 100% supported (about time), and id() and key() expressions should
- now work in all (at least most) combinations.
- PR: bugzilla 1376 (!!!) and 2624
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>A small fix for a cleanup I did in the basis library (it broke the
- substring() function)&gt;
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Added small fix to prevent NPE in output handler.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc TransletOutputHandler.java
- java/src/org/apache/xalan/xsltc/compiler Variable.java
- VariableRef.java VariableRefBase.java
- java/src/org/apache/xalan/xsltc/compiler/util
- MultiHashtable.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
- TextOutput.java TransletOutputBase.java<br/><ref>Committer's log entry: </ref>Added element/attribute prefix information in the internal DOM.
- This should fix some problems we have had with the copy and copy-of
- elements. Added a few lines of code in an attempt to speed up the DOM builder.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DTDMonitor.java<br/><ref>Committer's log entry: </ref>An attempt to optimise the building of the ID index. The previous version of
- this code would traverse the DOM once for each type of element that had a
- defined ID attribute. The new version traverses the DOM once, and looks up
- each element's type in a hashtable to determine its ID attribute type (if 
-any).
- The new version of the code does not use string comparisons, like the old one.
- This update was done to compensate for the possible performance degradation of
- having implemented an element/attribute prefix array in the internal DOM.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/21/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TemplatesHandlerImpl.java TemplatesImpl.java
- TransformerHandlerImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Protected some methods in our TrAX code that are not defined in the TrAX API.
- These methods were never intended for public use and should have been defined
- as "protected" to begin with.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/22/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslElement.java<br/><ref>Committer's log entry: </ref>Fix for a problem with some combinations of &lt;xsl:element&gt; and namespace
- aliasing. The output lacked the necessary namespace definitions when an
- element created with &lt;xsl:element&gt; was given a qname with a prefix that
- was mapped to some other prefix.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ParameterRef.java<br/><ref>Committer's log entry: </ref>removed typeCheck(), uses the base classes method now<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- VariableRefBase.java<br/><ref>Committer's log entry: </ref>added default typeCheck() to this base class<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler RelationalExpr.java<br/><ref>Committer's log entry: </ref>bug fix 2838, cast to type real if both operands are
- ResultTreeType<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler
- AbsoluteLocationPath.java AbsolutePathPattern.java
- AncestorPattern.java ApplyTemplates.java
- BooleanExpr.java CallTemplate.java CastExpr.java
- Constants.java Copy.java CopyOf.java
- DocumentCall.java FilterExpr.java
- FilteredAbsoluteLocationPath.java ForEach.java
- FunctionCall.java Key.java KeyCall.java
- LastCall.java LocalNameCall.java Mode.java
- NameCall.java NamespaceUriCall.java Number.java
- Param.java ParameterRef.java
- ParentLocationPath.java ParentPattern.java
- PositionCall.java Predicate.java
- RelationalExpr.java Sort.java Step.java
- StepPattern.java Stylesheet.java
- SyntaxTreeNode.java Template.java TestSeq.java
- Text.java TransletOutput.java ValueOf.java
- Variable.java VariableRef.java Whitespace.java
- XSLTC.java
- java/src/org/apache/xalan/xsltc/compiler/util
- ClassGenerator.java ErrorMsg.java
- MethodGenerator.java NodeSetType.java NodeType.java
- ResultTreeType.java
- java/src/org/apache/xalan/xsltc/dom Axis.java
- DOMAdapter.java DOMImpl.java LoadDocument.java
- MultiDOM.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java BasisLibrary.java<br/><ref>Committer's log entry: </ref>Changes all calls from the compiled translet code to the DOM to be calls
- to the DOM interface (and not to a specific DOM class). I did this to make
- it possible to plugi in any DOM implementation.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc TransletOutputHandler.java
- java/src/org/apache/xalan/xsltc/compiler Constants.java
- TransletOutput.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java DefaultSAXOutputHandler.java
- TextOutput.java TransletOutputBase.java<br/><ref>Committer's log entry: </ref>Added an &lt;xsltc:output&gt; extension to allow for multiple output files. I know
- that this is not a prioritised task, but I need this for a little project I
- am working on.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Param.java
- ParameterRef.java Variable.java VariableBase.java
- VariableRef.java
- java/src/org/apache/xalan/xsltc/compiler/util
- NodeSetType.java NodeType.java ReferenceType.java
- ResultTreeType.java StringType.java Type.java<br/><ref>Committer's log entry: </ref>A few fixes for the regression caused by my last (huge) putback.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DupFilterIterator.java<br/><ref>Committer's log entry: </ref>A fix for the position() function when using duplicate filter iterators.
- PR: n/
- Obtained from: N/A
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li>
- <li><ref>Committed by </ref>amiro@apache.org<ref> on </ref>08/30/2001<br/><ref>Modified: 
- </ref>java/src/org/apache/xalan/xsltc/runtime SAXAdapter.java<br/><ref>Committer's log entry: </ref>
- Submitted by: Tom Amiro  
- I just added an empty close method to resolve the build problem.<br/><br/></li> 
- </ul>
-</s2>
-<s2 title="XSLTC source code updates for &xslt4j; 2.2.D9">
-<p>XSLTC source code updates:</p><ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Integrated fix for problem with count() function for certain iterators.
- PR: Bugzilla 1407
- Obtained from: n/a
- Submitted by: John Howard &lt;johnh@schemasoft.com&gt;
- Reviewed by: Morten Jorgensen &lt;morten@xml.apache.org&gt;<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/30/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc DOM.java
- java/src/org/apache/xalan/xsltc/compiler EqualityExpr.java
- FilterParentPath.java Parser.java Predicate.java
- Step.java SyntaxTreeNode.java Variable.java
- XSLTC.java
- java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
- DOMImpl.java MultiDOM.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java DefaultSAXOutputHandler.java
- TextOutput.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Added code that will speed up predicates such as //foo[@attr=$var],
- //foo[bar = $var] and //foo/[@attr = 'str'].
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Expression.java
- Param.java ParameterRef.java Predicate.java
- Stylesheet.java SyntaxTreeNode.java Variable.java
- VariableRef.java WithParam.java<br/><ref>Committer's log entry: </ref>Fix for parameter and variable handling. This fix makes sure variable slots
- are released once a variable goes out of scope. I have also extracted common
- functionality from Variable and Param into VariableBase, and similarly
- extracted some functionality from VariableRef and ParameterRef into a new
- class VariableRefBase. This can potentially make some code more efficient as
- one can test for 'if (blob instanceof VariableBase)' instead of testing on
- both Variable and Param.
- PR: Bugzilla 2661 and 2699
- Obtained from: n/a
- Submitted by: John Howard &lt;JohnH@schemasoft.com&gt;
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/31/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler VariableBase.java
- VariableRefBase.java<br/><ref>Committer's log entry: </ref>Forgot to add these two in my last putback.
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java
- Step.java Stylesheet.java XSLTC.java<br/><ref>Committer's log entry: </ref>Removed type-cast error in Stylesheet.java
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler VariableBase.java
- java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>Removed some of the linefeeds we output in the default SAX output handler
- to produce output more similar to Saxon (for testing purposes).
- Added a test for null-pointers in the new VariableBase class.
- PR: bugzilla 2922 &amp; 2598
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org`<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/31/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom NodeCounter.java<br/><ref>Committer's log entry: </ref>Added a small fix to prevent unwanted output when using the xsl:number
- element.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Constants.java
- If.java Key.java Predicate.java Step.java When.java
- java/src/org/apache/xalan/xsltc/compiler/util
- CompareGenerator.java
- java/src/org/apache/xalan/xsltc/dom NodeCounter.java
- java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>A few changes to make our output look more like Saxon's (to simplyfy
- test diffs).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/01/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java
- DOM2SAX.java<br/><ref>Committer's log entry: </ref>add support for DOMResult handling<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/01/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax SAX2DOM.java<br/><ref>Committer's log entry: </ref>work in progress, converted needed for DOMResult<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>added setting of systemId in DOMSource handling<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax SAX2DOM.java
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerHandlerImpl.java<br/><ref>Committer's log entry: </ref>Added an implementation of the TransformerHandler interface of TrAX/JAXP.
- Implemented the 4 methods in TransformerFactory to instanciate this
- TransformerHandler implementation.
- Added an attribute of the TransformerFactory which contains the default
- name for generated translet classes (the default name is GregorSamsa from
- Kafka's Metemorphosis), but should be set by the user in cases where the
- Templates implementation cannot get the systemId from the Source object.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java
- TransformerHandlerImpl.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax
- TemplatesHandlerImpl.java<br/><ref>Committer's log entry: </ref>Added missing TemplatesHandlerImpl file (implementation of the TrAX
- TemplatesHandler interface).
- Added initial implementation of getAssociatedStylesheet() in
- the TransformerFactoryImpl class.
- Changed behaviour of TransformerHandlerImpl class with regard to
- the setResult() method. This method now has to be called before
- startDocument() is called, which gives XSLTC the same behaviour
- as Xalan.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/02/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- XSLTC.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Added support for the TransformerFactory's getAssociatedStylesheet()
- method. Added similar methods to the native XSLTC API, as they can come
- in handy.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Constants.java
- DocumentCall.java
- java/src/org/apache/xalan/xsltc/dom LoadDocument.java<br/><ref>Committer's log entry: </ref>Fix for the document() function. The code compiled by DocumentCall now
- passes the context URI to the LoadDocument.document() method, and the
- document() method resolves the base/new URIs and constructs an absolute
- path/URI to the document to load.
- PR: bugzilla 2832
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax DOM2SAX.java<br/><ref>Committer's log entry: </ref>new recursive parse(InputSource) implemented<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax DOM2SAX.java<br/><ref>Committer's log entry: </ref>upated<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax DOM2SAX.java<br/><ref>Committer's log entry: </ref>updated again<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- java/src/org/apache/xalan/xsltc/trax SAX2DOM.java<br/><ref>Committer's log entry: </ref>Fix to get around problem with Crimson. Crimson does not like attribute-
- nodes to be created with 'null' or "" namespace URI. Added an if-test to
- invoke setAttribute(name, value) instead of setAttributeNS(uri, name, value).
- Had to add a little test to DOMImpl$DOMBuilder.makeAttributeNode() to get
- around an internal NPE problem.
- PR: n/a
- Obtained from: n.a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/03/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler CopyOf.java
- Step.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- UnionIterator.java<br/><ref>Committer's log entry: </ref>Fix for union-iterators wrapping one or more attribute-iterators.
- Attributes should be wrapped in TypedAttributeIterator objects and not
- SingletonIterator objects when they occur insude unions.
- Fix for copying attribute nodes using &lt;xsl:copy&gt; and &lt;xsl:copy-of&gt;
- PR: bugzilla 2603
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom LoadDocument.java<br/><ref>Committer's log entry: </ref>Added code behind the document() function to force the parser to be
- namespace aware (Crimson is pr. default, Xerces is not).
- PR: bugzilla 2862
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix to prevent escaping of attribute values in HTML output.
- PR: bugzilla 3003
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fix for grouping a sequence of text nodes inside one CDATA section.
- PR: bugzilla 3005
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ForEach.java
- xpath.cup
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>Fix for passing node-sets as parameters into a template with a for-each loop.
- The ForEach class resets its node iterator by default. This behaviour is not
- desierd for iterators that are passed in through a parameter, so I added an
- it-test that checks if the iterator is of type 'Reference'.
- PR: bugzilla 2468
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- AbsolutePathPattern.java<br/><ref>Committer's log entry: </ref>Fix for a certain combination of absolute path patterns and ancestor patterns,
- such as &lt;xsl:template match="/foo//*"/&gt;.
- PR: bugzilla 2836
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler DocumentCall.java<br/><ref>Committer's log entry: </ref>Fix for document() function. Prevents run-time error.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslElement.java<br/><ref>Committer's log entry: </ref>Added a test to the &lt;xsl:element&gt; element to verify that the element name
- given in the 'name' attribute contains something other than an empty string.
- PR: bugzilla 2794
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LiteralElement.java<br/><ref>Committer's log entry: </ref>Applied a fix to our class for handling literal result elements. The only
- attributes in the XSLT namespace we handle in LREs are exclude-result-prefixes
- and extension-element-prefixes. We have a test to check if an attribute is
- in the XSLT namespace, and if it is we ignore the attribute. This test was
- placed before the test for the two XSLT attributes we do want to handle,
- causing us to ignore all xsl:exclude-result-prefixes attributes in LREs.
- PR: bugzilla 1506
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Attribute.java
- AttributeSet.java Copy.java UseAttributeSets.java
- XslAttribute.java
- java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Fix and performance improvement for attribute sets.
- PR: bugzilla 2536
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>08/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Copy.java<br/><ref>Committer's log entry: </ref>Fix for use of attribute sets with the xsl:copy element. We were a bit too
- restrictive in our tests to see if it was safe to send the attributes to
- the output handler. We only compiled in a test to see if the copied node
- was an elment, but should also have tested if the xsl:copy element's
- parent node was a LRE or a xsl:element element.
- PR: bugzilla 2538
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li></ul>
-</s2>
-<s2 title="XSLTC source code updates for &xslt4j; 2.2.D8">
-<p>XSLTC source code updates:</p><ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Added support for SAXSource and SAXResult in TransformerFactoryImpl
- and TransformerFactory. I had to add a new consturctor the the
- default SAX output handler (in the xsltc runtime library) to acommodate
- the SAXResult TrAX output handler.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Added default error-reporting behaviour for our trax code (error messages
- are dumped to System.err).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>in progress, adding DOMSource support<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>07/20/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax DOM2SAX.java<br/><ref>Committer's log entry: </ref>new class, DOM2SAX, supports DOMSources, in progress<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Import.java
- Include.java Stylesheet.java XSLTC.java
- java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler SourceLoader.java<br/><ref>Committer's log entry: </ref>Added a SourceLoader interface to the compiler package. This interface can
- be used to plug in an external document loader for imported and/or
- included stylesheets. The trax.TransformerImpl class is updated to
- implement this interface and act as an adapter between the internal XSLTC
- SourceLoader interface and TrAX's URIResolver interface.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@apache.org
- Reviewed by: morten@apache.org<br/><br/></li><li><ref>Committed by </ref>amiro@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime Constants.java<br/><ref>Committer's log entry: </ref>Added the NAMESPACE_FEATURE constant. Checked to see if it was in
- org.xml.sax first, but it wasn't. Since this constant is used both
- at compile and runtime, it should be in the runtime Constants class
- as well as the compile Constants class. Runtime code needs to be
- kept separate from the compile time code.<br/><br/></li><li><ref>Committed by </ref>amiro@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime DefaultRun.java
- java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/dom DocumentCache.java<br/><ref>Committer's log entry: </ref>Added import for org.apache.xalan.xsltc.runtime.Constants;
- to the runtime classes that need to use the NAMESPACE_FEATURE constant
- and had them reference it rather than define it themselves.<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>minor changes for DOMSource impl support<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Added DOMSource support for stylesheet<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>07/20/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax DOM2SAX.java<br/><ref>Committer's log entry: </ref>updated convertor which supports DOMSource impl<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>Added a small fix to the compiler (XSLTC.java) to make sure that the SAX
- parser reference was not reset prior to compiling the translet.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Added support for DOMSource as input to our Transformer implementation<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Import.java
- Sort.java
- java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java
- NodeSortRecordFactory.java<br/><ref>Committer's log entry: </ref>For some reason I decided to optimise the &lt;xsl:sort&gt; functionaility. The
- sort records we used has some global values stored behind methods, but are
- now static fields. Somewhat faster.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Import.java
- Include.java<br/><ref>Committer's log entry: </ref>Fix for problem with import &amp; include introduced with the latest updated
- for TrAX URIResolvers.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Integrated fix for problem with count() function for certain iterators.
- PR: Bugzilla 1407
- Obtained from: n/a
- Submitted by: John Howard &lt;johnh@schemasoft.com&gt;
- Reviewed by: Morten Jorgensen &lt;morten@xml.apache.org&gt;<br/><br/></li></ul>
-</s2>
-<s2 title="XSLTC source code updates for &xslt4j; 2.2.D7">
-<ul><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/09/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Constants.java
- Param.java StepPattern.java Stylesheet.java
- SyntaxTreeNode.java Variable.java WithParam.java
- java/src/org/apache/xalan/xsltc/dom KeyIndex.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java BasisLibrary.java
- DefaultRun.java Parameter.java TextOutput.java<br/><ref>Committer's log entry: </ref>Loads of small fixes and a good few comments added to the source code.
- The major fixes are one fix for variable/parameter handlingi and one for
- key/id index handling. XSLTC now correctly updates the value of parameters
- with changing default values, such as with
- &lt;xsl:param name="foo" select="current()"/&gt;.
- Also updated bit-arrays to correctly return single node ids, so that the
- key() and id() functions return the correct number of nodes (they would
- sometimes skip the first node in the defined node set for the key/id).
- Added some structure and loads of comments to the Translet base class.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/10/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- AncestorPattern.java AttributeSet.java
- CallTemplate.java CastExpr.java EqualityExpr.java
- Expression.java FunctionCall.java If.java
- Import.java Include.java Mode.java NameBase.java
- Param.java ParameterRef.java Parser.java
- StepPattern.java SyntaxTreeNode.java Template.java
- TestSeq.java Variable.java VariableRef.java
- XSLTC.java XslAttribute.java
- java/src/org/apache/xalan/xsltc/compiler/util ErrorMsg.java
- ReferenceType.java
- java/src/org/apache/xalan/xsltc/dom MultiDOM.java
- StepIterator.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>A wide range of fixes provided by Erwin Bolwidt.
- o) fix for long IF and GOTO instructions inside translets.
- 'wide' GOTOs are now used (GOTO_W) instead of plain GOTO
- to allow longer jump offsets
- o) fix for illegal field/method names in the translet.
- Methods and fields no longer contain the '.' or '-' characters
- o) source filenames (and if possible also line numbers) are now
- provided with error and warning messages
- o) external functions that are not supported by XSLTC do not cause
- compile errors. They will still cause a warning message at
- compile-time if they are not wrapped in proper &lt;xsl:if&gt; or
- &lt;xsl:when&gt; elements that test on the availability of the function,
- and will cause a runtime error if the function is attempted called.
- o) added type cast from reference-type to node-type
- o) some other smaller fixes to prevent null-pointer exceptions
- Other changes:
- o) code cleanup and some added comments
- PR: n/a
- Obtained from: n/a
- Submitted by: Erwin Bolwidt &lt;ejb@klomp.org&gt;
- Reviewed by: Morten Jorgensen &lt;morten@xml.apache.org&gt;<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- SyntaxTreeNode.java XSLTC.java<br/><ref>Committer's log entry: </ref>Cleaned up the XSLTC compiler class in an attempt to make it more flexible.
- This class was originally written as a command-line interface, but it has
- now grown huge and messy. I separated the command-line stuff from the
- methods that make up the actual functionality and made some methods public.
- This is part of the preparation for our new implementation of the JAXP
- Templates object.
- PR: n/a
- Obtained from: n.a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime DefaultRun.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java
- Transform.java<br/><ref>Committer's log entry: </ref>Extracted the command-line stuff from the core XSLTC packages. The command-
- line handling is now in xalan.xsltc.cmdline.Compile and
- xalan.xsltc.cmdline.Transform. The command-line stuff is still left in
- xalan.xsltc.compiler.XSLTC and xalan.xsltc.runtime.DefaultRun for backwards
- compatability. This should be removed shortly.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/cmdline Compile.java
- java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/cmdline/getopt GetOpt.java
- GetOptsException.java IllegalArgumentException.java
- MissingOptArgException.java
- java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
- TransformerImpl.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/util/getopt GetOpt.java
- GetOptsException.java IllegalArgumentException.java
- MissingOptArgException.java<br/><ref>Committer's log entry: </ref>Moved the org.apache.xalan.xsltc.util.getopt package to
- org.apache.xalan.xsltc.cmdline.getopt. Also added some skeleton
- code in a new org.apache.xalan.xsltc.trax directory.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransletTemplates.java<br/><ref>Committer's log entry: </ref>minor adjustment
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>removed obselete try/catch<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java
- java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/trax TransletTemplates.java<br/><ref>Committer's log entry: </ref>A first stab at our new TrAX design.`
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java
- java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>A few minor adjustments to yesterdays JAXP/TrAX implementation. These is one
- change in the way the compiler (XSLTC) generates bytecode arrays, and the
- rest is basically a cleanup of error reporting and a few added comments.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/16/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DocumentCache.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax OutputSettings.java<br/><ref>Committer's log entry: </ref>Reduced the refresh rate of the DocumentCache to 1 second.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>amiro@apache.org<ref> on </ref>07/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DocumentCache.java<br/><ref>Committer's log entry: </ref>Submitted by: Tom Amiro
- Fixes bug 1591. Changed the lastModified() method to return
- the correct timestamp for local files beginnig with the "file:"
- protocol. Incorporated Brian Ewin's suggestion to use URLdecode.
- Todd Miller and Morten Jorgensen<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java
- java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
- TransformerFactoryImpl.java TransformerImpl.java<br/><ref>Committer's log entry: </ref>Added some javadoc comments to our trax stuff. Added preliminary support
- for getting/setting output properties, and for getting/setting URL resolvers.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc TransletOutputHandler.java
- java/src/org/apache/xalan/xsltc/cmdline Transform.java
- java/src/org/apache/xalan/xsltc/compiler Output.java
- Stylesheet.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java DefaultRun.java
- DefaultSAXOutputHandler.java SAXAdapter.java
- StringValueHandler.java TextOutput.java
- TransletOutputBase.java<br/><ref>Committer's log entry: </ref>A series of changes to the XSLTC output handling to accomodate the
- set/getOutputSettings() methods in the TrAX API.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Fixed the handling of the 'cdata-section-elements' attribute of the
- &lt;xsl:output&gt; element. Previously we output the whole element, including
- all contents, child elements and the start- and end-tags in one big
- CDATA section. We now correctly output only immediate text child-nodes
- as CDATA sections.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc Translet.java
- java/src/org/apache/xalan/xsltc/dom LoadDocument.java
- java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java
- java/src/org/apache/xalan/xsltc/trax TransformerImpl.java<br/><ref>Committer's log entry: </ref>Added implementation of get/setOutputProperties() of the Transformer
- implementation.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>07/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DocumentCache.java<br/><ref>Committer's log entry: </ref>Added (a rather brutal) handling of all Exceptions thrown in the
- DocumentCache.getLastModified() method. This class is provided only
- as an example/skeleton, but should still - for various reasons -
- be provided in the base 'xsltc.dom' package.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li></ul>
-</s2>
-<s2 title="XSLTC source code updates for the &xslt4j; 2.2.D releases up to and including 2.2.D6">
-<ul><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>05/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Text.java<br/><ref>Committer's log entry: </ref>bug fix 1403, output escaping fixed<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>05/23/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>bug fix 1403, output escaping fixed<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java<br/><ref>Committer's log entry: </ref>stylesheet compilation error listening added for
- TrAX support<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>stylesheet compilation error listening added for
- TrAX support<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>stylesheet compilation error listening added for
- TrAX support<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>Transformer factory's setErrorListener() now throws
- IllegalArgumentException is listener is null<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>translet transformation errors now forwarded to
- TrAX error listener when applicable<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/05/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>translet transformation errors now forwarded to
- TrAX error listener when applicable<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime AttributeList.java<br/><ref>Committer's log entry: </ref>Added a constructor for copying an org.xml.sax.Attributes to our
- org.apache.xalan.xsltc.runtime.AttributeList.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ApplyImports.java
- ApplyTemplates.java Attribute.java
- AttributeSet.java AttributeValueTemplate.java
- BinOpExpr.java CallTemplate.java Comment.java
- ConcatCall.java Constants.java Copy.java
- CopyOf.java DecimalFormatting.java
- DocumentCall.java Expression.java Fallback.java
- ForEach.java FormatNumberCall.java
- FunctionAvailableCall.java FunctionCall.java
- If.java Import.java Include.java Key.java
- LiteralAttribute.java LiteralElement.java
- LiteralExpr.java LogicalExpr.java Message.java
- NamespaceAlias.java Number.java Output.java
- Param.java Parser.java ProcessingInstruction.java
- QName.java RelationalExpr.java Sort.java
- Stylesheet.java SymbolTable.java
- SyntaxTreeNode.java Template.java Text.java
- TransletOutput.java UnaryOpExpr.java ValueOf.java
- Variable.java When.java Whitespace.java
- WithParam.java XSLTC.java XslAttribute.java
- XslElement.java xpath.cup
- java/src/org/apache/xalan/xsltc/compiler/util
- MethodType.java<br/><ref>Committer's log entry: </ref>Removed the intermediate DOM used to contain the input document (the
- stylesheet) for the compiler. The compiler now uses SAX2 to import
- the stylesheet, and all references to DOM interfaces have been removed.
- This means that most classes representing XSL elements have been
- changed, but most classes representing XPath functions, expressions
- and patterns are unchanged.
- PR: After suggestion from Scott Boag
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler
- UnsupportedElement.java<br/><ref>Committer's log entry: </ref>Adding a class for handling unsupported stylesheet elements
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Minor fix to make sure that attributes are processed in the correct order.
- PR: n/a
- Obtained from: n.a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>Minor change in output indentation/line feeds.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xmp.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- LocationPathPattern.java Parser.java Template.java<br/><ref>Committer's log entry: </ref>Fixed the code that resolves conflicts between templates with identical
- patterns. The order of the templates is not taken into account - after
- import precedence and priority has been checked.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- DefaultSAXOutputHandler.java<br/><ref>Committer's log entry: </ref>Reverted changes to SAX output handler.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/06/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- Template.java xpath.cup<br/><ref>Committer's log entry: </ref>unified Parser error reporting to use Mortens
- reportError routine<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/07/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler BinOpExpr.java
- FunctionCall.java Otherwise.java Param.java
- RelationalExpr.java Stylesheet.java
- SyntaxTreeNode.java Variable.java When.java
- XSLTC.java XslElement.java<br/><ref>Committer's log entry: </ref>Updated a few classes that were still calling Parser.addError(),
- Parser.addWarning() and Parser.addFatalError() to use the new common
- error handler Prarser.reportError(int category, ErrorMsg message).
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Parser.java
- java/src/org/apache/xalan/xsltc/runtime DefaultRun.java<br/><ref>Committer's log entry: </ref>Added two lines of code to explicitly set the feature
- "http://xml.org/sax/features/namespaces" of the SAXParser to "true".
- The default is "true" but xerces seems to set it to "false", and this
- caused some problems for our Stylesheet and XML doc parsers (which are
- both using SAX2).
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Constants.java
- Parser.java
- java/src/org/apache/xalan/xsltc/runtime DefaultRun.java<br/><ref>Committer's log entry: </ref>A few more changes to make sure the parsers used are namespace aware.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/08/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LiteralElement.java
- SyntaxTreeNode.java XslAttribute.java
- XslElement.java<br/><ref>Committer's log entry: </ref>The change from using DOM to using SAX in the stylesheet input caused some
- of the elements in the Abstract Syntax Tree (AST) to be out of order. I
- added a few lines of code to the xsl:element/attribute handling code to
- fix this.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler AttributeSet.java
- Choose.java Constants.java If.java
- LiteralElement.java Stylesheet.java
- UseAttributeSets.java When.java XSLTC.java
- XslAttribute.java<br/><ref>Committer's log entry: </ref>This putback contains three fixes:
- o) fix for complex &lt;xsl:attribute-set&gt; inheritance structures
- o) fix for xsl:element-available() function used in &lt;xsl:when&gt; or
- &lt;xsl:if&gt; to test support for various extension elements
- o) fix for preserving namespace prefixes for &lt;xsl:attribute&gt; output.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Constants.java
- UseAttributeSets.java ValueOf.java
- XslAttribute.java
- java/src/org/apache/xalan/xsltc/compiler/util
- AttributeSetMethodGenerator.java<br/><ref>Committer's log entry: </ref>Fix to allow iterator access within attribute sets. This is necessary for
- attribute sets that contain attributes whose values are generated by XSL
- functions such as position() and last().
- Obtained from: test mk013
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime TextOutput.java<br/><ref>Committer's log entry: </ref>Added output character escaping for non-breaking space characters.
- I cannot believe we've waited this long before doing this. Madness!
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java
- Parser.java<br/><ref>Committer's log entry: </ref>support for java.io.InputStream StreamSources<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/11/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransletTemplates.java<br/><ref>Committer's log entry: </ref>support for java.io.InputStream StreamSources<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LogicalExpr.java<br/><ref>Committer's log entry: </ref>Fix for bug 1511. Predicates on the format ((a or b) and c) are not
- handled correctly. I added a small piece of code to direct the true-list
- of the OR expression to the beginning of the AND test.
- PR: Bugzilla 1511
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
- TextOutput.java<br/><ref>Committer's log entry: </ref>Fix attribute node-set comparisons. There was a bug in one of the compare()
- methods of the BasisLibrary class which prevented attribute values from
- being compared. The method compared node IDs instead of node values.
- Pretty stupid bug, but now it is solved anyway.
- PR: Bugzilla 1409
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Mode.java<br/><ref>Committer's log entry: </ref>Fix to make sure that the implicit "text()" pattern is run when templates
- containing "text()" in their pattern fail. XSLTC would not previously
- invoke the built-in pattern for "text()" if a stylesheet contained a
- template such as &lt;xsl:template pattern="foo/bar/text()" .../&gt;
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XslElement.java<br/><ref>Committer's log entry: </ref>Modified test for legal element names in &lt;xsl:element&gt;. The element name is
- treated as an attribute value. Whitespaces are not allowed in plain text
- element names, but should be allowed inside "{...}" attribute values.
- PR: Bugzilla 1489
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>A fix for the preceding:: iterator
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom DOMImpl.java<br/><ref>Committer's log entry: </ref>Minor re-adjustment to last fix for preceding:: iterator
- PR: 1407
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ForEach.java
- XSLTC.java<br/><ref>Committer's log entry: </ref>Fix to prevent compiler warnings to be output more than once.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler AttributeSet.java<br/><ref>Committer's log entry: </ref>Final fix (for now) for attribute sets. In cases where multiple
- &lt;xsl:attribute-set.../&gt; elements make up one attribute set (ie. they share
- the same name) attributes that occured last in the stylesheet will take
- precedence.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/12/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added support for java.io.InputStream StreamSources<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LogicalExpr.java<br/><ref>Committer's log entry: </ref>Fix for code handling logical expressions and combinations of logical
- expressions. Mindblowing stuff, but it now seems to work as it should.
- Added another few lines of code to properly direct the program flow in
- compiled predicates with various combinations of "and" and "or" expressions.
- PR: Bugzilla 1511
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/13/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/dom SingletonIterator.java<br/><ref>Committer's log entry: </ref>Fix for singleton iterators encapsulating variable references.
- PR: Bugzilla 1412
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/14/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LiteralElement.java<br/><ref>Committer's log entry: </ref>Added one-line fix to prevent null-pointer error. Simple code cleanup.
- PR: n/a
- Obtained from: suggestion by Guoliang Cao &lt;cao@ispsoft.com&gt;
- Submitted by: cao@ispsoft.com
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/15/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler LogicalExpr.java<br/><ref>Committer's log entry: </ref>Fix to prevent compile-time null-pointer exceptions for certain logical
- expressions. Some nexted AND-expressions would cause this error because
- their true-list would not be backpatched. This would result in an
- instruction list with one or more branch instructions with no target,
- such as a GOTO(null) or an IFEQ(null) instruction.
- PR: none, bug found in test run and fixed immediately
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>curcuru@apache.org<ref> on </ref>06/17/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler
- AbsoluteLocationPath.java ApplyImports.java
- ApplyTemplates.java CastExpr.java CopyOf.java
- DocumentCall.java EqualityExpr.java Expression.java
- FilterExpr.java FilterParentPath.java ForEach.java
- FunctionCall.java IdKeyPattern.java Key.java
- KeyCall.java NameBase.java ParentLocationPath.java
- Parser.java Predicate.java RelationalExpr.java
- Step.java UnionPathExpr.java
- java/src/org/apache/xalan/xsltc/compiler/util
- NodeSetType.java NodeType.java ReferenceType.java
- ResultTreeType.java Type.java
- java/src/org/apache/xalan/xsltc/dom UnionIterator.java
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>OK, I'm going to make a wild guess and assume that sboag's recent commit
- of /NodeSet/NodeSetDTM/ got a little out of control and shouldn't have
- gone down into org.apache.xalan.xsltc - undone to fix compile error<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/18/2001<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- NodeSetType.java<br/><ref>Committer's log entry: </ref>Removing NodeSetType (renamed to NodeSetDTMType).
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util Type.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- NodeSetDTMType.java<br/><ref>Committer's log entry: </ref>
-<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/18/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler/util Type.java<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- NodeSetType.java<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/compiler/util
- NodeSetDTMType.java<br/><ref>Committer's log entry: </ref>
-
-
-<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/19/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ContainsCall.java
- FunctionCall.java If.java LogicalExpr.java
- Param.java QName.java StartsWithCall.java
- SymbolTable.java SyntaxTreeNode.java Template.java
- Variable.java xpath.cup
- java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java<br/><ref>Committer's log entry: </ref>Fix for function calls used as clauses in logical expressions.
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>Tom.Amiro@Sun.COM<ref> on </ref>06/19/2001<br/><ref>Committer's log entry: </ref>
-&gt; Fix for function calls used as clauses in logical expressions.
-&gt; Submitted by: morten@xml.apache.org
-&gt; Reviewed by: morten@xml.apache.org
-&gt;
-&gt;<br/><br/></li><li><ref>Committed by </ref>Morten.Jorgensen@sun.com<ref> on </ref>06/19/2001<br/><ref>Committer's log entry: </ref>
-&gt; &gt; Fix for function calls used as clauses in logical expressions.
-&gt; &gt; Submitted by: morten@xml.apache.org
-&gt; &gt; Reviewed by: morten@xml.apache.org
-&gt; &gt;
-&gt; &gt;<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added check to see if stylesheet is already an URL<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransletTemplates.java<br/><ref>Committer's log entry: </ref>added check to see if stylesheet is already an URL<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/25/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/runtime TrAXFilter.java<br/><ref>Committer's log entry: </ref>proto<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/25/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>removed debug statements<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/26/2001<br/><ref>Removed: </ref>java/src/org/apache/xalan/xsltc/runtime TrAXFilter.java
- TransformerFactoryImpl.java TransletTemplates.java<br/><ref>Committer's log entry: </ref>in process of moving these to new subdir<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/26/2001<br/><ref>Added: </ref>java/src/org/apache/xalan/xsltc/trax TrAXFilter.java
- TransformerFactoryImpl.java TransletTemplates.java<br/><ref>Committer's log entry: </ref>moved from runtime subdir to its own trax subdir<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>fixed bug with deriving translet name from
- stylesheet name that included paths, e.g. /tmp/foo.xsl<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java<br/><ref>Committer's log entry: </ref>This update allows variables that contain references to result-tree fragments
- to be used inside position filters.
- PR: n/a
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/runtime
- AbstractTranslet.java<br/><ref>Committer's log entry: </ref>added url handling in doTransform<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax
- TransformerFactoryImpl.java<br/><ref>Committer's log entry: </ref>added a new sys property called 'transletPool'
- to allow user to set the destination directory for generated translets<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/trax TransletTemplates.java<br/><ref>Committer's log entry: </ref>added a new sys property called 'transletPool'
- to allow user to set the destination directory for generated translets<br/><br/></li><li><ref>Committed by </ref>tmiller@apache.org<ref> on </ref>06/27/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler XSLTC.java<br/><ref>Committer's log entry: </ref>made private method setDestDirectory() public to
- support the new transletPool system property.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/28/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Predicate.java
- Step.java Stylesheet.java VariableRef.java
- java/src/org/apache/xalan/xsltc/compiler/util
- MethodGenerator.java NodeSortRecordGenerator.java
- ResultTreeType.java TestGenerator.java<br/><ref>Committer's log entry: </ref>Various bugfixes in the way auxiliary classes access variables/fields in
- the main translet class. Fixes a few VAR tests and customer tests.
- Pmorten@xml.apache.org:<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler Choose.java
- ElementAvailableCall.java
- FunctionAvailableCall.java Parser.java When.java<br/><ref>Committer's log entry: </ref>Fix for element-available() and function-available() calls. Ties these
- calls to tables in the XSL parser and the symbol-table (the actual
- implementation) instead of using redundant and not-up-to-date tables
- in the classes that implement the X-avaiable() calls.
- I also cleaned up the Choose call so that it now properly handles
- all types of function calls in the xsl:when elements' test clause.<br/><br/></li><li><ref>Committed by </ref>morten@apache.org<ref> on </ref>06/29/2001<br/><ref>Modified: </ref>java/src/org/apache/xalan/xsltc/compiler ForEach.java
- Param.java Variable.java
- java/src/org/apache/xalan/xsltc/compiler/util
- MethodGenerator.java<br/><ref>Committer's log entry: </ref>Added a fix for local variables inside nested xsl:for-each elements.
- Local variables are usually not initialized to any default value (such as
- with general Java classes), because code compiled for &lt;xsl:variable&gt;
- elements always assign values to variable slots before they are accessed.
- But the code structure generated by nested &lt;xsl:for-each&gt; elements is too
- much for the JVMs verifier to get around, so we have to initialize all
- local variables inside such loops to zero, false, null, whatever.
- This takes care some of our runtime-errors caused by apparent corrupt code.
- (The JVMs verifier thinks that it is corrupt, but it isn't really.)
- PR: none
- Obtained from: n/a
- Submitted by: morten@xml.apache.org
- Reviewed by: morten@xml.apache.org<br/><br/></li></ul>
- </s2>
- <s2 title="XSLTC Changes for &xslt4j; 2.1.0">
-<p>The Sun XSLTC team (david.hofert@east.sun.com, tom.amiro@east.sun.com, todd.miller@east.sun.com, 
-morten.jorgensen@Ireland.sun.com) has checked <link idref="xsltc_usage">XSLTC</link> into the Xalan
-source tree, and we have begun the process of merging XSLTC into Xalan. XSLTC provides a compiler for compiling
-stylesheets into translets, and a streamlined runtime environment for using translets to transform XML input. 
-In the near term, XSLTC will appear in a separate JAR file (xsltc.jar) with its own API and command-line
-utilities. You can already use the same JAXP interfaces to perform
-transformations with the Xalan transformer and with translets. Over time, we plan to merge the two codebases.
-<ref>See <jump href="xsltc/index.html">XSLTC Design Documents</jump>.</ref></p>
-<p>Since this is the first release of XSLTC on Apache (xml.apache.org), changes are  
-relative to Preview 5 of XSLTC posted on www.sun.com/xml/developers.</p>
-<ul>
-  <li>Simplified stylesheets are now implemented.</li>
-  <li>Base package name has changed from <code>com.sun.xslt</code> to <code>org.apache.xalan.xsltc</code></li>
-  <li>You no longer have to get the BCEL.jar file; it is included in the distribution.</li>
-  <li>The Project X parser components and APIs have all been replaced with JAXP equivalents. 
-  Consequently, you may deploy XSLTC with JAXP-conformant parsers, such as Xerces or Crimson.</li>
-  <li>Previously undocumented feature: -x. You can use the -x option on the java command line when you
-  compile translets or run them to get more detailed information on errors.</li>
-  <li>Addition of -s to DefaultRun - a new -s option has been added to the DefaultRun class 
-  for use with test auotmation. When you use the option, it prevents System.exit() from being called when 
-  and exception is encountered.</li>
-</ul>
-</s2> 
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalan/xsltc_usage.xml b/xdocs/sources/xalan/xsltc_usage.xml
deleted file mode 100644
index 329ae12..0000000
--- a/xdocs/sources/xalan/xsltc_usage.xml
+++ /dev/null
@@ -1,655 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="Using XSLTC">
-
-<ul>
-<li><link anchor="intro">Introduction</link></li>
-  <li><link anchor="classpath">Setting the system classpath for XSLTC</link></li>
-  <li><link anchor="compile">Compiling translets from the command line</link></li>
-  <li><link anchor="run">Running translets from the command line</link></li>
-  <li><link anchor="api">Calling XSLTC with the TrAX/JAXP API</link></li>
-  <li><link anchor="native_api">Calling XSLTC with the native API</link></li>
-  <li><link anchor="constraints">XSLTC usage constraints</link></li>  
-</ul>
-<p>See also: <jump href="xsltc/index.html">XSLTC Design</jump></p>
-<anchor name="intro"/>
-<s2 title="Introduction">
-<p>XSLT provides a compiler and a runtime processor. Use the compiler to compile an XSL stylesheet into a translet, a set of Java classes. Use the runtime processor to apply the translet to an XML document and perform a transformation.</p>
-<note>To compile translets, you must be running the JDK or JRE 1.2 or higher. You can run translets with the JDK or JRE 1.1.8 or higher.</note>
-</s2><anchor name="classpath"/>
-<s2 title="Setting the system classpath for XSLTC">
-<p>To compile translets, run translets, and use the XSLTC API, put the following on the system classpath:</p>
-<table>
-<tr>
-  <th>Classes or JAR</th>
-  <th>To compile a translet</th>
-  <th>To run a translet</th>
-  <th>To use the XSLTC API</th>
-</tr>
-<tr>
-  <td>the translet</td>
-  <td></td>
-  <td>required</td>
-  <td>required</td>  
-</tr>
-<tr>
-  <td>xsltc.jar</td>
-  <td>required</td>
-  <td>required</td>
-  <td>required</td>  
-</tr>
-<!-- TWA - xml.jar has old project x stuff; was able to compile and run without it -->
-<!--
-<tr>
-  <td>xml.jar</td>
-  <td>required</td>
-  <td>required</td>
-  <td>required</td>  
-</tr>
--->
-<tr>
-  <td>runtime.jar</td>
-  <td>required</td>
-  <td></td>
-  <td>required</td>  
-</tr>
-<tr>
-  <td>BCEL.jar</td>
-  <td>required</td>
-  <td></td>
-  <td>required</td>  
-</tr>
-<tr>
-  <td>Jlex.jar</td>
-  <td></td>
-  <td></td>
-  <td>required</td>  
-</tr>
-<tr>
-  <td>java_cup.jar</td>
-  <td></td>
-  <td></td>
-  <td>required</td>  
-</tr>
-</table>
-<p>The JAR files listed above are in the &xslt4j; bin directory. The translet is the set of class files or the JAR file that you generate with the compiler; see <link anchor="compile">Compiling translets</link>.</p>
-<p>If you are using JDK or JRE 1.1.8, also include classes.zip on the classpath. If you are using JDK or JRE 1.2, include tools.jar on the classpath.</p>
-<note>For the time being, the Xalan processor and XSLT do not yet use the same DOM, SAX, and parser infastructures. Accordingly, you may find it necessary to reset the system classpath each time you switch between the Xalan processor and XSLTC. For information on setting the classpath for the Xalan processor, see <link idref="getstarted" anchor="classpath">Setting the system classpath for Xalan</link>.</note>
-</s2>
-<anchor name="compile"/>
-<s2 title="Compiling translets from the command line">
-    <ul>
-      <li><link anchor="comp-synopsis">Synopis</link></li>
-      <li><link anchor="comp-args">Flags and arguments</link></li>
-      <li><link anchor="comp-examples">Examples</link></li>
-    </ul>
-	<p>The XSLT Compiler is a Java-based tool for compiling XSLT
-	stylesheets into lightweight and portable Java byte codes 
-	called translets.</p>  
-
-	<p>The XSLT Compiler can be run on any platform including UNIX,
-	Windows, NT, or Mac that supports Java 1.2.x or later. The generated
-	translets can be run on any platform that supports a Java
-	Runtime Environment, including a Palm Pilot with J2ME CLDC 
-	(Java 2 Micro Edition, Connected Limited Device Configuration).</p>
-    
-    <p>To run the compiler from the command line or a script, <link anchor="classpath">set the classpath</link> and 
-    run the XSLTC class with the appropriate flags and arguments (described below).</p>
-    <anchor name="comp-synopsis"/>
-<s3 title="Synopsis">
-<p>
-<code>java org.apache.xalan.xsltc.compiler.XSLTC</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;[-o &lt;output&gt;] [-d &lt;directory&gt;] [-j &lt;jarfile&gt;]</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp;[-p &lt;package name&gt;] [-u] &lt;stylesheet&gt;...</code></p> 
-
-</s3><anchor name="comp-args"/>
-<s3 title="Flags and arguments">
-	<p>The following flags and arguments are supported:</p>
-
-<source>-o &lt;output&gt;
-   Specifies the name of the generated translet class.
-   If you omit this argument, the translet class is
-   named &lt;stylesheet&gt;. Translets are written as 
-   .class files.
-
--d &lt;directory&gt;
-   Specifies the destination directory. If you omit
-   this argument, the translet class files are placed
-   in the current working directory.
-
--j &lt;jarfile&gt;
-   Outputs the generated translet class files into a 
-   jar file named &lt;jarfile&gt;.jar. When this option is 
-   used, only the jar file is output.
-
--p &lt;package name&gt;
-   Specifies a package name for the generated translet
-   classes.		
-
--u  &lt;stylesheet&gt;
-  Specifies the stylesheet with a URI such as 
-  'http://myserver/stylesheet1.xsl'.
-
-   &lt;stylesheet&gt;
-   (No flag) The pathname of the stylesheet file.</source>
-
-</s3><anchor name="comp-examples"/>
-<s3 title="Examples">
-	<p>The following examples assume that you have already set the classpath to include the translet and the required JAR
-    files (see <link anchor="classpath">setting the system classpath</link>).</p>
-
-	<p><em>Example 1:</em>  Creating a translet from the hamlet.xsl stylesheet.</p>
-	<p><code>java org.apache.xalan.xsltc.compiler.XSLTC</code><br/>
-    <code>&nbsp;&nbsp;&nbsp;&nbsp; hamlet.xsl</code></p>    
-    <p>Example 1 produces a set of class files such as hamlet.class, hamlet$0.class, hamlet$1.class.</p>	
-
-	<p><em>Example 2:</em>  Outputting to a JAR file.</p>
-    <p><code>java org.apache.xalan.xsltc.compiler.XSLTC</code><br/>
-    <code>&nbsp;&nbsp;&nbsp;&nbsp; -j hamlet.jar hamlet.xsl</code></p>
-    <p>Example 2 produces hamlet.jar, which contains the translet class files.</p>	
-
-	<p><em>Example 3:</em> Specifying the translet class name. </p> 
-	<p><code>java org.apache.xalan.xsltc.compiler.XSLTC</code><br/>
-    <code>&nbsp;&nbsp;&nbsp;&nbsp; -o newhamlet hamlet.xsl</code></p>
-    <p>Example 3 producs a set of class files such as newhamlet.class, newhamlet$0.class, etc., rather than hamlet.class,
-    hamles$0.class, etc.</p>
-
-
-	<p><em>Example 4:</em> Compiling multiple stylesheets.</p>
-	<p><code>java org.apache.xalan.xsltc.compiler.XSLTC</code><br/>
-    <code>&nbsp;&nbsp;&nbsp;&nbsp; hamlet1.xsl hamlet2.xsl hamlet3.xsl</code></p>
-    <p>Example 4 produces three translets and set of class files derived from the three stylesheets.</p>
-
-	<p><em>Example 5:</em> Package Specification.</p>
-	<p><code>java org.apache.xalan.xsltc.compiler.XSLTC</code><br/>
-    <code>&nbsp;&nbsp;&nbsp;&nbsp; -p com.mycompany.translets hamlet.xsl</code></p>
-    <p>Example 5 produces a set of class files such as com/mycompany/translets/hamlet.class,
-	com/mycompany/translets/hamlet$0.class', etc.</p>
-</s3>
-</s2><anchor name="run"/>
-<s2 title="Running translets from the command line">
-    <ul>
-      <li><link anchor="run-synopsis">Synopis</link></li>
-      <li><link anchor="run-args">Flags and arguments</link></li>
-      <li><link anchor="run-examples">Examples</link></li>
-    </ul>
-
-    <p>The Sun XSLT runtime processor is a Java-based tool for 
-	transforming XML document files using a translet (compiled 
-	stylesheet). </p>
-
-	<p>The XSLT processor can be run on any platform including UNIX,
-	Windows, NT, Mac that supports Java, including a Palm Pilot
-	with J2ME CLDC (Java 2 Micro Edition, Connected Limited Device
-	Configuration).</p>
-    
-    <p>To run  translet from the command line or a script, <link anchor="classpath">set the classpath</link> (be sure to include
-     the translet) and run the translset with the appropriate flags and arguments (described below).</p>
-<anchor name="run-synopsis"/>
-<s3 title="Synopsis">
-<p><code>java &lt;translet&gt;</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp; {-u &lt;document_url&gt; | &lt;document&gt;} &lt;class&gt;</code><br/>
-<code>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;name1&gt;=&lt;value1&gt; ...]</code></p>
-
-</s3><anchor name="run-args"/>
-<s3 title="Flags and arguments">
-
-	<p>The following flags and arguments are supported:</p>
-
-<source>-u
-   Specifies the XML input &lt;document&gt; with a URI,
-   such as 'http://myserver/hamlet.xml'.		
-
-Arguments wirhout flags:
-
-   &lt;document&gt;     		
-   Filename of the XML input document. 
-   
-   &lt;document_url&gt;     	
-   URI of the XML input document (see the -u flag above). 
-
-   &lt;class&gt;
-   The translet that performs the transformation. The translet
-   may take a set of stylesheet parameters specified as
-   name-value pairs. The format for a name-value pair is
-   &lt;name&gt;=&lt;value&gt;.</source>
-</s3><anchor name="run-examples"/>
-<s3 title="Examples">
-
-	<p>The following examples assume that you have already set the classpath to include the translet and the required JAR
-    files (see <link anchor="classpath">setting the system classpath</link>).</p>
-    <p>A possible variation: You have set the classpath to include the required JAR files, but when you run the translet,
-    you use the java -cp flag to add the current working directory (containing the translet class files you have just generated)
-    to the classpath.</p>
-    <p><ref>Windows:</ref><code> java -cp .;%CLASSPATH% ...</code><br/>
-       <ref>UNIX:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ref><code> java -cp .:$CLASSPATH ...</code></p>
-    
-    <p><em>Example 1:</em> Processing an XML document.</p>
-
-	<p><code>java org.apache.xalan.xsltc.runtime.DefaultRun</code><br/>
-       <code>&nbsp;&nbsp;&nbsp;&nbsp;  hamlet.xml hamlet</code></p> 
-
-	<p>Example 1 uses the specified translet (hamlet) to transform the specified XML input document (hamlet.xml). 
-    The XML input document is in the current working directory. The translet was created by using
-    org.apache.xalan.xslt.compiler.XSLTC to compile an XSL stylesheet (hamlet.xsl). </p>
-
-	<p><em>Example 2:</em> Passing stylesheet parameters to the translet.</p>
-
-	<p><code>java org.apache.xalan.xsltc.runtime.DefaultRun</code><br/>
-       <code>&nbsp;&nbsp;&nbsp;&nbsp; hamlet.xml hamlet</code><br/>
-       <code>&nbsp;&nbsp;&nbsp;&nbsp; speaker=HAMLET 'scene=SCENE IV'</code></p>
-
-	<p>Example 2 passes "HAMLET" to the stylesheet for the stylesheet parameter named speaker, and "SCENE IV" for the
-    stylesheet parameter named scene. The second name-value pair was placed in single quotes to 
-    specify a value containing a space.</p>
-    
-    <p><em>Example 3:</em> Processing an XML input document specified with a URI.</p>
-
-	<p><code>java org.apache.xalan.xsltc.runtime.DefaultRun</code><br/>
-       <code>&nbsp;&nbsp;&nbsp;&nbsp;  -u http://zarya.east/test.xml hamlet</code></p>
-
-	<p>Example 3 applies the translet (hamlet) to the XML input document (http://zarya.east/test.xml hamlet). Inclusion of
-    the flag (-u) is optional.</p>
-</s3>
-</s2><anchor name="api"/>
-<s2 title="Calling XSLTC with the TrAX/JAXP API">
-<p>G. Todd Miller has begun integrating the translet with the TrAX/JAXP 1.1 API. See <jump href="xsltc/xsltc_trax.html">The Translet API &amp; TrAX</jump>. Accordingly, it is now possible to set a system property and use a TransformerFactory to generate a Transformer that performs a transformation by compiling and running a translet.</p>
-
-
-<p>When you use the JAXP 1.1 API to run &xslt4j;, the <code>javax.xml.transform.TransformerFactory</code> system property is set to <code>org.apache.xalan.processor.TransformerFactoryImpl</code>. As it currently stands, this Xalan implementation of TransformerFactory always uses the Xalan Transformer to perform transformations. To use translets to perform transformations, set this system property to <code>org.apache.xalan.xsltc.trax.TransformerFactoryImpl</code>. For information on setting this and related system properties designating XML parsere and XSL transformer, see <link idref="usagepatterns" anchor="plug">Plugging in a Transformer and XML parser</link>.</p>
-<p>To Use the JAXP 1.1 API to perform transformations with translets do the following:</p>
-<ol>
-  <li>Set the <code>javax.xml.transform.TransformerFactory</code> system property as indicated above.<br/><br/></li>
-  <li>Instantiate a TransformerFactory.<br/><br/></li>
-  <li>Assuming you want to perform a series of transformations with the same translet, use the TransformerFactory and a
-   StreamSource XSL stylesheet to generate a Templates object (the translet). If you are performing a single
-   transformation, use the TransformerFactory and the StreamSource object to instantiate a Transformer.<br/><br/></li>
-  <li>Perform the transformation, using a StreamSource object for the XML input and a StreamResult object to hold the
-   transformation output.</li>
-</ol>
-<s3 title="Examples">
-<p><em>Example 1:</em> Using a translet/Templates object for multiple transformations</p>
-<source>import java.util.Properties;
-import javax.xml.transform.Transformer;
-import java.io.FileOutputStream;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Templates;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-...
-// Set the TransformerFactory system property.
-// Note: For more flexibility, load properties from a properties file.
-String key = "javax.xml.transform.TransformerFactory";
-String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl";
-Properties props = System.getProperties();
-props.put(key, value);
-System.setProperties(props);
-...
-String xslInURI;
-// Instantiate the TransformerFactory, and use it along with a SteamSource
-// XSL stylesheet to create a translet as a Templates object.
-TransformerFactory tFactory = TransformerFactory.newInstance();
-Templates translet = tFactory.newTemplates(new StreamSource(xslInURI));
-...
-String xmlInURI;
-String htmlOutURI;
-...
-// For each transformation, instantiate a new Transformer, and perform
-// the transformation from a StreamSource to a StreamResult;
-Transformer transformer = translet.newTransformer();
-transformer.transform(new StreamSource(xmlInURI),
-                      new StreamResult(new FileOutputStream(htmlOutURI)));
-...</source>
-<p>For a working sample that illustrates this usage pattern, see <link idref="samples" anchor="xsltc1">JAXPTransletOneTransformation</link>.</p>
-<p><em>Example 2:</em> Compiling a translet/Templates object for a single transformation</p>
-<source>import java.util.Properties;
-import javax.xml.transform.TransformerFactory;
-import java.io.FileOutputStream;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-...
-// Set the TransformerFactory system property.
-// Note: For more flexibility, load properties from a properties file.
-String key = "javax.xml.transform.TransformerFactory";
-String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl";
-Properties props = System.getProperties();
-props.put(key, value);
-System.setProperties(props);
-...
-String xslInURI;
-String xmlInURI;
-String htmlOutURI;
-// Instantiate the TransformerFactory, and use it along with a SteamSource
-// XSL stylesheet to create a Transformer.
-TransformerFactory tFactory = TransformerFactory.newInstance();
-Transformer transformer = tFactory.newTransformer(new StreamSource(xslInURI));
-// Perform the transformation from a StreamSource to a StreamResult;
-transformer.transform(new StreamSource(xmlInURI),
-                      new StreamResult(new FileOutputStream(htmlOutURI)));</source>
-<p>For a working sample that illustrates this usage pattern, see <link idref="samples" anchor="xsltc2">JAXPTransletMultipleTransformations</link>.</p>
-</s3>
-</s2><anchor name="native_api"/>
-<s2 title="Calling XSLTC with the native API">
-<p>This section demonstrates how to use the native XSLTC API in a standalone Java application.</p> 
-<p>Processing an XML document with a translet involves three main steps:</p>
-<ol> 
-  <li><link anchor="native_compile">Compile the stylesheet to a translet</link>.</li>
-  <li><link anchor="native_parse">Parse the input XML document</link>.</li> 
-  <li><link anchor="native_transform">Use the translet to transform the XML document</link>.</li>
-</ol><anchor name="native_overview"/>
-<s3 title="Code overview">
-<p>XsltApp.java illustrates the basic structure for coding a transformation with the native XSLTC API. In the following listing, the method for performing each of the three steps is an empty shell. The methods are filled in the listings in subsequent sections.</p>
-<source>import org.apache.xalan.xsltc.Translet;
-import org.apache.xalan.xsltc.dom.DOMImpl;
-
-public class XsltApp {
-  public static void main(String[] args) {
-    XsltApp proc = new XsltApp();
-    proc.run(args);
-  }
-
-  public void run(String[] args) {
-    if (args.length != 2) {
-      System.err.println("Usage:\n\tprocessor &lt;xmlfile&gt; &lt;xslfile&gt;" +
-            "\n\n\twhere &lt;xmlfile&gt; = xml input filename, and" +
-            "\n\t      &lt;xslfile&gt; = stylesheet filename.");
-      System.exit(1);
-    }
-    String xmldocFilename     = args[0];
-    String stylesheetFilename = args[1];
-
-    // Compile the stylesheet to a translet
-    Translet translet = compileStylesheet(stylesheetFilename);
-
-    // Parse the input XML document
-    DOMImpl dom = getDOM(xmldocFilename);
-
-    // Transform the XML document against the translet
-    doTransform(translet, dom);
-    System.exit(0);
-  }
-  
-  // compile the stylesheet [Empty shell: see below]
-  private Translet compileStylesheet(String stylesheetName) { return null; }
-
-  // parse the input XML document [Empty shell: see below]
-  private DOMImpl getDOM(String xmldocname) { return null; }
-
-  // transform the XML document [Empty shell: see below]
-  private void doTransform(Translet translet, DOMImpl dom) { }
-}</source>
-
-<p>XsltApp takes two command line arguments: the input XML document filename, and the
-XSL stylesheet filename. The public run() method processes the commandline args,
-and then carries out the three steps.</p> 
-<p>The first step is accomplished by calling the compileStylesheet() method. This method
-takes the stylesheet filename as input (String), and returns an instance
-of the translet, as type org.apache.xalan.xsltc.Translet.</p>
-
-<p>The input XML document now needs to be parsed. This is accomplished by the getDOM() method. This method takes the XML document's filename (String)
-and returns the Document Object Model for the document, as an object of
-type org.apache.xalan.xsltc.dom.DOMImpl. </p>
-
-<p>Finally, the transformation prescribed by the stylesheet is carried out by
-calling the doTransform() method. This method takes the translet (compiled
-stylesheet) and the dom (Document Object Model for the XML document) as
-input parameters. In this example, the results of the transformation are
-output to standard output, so this method returns nothing. </p>
-
-<p>If all three steps are carried out successfully, the application exits with
-a successful (zero) value.</p>
-
-<p>The following sections examine each of the three steps in detail.</p>
-</s3><anchor name="native_compile"/>
-<s3 title="1. Compiling the Stylesheet to a Translet">
-<p>The 'compileStylesheet' method:</p>
-
-<source>import java.io.File;
-import java.net.MalformedURLException; 
-import org.apache.xalan.xsltc.compiler.XSLTC;
-...
-  private Translet compileStylesheet(String stylesheetName) {
-    Translet retval = null;
-    String transletName = stylesheetName.substring(0,
-                              stylesheetName.indexOf('.'));
-    try {
-      XSLTC xsltc = new XSLTC();
-      xsltc.init();
-      File stylesheet = new File(stylesheetName);
-      xsltc.compile(stylesheet.toURL());
-      Class clazz = Class.forName(transletName);
-      retval = (Translet)clazz.newInstance();
-    } 
-    catch (MalformedURLException e) {
-      System.err.println("Could not create URL to stylesheet file: " +
-                          stylesheetName + ".\n" + e.getMessage());
-      System.exit(1);
-    } 
-    catch (ClassNotFoundException e) {
-      System.err.println("Could not find class file: " +
-                          transletName + ".class .\n" + e.getMessage());
-      System.exit(1);
-    } 
-    catch (InstantiationException e) {
-      System.err.println("Could not instantiate class file: " +
-                          transletName + ".class .\n" + e.getMessage());
-      System.exit(1);
-    } 
-    catch (IllegalAccessException e) {
-      System.err.println("Could not instantiate class file: " +
-            transletName + ".class, illegal access.\n" + e.getMessage());
-      System.exit(1);
-    }
-    return retval;
-  }</source>
-
-<p>This method reads in the stylesheet file, compiles it to Java bytecodes 
-(the translet), and then writes the bytecodes to the filesystem, as a 
-series of .class files. Their base name is derived from the name of the 
-stylesheet. </p>
-
-<p>The XSLT compiler object (org.apache.xalan.xsltc.compiler.XSLTC), is created,
-initialized and then its compile() method is called passing in a URL
-to the stylesheet itself. Once the .class files have been written,
-the translet is instantiated using Java reflection to create the Class
-and then a new instance of the Class as 'retval' of type 
-org.apache.xalan.xsltc.Translet. </p>
-
-<p>Notice all of the various exceptions that could be thrown in the process
-have been handled with explicit warning messages and a System.exit with a non-zero return value. 
-In your applications, you may want to handle these exceptions differently.</p>
-
-</s3><anchor name="native_parse"/>
-<s3 title="2. Parsing the XML Document">
-
-<p>Parsing the input XML document is handled in the getDOM() method:</p>
-
-<source>import java.io.IOException;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.ParserConfigurationException;
-import org.apache.xalan.xsltc.compiler.Constants;
-import org.apache.xalan.xsltc.dom.DTDMonitor;
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-...
-  private DTDMonitor _dtdMonitor = null;
-
-  private DOMImpl getDOM(String xmldocname) {
-    final SAXParserFactory factory = SAXParserFactory.newInstance();
-    try {
-      factory.setFeature(Constants.NAMESPACE_FEATURE, true);
-    } 
-    catch (Exception e) {
-      factory.setNamespaceAware(true);
-    }
-    final DOMImpl dom = new DOMImpl();
-    dom.setDocumentURI(xmldocname);
-    XMLReader reader = null;
-    SAXParser parser = null;
-    _dtdMonitor = new DTDMonitor();
-    try {
-      parser = factory.newSAXParser();
-      reader = parser.getXMLReader();
-      reader.setContentHandler(dom.getBuilder());
-      _dtdMonitor.handleDTD(reader);
-      reader.parse(xmldocname);
-    } 
-    catch (ParserConfigurationException e) {
-      System.err.println("SAX Parser is not configured properly.\n"+
-                          e.getMessage());
-      System.exit(1);
-    } 
-    catch (SAXException e ) {
-      System.err.println("SAX Parser could not be created.\n"+
-                          e.getMessage());
-      System.exit(1);
-    } 
-    catch (IOException e ) {
-      System.err.println("XML Reader could not read xml document '"+
-                          xmldocname + "'," + e.getMessage());
-      System.exit(1);
-    }
-    return dom;
-  }</source>
-
-<p>The method parses the input XML document and creates a Document
-Object Model to return to the run() method for later use. To parse the 
-document we use a javax.xml.parsers.SAXParser, from the JAXP.  The JAXP
-model uses a factory method; accordingly we first create the factory,
-which is of type javax.xml.parsers.SAXParserFactory. After configuring 
-the factory to handle namespaces, the procedure gets an org.xml.sax.XMLReader
-from the SAXParser. The reader is registered
-with the class DTDMonitor, and then the reader is instructed to parse
-the XML document. The DOMImpl object is returned to the main() method.</p> 
-
-<note>Before the document is parsed, the DOMImpl is configured with the
-XML document's URI with a call to the setDocumentURI() method. This
-is necessary to define the origin of the document from which the DOM tree
-is built. This information is needed for xsl:import, xsl:include, and
-the document() function.</note>
-</s3><anchor name="native_transform"/>
-<s3 title="3. Doing the Transformation">
-
-<p>Now everything is set to carry out the XSL transformation. The doTransform()
-method takes a reference to the Translet object generated 
-from the stylesheet, and the DOMImpl object created from the XML document.</p>
-
-<source>import java.io.IOException;
-import org.apache.xalan.xsltc.runtime.DefaultSAXOutputHandler;
-import org.apache.xalan.xsltc.runtime.TextOutput;
-import org.apache.xalan.xsltc.runtime.AbstractTranslet;
-import org.apache.xalan.xsltc.TransletException;
-...
-  private void doTransform(Translet translet, DOMImpl dom) {
-    DefaultSAXOutputHandler outputhandlr = null;
-    TextOutput textoutput = null;
-    try {
-      outputhandlr= new DefaultSAXOutputHandler(System.out, "utf-8");
-      textoutput = new TextOutput(outputhandlr, "utf-8");
-    } 
-    catch (IOException e) {
-      System.err.println("Could not create SAX Output Handler."+
-                          e.getMessage());
-      System.exit(1);
-    }
-  
-    // for XSL keys
-    AbstractTranslet absTranslet = (AbstractTranslet)translet;
-    absTranslet.setIndexSize(dom.getSize());
-    _dtdMonitor.buildIdIndex(dom, 0, absTranslet);
-
-    try {
-      absTranslet.transform(dom, textoutput);
-    } 
-    catch (TransletException e) {
-      System.err.println("Could not transform XML document."+
-                          e.getMessage());
-      System.exit(1);
-    }
-  }</source>
-
-<p>The Translet's transform() method takes two arguments: the DOMImpl
-reference created in the getDOM() method, and an xsltc.runtime.TextOutput
-object. TextOutput is a ContentHandler wrapper class that implements the
-xsltc.TransletOutputHandler interface. In this example, the content
-handler (DefaultSAXOutputHandler) is wrapped.</p>     
-
-<p>Translet is an interface. AbstractTranslet is a class that implements that
-interface. Before the transform() method is called, setIndexSize(int)
-is called to pass in the maximum DOM size to the translet and the DTDMonitor
-is called to build the node index that the Key (xsl:key implementation)
-class uses. This is a general case, if you are not using keys, then you
-do not need to set the index size, consequently you would not need to
-work with the AbstractTranslet either. In that case, you can  use the
-Translet directly by calling translet.transform(dom, textoutput). </p>
-</s3><anchor name="native_conclusion"/>
-<s3 title="Conclusion">
-<p>The native XSLT compiler API provides a way to compile an XSL stylesheet
-into a translet. The translet can then be used to transform the DOMImpl
-of an input XML document.   This example demonstrated how to compile a
-stylesheet into a translet, parse an input XML document, and then transform
-the XML document using the translet.</p>
-</s3></s2><anchor name="constraints"/>
-<s2 title="XSLTC usage constraints">
-<p>See <link idref="xsltc_constraints" anchor="xsltcconf">Conformance issues</link> and <link idref="xsltc_constraints" 
-anchor="xsltcknownproblems">Known problems</link>.</p>
-</s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xalandesign.xml b/xdocs/sources/xalandesign.xml
deleted file mode 100644
index 702da28..0000000
--- a/xdocs/sources/xalandesign.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book SYSTEM "sbk:/style/dtd/book.dtd">
-
-<!--
- * 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) 2000, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<book title="Xalan 2.0.0 Design" copyright="2000 The Apache Software Foundation">
- 
-  <document id="design2_0_0"
-            label="Xalan-J 2.0.0 Design"
-            source="design/design2_0_0.xml"/>    
-</book>
-  
\ No newline at end of file
diff --git a/xdocs/sources/xsltc.xml b/xdocs/sources/xsltc.xml
deleted file mode 100644
index 8a21e28..0000000
--- a/xdocs/sources/xsltc.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book SYSTEM "sbk:/style/dtd/book.dtd">
-
-<book title="XSLTC Design" copyright="2002 The Apache Software Foundation">
- 
-  <document id="index"
-            label="Overview"
-            source="xsltc/index.xml"/>
-
- <separator/>
-
-  <document id="xsltc_compiler"
-            label="Compiler design"
-            source="xsltc/xsltc_compiler.xml"/>
-
- <separator/>
- 
-   <document id="xsl_whitespace_design"
-            label="Whitespace"
-            source="xsltc/xsl_whitespace_design.xml"/>
-
-  <document id="xsl_sort_design"
-            label="xsl:sort"
-            source="xsltc/xsl_sort_design.xml"/> 
-
-  <document id="xsl_key_design"
-            label="Keys"
-            source="xsltc/xsl_key_design.xml"/> 
-
-  <document id="xsl_comment_design"
-            label="Comment design"
-            source="xsltc/xsl_comment_design.xml"/>
- 
-  <separator/>
-
-  <document id="xsl_lang_design"
-            label="lang()"
-            source="xsltc/xsl_lang_design.xml"/> 
-
-  <document id="xsl_unparsed_design"
-            label="Unparsed entities"
-            source="xsltc/xsl_unparsed_design.xml"/> 
-  
- <separator/>
-   
-  <document id="xsltc_runtime"
-            label="Runtime"
-            source="xsltc/xsltc_runtime.xml"/> 
-            
- <separator/>
-
-  <document id="xsltc_dom"
-            label="Internal DOM"
-            source="xsltc/xsltc_dom.xml"/>            
-            
-  <document id="xsltc_namespace"
-            label="Namespaces"
-            source="xsltc/xsltc_namespace.xml"/>             
-            
- <separator/>
- 
-   <document id="xsltc_trax"
-             label="Translet &amp; TrAX"
-             source="xsltc/xsltc_trax.xml"/>
-   <document id="xsltc_predicates"
-             label="XPath Predicates"
-             source="xsltc/xsltc_predicates.xml"/>
-   <document id="xsltc_iterators"
-             label="Xsltc Iterators"
-             source="xsltc/xsltc_iterators.xml"/>
-   <document id="xsltc_native_api"
-             label="Xsltc Native API" 
-             source="xsltc/xsltc_native_api.xml"/>
-   <document id="xsltc_trax_api"
-             label="Xsltc Native API" 
-             source="xsltc/xsltc_trax_api.xml"/>
- <separator/>
- <external href="todo.html" label="To-do list"/>
-            
-</book>
-  
diff --git a/xdocs/sources/xsltc/DOMInterface.gif b/xdocs/sources/xsltc/DOMInterface.gif
deleted file mode 100644
index 8f8919e..0000000
--- a/xdocs/sources/xsltc/DOMInterface.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/DOMLocking.gif b/xdocs/sources/xsltc/DOMLocking.gif
deleted file mode 100644
index cae33b4..0000000
--- a/xdocs/sources/xsltc/DOMLocking.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/README b/xdocs/sources/xsltc/README
deleted file mode 100644
index e7b498e..0000000
--- a/xdocs/sources/xsltc/README
+++ /dev/null
@@ -1,246 +0,0 @@
-=======================================================================
-         README FILE FOR THE SUN XSLT COMPILER
-                 Preview Version 6 
-                    April, 2001
-           Copyright (c) Sun Microsystems, 2001
-=======================================================================
-
-The Sun XSLT Compiler (XSLTC) is a Java-based tool for compiling XSL 
-stylesheets into extremely lightweight and portable Java byte code. 
-The Sun XSLTC Java Runtime environment can then process XML files 
-against these compiled stylesheets (Translets) to generate any manner 
-of output per the style-sheet instructions.
-
-This preview version of the XSLT Compiler can be run on any 
-platform -- including UNIX, Windows, NT, Mac -- that supports 
-Java2 or later. The Translets (compiled stylesheets) can be run on any 
-Java platform including a Palm Pilot with J2ME CLDC 
-(Java 2 Micro Edition, Connected Limited Device Configuration). 
-While the compiler itself requires Java2,translets are designed to run 
-anywhere Java is available.
-
-Almost all functions of the XLST 1.0 language are implemented; 
-more than enough to show you how this new approach to XSLT works 
-and its advantages! Using the samples provided, you will be able 
-to see for yourself. Also, demos for the Palm Pilot, Applets, and 
-Servlets are provided.
-
------------------------------------------------------------------------
-ATTRIBUTIONS
------------------------------------------------------------------------
-The XSLT Compiler program uses the CUP Parser Generator
-for Java, Copyright 1996-1999 by Scott Hudson, Frank Flannery,
-C. Scott Ananian.  For more details, please see:
-http://www.cs.princeton.edu/~appel/modern/java/CUP/
-
-The XSLT Compiler program also uses a modified version of the
-Byte Code Engineering Library (BCEL), formerly known as 
-(JavaClass API), Copyright 2000 Markus Dahm.
-
-** Please note that this additional package, BCEL, is
-** needed in order to generate the class files from the compiler.
-** Without the BCEL package, this preview version of the
-** compiler WILL NOT WORK.  BCEL is freely available for
-** download as described below.
-
------------------------------------------------------------------------
-REQUIRED PACKAGE
------------------------------------------------------------------------
-BCEL (formerly JavaClass) by Markus Dahm has been 
-used to automatically create class files from the XSLT compiler output.  
-You must obtain the BCEL.jar file and install it before using the 
-XSLT compiler.
-
-The simplest way to download the BCEL.jar file from 
-
-    http://bcel.sourceforge.net/downloads.html
-
-is to use the "JAR file (without docs)" link.
-
-You may want to obtain the precompiled class files and documentation.
-To download them to a Unix system:
-
-    1) Choose the "latest version (Precompiled + docs)" 
-       Gzipped Tar-File or ZIP-File link.
-
-    2) Unpack and expand the downloaded BCEL files in your 
-       download directory (e.g., /usr/local).
-
-    3) Change directory to BCEL.
-
-    4) Create the jar file BCEL.jar.
-    
-       From within the BCEL directory, you can either use the 
-       included GNUmakefile or create the jar yourself.
-       
-       To use the GNUmakefile, type the command 'make jar'.
-       
-       To create the jar yourself, type the command:
-       
-         jar cvf BCEL.jar `find de gnu -name \*.class` listclass.class
-
-To download the precompiled class files and documentation 
-to a Windows system:
-
-    1) Choose the "latest version (Precompiled + docs)" 
-       ZIP-File link.
-
-    2) Unzip the downloaded BCEL files in your 
-       download directory.
-
-    3) Change directory to BCEL and from a DOS command line,
-       type the command:
-
-         jar -cvf BCEL.jar de\fub\bytecode\classfile\*.class
-           gnu\regexp\*.class listclass.class
-
-To complete the BCEL setup:
-
-    1) Install XSLTC, as described in the section below,
-       "HOW TO INSTALL XSLTC AND RUN THE SAMPLES."
-
-    2) Copy the BCEL.jar file into the "lib" directory
-       under your "xsltc" directory.
-
-       You are now set to run the XSLT compiler.
-
-------------------------------------------------------------
-ADDITIONS FROM VERSION 5 (of the PREVIEW COMPILER)
-------------------------------------------------------------
-
-Support for 
-
-	- Simplified Stylesheets
-	- id() and key() in match patterns
-
-------------------------------------------------------------
-XSLT 1.0 Features Not Suported in PREVIEW VERSION 6
-------------------------------------------------------------
-
-The following XSLT 1.0 features are not yet supported:
-
-    * Nonstatic external Java methods. 
-      You may call static Java functions
-      using a namespace prefix matching the class name that is 
-      associated with the following URL:
-      
-        http://www.sun.com/xsltc/java/YourJavaClass
-      
-    * Namespace axis
-
-------------------------------------------------------------
-LIST OF FILES
-------------------------------------------------------------
-
-The files included in this preview package are as follows:
-
-xsltc-1_0-alpha5-bin.zip
-   <install dir>/xsltc
-      LICENSE.txt           (license file)
-      XSLTCprn_lg.txt       (copyright notice)
-      README                (this file)
-      README.api            (describes Translet API)
-      README.xslt           (describes runtime command line interface)
-      README.xsltc          (describes compiler command line interface)
-      bin 
-         xslt               (runtime for Unix)
-         xsltc              (compiler for Unix)
-
-         xslt.bat           (runtime for DOS)
-         xsltc.bat          (compiler for DOS)
-      demo
-         README
-         TransletDemo.prc (Palm Pilot install file)
-      lib
-         xml.jar
-         xsltc.jar
-         xsltcrt.jar               ('rt' = runtime)
-         [BCEL.jar goes here] (see REQUIRED PACKAGE above)
-      samples
-         set of xml and xsl files for you to try
-      src
-         subset of the runtime package to complement README.api
-         plus an Applet demo and a servlet demo
-         com/sun/xslt/demo/servlet
-             README.servlet        (describes Servlet demo)
-         com/sun/xslt/demo/applet
-             README.applet         (describes Applet demo)
-
-------------------------------------------------------------
-HOW TO INSTALL XSLTC AND RUN THE SAMPLES
-------------------------------------------------------------
-
-1. Unzip the files in a directory of your choice, for example
-   from the user directory '/home/user1', the distribution
-   zip file can be unzipped using the jar command as:
-
-   jar xvf xsltc-1_0-alpha5-bin.zip 
-
-   The subdirectory 'xslt' will be created in '/home/user1'.
-
-2. Set the XSLT environment variable to point to your installation
-   directory. Set your PATH environment variable to include
-   the bin directory of XSLT. 
-
-   For example, in the bash shell:
- 
-      export XSLT=/home/user1/xslt
-      export PATH=$XSLT/bin:$PATH
-
-3. Compile the stylesheet to produce a Java class file.
-
-   For example, on the Unix platform, to compile the play1.xsl
-   stylesheet for the play.xml document:
-
-      cd /home/user1/xsltc/samples
-      xsltc play1.xsl
-
-   The compiled stylesheet will be in the main Java class file 
-   'play1.class'
-
-   NOTE: The 'xlstc' shell script adds the required jars to your CLASSPATH
-
-   For example, on the Windows platform, to compile the play1.xsl
-   stylesheet for the play.xml document:
-   
-      set classpath=c:\xsltc\samples;c:\xsltc\lib\xsltc.jar;
-      c:\xsltc\lib\xsltcrt.jar;c:\xsltc\lib\xml.jar;
-      c:\xsltc\lib\BCEL.jar;.
-      cd c:\xsltc\samples
-      java com.sun.xslt.compiler.XSLTC play1.xsl
-
-4. Use the compiled Java class file (play1.class) to transform 
-   the example XML document.
-
-   For example, on the Unix platform:
-
-      xslt play.xml play1
-
-   For example, on the Windows platform:
-
-      java com.sun.xslt.runtime.DefaultRun play.xml play1
-
-   The result is sent to standard output.
-
-   NOTE: When running the compiled stylesheet, you 
-         just specify the name of its Java class, not its
-         file name (e.g., play1, not play1.class).
-         You do not include the ".class" extension, nor
-         the path to the class. The class is found by means 
-         of the Java CLASSPATH variable. If you run
-         the translet from a directory other
-         than the directory in which the compiled
-         stylesheet class is located, you need to add 
-         that directory to your Java CLASSPATH. Also, you
-         need to remove directories from your CLASSPATH 
-         for prior installations of XSLTC and any references 
-         to Sun's project X parser (com.sun.xml.tree)
-         installed from some other XML application/tool.
- 
-   NOTE: The javadocToHtml sample calls external Java methods
-         from the JavadocFormatter class. Before compiling the
-         javadocToHtml.xsl stylesheet, compile the 
-         JavadocFormatter class using 'javac'.
-
-------------------------------------------------------------
-END OF README
diff --git a/xdocs/sources/xsltc/README.APACHE b/xdocs/sources/xsltc/README.APACHE
deleted file mode 100644
index c7cd61f..0000000
--- a/xdocs/sources/xsltc/README.APACHE
+++ /dev/null
@@ -1,86 +0,0 @@
-README.APACHE
-=====================================================================
-Entire source tree and support packages are located in the single jar
-file 'apache.jar'. 
-
-
-Installation
--------------
-
-(1) create directory [Root], unpack 'apache.jar' there.
-	ex) % cd /tmp; mkdir xsltc_apache 
-	    % cd xsltc_apache
-        copy apache.jar to xsltc_apache directory
-	    % jar xvf apache.jar 
-	cleanup
-	    % rm -rf META-INF apache.jar
-
-    Unpacking the jar file will result in the following tree:
-
-	[Root]
-	  External/
-	    BCEL/                ... contains BCEL.jar
-	    JLex/                ... contains JLex.jar
-	    java_cup/            ... contains java_cup.jar, runtime/runtime.jar
-	    xml-tr2/             ... contains xml.jar
-	  bin/
-	    xslt
-	    xsltc
-	  doc/
-	    api/                 ... contains javadoc for api
-	  src/
-	    GNUmakefile
-	    GNUmakefile.allinc
-	    docs/
-	      LICENSE.txt
-	      Message.txt
-	      README
-	      README.api
-	      README.xslt
-	      README.xsltc
-	      XSLTCprn_lg.txt*
-	      xsltcA3.txt
-	    org/
-	      apache/
-		xalan/
-		  xsltc/
-		     (src tree)  ... all the source code files
-
-
-    The 'src tree' is a hierarchy of the following packages:
-	org.apache.xalan.xsltc
-	org.apache.xalan.xsltc.compiler
-	org.apache.xalan.xsltc.compiler.util
-	org.apache.xalan.xsltc.dom
-	org.apache.xalan.xsltc.runtime
-	org.apache.xalan.xsltc.util
-	org.apache.xalan.xsltc.util.getopt
-
-
-(2) make bin programs executable
-	    % chmod +x bin/*
-
-(3) set env variable to point to top of directory [Root]
-	ex) % setenv XSLT /tmp/xsltc_apache
-
-(4) compile sources (uses gnu make and the provides 'GNUmakefile'). This
-    will create java classes in [Root]/classes, e.g. /tmp/xsltc_apache/classes.
-    (No need to set your CLASSPATH variable.)
-    
-	ex) % cd src; gmake again
-
-    Note: the 'again' target forces everything to be built from scratch,
-    including the java_cup source files. Subsequent builds can be done
-    using the 'classes' target. 
-
-(5) make the javadoc
-	ex) % gmake jdoc
-
-(6) add bin directory to your executable path, 
-	ex) % set path=($XSLT/bin $path)
-
-(7) test distribution, given a stylesheet (test.xsl) and an input xml doc
-    (test.xml), and be sure current working directory (.) is in your
-    CLASSPATH.
- 	% xsltc test.xsl		... creates translet, test.class
-	% xslt test.xml test		... runs translet on xml input	
diff --git a/xdocs/sources/xsltc/README.api b/xdocs/sources/xsltc/README.api
deleted file mode 100644
index 601b092..0000000
--- a/xdocs/sources/xsltc/README.api
+++ /dev/null
@@ -1,422 +0,0 @@
-============================================================
-         README FILE FOR THE SUN XSLT COMPILER API
-                  Preview Version 5 
-                    February, 2001
-           Copyright (c) Sun Microsystems, 2001
-============================================================
-
-The Sun XSLT Compiler (XSLTC) is a Java-based tool for 
-compiling XSL stylesheets into extremely lightweight and 
-portable Java byte code. The Sun XSLTC Java Runtime environment 
-can then process XML files against these compiled stylesheets 
-(Translets) to generate any manner of output per the style-
-sheet instructions.
-
-CONTENTS OF THIS DOCUMENT:
-	1. HOW TO INCLUDE TRANSLETS IN YOUR APPLICATIONS
-	2. FULL CODE EXAMPLE 1, (uses a SAX DocumentHandler).
-	3. COMPILING AND RUNNING THE EXAMPLE 
-	4. FULL CODE EXAMPLE 2, (uses DefaultSAXOutputHandler). 
-	5. APPENDIX (TextOut and DefaultSAXOutputHandler)
-
-
-
-
-1. HOW TO INCLUDE TRANSLETS IN YOUR APPLICATIONS
----------------------------------------------------------------------
-
-Translets implement the interface com.sun.xslt.Translet
-that you will find in the src directory.
-
-public interface Translet {
-    public void transform(DOM document, TransletOutputHandler handler)
-	throws TransletException;
-
-    public void transform(DOM document, TransletOutputHandler[] handlers)
-	throws TransletException;
-
-    public void transform(DOM document, NodeIterator iterator,
-                          TransletOutputHandler handler) throws 
-			  TransletException;
-
-    public Object addParameter(String name, Object value);
-
-    public void buildKeys(DOM document, NodeIterator iterator,
-                          TransletOutputHandler handler, int root) throws 
-			  TransletException;
-
-    public String getOutputEncoding();
-}
-
-The Translet takes a DOMImpl object (created from an input XML document),
-as input and transforms it. The results of the transformation are 
-sent to an  event-based output handler that implements the 
-com.sun.xslt.TransletOutputHandler interface :
-
-
-public interface com.sun.xslt.TransletOutputHandler {
-    public void startDocument() throws TransletException;
-    public void endDocument() throws TransletException;
-    public void characters(char[] characters, int offset, int length)
-        throws TransletException;
-    public void startElement(String elementName) throws TransletException;
-    public void endElement(String elementName) throws TransletException;
-    public void attribute(String attributeName, String attributeValue)
-        throws TransletException;
-    public void comment(String comment) throws TransletException;
-    public void processingInstruction(String target, String data)
-        throws TransletException;
-    public void setType(int type);
-    public void setIndent(boolean indent);
-    public boolean setEscaping(boolean escape) throws TransletException;
-    public void insertCdataElement(String elementName);
-}
-
-
-You create an instance of the class that implements the Translet interface
-using Java reflection:
-
-  Class clazz = Class.forName("classname");
-  Translet translet = (Translet) clazz.newInstance();
-
-where "classname" is the name of the class generated by XSLTC.
-In order to execute a transformation, both a document and a SAX-like
-handler (TransletOutputHandler) are needed.
-A document instance can be created with the aid of SAX-complaint XML parser.
-For example, using Sun's parser you would write,
-
-  import com.sun.xslt.dom.DOMImpl;
-  import com.sun.xml.parser.Parser;
-  import com.sun.xml.parser.Resolver;
-
-  // Create new instances of DOM and Parser
-  DOMImpl dom = new DOMImpl();
-  Parser parser = new Parser();
-
-  // Set a SAX handler to build a DOM tree
-  parser.setDocumentHandler(dom.getBuilder());
-
-  // Parse the document and build a DOM tree
-  InputSource input = new InputSource(
-                          new FileReader("xmlfile.xml"));
-  parser.parse(input);
-  
-In this example a document is parsed from a file, but it is also 
-possible to parse a document from a URI by writing,
-
-  parser.parse("http://.../xmlfile.xml");
-
-To transform the input XML document, a call is made to the translet's
-transform() method. In order to do its work, the transform() method
-takes two arguments, (1) the DOMImpl object created from parsing
-the input XML document, and (2) an output handler. The output handler
-must implement the org.xml.sax.DocumentHandler interface.  You 
-have the option of: (1) writing your own class that implements 
-DocumentHandler, or (2) using our default class
-'com.sun.xslt.runtime.DefaultSAXOutputHandler' instead.  
-The source code for our DefaultSAXOutputHandler is included
-in this package in the com/sun/xslt/runtime directory. 
-This is a change from the previous releases of
-our compiler API. If you  wanted to create your own 
-output handler in previous releases, you would have write a class that 
-implemented the interface TransletOutputHandler. This change was made
-so that users could more easily plug in any SAX compliant output
-handler. To plug in the SAX compliant output handler,
-(whether it is a user written class or our DefaultSAXOutputHandler)
-into the transform() method, it must be wrapped in a
-TextOutput object first. 
-
-The Translet.transform() method may also take an array of output handlers. 
-In this case the transformation will be able to select which handler 
-to send output to by using the extension element <translet:output port="n"> 
-where 'n' is a 0-based index in the array of output handlers.
-
-Lets take a look at the code needed to carry out both of the options
-for passing the SAX output handler to the translet's transform() method:
-
-   (1) You would write your own output handler that implements
-       the org.xml.sax.DocumentHandler interface, pass this class
-       into our com.sun.xslt.runtime.TextOutput class which itself
-       implements the TransletOutputHandler interface.
-
-   (2) You would create an instance of the default SAX output handler,
-       com.sun.xslt.runtime.DefaultSAXOutputHandler, pass this
-       instance into our com.sun.xslt.runtime.TextOutput class which
-       itself implements the TransletOutputHandler interface.
-
-
-In option (1), we want to use a SAX compliant output handler that we write
-ourselves. In this case we create our Handler class, which implements 
-org.xml.sax.DocumentHandler:
-
-import org.xml.sax.DocumentHandler;
-
-// user supplied SAX Handler:
-class Handler implements DocumentHandler {
-    public void startDocument() throws SAXException {}
-
-    public void endDocument() throws SAXException {}
-
-    public void characters(char[] characters, int offset, int length)
-        throws SAXException
-    {
-        System.out.println(new String(characters, offset, length));
-    }
-    public void startElement(String elementName, AttributeList attrs)
-        throws SAXException {}
-    public void endElement(String elementName) throws SAXException {}
-    public void setDocumentLocator(Locator loc) {}
-    public void ignorableWhitespace(char[] characters, int offset, int length)
-        throws SAXException {}
-    public void processingInstruction(String target, String data)
-        throws SAXException {}
-}
-
-Now before we pass our handler to the transform() method, we wrap it
-in a TextOutput object (which implements the TransletOutputHandler
-interface for us).  Then given the instantiated translet class, 
-the transform method could be called as:
-
-	import com.sun.xslt.runtime.TextOutput;
-
-	DOMImpl dom;
-        ...
-        Handler saxHandler;
-        TextOutput textOutput;
-        try {
-            saxHandler = new Handler();
-            textOutput = new TextOutput(saxHandler);
-            translet.transform(dom, textOutput);
-        } catch (TransletException  e){
-	    ...
-        } catch (IOException  e){
-	    ...
-        }
-
-
-By using the TextOutput wrapper class, one can also control the character
-encoding. The TextOutput class has an additional constructor that takes
-the DocumentHandler and a String that describes the encoding, for example
-'textOutput' could have been created as:
-
-	textOutput = new TextOutput(saxHandler, "utf-8");
-
-Finally, option (2) is much like option (1) except you do not have
-to write your own DocumentHandler. We provide one by default. To use the
-default one, instantiate 'com.sun.xslt.runtime.DefaultSAXOutputHandler'
-rather than instantiating your own class (such as Handler above):
-
-	import com.sun.xslt.runtime.DefaultSAXOutputHandler;
-	import com.sun.xslt.runtime.TextOutput;
-
-	DefaultSAXOutputHandler defhandlr;
-	try {
-            defhandlr = new DefaultSAXOutputHandler(System.out, "utf-8");
-            translet.transform(dom, new TextOutput(defhandlr));
-        } catch (TransletException  e){
-	    ...
-        } catch (IOException  e){
-	    ...
-        }
-
-For a quick reference to the TextOutput and DefaultSAXOutputHandler
-constructors available, see the Appendix. 
-
-In the following sections, full code examples are shown.
-	
-Finally, if you want the transformation results in the DOM form:
-
-DOM result = new DOM();
-translet.transform(dom, result.getOutputDomBuilder());
-
-If the compiled stylesheet requires the values of global 
-parameters to be set, you should call addParameter() before 
-calling the transform() method.
-
- 
-2. FULL CODE EXAMPLE 1, XsltApp.java, uses a SAX DocumentHandler.
-	This example corresponds to option (1) in discussion above.
-------------------------------------------------------------------
-import java.io.FileReader;
-import java.io.IOException;
-import com.sun.xslt.dom.DOMImpl;
-import com.sun.xslt.runtime.TextOutput;
-import com.sun.xslt.Translet;
-import com.sun.xslt.TransletException;
-import com.sun.xml.parser.Parser;
-import org.xml.sax.AttributeList;
-import org.xml.sax.DocumentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-
-// Create a SAX Output Handler
-class Handler implements DocumentHandler {
-    public void startDocument() throws SAXException {}
-
-    public void endDocument() throws SAXException {}
-
-    public void characters(char[] characters, int offset, int length)
-        throws SAXException
-    {
-        System.out.println(new String(characters, offset, length));
-    }
-
-    public void startElement(String elementName, AttributeList attrs)
-        throws SAXException {}
-
-    public void endElement(String elementName) throws SAXException {}
-
-    public void setDocumentLocator(Locator loc) {}
-
-    public void ignorableWhitespace(char[] characters, int offset, int length)
-        throws SAXException {}
-
-    public void processingInstruction(String target, String data)
-        throws SAXException {}
-
-}
-
-public class XsltApp {
-   public static void main(String[] args){
-        XsltApp app = new XsltApp();
-        app.run(args);
-   }
-
-   public void run(String[] args){
-        if(args.length != 2){
-                usage();
-        }
-        String inputFileName = args[0];
-        String transletName = args[1];
-
-        DOMImpl dom = new DOMImpl();
-        Parser parser = new Parser();
-        parser.setDocumentHandler(dom.getBuilder());
-        InputSource input = null;
-        try {
-            input = new InputSource(new FileReader(inputFileName));
-        } catch( java.io.FileNotFoundException e){
-            System.err.println("File " + inputFileName + " not found");
-            System.exit(1);
-        }
-
-        try {
-            parser.parse(input);
-        } catch (org.xml.sax.SAXException e){
-            System.err.println("Error: " + e);
-            System.exit(1);
-        } catch (IOException e){
-            System.err.println("Error: " + e);
-            System.exit(1);
-        }
-
-        Class transletPluggable = null;
-        try {
-            transletPluggable = Class.forName(transletName);
-        } catch (java.lang.ClassNotFoundException e){
-            System.err.println("Error: " + e);
-            System.exit(1);
-        }
-
-        Translet translet = null;
-        try {
-            translet = (Translet)transletPluggable.newInstance();
-        } catch (java.lang.Exception e){
-            System.err.println("Error instantiating pluggable translet");
-            System.exit(1);
-        }
-
-        Handler saxHandler;
-        TextOutput textOutput;
-        try {
-            saxHandler = new Handler();
-            textOutput = new TextOutput(saxHandler, "utf-8");
-            translet.transform(dom, textOutput);
-        } catch (TransletException  e){
-            System.err.println("Error: " + e);
-            System.exit(1);
-        } catch (IOException  e){
-            System.err.println("Error: " + e);
-            System.exit(1);
-        }
-   }
-
-   public void usage(){
-        System.out.println("Usage: \n" +
-                "     xsltapp <xml_file> <translet_name>\n\n" +
-                "     where <file> is xml source (e.g. play.xml). \n" +
-                "     and  <translet_name> is java class (e.g. play1). \n"
-        );
-        System.exit(1);
-   }
-}
-
-
-
-3. COMPILING AND RUNNING THE EXAMPLE:
----------------------------------------------------------------------
-
-To compile the example above, assuming you unpacked the code
-into the directory /tmp:
-
-javac -classpath "/tmp/xsltc/lib/xml.jar:/tmp/xsltc/lib/BCEL.jar:/tmp/xsltc
-/lib/xsltcrt.jar" XsltApp.java
-
-To run the example on xml document 'play.xml' and stylesheet 'play1.xsl':
-
-(1) compile the stylesheet:
-        xsltc play1.xsl
- 
-    this will produce the translet 'play1.class'.
-
-(2) run the translet with the XsltApp demo:
-
-java -classpath /tmp/xsltc/lib/xsltcrt.jar:/tmp/xsltc/lib/xml.jar:. XsltApp play
-.xml play1
-
-
- 
-4. FULL CODE EXAMPLE 2, DefaultRun.java
-	This example corresponds to option (2) in the discussion above.
-------------------------------------------------------------------
-See the source file for the class 'com.sun.xslt.runtime.DefaultRun',
-which is included in the src directory. It uses the 
-'DefaultSAXOutputHandler' approach.
-
-
-
-
-5. APPENDIX
-------------------------------------------------------------------
-
-TextOutput
-----------
-
-package com.sun.xslt.runtime;
-
-public final class TextOutput implements TransletOutputHandler {
-	public TextOutput(DocumentHandler handler) throws IOException;
-	public TextOutput(DocumentHandler handler, String encoding) throws
-		IOException;
-}
-
-
-DefaultSAXOutputHandler
------------------------
-package com.sun.xslt.runtime;
-
-public class DefaultSAXOutputHandler implements DocumentHandler{
-	public DefaultSAXOutputHandler(Writer writer) throws IOException;
-	public DefaultSAXOutputHandler(OutputStream out, String encoding)
-	    throws IOException;
-	public DefaultSAXOutputHandler(String filename, String encoding)
-            throws IOException;
-	...
-}
-
-
-
-------------------------------------------------------------
-END OF README
diff --git a/xdocs/sources/xsltc/README.xslt b/xdocs/sources/xsltc/README.xslt
deleted file mode 100644
index a014d80..0000000
--- a/xdocs/sources/xsltc/README.xslt
+++ /dev/null
@@ -1,102 +0,0 @@
-NAME
-	xslt - Apache/Xalan XSLT runtime processor. 
-
-SYNOPSIS
-	xslt [-j <jarfile>] [-xhs] {-u <document_url> | <document>} <class>
-             [<name1>=<value1> ...]
-
-
-DESCRIPTION
-	This command-line tool is a wrapper for the Java class
-	org.apache.xalan.xsltc.cmdline.Transform
-
-	The Sun XSLT runtime processor is a Java-based tool for 
-	transforming XML document files using a translet (compiled 
-	stylesheet). 
-
-	The XSLT processor can be run on any platform including UNIX,
-	Windows, NT, Mac that supports Java.
-
-OPTIONS
-
-	The following options are supported:
-
-	-j <jarfile>
-		gets the translet <class> from the specified <jarfile>
-		instead of from the user's CLASSPATH.	
-
-	-u
-		Specifies that the XML <document> location will be a URI
-		such as 'http://myserver/hamlet.xml'.		
-
-	-x
-		Turn debugging messages on.
-
-	-h
-		Output help screen.
-
-	-s
-		Prevent the command line tool from calling System.exit()
-
-OPERANDS
-
-	The following operands are supported:
-
-	<document>     		An XML document to be processed. 
-	<document_url>     	An XML document to be processed, specified
-				as a URL (See -u option above). 
-
-	<class>			The translet that will do the processing.
-				The translet may optionally take a set of 
-				global parameters specified as name-value 
-				pairs. A name-value pair uses the format
-				<name>=<value>.
-
-EXAMPLES
-	Example 1:  Processing an XML document.
-
-	example%  xslt hamlet.xml hamlet 
-
-	where the current working directory contains an XML document
-	'hamlet.xml' to be processed by the translet class 'hamlet'.
-	The translet would have been created initially using
-	xsltc to compile a XSLT stylesheet named 'hamlet.xsl'. 
-
-	Example 2:  Loading translet from a jar file. 
-
-	example%  xslt -j hamlet.jar hamlet.xml hamlet
-
-	In this case the translet class 'hamlet' is loaded from the
-	specified jar file, 'hamlet.jar' instead of from the user's
-	CLASSPATH.
-
-	Example 3: If the translet defined global parameters, then 
-	these can be passed on the command line to the runtime processor
-	as a space separated list of name-value pairs using the format
-	<name>=<value>. For example,
-
-	example%  xslt hamlet.xml hamlet speaker=HAMLET 'scene=SCENE IV'
-
-	Notice that the second name-value pair had to be quoted due to 
-	the intervening space in the value "SCENE IV".
-
-	example% xslt -u http://zarya.east/test.xml hamlet
-
-	where the xml document 'test.xml' can be specified as a URL.
-
-FILES
-	file.xml		input XML document to be processed. 
-	file.class		byte code file.
-	file.jar		java archive file.
-	
-SEE ALSO
-	xsltc, jar.
-
-BUGS
-	See the Bugzilla bug database: http://nagoya.apache.org/bugzilla
-
-AUTHORS
-	Morten Jorgensen		   morten.jorgensen@ireland.sun.com
-	G. Todd Miller                             todd.miller@east.sun.com
-	Jacek Ambroziak
-	Santiago Pericas-Geertsen
diff --git a/xdocs/sources/xsltc/README.xsltc b/xdocs/sources/xsltc/README.xsltc
deleted file mode 100644
index 740152d..0000000
--- a/xdocs/sources/xsltc/README.xsltc
+++ /dev/null
@@ -1,125 +0,0 @@
-NAME
-	xsltc - Apache/Xalan XSLT Compiler 
-
-SYNOPSIS
-	xsltc [-o <output>] [-d <directory>] [-j <jarfile>] 
-	      [-p <package name>] [-uxhsi] [<stylesheet>... ]
-
-DESCRIPTION
-	This command-line tool is a wrapper for the Java class
-	org.apache.xalan.xsltc.cmdline.Compile
-
-	The Sun XSLT Compiler is a Java-based tool for compiling XSLT
-	stylesheets into lightweight and portable Java byte codes 
-	called translets.  
-
-	The XSLT Compiler can be run on any platform including UNIX,
-	Windows, NT, Mac that supports Java 1.2.x or later. The generated
-	translets can be run on any platform that supports a Java
-	Runtime Environment, including a Palm Pilot with J2ME CLDC 
-	(Java 2 Micro Edition, Connected Limited Device Configuration).
-
-OPTIONS
-
-	The following options are supported:
-
-	-o <output>
-		Changes the name of the generated translet class.
-		By default, the translet class would be named
-		<stylesheet>, if -o <output> is set, then the 
-		translet class would be named <output>. Translet
-		class files are written as .class files.
-
-	-d <directory>
-		Changes the destination directory. By default, any
-		translet class files generated would be placed in 
-		the current working directory. If -d <directory> 
-		is specified, the files would be output to <directory>.
-
-	-j <jarfile>
-		Outputs all generated translet class files into a 
-		jar file named <jarfile>.jar. When this option is 
-		used only a jar file will be output.
-
-	-p <package name>
-		Specify a package name for all generated translet
-		class.
-
-	-u
-		Specifies that <stylesheet> location will be a URI
-		such as 'http://myserver/stylesheet1.xsl'.
-
-	-i
-		Specify that the stylesheet should be read from stdin.
-
-	-x
-		Turn debugging messages on.
-
-	-h
-		Output help screen.
-
-	-s
-		Prevent the command line tool from calling System.exit()
-
-
-OPERANDS
-
-	The following operand is supported:
-
-	<stylesheet>    A path name of an input stylesheet file. 
-
-
-EXAMPLES
-	Example 1:  Creating a translet from stylesheet 'hamlet.xsl'.
-
-	example%  xsltc hamlet.xsl
-
-	would produce a set of class files such as 'hamlet.class',
-	'hamlet$0.class', 'hamlet$1.class'.
-
-	Example 2:  Outputting all classes into a jar file.
-
-	example%  xsltc -j hamlet.jar hamlet.xsl
-
-	would produce a single jar file output, 'hamlet.jar' which would
-	contain all the generated .class files for the hamlet translet.
-
-	Example 3: Naming the class file.  
-
-	example%  xsltc -o newhamlet hamlet.xsl
-
-	would produce a set of class files such as 'newhamlet.class',
-	'newhamlet$0.class', etc rather than the default which would 
-	be 'hamlet.class', 'hamlet$0.class', etc.	
-
-	Example 4: Multiple stylesheets. 
-
-	example%  xsltc hamlet1.xsl hamlet2.xsl hamlet3.xsl
-
-	would produce a set of class files derived from the three
-	stylesheets. 
-
-	Example 5: Package Specification.
-
-	example% xsltc -p com.mycompany.translets hamlet.xsl
-
-	would produce a set of class files such as 
-	'com/mycompany/translets/hamlet.class',
-	'com/mycompany/translets/hamlet$0.class', etc.
-
-FILES
-	file.xsl		input XSLT stylesheet
-	file.class		byte code file
-	file.jar		java archive file
-	
-SEE ALSO
-	xslt, jar.
-
-BUGS
-	See the Bugzilla bug database: http://nagoya.apache.org/bugzilla
-
-AUTHORS
-	Morten Jorgensen,		   morten.jorgensen@ireland.sun.com
-	G. Todd Miller,                            todd.miller@east.sun.com
-	Santiago Pericas-Geertsen
-	Jacek Ambroziak
diff --git a/xdocs/sources/xsltc/README2 b/xdocs/sources/xsltc/README2
deleted file mode 100644
index c7cd61f..0000000
--- a/xdocs/sources/xsltc/README2
+++ /dev/null
@@ -1,86 +0,0 @@
-README.APACHE
-=====================================================================
-Entire source tree and support packages are located in the single jar
-file 'apache.jar'. 
-
-
-Installation
--------------
-
-(1) create directory [Root], unpack 'apache.jar' there.
-	ex) % cd /tmp; mkdir xsltc_apache 
-	    % cd xsltc_apache
-        copy apache.jar to xsltc_apache directory
-	    % jar xvf apache.jar 
-	cleanup
-	    % rm -rf META-INF apache.jar
-
-    Unpacking the jar file will result in the following tree:
-
-	[Root]
-	  External/
-	    BCEL/                ... contains BCEL.jar
-	    JLex/                ... contains JLex.jar
-	    java_cup/            ... contains java_cup.jar, runtime/runtime.jar
-	    xml-tr2/             ... contains xml.jar
-	  bin/
-	    xslt
-	    xsltc
-	  doc/
-	    api/                 ... contains javadoc for api
-	  src/
-	    GNUmakefile
-	    GNUmakefile.allinc
-	    docs/
-	      LICENSE.txt
-	      Message.txt
-	      README
-	      README.api
-	      README.xslt
-	      README.xsltc
-	      XSLTCprn_lg.txt*
-	      xsltcA3.txt
-	    org/
-	      apache/
-		xalan/
-		  xsltc/
-		     (src tree)  ... all the source code files
-
-
-    The 'src tree' is a hierarchy of the following packages:
-	org.apache.xalan.xsltc
-	org.apache.xalan.xsltc.compiler
-	org.apache.xalan.xsltc.compiler.util
-	org.apache.xalan.xsltc.dom
-	org.apache.xalan.xsltc.runtime
-	org.apache.xalan.xsltc.util
-	org.apache.xalan.xsltc.util.getopt
-
-
-(2) make bin programs executable
-	    % chmod +x bin/*
-
-(3) set env variable to point to top of directory [Root]
-	ex) % setenv XSLT /tmp/xsltc_apache
-
-(4) compile sources (uses gnu make and the provides 'GNUmakefile'). This
-    will create java classes in [Root]/classes, e.g. /tmp/xsltc_apache/classes.
-    (No need to set your CLASSPATH variable.)
-    
-	ex) % cd src; gmake again
-
-    Note: the 'again' target forces everything to be built from scratch,
-    including the java_cup source files. Subsequent builds can be done
-    using the 'classes' target. 
-
-(5) make the javadoc
-	ex) % gmake jdoc
-
-(6) add bin directory to your executable path, 
-	ex) % set path=($XSLT/bin $path)
-
-(7) test distribution, given a stylesheet (test.xsl) and an input xml doc
-    (test.xml), and be sure current working directory (.) is in your
-    CLASSPATH.
- 	% xsltc test.xsl		... creates translet, test.class
-	% xslt test.xml test		... runs translet on xml input	
diff --git a/xdocs/sources/xsltc/all_namespaces.gif b/xdocs/sources/xsltc/all_namespaces.gif
deleted file mode 100644
index 38034b7..0000000
--- a/xdocs/sources/xsltc/all_namespaces.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/ast_stage1.gif b/xdocs/sources/xsltc/ast_stage1.gif
deleted file mode 100644
index 6e5c425..0000000
--- a/xdocs/sources/xsltc/ast_stage1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/ast_stage2.gif b/xdocs/sources/xsltc/ast_stage2.gif
deleted file mode 100644
index 9387a5d..0000000
--- a/xdocs/sources/xsltc/ast_stage2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/ast_stage3.gif b/xdocs/sources/xsltc/ast_stage3.gif
deleted file mode 100644
index 2d40d2e..0000000
--- a/xdocs/sources/xsltc/ast_stage3.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/cast_expression.gif b/xdocs/sources/xsltc/cast_expression.gif
deleted file mode 100644
index 9bb0090..0000000
--- a/xdocs/sources/xsltc/cast_expression.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/class_loader.gif b/xdocs/sources/xsltc/class_loader.gif
deleted file mode 100644
index 3bc2db9..0000000
--- a/xdocs/sources/xsltc/class_loader.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_AST.gif b/xdocs/sources/xsltc/compiler_AST.gif
deleted file mode 100644
index 69871b6..0000000
--- a/xdocs/sources/xsltc/compiler_AST.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_DOM.gif b/xdocs/sources/xsltc/compiler_DOM.gif
deleted file mode 100644
index a056cbb..0000000
--- a/xdocs/sources/xsltc/compiler_DOM.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_architecture.gif b/xdocs/sources/xsltc/compiler_architecture.gif
deleted file mode 100644
index e57d661..0000000
--- a/xdocs/sources/xsltc/compiler_architecture.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_design.gif b/xdocs/sources/xsltc/compiler_design.gif
deleted file mode 100644
index f12ef43..0000000
--- a/xdocs/sources/xsltc/compiler_design.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/dom_namespace1.gif b/xdocs/sources/xsltc/dom_namespace1.gif
deleted file mode 100644
index 2b9418e..0000000
--- a/xdocs/sources/xsltc/dom_namespace1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/dom_namespace2.gif b/xdocs/sources/xsltc/dom_namespace2.gif
deleted file mode 100644
index 7fce24d..0000000
--- a/xdocs/sources/xsltc/dom_namespace2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/dom_namespace3.gif b/xdocs/sources/xsltc/dom_namespace3.gif
deleted file mode 100644
index d62b9b8..0000000
--- a/xdocs/sources/xsltc/dom_namespace3.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/index.xml b/xdocs/sources/xsltc/index.xml
deleted file mode 100644
index 871f412..0000000
--- a/xdocs/sources/xsltc/index.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC Documentation">
-
-  <s2 title="User Documentation">
-    <p>The following user documentation is currently available:</p>
-    <ul>
-      <li>XSLTC <jump href="README">Installation and Requirements</jump>
-      'README' (not updated)</li>
-      <li>Command-line <jump href="README.xsltc">compiler</jump> and
-      <jump href="README.xslt">runtime</jump> 'README'</li>
-      <li><link idref="xsltc_native_api">XSLTC Native API reference</link></li>
-      <li><link idref="xsltc_trax_api">XSLTC TrAX API reference</link></li>
-      <li><link idref="xsltc_performance">XSLTC Performance Hints</link></li>
-    </ul>
-  </s2>
-
-  <s2 title="Design Documents">
-    <p>The following design documents are currently available:</p>
-    <ul>
-      <li><link anchor="overall">XSLTC overall design</link></li>
-      <li><link anchor="compiler">XSLTC compiler design</link></li>
-      <li><link anchor="runtime">XSLTC runtime library design</link></li>
-      <li><link anchor="runtime">XSLTC internal DOM design</link></li>
-      <li><link anchor="trax">XSLTC TrAX implementation design</link></li>
-    </ul>
-
-
-    <!--========================= OVERALL DESIGN ==========================-->
-    <anchor name="overall"/>
-    <s3 title="XSLTC overall design">
-
-    <p>The figure below describes the overall design of XSLTC's compiler:</p>
-    <p><img src="overall_design.gif" alt="overall_design.gif"/></p>
-    <p><ref>Figure 1: Architectural overview of XSLTC</ref></p>
-
-    <p>A client application can use XSLTC either through its
-    <link idref="xsltc_native_api">native API</link> or through or
-    implementation of the <link idref="xsltc_trax_api">TrAX API</link>. The
-    <link anchor="compiler">compiler</link> generates one or more Java classes
-    (we have chosen to call them 'translets').
-    The <link anchor="runtime">runtime library</link> contains classes that
-    can load these translets and use them to transform XML documents to some
-    markup language or plain text. There is also a detailed document describing
-    <link idref="xsltc_namespace">namespace handling</link> in all parts of
-    XSLTC (compiler, internal DOM, and output handler).</p>
-
-    </s3>
-
-    <!--========================= COMPILER DESIGN =========================-->
-    <anchor name="compiler"/>
-    <s3 title="XSLTC compiler design">
-
-    <p>The figure below describes the overall design of XSLTC's compiler:</p>
-    <p><img src="compiler_design.gif" alt="compiler_design.gif"/></p>
-    <p><ref>Figure 2: Compiler architecture overview</ref></p>
-
-    <p>There is also a <link idref="xsltc_compiler">high-level design</link>
-    document for XSLTC's compiler. Apart from that you can also find separate
-    design documents for some XSL elements and XPath expressions, patterns
-    and functions:</p>
-
-    <s4 title="XSL elements">
-      <ul>
-        <li><link idref="xsl_sort_design">&lt;xsl:sort&gt;</link></li>
-        <li><link idref="xsl_key_design">&lt;xsl:key&gt;</link></li>
-        <li><link idref="xsl_whitespace_design">&lt;xsl:preserve-space&gt;</link></li>
-        <li><link idref="xsl_whitespace_design">&lt;xsl:strip-space&gt;</link></li>
-        <li><link idref="xsl_comment_design">&lt;xsl:comment&gt;</link></li>
-        <li><link idref="xsl_comment_design">&lt;xsl:message&gt;</link></li>
-        <li><link idref="xsl_if_design">&lt;xsl:if&gt;</link></li>
-        <li><link idref="xsl_choose_design">&lt;xsl:choose&gt;</link></li>
-        <li><link idref="xsl_variable_design">&lt;xsl:variable&gt;</link></li>
-        <li><link idref="xsl_variable_design">&lt;xsl:param&gt;</link></li>
-        <li><link idref="xsl_include_design">&lt;xsl:include&gt;</link></li>
-        <li><link idref="xsl_include_design">&lt;xsl:import&gt;</link></li>
-        <li><link idref="xsl_imports_design">&lt;xsl:apply-imports&gt;</link></li>
-      </ul>
-    </s4>
-    <s4 title="XPath functions">
-      <ul>
-        <li><link idref="xsl_key_design">key()</link></li>
-        <li><link idref="xsl_lang_design">lang()</link></li>
-        <li><link idref="xsl_unparsed_design">unparsed-entity-uri()</link></li>
-      </ul>
-    </s4>
-    <s4 title="XPath expressons">
-      <ul>
-        <li><link idref="xsltc_predicates">Predicates</link></li>
-      </ul>
-    </s4>
-
-    <s4 title="XPath patterns">
-      <ul>
-        <li><jump href="xsltc_predicates.html#step-pattern">StepPattern</jump></li>
-        <li><jump href="xsl_key_design.html#patterns">IdPattern</jump></li>
-        <li><jump href="xsl_key_design.html#patterns">KeyPattern</jump></li>
-      </ul>
-    </s4>
-    </s3>
-
-    <!--========================= RUNTIME DESIGN ==========================-->
-    <anchor name="runtime"/>
-    <s3 title="XSLTC runtime library design">
-
-    <p>The runtime portion of XSLTC has four main components; the internal DOM
-    implementation (not W3C), the translet class(es), the runtime
-    library and the output processor:</p>
-
-    <p><img src="runtime_design.gif" alt="runtime_design.gif"/></p>
-    <p><ref>Figure 3: Runtime library architecture overview</ref></p>
-
-    <p>The <link idref="xsltc_runtime">runtime library design</link> document
-    describes the structure of the compiled translet as well as the translet
-    runtime library.</p>
-
-    <p>The <link idref="xsltc_dom">Internal DOM design</link> document
-    describes the components and structure of the internal DOM, support for
-    DOM2 navigation, the DOM adapter, DOM multiplexer, and DOM builder.</p>
-
-    <p>The <link idref="xsltc_iterators">iterator design</link> document
-    describes the general design of the internal DOM iterators and describes
-    some of the more complicated iterators in detail.</p>
-
-    </s3>
-
-    <!--========================== TRAX DESIGN ===========================-->
-    <anchor name="trax"/>
-    <s3 title="XSLTC TrAX Implementation">
-
-    <p>An implementation of the JAXP/ TrAX interface was added on to XSLTC
-    at a late stage. Special care was taken to preserve the small footprint
-    and high performance of XSLTC. The following design was used to wrap
-    XSLTC behind a lightweight (but complete) TrAX implementation:</p>
-
-    <p><img src="trax_translet_wrapping.gif" alt="trax_translet_wrapping.gif"/></p>
-    <p><ref>Figure 4: XSLTC TrAX interface implementation</ref></p>
-
-    <p>The <link idref="xsltc_trax">TrAX design</link> document contains
-    details of XSLTC's TrAX implementation.</p>
-
-    <p>XSLTC also has a 'smart' TrAX <code>TransformerFactory</code> class
-    that will alternate between using XSLTC and Xalan for transformations.
-    This factory class will make its choices based on usage patterns. This will
-    be described in a separate design document.</p>
-
-    </s3>
-
-    </s2>
-
-  <p><ref>Design documents by <jump href="mailto:morten@xml.apache.org">Morten J&oslash;rgensen</jump> - updated 13.12.2001</ref></p>
-
-</s1>
diff --git a/xdocs/sources/xsltc/iterator_stack.gif b/xdocs/sources/xsltc/iterator_stack.gif
deleted file mode 100644
index 7e683d4..0000000
--- a/xdocs/sources/xsltc/iterator_stack.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/key_relations.gif b/xdocs/sources/xsltc/key_relations.gif
deleted file mode 100644
index 946d4dc..0000000
--- a/xdocs/sources/xsltc/key_relations.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/match_namespace1.gif b/xdocs/sources/xsltc/match_namespace1.gif
deleted file mode 100644
index 4d0056d..0000000
--- a/xdocs/sources/xsltc/match_namespace1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/match_namespace2.gif b/xdocs/sources/xsltc/match_namespace2.gif
deleted file mode 100644
index db10277..0000000
--- a/xdocs/sources/xsltc/match_namespace2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/namespace_stack.gif b/xdocs/sources/xsltc/namespace_stack.gif
deleted file mode 100644
index a469d23..0000000
--- a/xdocs/sources/xsltc/namespace_stack.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/output_namespaces1.gif b/xdocs/sources/xsltc/output_namespaces1.gif
deleted file mode 100644
index 5068fc2..0000000
--- a/xdocs/sources/xsltc/output_namespaces1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/output_namespaces2.gif b/xdocs/sources/xsltc/output_namespaces2.gif
deleted file mode 100644
index aaf7cf7..0000000
--- a/xdocs/sources/xsltc/output_namespaces2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/output_settings.gif b/xdocs/sources/xsltc/output_settings.gif
deleted file mode 100644
index 804e087..0000000
--- a/xdocs/sources/xsltc/output_settings.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/overall_design.gif b/xdocs/sources/xsltc/overall_design.gif
deleted file mode 100644
index 32e9e98..0000000
--- a/xdocs/sources/xsltc/overall_design.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/pattern_objects.gif b/xdocs/sources/xsltc/pattern_objects.gif
deleted file mode 100644
index ea07393..0000000
--- a/xdocs/sources/xsltc/pattern_objects.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/runtime_architecture.gif b/xdocs/sources/xsltc/runtime_architecture.gif
deleted file mode 100644
index 9c8e2e7..0000000
--- a/xdocs/sources/xsltc/runtime_architecture.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/runtime_design.gif b/xdocs/sources/xsltc/runtime_design.gif
deleted file mode 100644
index c5d605a..0000000
--- a/xdocs/sources/xsltc/runtime_design.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/runtime_type_mapping.gif b/xdocs/sources/xsltc/runtime_type_mapping.gif
deleted file mode 100644
index 769a993..0000000
--- a/xdocs/sources/xsltc/runtime_type_mapping.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/sort_objects.gif b/xdocs/sources/xsltc/sort_objects.gif
deleted file mode 100644
index 0ec7cbb..0000000
--- a/xdocs/sources/xsltc/sort_objects.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/translet_wrapping.gif b/xdocs/sources/xsltc/translet_wrapping.gif
deleted file mode 100644
index c71b914..0000000
--- a/xdocs/sources/xsltc/translet_wrapping.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/trax_output_settings.gif b/xdocs/sources/xsltc/trax_output_settings.gif
deleted file mode 100644
index 804e087..0000000
--- a/xdocs/sources/xsltc/trax_output_settings.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/trax_translet_wrapping.gif b/xdocs/sources/xsltc/trax_translet_wrapping.gif
deleted file mode 100644
index c71b914..0000000
--- a/xdocs/sources/xsltc/trax_translet_wrapping.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/type_mapping.gif b/xdocs/sources/xsltc/type_mapping.gif
deleted file mode 100644
index bb3cbb9..0000000
--- a/xdocs/sources/xsltc/type_mapping.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/type_mappings.gif b/xdocs/sources/xsltc/type_mappings.gif
deleted file mode 100644
index 31f888c..0000000
--- a/xdocs/sources/xsltc/type_mappings.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/typecast.gif b/xdocs/sources/xsltc/typecast.gif
deleted file mode 100644
index 2a9c168..0000000
--- a/xdocs/sources/xsltc/typecast.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/uri_resolver.gif b/xdocs/sources/xsltc/uri_resolver.gif
deleted file mode 100644
index 4da7a35..0000000
--- a/xdocs/sources/xsltc/uri_resolver.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/xsl_choose_design.xml b/xdocs/sources/xsltc/xsl_choose_design.xml
deleted file mode 100644
index 1f4d3f7..0000000
--- a/xdocs/sources/xsltc/xsl_choose_design.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:choose&gt; / &lt;xsl:when&gt; / &lt;xsl:otherwise&gt;">
-
-  <s2 title="Contents">
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>    
-  </ul>
-  </s2>
-
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>The <code>&lt;xsl:choose&gt;</code> element is used to determine one
-  course of action based on a series of tests. Each test is done inside an
-  <code>&lt;xsl:when&gt;</code> element. If a test succeeds, the body of the
-  <code>&lt;xsl:when&gt;</code> element is executed. If no tests fail then
-  a <code>&lt;xsl:otherwise&gt;</code> element can be used to specify a
-  default action:</p>
-
-  <source>
-    &lt;xsl:choose>
-      &lt;xsl:when test="element-available('some-extension')">
-          ...
-      &lt;/xsl:when>
-      &lt;xsl:when test="function-availabe('saxon:nodeset')">
-          ...
-      &lt;/xsl:when>
-      &lt;xsl:otherwise>
-          ...
-      &lt;/xsl:otherwise>
-    &lt;/xsl:choose></source>
-
-  </s2>
-
-  <anchor name="implementation"/>
-  <s2 title="Implementation">
-
-  <p>The <code>Choose</code> class places all <code>When</code> child-nodes
-  in a vector. The <code>Choose</code> class translates the "test"-attribute
-  of all <code>When</code> nodes (in strict order) and chains them together
-  in an if-else style. The expression that holds each test contains a true-
-  and a false-list. These lists are vectors of branch targets that should be
-  used if the test succeeds or fails, respectively. The first test's
-  false-list is pointed to the start of the next test (ie. if the first test
-  fails, then we run the next test). The last test's false-list points directly
-  to the code for the body of the <code>&lt;xsl:otherwise&gt;</code> element.
-  </p>
-
-  <p>Just as with the <code>&lt;xsl:if&gt;</code>-element, special care is
-  taken for the <code>element-available()</code> and
-  <code>function-available()</code> functions. These functions are evaluated at
-  compile-time (this can be done since all parameters for these functions are
-  literals) and the body of a <code>&lt;xsl:when&gt;</code> element is not
-  compiled if we know that it will never be needed at runtime.</p>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_comment_design.xml b/xdocs/sources/xsltc/xsl_comment_design.xml
deleted file mode 100644
index c1f306e..0000000
--- a/xdocs/sources/xsltc/xsl_comment_design.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:comment&gt; / &lt;xsl:message&gt;">
-
-  <ul>
-  <li><link anchor="functionality">Functionality</link></li>
-  <li><link anchor="implementation">Implementation</link></li>  
-  </ul>
-<anchor name="functionality"/>
-<s2 title="Functionality">
-
-  <p>The <code>&lt;xsl:comment&gt;</code> element is used to insert XML comments
-  into the result document. The comment is inserted as follows in the XSL
-  stylesheet:</p>
-
-  <source>    &lt;element&gt;
-      &lt;xsl:comment&gt;This is a comment!&lt;/xsl:comment&gt;
-    &lt;/element&gt;</source>
-
-  <p>and it will be output in the result document as follows:</p>
-
-  <source>    &lt;element&gt;
-      &lt;!-- This is a comment! --&gt;
-    &lt;/element&gt;</source>
-
-  <p>The <code>&lt;xsl:message&gt;</code> element is used to send messages to
-  who/whatever is performing the transformation. The message can be displayed
-  in a terminal, a dialog box, etc. The  <code>&lt;xsl:message&gt;</code> element
-  is used in the same way as the <code>&lt;xsl:comment&gt;</code> element,
-  however the message is <em>not</em> output in the result document.</p>
-
-  <p>The <code>&lt;xsl:message&gt;</code> element has an attribute
-  <code>"terminate"</code> which can be used to terminate the transformation at any
-  given stage. This is useful when using message to give information about
-  illegal values in the input document.</p>
-</s2><anchor name="implementation"/>
-<s2 title="Implementation">
-
-  <p>The output handler class has a method for outputting comments in the
-  output document and messages to the operator. The code compiled for a
-  comment gathers all text that goes into the comment in a StringValueHandler
-  object, retrieves the full text string from this handler, and then finally
-  sends it to the output handler. Similarly the code compiled for a message
-  will simply send the message to the output handler in use.</p>
-
-  <p>Messages will be output to the terminal (stdout) when a transformation
-  is run in a terminal. The message will be output before the beginning of the
-  output document. Messages will be shown in a dialog box if a transformation
-  is run in an applet.</p>
-
-  <p><code>&lt;xsl:message&gt;</code> elements that use the <code>"terminate"</code>
-  attribute to abort transformations cause an exception to be thrown. A
-  RuntimeException is used for this, and the exception text is:</p>
-  <p><code>Termination forced by an xsl:message instruction</code></p>
-  </s2>
-</s1>  
diff --git a/xdocs/sources/xsltc/xsl_if_design.xml b/xdocs/sources/xsltc/xsl_if_design.xml
deleted file mode 100644
index dbdd306..0000000
--- a/xdocs/sources/xsltc/xsl_if_design.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:if&gt;">
-
-  <s2 title="Contents">
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>    
-  </ul>
-  </s2>
-
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>This element is cruical to XSL processing, but still very simple both in
-  its use and implementation. The element is used like this:</p><source>
-  &lt;xsl:if test="contains($the-world,'Elvis')">
-    &lt;xsl:message>Elvis is still alive!&lt;/xsl:message>
-  &lt;/xsl:if></source>
-
-  <p>The element's contents will only be executed if the test succeeds. There
-  is no <code>&lt;xsl:else&gt;</code> element. One has to use either several
-  <code>&lt;xsl:if&gt;</code>-elements or use a choose-element.</p>
-
-  </s2>
-
-  <anchor name="implementation"/>
-  <s2 title="Implementation">
-
-  <p>The basic implementation is very simple:</p>
-  <ul>
-    <li>execute the expression from the 'test'-attribute</li>
-    <li>evaluate the resulting boolean value</li>
-    <li>ignore the element contents if the value is 'false'</li>
-    <li>otherwise execute the element contents</li>
-  </ul>
-
-  <p>There is onle type of function call that makes this a bit more complicated.
-  The <code>function-available()</code> and <code>element-available()</code>
-  function calls can be used to test for extension elements and functions. A
-  very common use for these is to encapsulate all references to extension
-  elements inside an <code>&lt;xsl:if&gt;</code> element and test for the
-  existance of this element before attempting to use it. XSLTC has to support
-  this. Otherwise we may risk either outputting erronuous error or warning
-  messages about acessing non-existing elements, or even worse, compiling in
-  calls to non-existing methods in the translet, causing the JVM's verifier to
-  prevent the translet from being loaded.</p>
-
-  <p>The <code>function-available()</code> and <code>element-available()</code>
-  functions have been updated to perform an evaluation at compile-time, so that
-  the <code>If</code> class can know wether to compile in calls to extensions or
-  not. This is possible because both functions take only literal expressions as
-  parameters. See the <code>getResult()</code> methods of the
-  <code>FunctionAvailableCall</code> and <code>ElementAvailableCall</code>
-  classes for details.</p>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_include_design.xml b/xdocs/sources/xsltc/xsl_include_design.xml
deleted file mode 100644
index 4e1be0d..0000000
--- a/xdocs/sources/xsltc/xsl_include_design.xml
+++ /dev/null
@@ -1,171 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:include&gt; / &lt;xsl:import&gt;">
-
-  <s2 title="Contents">
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>    
-  </ul>
-  </s2>
-
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-    <p><code>&lt;xsl:include&gt;</code> allows you to include one stylesheet
-    into another. The includ<em>ed</em> stylesheet's templates will have the same
-    default priorities and import precedence as the includ<em>ing</em> stylesheet.
-    <code>&lt;xsl:import&gt;</code> offers the same, but the import precedence
-    of elements in an import<em>ed</em> stylesheet is always less than that of
-    the import<em>ing</em> stylesheet.</p>
-   
-  </s2>
-
-  <anchor name="implementation"/>
-  <s2 title="Implementation">
- 
-    <anchor name="include"/>
-    <s3 title="&lt;xsl:include&gt;">
-
-    <p>This is the simplest case, so we will look at that first. The algorithm
-    for including another stylesheet is roughly:</p>
-
-    <ul>
-      <li>get the including stylesheet from the XSLT parser</li>
-      <li>get the value of the "href" attribute from the
-        <code>&lt;xsl:include&gt;</code> element and check for circular
-        includes/imports</li>
-      <li>check if there is a defined <code>SourceLoader</code> set either
-        through the native or the TrAX API</li>
-      <li>get an <code>InputSource</code> for the document to include, either
-        from the <code>SourceLoader</code> or from the document's URI</li>
-      <li>parse the input document using the compiler's XSLT parser</li>
-      <li>set the import precedence of the included stylesheet to the same as
-        the import precedence of the including stylesheet</li>
-      <li>get the top-level stylesheet from the XSLT parser</li>
-      <li>move all variables, parameters, and top-level elements (include
-        templates) from the included stylesheet to the top-level stylesheet
-        (all elements will keep their import precedence even after being moved
-        to the top-level stylesheet)</li>
-    </ul>
- 
-    </s3>    
-
-    <anchor name="import"/>
-    <s3 title="&lt;xsl:import&gt;">
-
-    <p>This is very similar to <code>&lt;xsl:include&gt;</code>, but import
-    precedence has to be handled differently. Looking at the code you'll find
-    this fragment:</p><source>
-    // Handle precedence for the including stylesheet
-    final int currPrecedence = parser.getCurrentImportPrecedence();
-    final int nextPrecedence = parser.getNextImportPrecedence();
-    _imported.setImportPrecedence(currPrecedence);
-    context.setImportPrecedence(nextPrecedence);</source>
-
-    <p>The important thing here is that the imported stylesheet has import
-    precedence <em>less</em> than the importing stylesheet. So the imported
-    stylesheet gets the current import precedence, while the current stylesheet
-    gets the next available (unused) import precedence. The
-    <code>Stylesheet</code> class has a method
-    <code>setImportPrecedence()</code> that ensures that the import precedence
-    is set not only for the stylesheet itself, but that it is also propagated
-    down to any included/imported stylesheets:</p><source>
-    public void setImportPrecedence(final int precedence) {
-	// Set import precedence for this stylesheet
-	_importPrecedence = precedence;
-
-	// Set import precedence for all included stylesheets
-	final Enumeration elements = elements();
-	while (elements.hasMoreElements()) {
-	    SyntaxTreeNode child = (SyntaxTreeNode)elements.nextElement();
-	    if (child instanceof Include) {
-		Stylesheet included = ((Include)child).getIncludedStylesheet();
-		if (included != null) included.setImportPrecedence(precedence);
-	    }
-	}
-
-	// Set import precedence for the stylesheet that imported this one
-	if (_importedFrom != null) {
-	    if (_importedFrom.getImportPrecedence() &lt; precedence) {
-		final Parser parser = getParser();
-		final int nextPrecedence = parser.getNextImportPrecedence();
-		_importedFrom.setImportPrecedence(nextPrecedence);
-	    }
-	}
-	// Set import precedence for the stylesheet that included this one
-	else if (_includedFrom != null) {
-	    if (_includedFrom.getImportPrecedence() != precedence)
-		_includedFrom.setImportPrecedence(precedence);
-	}
-    }</source>
-
-    <p>This method has been carefully cluttered together, and it works, and it
-    should not be touched.</p>
-
-    </s3>
-
-    <anchor name="apply-imports"/>
-    <s3 title="&lt;xsl:apply-imports&gt;">
-
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_key_design.xml b/xdocs/sources/xsltc/xsl_key_design.xml
deleted file mode 100644
index 9316f48..0000000
--- a/xdocs/sources/xsltc/xsl_key_design.xml
+++ /dev/null
@@ -1,296 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:key&gt; / key() / IdKeyPattern">
-
-  <s2 title="Contents">
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>    
-  </ul>
-  </s2>
-
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>The <code>&lt;xsl:key&gt;</code> element is a top-level element that can be
-  used to define a named index of nodes from the source XML tree(s). The
-  element has three attributes:</p>
-
-  <ul>
-    <li>
-      <code>name</code> - the name of the index
-    </li>
-    <li>
-      <code>match</code> - a pattern that defines the nodeset we want
-      indexed
-    </li>
-    <li>
-      <code>use</code> - an expression that defines the value to be used
-      as the index key value.
-    </li>
-  </ul>
-
-  <p>A named index can be accessed using either the <code>key()</code> function
-  or a KeyPattern. Both these methods address the index using its defined name
-  (the "name" attribute above) and a parameter defining one or more lookup
-  values for the index. The function or pattern returns a node set containing
-  all nodes in the index whose key value match the parameter's value(s):</p>
-
-  <source>
-    &lt;xsl:key name="book-author" match="book" use="author"/&gt;
-        :
-        :
-    &lt;xsl:for-each select="key('book-author', 'Mikhail Bulgakov')"&gt;
-      &lt;xsl:value-of select="author"/&gt;
-      &lt;xsl:text&gt;: &lt;/xsl:text&gt;
-      &lt;xsl:value-of select="author"/&gt;
-      &lt;xsl:text&gt;&amp;#xa;&lt;/xsl:text&gt;
-    &lt;/xsl:for-each&gt;</source>
-
-  <p>The KeyPattern can be used within an index definition to create unions
-  and intersections of node sets:</p><source>
-    &lt;xsl:key name="cultcies" match="farmer | fisherman" use="name"/&gt;</source>
-
-  <p>This could have been done using regular <code>&lt;xsl:for-each&gt;</code>
-  and <code>&lt;xsl:select&gt;</code> elements. However, if your stylesheet
-  accesses the same selection of nodes over and over again, the transformation
-  will be much more efficient using pre-indexed keys as shown above.</p>
-
-  </s2>
-
-  <anchor name="implementation"/>
-  <s2 title="Implementation">
-
-    <anchor name="indexing"/>
-    <s3 title="Indexing">
-
-    <p>The <code>AbstractTranslet</code> class has a global hashtable that holds
-    an index for each named key in the stylesheet (hashing on the "name"
-    attribute of <code>&lt;xsl:key&gt;</code>). <code>AbstractTranslet</code>
-    has a couple of public methods for inserting and retrieving data from this
-    hashtable:</p><source>
-    public void buildKeyIndex(String keyName, int nodeID, String value);
-    public KeyIndex KeyIndex getKeyIndex(String keyName);</source>
-
-    <p>The <code>Key</code> class compiles code that traverses the input DOM and
-    extracts nodes that match some given parameters (the <code>"match"</code>
-    attribute of the <code>&lt;xsl:key&gt;</code> element). A new element is
-    inserted into the named key's index. The nodes' DOM index and the value
-    translated from the <code>"use"</code> attribute of the
-    <code>&lt;xsl:key&gt;</code> element are stored in the new entry in the
-    index.</p>
-
-    <p>Something similar is done for indexing IDs. This index is generated from
-    the <code>ID</code> and <code>IDREF</code> fields in the input document's
-    DTD. This means that the code for generating this index cannot be generated
-    at compile-time, which again means that the code has to be generic enough
-    to handle all DTDs. The class that handles this is the
-    <code>org.apache.xalan.xsltc.dom.DTDMonitor</code> class. This class
-    implements the <code>org.xml.sax.XMLReader</code> and
-    <code>org.xml.sax.DTDHandler</code> interfaces. A client application using
-    the native API must instanciate a <code>DTDMonitor</code> and pass it to the
-    translet code - if, and only if, it wants IDs indexed (one can improve
-    performance by omitting this step). This is descrived in the
-    <link idref="xsltc_native_api">XSLTC Native API reference</link>. The
-    <code>DTDMonitor</code> class will use the same indexing as the code
-    generated by the <code>Key</code> class. The index for ID's is called
-    "##id". We assume that no stylesheets will contain a key with this name.</p>
-
-    <p>The index itself is implemented in the
-    <code>org.apache.xalan.xsltc.dom.KeyIndex</code> class. The index has an
-    hashtable with all the values from the matching nodes (the part of the node
-    used to generate this value is the one specified in the <code>"use"</code>
-    attribute). For every matching value there is a bit-array (implemented in
-    the <code>org.apache.xalan.xsltc.BitArray</code> class), holding a list of
-    all node indexes for which this value gives a match:</p>
-    <p><img src="key_relations.gif" alt="key_relations.gif"/></p>
-    <p><ref>Figure 1: Indexing tables</ref></p>
-
-    <p>The <code>KeyIndex</code> class implements the <code>NodeIterator</code>
-    interface, so that it can be returned directly by the implementation of the
-    <code>key()</code> function. This is how the index generated by
-    <code>&lt;xsl:key&gt;</code> and the node-set returned by the
-    <code>key()</code> and KeyPattern are tied together. You can see how this is
-    done in the <code>translate()</code> method of the <code>KeyCall</code>
-    class.</p>
-
-    <p>The <code>key()</code> function can be called in two ways:</p><source>
-    key('key-name','value')
-    key('key-name','node-set')</source>
-
-    <p>The first parameter is always the name of the key. We use this value to
-    lookup our index from the _keyIndexes hashtable in AbstractTranslet:</p>
-    <source>
-    il.append(classGen.aloadThis());
-    _name.translate(classGen, methodGen);
-    il.append(new INVOKEVIRTUAL(getKeyIndex));</source>
-
-    <p>This compiles into a call to
-    <code>AbstractTranslet.getKeyIndex(String name)</code>, and it leaves a
-    <code>KeyIndex</code> object on the stack. What we then need to do it to
-    initialise the <code>KeyIndex</code> to give us nodes with the requested
-    value. This is done by leaving the <code>KeyIndex</code> object on the stack
-    and pushing the <code>"value"</code> parameter to <code>key()</code>, before
-    calling <code>lookup()</code> on the index:</p><source>
-    il.append(DUP);  // duplicate the KeyIndex obejct before return
-    _value.translate(classGen, methodGen);
-    il.append(new INVOKEVIRTUAL(lookup));</source>
-
-    <p>This compiles into a call to <code>KeyIndex.lookup(String value)</code>.
-    This will initialise the <code>KeyIndex</code> object to return nodes that
-    match the given value, so the <code>KeyIndex</code> object can be left on
-    the stack when we return. This because the <code>KeyIndex</code> object
-    implements the <code>NodeIterator</code> interface.</p>
-
-    <p>This matter is a bit more complex when the second parameter of
-    <code>key()</code> is a node-set. In this case we need to traverse the nodes
-    in the set and do a lookup for each node in the set. What I do is this:</p>
-
-    <ul>
-      <li>
-        construct a <code>KeyIndex</code> object that will hold the
-        return node-set
-      </li>
-      <li>
-        find the named <code>KeyIndex</code> object from the hashtable in
-        AbstractTranslet
-      </li>
-      <li>
-        get an iterator for the node-set and do the folowing loop:</li>
-        <ul>
-          <li>get string value for current node</li>
-          <li>do lookup in KeyIndex object for the named index</li>
-          <li>merge the resulting node-set into the return node-set</li>
-        </ul>
-      <li>
-        leave the return node-set on stack when done
-      </li>
-    </ul>
-
-    </s3>
-
-    <anchor name="improvements"/>
-    <s3 title="Possible indexing improvements">
-
-    <p>The indexing implementation can be very, very memeory exhaustive as there
-    is one <code>BitArray</code> allocated for each value for every index. This
-    is particulary bad for the index used for IDs ('##id'), where a single value
-    should only map to one, single node. This means that a whole
-    <code>BitArray</code> is used just to contain one node. The
-    <code>KeyIndex</code> class should be updated to hold the first node for a
-    value in an <code>Integer</code> object, and then replace that with a
-    <code>BitArray</code> or a <code>Vector</code> only is a second node is
-    added to the value. Here is an outline for <code>KeyIndex</code>:</p>
-    <source>
-
-    public void add(Object value, int node) {
-        Object container;
-	if ((container = (BitArray)_index.get(value)) == null) {
-            _index.put(value, new Integer(node));
-	}
-	else {
-            // Check if there is _one_ node for this value
-            if (container instanceof Integer) {
-                int first = ((Integer)container
-                _nodes = new BitArray(_arraySize);
-                _nodes.setMask(node &amp; 0xff000000);
-                _nodes.setBit(first &amp; 0x00ffffff);
-                _nodes.setBit(node &amp; 0x00ffffff);
-                _index.put(value, _nodes);
-            }
-            // Otherwise add node to axisting bit array
-            else {
-                _nodex = (BitArray)container;
-                _nodes.setBit(node &amp; 0x00ffffff);
-            }
-        }
-    }</source>
-
-    <p>Other methods inside the <code>KeyIndex</code> should be updated to
-    reflect this.</p>
-
-    </s3>
-
-    <anchor name="patterns"/>
-    <s3 title="Id and Key patterns">
-
-    <p>As already mentioned, the challenge with the <code>id()</code> and
-    <code>key()</code> patterns is that they have no specific node type. 
-    Patterns are normally grouped based on their pattern's "kernel" node type.
-    This is done in the <code>org.apache.xalan.xsltc.compiler.Mode</code> class.
-    The <code>Mode</code> class has a method, <code>flatternAlaternative</code>,
-    that does this grouping, and all templates with a common kernel node type
-    will be inserted into a "test sequence". A test sequence is a set templates
-    with the same kernel node type. The <code>TestSeq</code> class generates
-    code that will figure out which pattern, amongst several patterns with the
-    same kernel node type, that matches a certain node. This is used by the
-    <code>Mode</code> class when generating the <code>applyTemplates</code>
-    method in the translet. A test sequence is also generated for all templates
-    whose pattern does not have a kernel node type. This is the case for all
-    Id and KeyPatterns. This test sequence, if necessary, is put before the
-    big <code>switch()</code> in the <code>applyTemplates()</code> mehtod. This
-    test has to be done for every single node that is traversed, causing the
-    transformation to slow down siginificantly. This is why we do <em>not</em>
-    recommend using this type of patterns with XSLTC.</p>
-
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_lang_design.xml b/xdocs/sources/xsltc/xsl_lang_design.xml
deleted file mode 100644
index 863929b..0000000
--- a/xdocs/sources/xsltc/xsl_lang_design.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="lang() function">
-
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>    
-  </ul>
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>The <code>xml:lang</code> can be used to determine the language for a node or
-  a node-set. The attribute can be used to store language-specific data in an
-  XML document:</p>
-
-  <source>
-    &lt;phrases&gt;
-      &lt;greeting xml:lang="en"&gt;Hello!&lt;/greeting&gt;
-      &lt;greeting xml:lang="no"&gt;Hei!&lt;/greeting&gt;
-      &lt;greeting xml:lang="fr"&gt;Salut!&lt;/greeting&gt;
-      &lt;greeting xml:lang="es"&gt;Hola!&lt;/greeting&gt;
-      &lt;greeting xml:lang="de"&gt;Sweinhund!&lt;/greeting&gt;
-    &lt;/phrases&gt;
-  </source>
-
-  <p>The XSL stylesheet can use the <code>lang()</code> function to select the
-  element with the desired language:</p>
-
-  <source>
-    &lt;xsl:template match="greeting"&gt;
-      &lt;xsl:if test="lang("de")&gt;
-        &lt;xsl:value-of select="."/&gt;
-        &lt;xsl:text&gt; Grossglucklicher wunche!&lt;/xsl:text&gt;
-      &lt;/xsl:if&gt;
-    &lt;/xsl:template&gt;
-  </source>
-</s2> <anchor name="implementation"/>
-<s2 title="Implementation">
-
-  <p>The DOM interface has been given a method that returns the language for
-  a given node. The language is returned as a string (on whatever format is
-  used in the XML document - should be iso), and may be null if no language is
-  defined.</p>
-
-  <source>
-    public String DOM.getLanguage(int node);
-  </source>
-
-  <p>The BasisLibrary class has a static method that will compare the language
-  of the context node with some other language and return the result as a
-  boolean.</p>
-
-  <source>
-    public static boolean BasisLibrary.testLanguage(String language, DOM dom, int node);
-  </source>
-
-  <p>The compiled code for the <code>lang()</code> method calls this method in the
-  BasisLibrary and leaves the result on the stack for the calling element.</p>
-  </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_sort_design.xml b/xdocs/sources/xsltc/xsl_sort_design.xml
deleted file mode 100644
index 40ad312..0000000
--- a/xdocs/sources/xsltc/xsl_sort_design.xml
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:sort&gt;">
-
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="sort-class">The Sort class</link></li>
-    <li><link anchor="iterator">The SortingIterator class</link></li>
-    <li><link anchor="sortrecord">The NodeSortRecord class</link></li>    
-    <li><link anchor="recordfactory">The NodeSortRecordFactory class</link></li>
-  </ul>
-  
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>The <code>&lt;xsl:sort&gt;</code> element is used to define a sort key
-  which specifies the order in which nodes selected by either
-  <code>&lt;xsl:apply-templates&gt;</code> or <code>&lt;xsl:for-each&gt;</code>
-  are processed. The nodes can be sorted either in numerical or alphabetic
-  order, and the alphabetic order may vary depeinding on the language in use.
-  The nodes can be sorted either in ascending or descending order.</p>
-
-  </s2><anchor name="sort-class"/>
-  <s2 title="The Sort class">
-
-  <p>Static methods of the Sort class is responsible for generating the
-  necessary code for invoking SortingIterators under
-  <code>&lt;xsl:apply-templates&gt;</code> and <code>&lt;xsl:for-each&gt;</code>
-  elements. Both these elements can have several <code>&lt;xsl:sort&gt;</code>
-  child nodes defining primary, secondary, teriary, etc. keys. The code for
-  <code>&lt;xsl:apply-templates&gt;</code> and <code>&lt;xsl:for-each&gt;</code>
-  create  vectors containg a Sort object for each sort key. The object methods
-  of the Sort object encapsulate a container for key-specific data (such as the
-  sort key itself, sort order, sort type, and such) while the static methods
-  take a vector of Sort objects and generate the actual code.</p>
-
-  <p>The <code>translate()</code> method of the Sort object is never called. The
-  vectors containing the Sort objects for a <code>&lt;xsl:apply-templates&gt;</code>
-  or <code>&lt;xsl:for-each&gt;</code> element are instead passed to the static
-  <code>translateSortIterator()</code> method. This method compiles code that
-  instanciates a SortingIterator object that will pass on a node-set in a
-  specific order to the code handling the <code>&lt;xsl:apply-templates&gt;</code>
-  or <code>&lt;xsl:for-each&gt;</code> element.</p>
-
-  </s2><anchor name="iterator"/>
-  <s2 title="The SortingIterator class">
-
-  <p>The SortingIterator class is responsible for sorting nodes encapsulated in
-  sort obects. These sort objects must be of a class inheriting from
-  NodeSortRecord, a the SortingIterator object needs a factory object providing
-  it with the correct type of objects:</p>
-
-  <p><img src="sort_objects.gif" alt="sort_objects.gif"/></p>
-  <p><ref>Figure 1: SortingIterator</ref></p>
-
-  <p>The SortingIterator class is fairly dumb and leaves much of the work to the
-  NodeSortRecord class. The iterator gets the NodeSortRecords from the factory
-  object and sorts them using quicksort and calling <code>compareTo()</code> on
-  pairs of NodeSortRecord objects.</p>
-
-  </s2><anchor name="sortrecord"/>
-  <s2 title="The NodeSortRecord class">
-
-  <p>The static methods in the Sort class generates a class inheriting from
-  NodeSortRecord, with the following overloaded methods:</p>
-
-  <ul>
-    <li><em>Class Constructor</em></li>
-      <ul><li>The class constructor is overloaded to create sort-key global
-      tables, such as an array containing the sort order for all the sort keys
-      and another array containg all the sort types. Different sort order/types
-      can be specified for the different levels of sort keys, but we assume that
-      the same language is used for all levels.</li></ul>
-      
-    <li><code>extractValueFromDOM(int level)</code></li>
-      <ul><li>This method is called by the SortingIterator object to extract the
-      value for a specific sort key for a node. The SortingIterator will only
-      use this method once and will cache the returned value for later use. The
-      method will only be called if absultely necessary.</li></ul>
-
-    <li><code>compareType(int level)</code></li>
-      <ul><li>This method returns the sort type for one sort key level. Returns
-      either <code>COMPARE_STRING</code> or <code>COMPARE_NUMERIC</code>.</li></ul>
-    
-    <li><code>sortOrder(int level)</code></li>
-      <ul><li>This method returns the sort order for one sort key level. Returns
-      either <code>COMPARE_ASCENDING</code> or <code>COMPARE_DESCENDING</code></li></ul>
-    
-    <li><code>getCollator(int level)</code></li>
-      <ul><li>This method returns a Collator object for language-specific
-      string comparisons. The same Collator is used for all levels of the key.
-      </li></ul> 
-  </ul>
-
-  <p>The <code>compareTo()</code> method of the NodeSortRecord base class deserves
-  a bit of attention. It takes its own node (from the this pointer) and another
-  node and compares, if necessary, the values for all sort keys:</p>
-
-  <source>
-    /**
-     * Compare this sort element to another. The first level is checked first,
-     * and we proceed to the next level only if the first level keys are
-     * identical (and so the key values may not even be extracted from the DOM)
-     */
-    public int compareTo(NodeSortRecord other) {
-	int cmp;
-    
-	for (int level=0; level&lt;_levels; level++) {
-	    
-	    // Compare the two nodes either as numeric or text values
-	    if (compareType(level) == COMPARE_NUMERIC) {
-		final Double our = numericValue(level);
-		final Double their = other.numericValue(level);
-		if (our == null) return(-1);
-		if (their == null) return(1);
-		cmp = our.compareTo(their);
-	    }
-	    else {
-		String our = stringValue(level);
-		String their = other.stringValue(level);
-		if (our == null) return(-1);
-		if (their == null) return(1);
-		cmp = getCollator().compare(our,their);
-	    }
-	    
-	    // Return inverse compare value if inverse sort order
-	    if (cmp != 0) {
-		if (sortOrder(level) == COMPARE_DESCENDING)
-		    return(0 - cmp);
-		else
-		    return(cmp);
-	    }
-	    
-	}
-	return(0);
-    }
-  </source>
-
-  <p>The two methods <code>stringValue(int level)</code> and 
-  <code>numericValue(int level)</code> return values for one level of the sort key
-  of a node. These methods cache these values after they are first read so that
-  the <code>DOM.getNodeValue()</code> is only called once. Also, the algorithm
-  used for these two methods assure that <code>DOM.getNodeValue()</code> is only
-  called when needed. The value for a node's secondary sort key is never
-  retrieved if the node can be uniquely identified by its primary key.</p>
-
-  </s2><anchor name="recordfactory"/>
-  <s2 title="The NodeSortRecordFactory class">
-
-  <p>After the static methods of the Sort class has generated the new class for
-  sort objects it generates code that instanciates a new NodeSortRecordFactory
-  object. This object is passed as a parameter to SortingIterators constructor
-  and is used by the iterator to generate the necessary sort objects.</p>
-
-  </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_unparsed_design.xml b/xdocs/sources/xsltc/xsl_unparsed_design.xml
deleted file mode 100644
index eca0ad9..0000000
--- a/xdocs/sources/xsltc/xsl_unparsed_design.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="unparsed-entity-uri()">
-
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>
-  </ul>
-  
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-
-  <p>The <code>unparsed-entity-uri()</code> function gives access to declarations
-  of unparsed entities in the DTD of the source document. If the DTD contains
-  the declaration:</p>
-
-  <source>
-    &lt;!ENTITY mom-picture SYSTEM "http://www.home.com/mom.jpg" NDATA JPEG&gt;
-  </source>
-
-  <p>the expression <code>unparsed-entity-uri('mom-picture')</code> returns an
-  URI for the file <code>mom.jpg</code>.</p>
-
-  </s2><anchor name="implementation"/>
-  <s2 title="Implementation">
-
-  <p>Unparsed entities must be gathered from the XML input document at the time
-  when the DOM is built. To achieve this our parser must parse the document DTD
-  (if any) and store all data of type NDATA (not XML data) in a
-  hashtable in the AbstractTranslet object. All the compiled code for this
-  function needs to do is call a method in the translet for retrieving the
-  value for the requested element:</p>
-
-  <source>
-    public String AbstractTranslet.getUnparsedEntity(String entityName);
-  </source>
-
-  <p>The translet will use the supplied <code>entityName</code> to look up the
-  value in the hashtable and then leave the string value on the stack for the
-  element that called <code>lang()</code>.</p>
-  </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_variable_design.xml b/xdocs/sources/xsltc/xsl_variable_design.xml
deleted file mode 100644
index ccdcf3f..0000000
--- a/xdocs/sources/xsltc/xsl_variable_design.xml
+++ /dev/null
@@ -1,244 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:variable&gt; / &lt;xsl:param&gt;">
-
-  <s2 title="Contents">
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="implementation">Implementation</link></li>    
-  </ul>
-  </s2>
-
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>Variables in XSLT are not really variables, as their values cannot be
-  changed. They resemble constants from conventional programming languages. The
-  only way in which a variable can be changed is by declaring it inside a
-  for-each loop, in which case its value will be updated for every iteration.
-  Top-level variables (variables that are direct child nodes of the
-  <code>&lt;xsl:stylesheet&gt;</code> element) can never be changed.</p>
-
-  <source>
-    &lt;xsl:for-each select="/foo/bar">
-      &lt;xsl:variable name="some-bar" select="."/>
-      &lt;xsl:value-of select="$some-bar"/>
-    &lt;/xsl:for-each></source>
-
-  <p>Parameters are assigned a value either from the process that invoked
-  the stylesheet (top-level parameter), or from a
-  <code>&lt;xsl:with-param&gt;</code> or from a default value (in which case it
-  behaves as if it was a variable).</p>
-
-  <source>
-    &lt;xsl:template match="/">
-      &lt;xsl:call-template name="blob">
-        &lt;xsl:with-param name="par" select="'some-value'"/>
-      &lt;/xsl:call-template>
-    &lt;/xsl:template>
-
-    &lt;xsl:template name="blob">
-      &lt;xsl:param name="par" select="'default-value'"/>
-      &lt;xsl:value-of select="$param"/>
-    &lt;/xsl:template></source>
-
-  </s2>
-
-  <anchor name="implementation"/>
-  <s2 title="Implementation">
-
-    <p>Variables and parameters share a common base class
-    <code>VariableBase</code> that contains a lot of common methods. This class
-    handles both global and local variables/parameters.</p>
-
-    <s3 title="Top-level parameters and variables">
-
-    <p>All top-level (ie. global) parameters and variables are stored inside
-    fields in the translet class. Variables are stored as objects or basic
-    data types (such as boolean, char, int, etc.) while parameters have to be
-    "boxed" inside an object. This is because parameters are also stored as
-    objects inside the translet. The <code>addParameter()</code> method of the
-    <code>AbstractTranslet</code> class stores the parameter in a Hashtable
-    (the Hashtable maps the parameter name to the parameter value). The
-    "boxing" of the parameter's value is done by the class that handles the
-    parameters type. This class is a subclass of
-    <code>org.apache.xalan.xsltc.compiler.util.Type</code>.</p>
-
-    <p>Note that all top-level parameters and variables from all imported and
-    included stylesheets will be placed as direct children of the top-level
-    stylesheet in the AST. This done to make global variables truly global and
-    not just global in the stylesheet where it was declared.</p>
-
-    </s3>
-
-    <s3 title="Local parameters and variables">
-
-    <p>Local variables that are accessible from a given syntax tree node will
-    first be put on the JVM's stack and stored in a local variable slot. This
-    makes the variable or parameter accessible from all code within that
-    method. But, in some special cases, the code that is compiled to handle an
-    element/expression within the variable scope is not put inside the same
-    method as the actual variable. This is the case for some predicates.
-    All syntax-tree nodes implement the <code>isClosureBoundary()</code> method
-    to indicate if its child an ancestor nodes will end up in a different method
-    then itself. This method is used by the <code>Variable</code> and
-    <code>Param</code> classes to determine if the variable or parameter will
-    "escape" the variable frame.</p>
-
-    <source>
-    &lt;xsl:for-each select="/foo/bar/baz">
-        &lt;xsl:variable name="pos" select="3"/>
-        &lt;xsl:apply-templates select="/foo/bar[$pos]"/>
-    &lt;/xsl:for-each></source>
-
-    <p>The predicate in this stylesheet fragment is compiled into a separate
-    auxiliary class that implements the <code>Filter</code> interface. It will
-    therefore not have access to the variable "pos" in the current stack frame.
-    A common technique for cases like this is to use a <em>"closure"</em>. A
-    closure is a record that contains references to all variables that are in
-    scope for a certain part of the compiled scope. This is done in a very
-    simple manner in XSLTC. All variables or parameters that can "escape" the
-    stack are passed to the translet via its <code>addVariable()</code> method.
-    They can then later be retrieved by the <code>getVariable()</code> method.
-    </p>
-
-    <p><em>Important note 1:</em> A predicate does not always result in a
-    auxiliary class. In some cases we optimize the code by using tailored
-    iterators and goodies like that instead. We may want to update the
-    predicate code to check if an auxiliary class will be generated before
-    returning true or false from the <code>isClosureBoundary()</code>
-    method.</p>
-
-    <p><em>Important note 2:</em> There could be other closure boundaries
-    that we have not yet discovered or considered. This could be, for instance,
-    sort records and other auxiliary classes:</p>
-
-    <source>
-    &lt;xsl:variable name="sort-order" select="'decending'"/>
-    &lt;xsl:for-each select="/foo/bar/baz">
-        &lt;xsl:sort select="@name" order="$sort-order"/>
-        &lt;xsl:value-of select="."/>
-    &lt;/xsl:for-each></source>
-
-    <p>I would not be surprised if this fails. A fix could be to implement the
-    <code>isClosureBoundary()</code> in the <code>Sort</code> class and have the
-    method return 'true' in all cases.</p>
-
-    </s3>
-
-    <s3 title="Parameter and variable references">
-
-    <p>A parameter or variable reference does the oposite of a parameter or
-    variable. The value is read from either a global field, a local variable
-    slot or from a call to <code>getVariable()</code> /
-    <code>getParameter()</code>. The chosen method depends is we're dealing with
-    a parameter or a variable, a global or a local, an escaping variable or not.
-    </p>
-
-    <p>The XPath parser identifies all variable references and instanciates
-    either a <code>VariableRef</code> or a <code>ParameterRef</code>. The XPath
-    parser calls the parser's <code>lookupVariable</code> method in an initial
-    attempt to find the variable/parameter instance. If that fails, it goes on
-    to call the symbol table's <code>lookupName()</code> method. If that also
-    fails this means that either:</p>
-
-    <ul>
-      <li>a variable or parameter with the given name does not exist</li>
-      <li>the variable will be declared at a later stage
-      (but within the same scope)</li>
-    </ul>
-
-    <p>The XPath parser creates an instance of the <code>UnresolvedRef</code>
-    class. This class attempts to locate the variable after the whole AST has
-    been built, when the <code>typeCheck()</code> method is called. If this
-    fails an error is reported and the compilation stops. Otherwise the class
-    creates a <code>VariableRef</code> or a <code>ParameterRef</code> instance
-    and lets that handle the reference.</p>
-
-    </s3>
-
-    <s3 title="Forward references">
-
-    <p>XSLTC allows for forward references to global variables and parameters.
-    You can even reference variables in not-yet included/imported stylesheets.
-    In most cases, this is handled by changing the order of top-level elements.
-    (Variables are placed first so that they are handled before any includes
-    or imports).  But when a variable contains references to other variables,
-    then this requires some extra code in the <code>Stylesheet</code> and
-    <code>VariableBase</code> classes. The <code>VariableBase</code> has a
-    method that returns a vector containing all variables that are referenced
-    in the variable definition.</p>
-
-    <source>
-    &lt;xsl:variable name="C" select="$A &lt; $B"/>
-    &lt;xsl:variable name="A" select="1"/>
-    &lt;xsl:variable name="B" select="2"/></source>
-
-    <p>In this case, the <code>getDependencies()</code> method for variable
-    C will return the variables A and B. The stylesheet has a method called
-    <code>resolveReferences</code> that will order the variables accordingly
-    so that the variable values are computed in the desired order. This method
-    will issue an error message and terminate the compilation if there are
-    circular variable/parameter dependencies.</p>
-
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_whitespace_design.xml b/xdocs/sources/xsltc/xsl_whitespace_design.xml
deleted file mode 100644
index f03578d..0000000
--- a/xdocs/sources/xsltc/xsl_whitespace_design.xml
+++ /dev/null
@@ -1,343 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-  <s1 title="&lt;xsl:strip/preserve-space&gt;">
-
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="identify">Identifying strippable whitespace nodes</link></li>
-    <li><link anchor="which">Determining which nodes to strip</link></li>
-    <li><link anchor="strip">Stripping nodes</link></li>
-    <li><link anchor="filter">Filtering whitespace nodes</link></li>
-  </ul>
-  
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-  <p>The <code>&lt;xsl:strip-space&gt;</code> and <code>&lt;xsl:preserve-space&gt;</code>
-  elements are used to control the way whitespace nodes in the source XML
-  document are handled. These elements have no impact on whitespace in the XSLT
-  stylesheet. Both elements can occur only as top-level elements, possible more
-  than once, and the elements are always empty</p>
- 
-  <p>Both elements take one attribute &quot;elements&quot; which contains a
-  whitespace separated list of named nodes which should be or preserved
-  stripped from the source document. These names can be on one of these three
-  formats (NameTest format):</p>
-
-  <ul>
-    <li>
-      All whitespace nodes:
-      <code>elements=&quot;*&quot;</code>
-    </li>
-    <li>
-      All whitespace nodes with a namespace:
-      <code>elements=&quot;&lt;namespace&gt;:*&quot;</code>
-    </li>
-    <li>
-      Specific whitespace nodes: <code>elements=&quot;&lt;qname&gt;&quot;</code>
-    </li>
-  </ul>
-
-  </s2><anchor name="identify"/>
-  <s2 title="Identifying strippable whitespace nodes">
-
-  <p>The DOM detects all text nodes and assigns them the type <code>TEXT</code>.
-  All text nodes are scanned to detect whitespace-only nodes. A text-node is
-  considered a whitespace node only if it consist entirely of characters from
-  the set { 0x09, 0x0a, 0x0d, 0x20 }. The DOM implementation class has a static
-  method used to detect such nodes:</p>
-
-<source>
-    private static final boolean isWhitespaceChar(char c) {
-        return c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09;
-    }
-</source>
-
-  <p>The characters are checked in probable order.</p>
-
-  <p> The DOM has a bit-array that is used to  tag text-nodes as strippable
-  whitespace nodes:</p>
-
-  <source>private int[] _whitespace;</source>
-
-  <p>There are two methods in the DOM implementation class for accessing this
-  bit-array: <code>markWhitespace(node)</code> and <code>isWhitespace(node)</code>.
-  The array is resized together with all other arrays in the DOM by the
-  <code>DOM.resizeArrays()</code> method. The bits in the array are set in the
-  <code>DOM.maybeCreateTextNode()</code> method. This method must know whether
-  the current node is a located under an element with an
-  <code>xml:space=&quot;&lt;value&gt;&quot;</code> attribute in the DOM, in which
-  case it is not a strippable whitespace node.</p>
-
-  <p>An auxillary class, WhitespaceHandler, is used for this purpose. The class
-  works in a way as a stack, where you "push" a new strip/preserve setting
-  together with the node in which this setting was determined. This means that
-  for every time the DOM builder encounters an <code>xml:space</code> attribute
-  it will invoke a method on an instance of the WhitespaceHandler class to
-  signal that a new preserve/strip setting has been encountered. This is done
-  in the <code>makeAttributeNode()</code> method. The whitespace handler stores the
-  new setting and pushes the current element node on its stack. When the
-  DOM builder closes up an element (in <code>endElement()</code>), it invokes
-  another method of the whitespace handler to check if the strip/preserve
-  setting is still valid. If the setting is now invalid (we're closing the
-  element whose node id is on the top of the stack) the handler inverts the
-  setting and pops the element node id off the stack. The previous
-  strip/preserve setting is then valid, and the id of node where this setting
-  was defined is on the top of the stack.</p>
-
-  </s2><anchor name="which"/>
-  <s2 title="Determining which nodes to strip">
-
-  <p>A text node is never stripped unless it contains only whitespace
-  characters (Unicode characters 0x09, 0x0A, 0x0D and 0x20). Stripping a text
-  node means that the node disappears from the DOM; so that it is never
-  included in the output and that it is ignored by all functions such as
-  <code>count()</code>. A text node is preserved if any of the following apply:</p>
-
-  <ul>
-    <li>
-      the element name of the parent of the text node is in the set of
-      elements listed in <code>&lt;xsl:preserve-space&gt;</code>
-    </li>
-    <li>
-      the text node contains at least one non-whitespace character
-    </li>
-    <li>
-      an ancenstor of the whitespace text node has an attribute of
-      <code>xsl:space=&quot;preserve&quot;</code>, and no close ancestor has and
-      attribute of <code>xsl:space=&quot;default&quot;</code>.
-    </li>
-  </ul>
-
-  <p>Otherwise, the text node is stripped. Initially the set of 
-  whitespace-preserving element names contains all element names, so the
-  default behaviour is to preserve all whitespace text nodes.</p>
-
-  <p>This seems simple enough, but resolving conflicts between matching
-  <code>&lt;xsl:strip-space&gt;</code> and <code>&lt;xsl:preserve-space&gt;</code>
-  elements requires a lot of thought. Our first consideration is import
-  precedence; the match with the highest import precedence is always chosen.
-  Import precedence is determined by the order in which the compared elements
-  are visited. (In this case those elements are the top-level
-  <code>&lt;xsl:strip-space&gt;</code> and <code>&lt;xsl:preserve-space&gt;</code>
-  elements.) This example is taken from the XSLT recommendation:</p>
-
-  <ul>
-    <li>stylesheet A imports stylesheets B and C in that order;</li>
-    <li>stylesheet B imports stylesheet D;</li>
-    <li>stylesheet C imports stylesheet E.</li>
-  </ul>
-
-  <p>Then the order of import precedence (lowest first) is D, B, E, C, A.</p>
-
-  <p>Our next consideration is the priority of NameTests (XPath spec):</p>
-  <ul>
-    <li>
-      <code>elements=&quot;&lt;qname&gt;&quot;</code> has priority 0
-    </li>
-    <li>
-      <code>elements=&quot;&lt;namespace&gt;:*&quot;</code> has priority -0.25
-    </li>
-    <li>
-      <code>elements=&quot;*&quot;</code> has priority -0.5
-    </li>
-  </ul>
-
-  <p>It is considered an error if the desicion is still ambiguous after this,
-  and it is up to the implementors to decide what the apropriate action is.</p>
-
-  <p>With all this complexity, the normal usage for these elements is quite
-  smiple; either preserve all whitespace nodes but one type:</p>
-
-  <source>&lt;xsl:strip-space elements="foo"/&gt;</source>
-
-  <p>or strip all whitespace nodes but one type:</p>
-
-  <source>
-    &lt;xsl:strip-space elements="*"/&gt;
-    &lt;xsl:preserve-space elements="foo"/&gt;</source>
-
-  </s2><anchor name="strip"/>
-  <s2 title="Stripping nodes">
-
-  <p>The ultimate goal of our design would be to totally screen all stripped
-  nodes from the translet; to either physically remove them from the DOM or to
-  make it appear as if they are not there. The first approach will cause
-  problems in cases where multiple translets access the same DOM. In the future
-  we wish to let translets run within servlets / JSPs with a common DOM cache.
-  This DOM cache will keep copies of DOMs in memory to prevent the same XML
-  file from being downloaded and parsed several times. This is a scenarios we
-  might see:</p>
-
-    <p><img src="DOMInterface.gif" alt="DOMInterface.gif"/></p>
-    <p><ref>Figure 1: Multiple translets accessing a common pool of DOMs</ref></p>
-
-  <p>The three translets running on this host access a common pool of 4 DOMs.
-  The DOMs are accessed through a common DOM interface. Translets accessing
-  a single DOM will have a DOMAdapter and a single DOMImpl object behind this
-  interface, while translets accessing several DOMs will be given a MultiDOM
-  and a set of DOMImpl objects.</p>
-
-  <p>The translet to the left may want to strip some nodes from the shared DOM
-  in the cache, while the other translets may want to preserve all whitespace
-  nodes. Our initial thought then is to keep the DOM as it is and somehow
-  screen the left-hand translet of all the whitespace nodes it does not want to
-  process. There are a few ways in which we can accomplish this:</p>
-
-  <ul>
-    <li>
-      The translet can, prior to starting to traverse the DOM, send a reference
-      to the tables containing information on which nodes we want stripped to
-      the DOM interface. The DOM interface is then responsible for hiding all
-      stripped whitespace nodes from the iterators and the translet. A problem
-      with this approach is that we want to omit the DOM interface layer if
-      the translet is only accessing a single DOM. The DOM interface layer will
-      only be instanciated by the translet if the stylesheet contained a call
-      to the <code>document()</code> function.<br/><br/>
-    </li>
-    <li>
-      The translet can provide its iterators with information on which nodes it
-      does not want to see. The translet is still shielded from unwanted
-      whitespace nodes, but it has the hassle of passing extra information over
-      to most iterators it ever instanciates. Note that all iterators do not
-      need be aware of whitepspace nodes in this case. If you have a look at
-      the figure again you will see that only the first level iterator (that is
-      the one closest to the DOM or DOM interface) will have to strip off
-      whitespace nodes. But, there may be several iterators that operate
-      directly on the DOM ( invoked by code handling XSL functions such as
-      <code>count()</code>) and every single one of those will need to be told
-      which whitespace nodes the translet does not want to see.<br/><br/>
-    </li>
-    <li>
-      The third approach will take advantage of the fact that not all
-      translets will want to strip whitespace nodes. The most effective way of
-      removing unwanted whitespace nodes is to do it once and for all, before
-      the actual traversal of the DOM starts. This can be done by making a
-      clone of the DOM with exlusive-access rights for this translet only. We
-      still gain performance from the cache because we do not have to pay the
-      cost of the delay caused by downloading and parsing the XML source file.
-      The cost we have to pay is the time needed for the actual cloning and the
-      extra memory we use.<br/><br/>
-      Normally one would imagine the translet (or the wrapper class that
-      invokes the translet) calls the DOM cache with just an URL and receives
-      a reference to an instanciated DOM. The cache will either have built
-      this DOM on-demand or just passed back a reference to an existing tree.
-      In this case the DOM would need an extra call that a translet would use
-      to clone a DOM, passing the existing DOM reference to the cache and
-      recieving a new reference to the cloned DOM. The translet can then do
-      whatever it wants with this DOM (the cache need not even keep a reference
-      to this tree).
-    </li>
-  </ul>
-  
-  <p>We are lucky enough to be able to combine the first two approaches. All
-  iterators that directly access the DOM (axis iterators) are instanciated by
-  calls to the DOM interface layer (the DOM class). The actual iterators are
-  created in the DOM implementation layer (the DOMImpl class). So, we can pass
-  references to the preserve/strip whitespace tables to the DOM, and the DOM
-  will make sure that all axis iterators return node sets with respect to these
-  tables.</p>
-  </s2><anchor name="filter"/> 
-  <s2 title="Filtering whitespace nodes">
-
-  <p>For each axis iterator and for <code>DOM.makeStringValue()</code> and
-  <code>DOM.stringValueAux()</code> we must apply a filter for eliminating all
-  unwanted whitespace nodes. To achive this we must build a very efficient
-  predicate for determining if the current node should be stripped or not. This
-  predicate is built by <code>Whitespace.compilePredicate()</code>. This method is
-  static and builds a predicate for a vector of WhitespaceRule objects. (The
-  WhitespaceRule class is defined within the Whitespace class.) Each
-  WhitespaceRule object contains information for a single element listed
-  in an <code>&lt;xsl:strip/preserve-space&gt;</code> element, and is broken down
-  into the following information:</p>
-
-  <ul>
-    <li>the namespace (can be the default namespace)</li>
-    <li>the element name or "<code>*</code>"</li>
-    <li>the type of rule; NS:EL, NS:<code>*</code> or <code>*</code></li>
-    <li>the priority of the rule (based on import precedence and type)</li>
-    <li>the action; either strip or preserver</li>
-  </ul>
-
-  <p>The Vector of WhitespaceRules is arranged in order of priority and
-  redundant rules are removed. A predicate method is then compiled into the
-  translet as:</p>
-
-<source>
-    public boolean stripSpace(int node);
-</source>
-
-  <p>Unfortunately this method cannot be declared static.</p>
-
-  <p>When the Stylesheet objectcompiles the <code>topLevel()</code> method of the
-  translet it checks for the existance of the <code>stripSpace()</code> method. If
-  this method exists the <code>topLevel()</code> will be compiled to pass the
-  translet to the DOM as a StripWhitespaceFilter (the translet implements this
-  interface when the <code>stripSpace()</code> method is compiled).</p>
-
-  <p>All axis iterators and the <code>DOM.makeStringValue()</code> and
-  <code>DOM.stringValueAux()</code> methods check for the existance of this filter
-  (it is kept in a global variable in the DOM implementation class) and takes
-  the appropriate actions. The methods in the DOM for returning axis iterators
-  will place a StrippingIterator on top of the axis iterator if the filter is
-  present, and the two methods just mentioned will return empty strings for
-  whitespace nodes that should be stripped.</p>
- 
-  </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_compiler.xml b/xdocs/sources/xsltc/xsltc_compiler.xml
deleted file mode 100644
index f6ce627..0000000
--- a/xdocs/sources/xsltc/xsltc_compiler.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC Compiler Design">
-
-  <ul>  
-    <li><link anchor="overview">Compiler Overview</link></li>
-    <li><link anchor="ast">Building the Abstract Syntax Tree</link></li>
-    <li><link anchor="typecheck">Type-check and Cast Expressions</link></li>
-    <li><link anchor="compile">JVM byte-code generation</link></li>
-  </ul>
-
-  <!--=================== OVERVIEW SECTION ===========================-->
-
-  <anchor name="overview"/>
-  <s2 title="Compiler overview">
-
-    <p>The main component of the XSLTC compiler is the class</p>   
-    <ul>
-      <li><code>org.apache.xalan.xsltc.compiler.XSLTC</code></li>
-    </ul>
-
-    <p>This class uses three parsers to consume the input stylesheet(s):</p>
-
-    <ul>
-      <li><code>javax.xml.parsers.SAXParser</code></li>
-    </ul>
-
-    <p>is used to parse the stylesheet document and pass its contents to
-    the compiler as basic SAX2 events.</p>
-
-    <ul>
-      <li><code>com.sun.xslt.compiler.XPathParser</code></li>
-    </ul>
-
-    <p> is a parser used to parse XPath expressions and patterns. This parser
-    is generated using JavaCUP and JavaLEX from Princeton University.</p>
-
-    <ul>
-      <li><code>com.sun.xslt.compiler.Parser</code></li>
-    </ul>
-
-    <p>is a wrapper for the other two parsers. This parser is responsible for
-    using the other two parsers to build the compiler's abstract syntax tree
-    (which is described in more detail in the next section of this document).
-    </p>
-
-  </s2>
-
-  <!--============== ABSTRACT SYNTAX TREE SECTION ======================-->
-  <anchor name="ast"/>
-  <s2 title="Building an Abstract Syntax Tree">
-
-    <p>An abstract syntax tree (AST) is a data-structure commonly used by
-    compilers to separate the parse-phase from the later phases of the
-    compilation. The AST has one node for each parsed token from the stylesheet
-    and can easily be parsed at the stages of type-checking and bytecode
-    generation.</p>
-
-    <ul>
-      <li>
-        <link anchor="mapping">Mapping stylesheet elements to AST nodes</link>
-      </li>
-      <li>
-        <link anchor="domxsl">Building the AST from AST nodes</link>
-      </li>
-      <li>
-        <link anchor="mapping">Mapping XPath expressions and patterns to additional AST nodes</link>
-      </li>
-    </ul>
-
-    <p>The SAX parser passes the contents of the stylesheet to XSLTC's main
-    parser. The SAX events represent a decomposition of the XML document that
-    contains the stylesheet. The main parser needs to create one AST node from
-    each node that it receives from the SAX parser. It also needs to use the
-    XPath parser to decompose attributes that contain XPath expressions and
-    patterns. Remember that XSLT is in effect two languages: XML and XPath,
-    and one parser is needed for each of these languages. The SAX parser breaks
-    down the stylesheet document, the XPath parser breaks down XPath expressions
-    and patterns, and the main parser maps the decomposed elements into nodes
-    in the abstract syntax tree.</p>
-
-    <anchor name="mapping"/>
-    <s3 title="Mapping stylesheets elements to AST nodes">
-
-    <p>Every element that is defined in the XSLT 1.0 spec is represented by a
-    a class in the <code>org.apache.xalan.xsltc.compiler</code> package. The
-    main parser class contains a <code>Hashtable</code> that that maps XSL
-    elements into Java classes that make up the nodes in the AST. These Java
-    classes all reside in the <code>org.apache.xalan.xsltc.compiler</code>
-    package and extend either the <code>TopLevelElement</code> or the
-    <code>Instruction</code> classes. (Both these classes extend the
-    <code>SyntaxTreeNode</code> class.)</p>
-
-    <p>The mapping from XSL element names to Java classes/AST nodes is set up
-    in the <code>initClasses()</code> method of the main parser:</p><source>
-    private void initStdClasses() {
-	try {
-	    initStdClass("template",    "Template");
-	    initStdClass("param",       "Param");
-	    initStdClass("with-param",  "WithParam");
-	    initStdClass("variable",    "Variable");
-	    initStdClass("output",      "Output");
-	    :
-	    :
-	    :
-	}
-    }
-
-    private void initClass(String elementName, String className)
-	throws ClassNotFoundException {
-	_classes.put(elementName,
-		     Class.forName(COMPILER_PACKAGE + '.' + className));
-    }</source>
-
-    </s3>
-
-    <anchor name="domxsl"/>
-    <s3 title="Building the AST from AST nodes">
-    <p>The parser builds an AST from the various syntax tree nodes. Each node
-    contains a reference to its parent node, a vector containing references
-    to all child nodes and a structure containing all attribute nodes:</p><source>
-    protected SyntaxTreeNode _parent; // Parent node
-    private   Vector _contents;       // Child nodes
-    protected Attributes _attributes; // Attributes of this element</source>
-
-
-    <p>These variables should be accessed using these methods:</p><source>
-    protected final SyntaxTreeNode getParent();
-    protected final Vector getContents();
-    protected String getAttribute(String qname);
-    protected Attributes getAttributes();</source>
-
-    <p>At this time the AST only contains nodes that represent the XSL elements
-    from the stylesheet. A SAX parse is generic and can only handle XML files
-    and will not break up and identify XPath patterns/expressions (these are
-    stored as attributes to the various nodes in the tree). Each XSL instruction
-    gets its own node in the AST, and the XPath patterns/expressions are stored
-    as attributes of these nodes. A stylesheet looking like this:</p><source>
-    &lt;xsl:stylesheet .......&gt;
-      &lt;xsl:template match="chapter"&gt;
-        &lt;xsl:text&gt;Chapter&lt;/xsl:text&gt;
-        &lt;xsl:value-of select="."&gt;
-      &lt;/xsl:template&gt;
-    &lt;/xsl&gt;stylesheet&gt;</source>
-
-    <p>will be stored in the AST as indicated in the following picture:</p>
-    <p><img src="ast_stage1.gif" alt="ast_stage1.gif"/></p>
-    <p><ref>Figure 1: The AST in its first stage</ref></p>
-
-    <p>All objects that make up the nodes in the initial AST have a
-    <code>parseContents()</code> method. This method is responsible for:</p>
-
-    <ul>
-      <li>parsing the values of those attributes that contain XPath expressions
-      or patterns, breaking each expression/pattern into AST nodes and inserting
-      them into the tree.</li>
-      <li>reading/checking all other required attributes</li>
-      <li>propagate the <code>parseContents()</code> call down the tree</li>
-    </ul>
-    </s3>
-
-    <s3 title="Mapping XPath expressions and patterns to additional AST nodes">
-
-    <p>The nodes that represent the XPath expressions and patterns extend
-    either the <code>Expression</code> or <code>Pattern</code> class
-    respectively. These nodes are not appended to the <code>_contents</code>
-    vectory of each node, but rather stored as individual references in each
-    AST element node. One example is the <code>ForEach</code> class that
-    represents the <code>&lt;xsl:for-each&gt;</code> element. This class has
-    a variable that contains a reference to the AST sub-tree that represents
-    its <code>select</code> attribute:</p><source>
-    private Expression _select;</source>
-   
-    <p>There is no standard way of storing these XPath expressions and each
-    AST node that contains one or more XPath expression/pattern must handle
-    that itself. This handling basically involves passing the attribute's
-    value to the XPath parser and receiving back an AST sub-tree.</p>
-
-    <p>With all XPath expressions/patterns expanded, the AST will look somewhat
-    like this:</p>
-
-    <p><img src="ast_stage2.gif" alt="ast_stage2.gif"/></p>
-    <p><ref>Fiugre 2: The AST in its second stage</ref></p>
-
-    </s3>
-  </s2>
-
-  <!--================= TYPE CONVERSION SECTION ========================-->
-
-  <anchor name="typecheck"/>
-  <s2 title="Type-check and Cast Expressions">
-
-    <p>In many cases we will need to typecast the top node in the expression
-    sub-tree to suit the expected result-type of the expression, or to typecast
-    child nodes to suit the allowed types for the various operators in the
-    expression. This is done by calling 'typeCheck()' on the root-node in the
-    XSL tree. Each SyntaxTreeNode node is responsible for inserting type-cast
-    nodes between itself and its child nodes or XPath nodes. These type-cast
-    nodes will convert the output-types of the child/XPath nodes to the expected
-    input-type of the parent node. Let look at our AST again and the node that
-    represents the <code>&lt;xsl:value-of&gt;</code> element. This element
-    expects to receive a string from its <code>select</code> XPath expression,
-    but the <code>Step</code> expression will return either a node-set or a
-    single node. An extra node is inserted into the AST to perform the
-    necessary type conversions:</p>
-
-    <p><img src="ast_stage3.gif" alt="ast_stage3.gif"/></p>
-    <p><ref>Figure 3: XPath expression type cast</ref></p>
-
-    <p>The <code>typeCheck()</code> method of each SyntaxTreeNode object will
-    call <code>typeCheck()</code> on each of its XPath expressions. This method
-    will return the native type returned by the expression. The AST node will
-    insert an additional type-conversion node if the return-type does not match
-    the expected data-type. Each possible return type is represented by a class
-    in the <code>org.apache.xalan.xsltc.compiler.util</code> package. These
-    classes all contain methods that will generate bytecodes needed to perform
-    the actual type conversions (at runtime). The type-cast nodes in the AST
-    mainly consist of calls to these methods.</p>
-  </s2>
-
-  <!--=============== BYTE-CODE GENERATION SECTION ======================-->
-
-  <anchor name="compile"/>
-  <s2 title="JVM byte-code generation">
-
-    <ul>
-      <li><link anchor="stylesheet">Compiling the stylesheet</link></li>
-      <li><link anchor="toplevel">Compiling top-level elements</link></li>
-      <li><link anchor="templates">Compiling template code</link></li>
-      <li><link anchor="instructions">Compiling instructions, functions expressions and patterns</link></li>
-    </ul>
-
-    <p>Evey node in the AST extends the <code>SyntaxTreeNode</code> base class
-    and implements the <code>translate()</code> method. This method is
-    responsible for outputting the actual bytecodes that make up the
-    functionality required for each element, function, expression or pattern.
-    </p>
-
-    <anchor name="stylesheet"/>
-    <s3 title="Compiling the stylesheet">
-    <p>Some nodes in the AST require more complex code than others. The best
-    example is the <code>&lt;xsl:stylesheet&gt;</code> element. The code that
-    represents this element has to tie together the code that is generated by
-    all the other elements and generate the actual class definition for the main
-    translet class. The <code>Stylesheet</code> class generates the translet's
-    constructor and methods that handle all top-level elements.</p>
-    </s3>
-
-    <anchor name="toplevel"/>
-    <s3 title="Compiling top-level elements">
-    <p>The bytecode that handles top-level elements must be generated before any
-    other code. The '<code>translate()</code>' method in these classes are
-    mainly called from these methods in the Stylesheet class:</p><source>
-    private String compileBuildKeys(ClassGenerator);
-    private String compileTopLevel(ClassGenerator, Enumeration);
-    private void compileConstructor(ClassGenerator, Output);</source>
-
-    <p>These methods handle most top-level elements, such as global variables
-    and parameters, <code>&lt;xsl:output&gt;</code> and
-    <code>&lt;xsl:decimal-format&gt;</code> instructions.</p>
-    </s3>
-
-    <anchor name="templates"/>
-    <s3 title="Compiling template code">
-    <p>All XPath patterns in <code>&lt;xsl:apply-template&gt;</code>
-    instructions are converted into numeric values (known as the pattern's
-    kernel 'type'). All templates with identical pattern kernel types are
-    grouped together and inserted into a table known as a test sequence.
-    (The table of test sequences is found in the Mode class in the compiler
-    package. There will be one such table for each mode that is used in the
-    stylesheet). This table is used to build a big <code>switch()</code>
-    statement in the translet's <code>applyTemplates()</code> method. This
-    method is initially called with the root node of the input document.</p>
-
-    <p>The <code>applyTemplates()</code> method determines the node's type and
-    passes this type to the <code>switch()</code> statement to look up the
-    matching template. The test sequence code (the <code>TestSeq</code> class)
-    is responsible for inserting bytecodes to find  one  matching template
-    in cases where more than one template matches the current node type.</p>
-
-    <p>There may be several templates that share the same pattern kernel type.
-    Here are a few examples of templates with patterns that all have the same
-    kernel type:</p><source>
-    &lt;xsl:template match=&quot;A/C&quot;&gt;
-    &lt;xsl:template match=&quot;A/B/C&quot;&gt;
-    &lt;xsl:template match=&quot;A | C&quot;&gt;</source>
-
-    <p>All these templates will be grouped under the type for
-    <code>&lt;C&gt;</code> and will all get the same kernel type (the type for
-    <code>"C"</code>). The last template will be grouped both under
-    <code>"C"</code> and <code>"A"</code>, since it matches either element.
-    If the type identifier for <code>"C"</code> in this case is 8, all these
-    templates will be put under <code>case 8:</code> in
-    <code>applyTemplates()</code>'s big <code>switch()</code> statement. The
-    <code>TestSeq</code> class will insert some code under the
-    <code>case 8:</code> statement (similar to if's and then's) in order to
-    determine which of the three templates to trigger.</p>
-    </s3>
-
-    <anchor name="instructions"/>
-    <s3 title="Compiling instructions, functions, expressions and patterns">
-
-    <p>The template code is generated by calling <code>translate()</code> on
-    each <code>Template</code> object in the abstract syntax tree. This call
-    will be propagated down the abstract syntax tree and every element will
-    output the bytecodes necessary to complete its task.</p>
-
-    <p>The Java Virtual Machine is stack-based, which goes hand-in-hand with
-    the tree structure of a stylesheet and the AST. A node in the AST will
-    call <code>translate()</code> on its child nodes and any XPath nodes before
-    it generates its own bytecodes. In that way the correct sequence of JVM
-    instructions is generated.  Each one of the child nodes is responsible of
-    creating code that leaves the node's output value (if any) on the stack.
-    The typical procedure for the parent node is to create JVM code that
-    consumes these values off the stack and then leave its own output on the
-    stack (for its parent).</p>
-
-    <p>The tree-structure of the stylesheet is in this way closely tied with
-    the stack-based JVM. The design does not offer any obvious way of extending
-    the compiler to output code for other non-stack-based VMs or processors.</p>
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_dom.xml b/xdocs/sources/xsltc/xsltc_dom.xml
deleted file mode 100644
index c362c22..0000000
--- a/xdocs/sources/xsltc/xsltc_dom.xml
+++ /dev/null
@@ -1,484 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="XSLTC Internal DOM">
-
-  <ul>
-    <li><link anchor="functionality">General functionlaity</link></li>
-    <li><link anchor="components">Components of the internal DOM</link></li>
-    <li><link anchor="structure">Internal structure</link></li>
-    <li><link anchor="navigation">Tree navigation</link></li>
-    <li><link anchor="namespaces">Namespaces</link></li>
-    <li><link anchor="w3c">W3C DOM2 navigation support</link></li>
-    <li><link anchor="adapter">The DOM adapter - DOMAdapter</link></li>
-    <li><link anchor="multiplexer">The DOM multiplexer - MultiDOM</link></li>
-    <li><link anchor="builder">The DOM builder - DOMImpl$DOMBuilder</link></li>
-  </ul>
-
-  <anchor name="functionality"/>
-  <s2 title="General functionality">
-  <p>The internal DOM gives the translet access to the XML document(s) it has
-  to transform. The interface to the internal DOM is specified in the DOM.java
-  class. This is the interface that the translet uses to access the DOM. 
-  There is also an interface specified for DOM caches -- DOMCache.java</p>
-
-  </s2><anchor name="components"/>
-  <s2 title="Components of the internal DOM">
-
-  <p>This DOM interface is implemented by three classes:</p>
-  <ul>
-    <li><em>org.apache.xalan.xsltc.dom.DOMImpl</em><br/><br/>
-      This is the main DOM class. An instance of this class contains the nodes
-      of a <em>single</em> XML document.<br/><br/>
-    </li>
-    <li><em>org.apache.xalan.xsltc.dom.MultiDOM</em><br/><br/>
-      This class is best described as a DOM multiplexer. XSLTC was initially
-      designed to operate on a single XML document, and the initial DOM and
-      the DOM interface were designed and implemented without the
-      <code>document()</code> function in mind. This class will allow a translet
-      to access multiple DOMs through the original DOM interface.<br/><br/>
-    </li>
-    <li><em>org.apache.xalan.xsltc.dom.DOMAdapter</em><br/><br/>
-      The DOM adapter is a mediator between a DOMImpl or a MultiDOM object and
-      a single translet. A DOMAdapter object contains mappings and reverse
-      mappings between node  types in the DOM(s) and node types in the translet.
-      This mediator is needed to allow several translets access to a single DOM.
-      <br/><br/>
-    </li>
-    <li><em>org.apache.xalan.xsltc.dom.DocumentCache</em><br/><br/>
-      A sample DOM cache (implementing DOMCache) that is used with our sample
-      transformation applications.
-    </li>
-  </ul>
-
-  <p><img src="DOMInterface.gif" alt="DOMInterface.gif"/></p>
-  <p><ref>Figure 1: Main components of the internal DOM</ref></p>
-
-  <p>The figure above shows how several translets can access one or more
-  internal DOM from a shared pool of cached DOMs. A translet can also access a
-  DOM tree outside of a cache. The Stylesheet class that represents the XSL
-  stylesheet to compile contains a flag that indicates if the translet uses the
-  <code>document()</code> function. The code compiled into the translet will act
-  accordingly and instanciate a MultiDOM object if needed (this code is compiled
-   in the compiler's <code>Stylesheet.compileTransform()</code> method).</p>
-
-  </s2><anchor name="structure"/>
-  <s2 title="Internal Structure">
-  <ul>
-    <li><link anchor="node-id">Node identification</link></li>
-    <li><link anchor="element-nodes">Element nodes</link></li>
-    <li><link anchor="attribute-nodes">Attribute nodes</link></li>    
-    <li><link anchor="text-nodes">Text nodes</link></li>
-    <li><link anchor="comment-nodes">Comment nodes</link></li>    
-    <li><link anchor="pi"></link>Processing instructions</li>
-  </ul>
-  <anchor name="node-id"/>
-  <s3 title="Node identifation">
-
-  <p>Each node in the DOM is represented by an integer. This integer is an
-  index into a series of arrays that describes the node. Most important is
-  the <code>_type[]</code> array, which holds the (DOM internal) node type. There
-  are some general node types that are described in the DOM.java interface:</p>
-
-<source>
-    public final static int ROOT                   = 0;
-    public final static int TEXT                   = 1;
-    public final static int UNUSED                 = 2;
-    public final static int ELEMENT                = 3;
-    public final static int ATTRIBUTE              = 4;
-    public final static int PROCESSING_INSTRUCTION = 5;
-    public final static int COMMENT                = 6;
-    public final static int NTYPES                 = 7;
-</source>
-
-  <p>Element and attribute nodes will be assigned types based on their expanded
-  QNames. The <code>_type[]</code> array is used for this:</p>
-
-<source>
-    int    type      = _type[node];             // get node type
-</source>
-
-  <p>The node type can be used to look up the element/attribute name in the
-  element/attribute name array <code>_namesArray[]</code>:</p>
-
-<source>
-    String name      = _namesArray[type-NTYPES]; // get node element name
-</source>
-
-  <p>The resulting string contains the full, expanded QName of the element or
-  attribute. Retrieving the namespace URI of an element/attribute is done in a
-  very similar fashion:</p>
-
-<source>
-    int    nstype    = _namespace[type-NTYPES]; // get namespace type
-    String namespace = _nsNamesArray[nstype];   // get node namespace name
-</source>
-  </s3><anchor name="element-nodes"/>
-  <s3 title="Element nodes">
-
-  <p>The contents of an element node (child nodes) can be identified using
-  the <code>_offsetOrChild[]</code> and <code>_nextSibling[]</code> arrays. The
-  <code>_offsetOrChild[]</code> array will give you the first child of an element
-  node:</p>
-
-<source>
-    int    child     = _offsetOrChild[node];    // first child
-    child = _nextSibling[child];                // next child
-</source>
-
-  <p>The last child will have a &quot;<code>_nextSibling[]</code>&quot; of 0 (zero).
-  This value is OK since the root node (the 0 node) will not be a child of
-  any element.</p>
-
-  </s3><anchor name="attribute-nodes"/>
-  <s3 title="Attribute nodes">
-
-  <p>The first attribute node of an element is found by a lookup in the
-  <code>_lengthOrAttr[]</code> array using the node index:</p>
-
-<source>
-    int    attribute = _offsetOrChild[node];    // first attribute
-    attribute = _nextSibling[attribute];        // next attribute
-</source>
-
-  <p>The names of attributes are contained in the <code>_namesArray[]</code> just
-  like the names of element nodes. The value of attributes are store the same
-  way as text nodes:</p>
-
-<source>
-    int    offset    = _offsetOrChild[attribute]; // offset into character array
-    int    length    = _lengthOrAttr[attribute];  // length of attribute value
-    String value     = new String(_text, offset, length);
-</source>
-  </s3><anchor name="text-nodes"/>
-  <s3 title="Text nodes">
-
-  <p>Text nodes are stored identically to attribute values. See the previous
-  section on <link anchor="attribute-nodes">attribute nodes</link>.</p>
-  </s3><anchor name="comment-nodes"/>
-  <s3 title="Comment nodes">
-
-  <p>The internal DOM does currently <em>not</em> contain comment nodes. Yes, I
-  am quite aware that the DOM has a type assigned to comment nodes, but comments
-  are still not inserted into the DOM.</p>
-  </s3><anchor name="pi"/>
-  <s3 title="Processing instructions">
-
-  <p>Processing instructions are handled as text nodes. These nodes are stored
-  identically to attribute values. See the previous section on
-  <link anchor="attribute-nodes">attribute nodes</link>.</p>
-
-  </s3></s2><anchor name="navigation"/>
-  <s2 title="Tree navigation">
-
-  <p>The DOM implementation contains a series of iterator that implement the
-  XPath axis. All these iterators implement the NodeIterator interface and
-  extend the NodeIteratorBase base class. These iterators do the job of
-  navigating the tree using the <code>_offsetOrChild[]</code>, <code>_nextSibling</code>
-  and <code>_parent[]</code> arrays. All iterators that handles XPath axis are
-  implemented as a private inner class of DOMImpl. The translet uses a handful
-  of methods to instanciate these iterators:</p>
-
-<source>
-    public NodeIterator getIterator();
-    public NodeIterator getChildren(final int node);
-    public NodeIterator getTypedChildren(final int type);
-    public NodeIterator getAxisIterator(final int axis);
-    public NodeIterator getTypedAxisIterator(final int axis, final int type);
-    public NodeIterator getNthDescendant(int node, int n);
-    public NodeIterator getNamespaceAxisIterator(final int axis, final int ns);
-    public NodeIterator orderNodes(NodeIterator source, int node);
-</source>
-
-  <p>There are a few iterators in addition to these, such as sorting/ordering
-  iterators and filtering iterators. These iterators are implemented in
-  separate classes and can be instanciated directly by the translet.</p>
-
-  </s2><anchor name="namespaces"/>
-  <s2 title="Namespaces">
-
-  <p>Namespace support was added to the internal DOM at a late stage, and the
-  design and implementation of the DOM bears a few scars because of this. 
-  There is a separate <link idref="xsltc_namespace">design
-  document</link> that covers namespaces.</p>
-
-  </s2><anchor name="w3c"/>
-  <s2 title="W3C DOM2 navigation support">
-
-  <p>The DOM has a few methods that give basic W3C-type DOM navigation. These
-  methods are:</p>
-
-<source>
-    public Node makeNode(int index);
-    public Node makeNode(NodeIterator iter);
-    public NodeList makeNodeList(int index);
-    public NodeList makeNodeList(NodeIterator iter);
-</source>
-
-  <p>These methods return instances of inner classes of the DOM that implement
-  the W3C Node and NodeList interfaces.</p>
-
-  </s2><anchor name="adapter"/>
-  <s2 title="The DOM adapter - DOMAdapter">
-  <ul>
-    <li><link anchor="translet-dom">Translet/DOM type mapping</link></li>
-    <li><link anchor="whitespace">Whitespace text-node stripping</link></li>
-    <li><link anchor="method-mapping">Method mapping</link></li>
-  </ul>
-  <anchor name="translet-dom"/>
-  <s3 title="Translet/DOM type mapping">
-
-  <p>The DOMAdapter class performs the mappings between DOM and translet node
-  types, and vice versa. These mappings are necessary in order for the translet
-  to correctly identify an element/attribute in the DOM and for the DOM to
-  correctly identify the element/attribute type of a typed iterator requested
-  by the translet. Note that the DOMAdapter also maps translet namespace types
-  to DOM namespace types, and vice versa.</p>
-
-  <p>The DOMAdapter class has four global tables that hold the translet/DOM
-  type and namespace-type mappings. If the DOM knows an element as type
-  19, the DOMAdapter will translate this to some other integer using the
-  <code>_mapping[]</code> array:</p>
-
-<source>
-    int domType = _mapping[transletType];
-</source>
-
-  <p>This action will be performed when the DOM asks what type a specific node
-  is. The reverse is done then the translet wants an iterator for a specific
-  node type. The DOMAdapter must translate the translet-type to the type used
-  internally in the DOM by looking up the <code>_reverse[]</code> array:</p>
-
-<source>
-    int transletType = _mapping[domType];
-</source>
-
-  <p>There are two additional mapping tables: <code>_NSmapping[]</code> and
-  <code>_NSreverse[]</code> that do the same for namespace types.</p>
-  </s3><anchor name="whitespace"/>
-  <s3 title="Whitespace text-node stripping">
-
-  <p>The DOMAdapter class has the additional function of stripping whitespace
-  nodes in the DOM. This functionality had to be put in the DOMAdapter, as
-  different translets will have different preferences for node stripping.</p>
-  </s3><anchor name="method-mapping"/>
-  <s3 title="Method mapping">
-
-  <p>The DOMAdapter class implements the same <code>DOM</code> interface as the
-  DOMImpl class. A DOMAdapter object will look like a DOMImpl tree, but the
-  translet can access it directly without being concerned with type mapping
-  and whitespace stripping. The <code>getTypedChildren()</code> demonstrates very
-  well how this is done:</p>
-
-<source>
-    public NodeIterator getTypedChildren(int type) {
-        // Get the DOM type for the requested typed iterator
-        final int domType = _reverse[type];
-        // Now get the typed child iterator from the DOMImpl object
-        NodeIterator iterator = _domImpl.getTypedChildren(domType);
-        // Wrap the iterator in a WS stripping iterator if child-nodes are text nodes
-	if ((domType == DOM.TEXT) &amp;&amp; (_filter != null))
-	    iterator = _domImpl.strippingIterator(iterator,_mapping,_filter);
-	return(iterator);
-    }
-</source>
-
-  </s3></s2><anchor name="multiplexer"/>
-  <s2 title="The DOM multiplexer - MultiDOM">
-
-  <p>The DOM multiplexer class is only used when the compiled stylesheet uses
-  the <code>document()</code> function. An instance of the MultiDOM class also
-  implements the DOM interface, so that it can be accessed in the same way
-  as a DOMAdapter object.</p>
-
-  <p>A node in the DOM is identified by an integer. The first 8 bits of this
-  integer are used to identify the DOM in which the node belongs, while the
-  lower 24 bits are used to identify the node within the DOM:</p>
-    <table>
-      <tr>
-        <td>31-24</td>
-        <td>23-16</td>
-        <td>16-8</td>
-        <td>7-0</td>
-      </tr>
-      <tr>
-        <td>DOM id</td>
-        <td colspan="3">node id</td>
-      </tr>
-    </table>
-
-  <p>The DOM multiplexer has an array of DOMAdapter objects. The topmost 8
-  bits of the identifier is used to find the correct DOM from the array. Then
-  the lower 24 bits are used in calls to methods in the DOMAdapter object:</p>
-
-<source>
-    public int getParent(int node) {
-	return _adapters[node>>>24].getParent(node &amp; 0x00ffffff) | node &amp; 0xff000000;
-    }
-</source>
-
-  <p>Note that the node identifier returned by this method has the same upper 8
-  bits as the input node. This is why we <code>OR</code> the result from
-  <code>DOMAdapter.getParent()</code> with the top 8 bits of the input node.</p>
-
-  </s2><anchor name="builder"/>
-  <s2 title="The DOM builder - DOMImpl$DOMBuilder">
-  <ul>
-    <li><link anchor="startelement">startElement()</link></li>
-    <li><link anchor="endelement">endElement()</link></li>
-    <li><link anchor="startprefixmapping">startPrefixMapping()</link></li>
-    <li><link anchor="endprefixmapping">endPrefixMapping()</link></li>
-    <li><link anchor="characters">characters()</link></li>
-    <li><link anchor="startdocument">startDocument()</link></li>
-    <li><link anchor="enddocument">endDocument()</link></li>
-  </ul>
-
-  <p>The DOM builder is an inner class of the DOM implementation. The builder
-  implements the SAX2 <code>ContentHandler</code> interface and populates the DOM
-  by receiving SAX2 events from a SAX2 parser (presently xerces). An instance
-  of the DOM builder class can be retrieved from <code>DOMImpl.getBuilder()</code>
-  method, and this handler can be set as an XMLReader's content handler:</p>
-
-<source>
-    final SAXParserFactory factory = SAXParserFactory.newInstance();
-    final SAXParser parser = factory.newSAXParser();
-    final XMLReader reader = parser.getXMLReader();
-    final DOMImpl dom = new DOMImpl();
-    reader.setContentHandler(dom.getBuilder());
-</source>
-
-  <p>The DOM builder will start to populate the DOM once the XML parser starts
-  generating SAX2 events:</p>
-  <anchor name="startelement"/>
-  <s3 title="startElement()">
-
-  <p>This method can be called in one of two ways; either with the expanded
-  QName (the element's separate uri and local name are supplied) or as a
-  normal QName (one String on the format prefix:local-name). The DOM stores
-  elements as expanded QNames so it needs to know the element's namespace URI.
-  Since the URI is not supplied with this call, we have to keep track of
-  namespace prefix/uri mappings while we're building the DOM. See 
-  <code><link anchor="startprefixmapping">startPrefixMapping()</link></code> below for details on
-  namespace handling.</p>
-
-  <p>The <code>startElement()</code> inserts the element as a child of the current
-  parent element, creates attribute nodes for all attributes in the supplied
-  &quot;<code>Attributes</code>&quot; attribute list (by a series of calls to
-  <code>makeAttributeNode()</code>), and finally creates the actual element node
-  (by calling <code>internElement()</code>, which inserts a new entry in the
-  <code>_type[]</code> array).</p>
-  </s3><anchor name="endelement"/>
-  <s3 title="endElement()">
-
-  <p>This method does some cleanup after the <code>startElement()</code> method,
-  such as revering <code>xml:space</code> settings and linking the element's
-  child nodes.</p>
-  </s3><anchor name="startprefixmapping"/>
-  <s3 title="startPrefixMapping()">
-
-  <p>This method is called for each namespace declaration in the source
-  document. The parser should call this method before the prefix is referenced
-  in a QName that is passed to the <code>startElement()</code> call. Namespace
-  prefix/uri mappings are stored in a Hashtable structure. Namespace prefixes
-  are used as the keys in the Hashtable, and each key maps to a Stack that
-  contains the various URIs that the prefix maps to. The URI on top of the
-  stack is the URI that the prefix currently maps to.</p>
-
-  
-    <p><img src="namespace_stack.gif" alt="namespace_stack.gif"/></p>
-    <p><ref>Figure 2: Namespace handling in the DOM builder</ref></p>
-
-
-  <p>Each call to <code>startPrefixMapping()</code> results in a lookup in the
-  Hashtable (using the prefix), and a <code>push()</code> of the URI onto the
-  Stack that the prefix maps to.</p>
-  </s3><anchor name="endprefixmapping"/>
-  <s3 title="endPrefixMapping()">
-
-  <p>A namespace prefix/uri mapping is closed by locating the Stack for the
-  prefix, and then <code>pop()</code>'ing the topmost URI off this Stack.</p>
-  </s3><anchor name="characters"/>
-  <s3 title="characters()">
-
-  <p>Text nodes are stored as simple character sequences in the character array
-  <code>_text[]</code>. The start and lenght of a node's text can be determined by
-  using the node index to look up <code>_offsetOrChild[]</code> and
-  <code>_lengthOrAttribute[]</code>.</p>
-
-  <p>We want to re-use character sequences if two or more text nodes have
-  identical content. This can be achieved by having two different text node
-  indexes map to the same character sequence. The <code>maybeReuseText()</code>
-  method is always called before a new character string is stored in the
-  <code>_text[]</code> array. This method will locate the offset of an existing
-  instance of a character sequence.</p>
-  </s3><anchor name="startdocument"/>
-  <s3 title="startDocument()">
-
-  <p>This method initialises a bunch of data structures that are used by the
-  builder. It also pushes the default namespace on the namespace stack (so that
-  the &quot;&quot; prefix maps to the <code>null</code> namespace).</p>
-  </s3><anchor name="enddocument"/>
-  <s3 title="endDocument()">
-
-  <p>This method builds the <code>_namesArray[]</code>, <code>_namespace[]</code>
-  and <code>_nsNamesArray[]</code> structures from temporary datastructures used
-  in the DOM builder.</p>
-
-   </s3>
- </s2>
-</s1>   
diff --git a/xdocs/sources/xsltc/xsltc_iterators.xml b/xdocs/sources/xsltc/xsltc_iterators.xml
deleted file mode 100644
index 486873c..0000000
--- a/xdocs/sources/xsltc/xsltc_iterators.xml
+++ /dev/null
@@ -1,397 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC node iterators">
-
-  <s2 title="Contents">
-
-  <p>This document describes the function of XSLTC's node iterators. It also
-  describes the <code>NodeIterator</code> interface and some implementations of
-  this interface are described in detail:</p>
-
-  <ul>
-    <li><link anchor="purpose">Node iterator function</link></li>
-    <li><link anchor="interface">NodeIterator interface</link></li>
-    <li><link anchor="baseclass">Node iterator base class</link></li>    
-    <li><link anchor="details">Implementation details</link></li>    
-  </ul>
-
-  </s2>
-
-  <!--=================== OVERVIEW SECTION ===========================--> 
-
-  <anchor name="purpose"/>
-  <s2 title="Node Iterator Function">
-
-    <p>Node iterators have several functions in XSLTC. The most obvious is
-    acting as a placeholder for node-sets. Node iterators also act as a link
-    between the translet and the DOM(s), they can act as filters (implementing
-    predicates), they contain the functionality necessary to cover all XPath
-    axes and they even serve as a front-end to XSLTC's node-indexing mechanism
-    (for the <code>id()</code> and <code>key()</code> functions).</p>
-  </s2>
-
-  <!--=================== INTERFACE SECTION ==========================--> 
-
-  <anchor name="interface"/>
-  <s2 title="Node Iterator Interface">
-
-    <p>The node iterator interface is defined in
-    <code>org.apache.xalan.xsltc.NodeIterator</code>.</p>
-
-    <p>The most basic operations in the <code>NodeIterator</code> interface are
-    for setting the iterators start-node. The &quot;start-node&quot; is
-    an index into the DOM. This index, and the axis of the iterator, determine
-    the node-set that the iterator contains. The axis is programmed into the
-    various node iterator implementations, while the start-node can be set by
-    calling:</p><source>
-    public NodeIterator setStartNode(int node);</source>
-
-    <p>Once the start node is set the node-set can be traversed by a sequence of
-    calls to:</p><source>
-    public int next();</source>
-
-    <p>This method will return the constant <code>NodeIterator.END</code> when
-    the whole node-set has been returned. The iterator can be reset to the start
-    of the node-set by calling:</p><source>
-    public NodeIterator reset();</source>
-
-    <p>Two additional methods are provided to set the position within the
-    node-set. The first method below will  mark  the current node in the
-    node-set, while the second will (at any point) set the iterators position
-    back to that node.</p><source>
-    public void setMark();
-    public void gotoMark();</source>
-
-    <p>Every node iterator implements two functions that make up the
-    functionality behind XPath's <code>getPosition()</code> and
-    <code>getLast()</code> functions.</p><source>
-    public int getPosition();
-    public int getLast();</source>
-
-    <p>The <code>getLast()</code> function returns the number of nodes in the
-    set, while the <code>getPosition()</code> returns the current position
-    within the node-set. The value returned by <code>getPosition()</code> for
-    the first node in the set is always 1 (one), and the value returned for the
-    last node in the set is always the same value as is returned by
-    <code>getLast()</code>.</p>
-
-    <p>All node iterators that implement an XPath axis will return the node-set
-    in the natural order of the axis. For example, the iterator implementing the
-     ancestor  axis will return nodes in reverse document order (bottom to
-    top), while the iterator implementing the  descendant  will return
-    nodes in document order. The node iterator interface has a method that can
-    be used to determine if an iterator returns nodes in reverse document order:
-    </p><source>
-    public boolean isReverse();</source>
-
-    <p>Two methods are provided for when node iterators are encapsulated inside
-    a variable or parameter. To understand the purpose behind these two methods
-    we should have a look at a sample XML document and stylesheet first:</p>
-    <source>
-    &lt;?xml version="1.0"?>
-    &lt;foo>
-        &lt;bar>
-            &lt;baz>A&lt;/baz>
-            &lt;baz>B&lt;/baz>
-        &lt;/bar>
-        &lt;bar>
-            &lt;baz>C&lt;/baz>
-            &lt;baz>D&lt;/baz>
-        &lt;/bar>
-    &lt;/foo>
-
-    &lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-        &lt;xsl:template match="foo">
-            &lt;xsl:variable name="my-nodes" select="//foo/bar/baz"/>
-            &lt;xsl:for-each select="bar">
-                &lt;xsl:for-each select="baz">
-                    &lt;xsl:value-of select="."/>
-                &lt;/xsl:for-each>
-                &lt;xsl:for-each select="$my-nodes">
-                    &lt;xsl:value-of select="."/>
-                &lt;/xsl:for-each>
-            &lt;/xsl:for-each>
-        &lt;/xsl:template>
-
-    &lt;/xsl:stylesheet></source>
-
-    <p>Now, there are three iterators at work here. The first iterator is the
-    one that is wrapped inside the variable <code>my-nodes</code> - this
-    iterator contains  all  <code>&lt;baz/&gt;</code> elements in the
-    document. The second iterator contains all <code>&lt;bar&gt;</code>
-    elements under the current element (this is the iterator used by the
-    outer <code>for-each</code> loop). The third and last iterator is the one
-    used by the first of the inner <code>for-each</code> loops. When the outer
-    loop is run the first time, this third iterator will be initialized to
-    contain the first two <code>&lt;baz&gt;</code> elements under the context
-    node (the first <code>&lt;bar&gt;</code> element). Iterators are by default
-    restarted from the current node when used inside a <code>for-each</code>
-    loop like this. But what about the iterator inside the variable
-    <code>my-nodes</code>? The variable should keep its assigned value, no
-    matter what the context node is. In able to prevent the iterator from being
-    reset, we must use a mechanism to block calls to the
-    <code>setStartNode()</code> method. This is done in three steps:</p>
-
-    <ul>
-      <li>The iterator is created and initialized when the variable gets
-      assigned its value (node-set).</li>
-      <li>When the variable is read, the iterator is copied (cloned). The
-      original iterator inside the variable is never used directly. This is
-      to make sure that the iterator inside the variable is always in its
-      original state when read.</li>
-      <li>The iterator clone is marked as not restartable to prevent it from
-      being restarted when used to iterate the <code>&lt;xsl:for-each&gt;</code>
-      element loop.</li>
-    </ul>
-
-    <p>These are the two methods used for the three steps above:</p><source>
-    public NodeIterator cloneIterator();
-    public void setRestartable(boolean isRestartable);</source>
-
-    <p>Special care must be taken when implementing these methods in some
-    iterators. The <code>StepIterator</code> class is the best example of this.
-    This iterator wraps two other iterators; one of which is used to generate
-    start-nodes for the other - so one of the encapsulated node iterators must
-    always remain restartable - even when used inside variables. The
-    <code>StepIterator</code> class is described in detail later in this
-    document.</p>
-
-  </s2>
-
-
-  <!--================= BASE CLASS SECTION ===========================--> 
-
-  <anchor name="baseclass"/>
-  <s2 title="Node Iterator Base Class">
-
-    <p>A node iterator base class is provided to contain some common
-    functionality. The base class implements the node iterator interface, and
-    has a few additional methods:</p><source>
-    public NodeIterator includeSelf();
-    protected final int returnNode(final int node);
-    protected final NodeIterator resetPosition();</source>
-
-    <p>The <code>includeSelf()</code> is used with certain axis iterators that
-    implement both the <code>ancestor</code> and <code>ancestor-or-self</code>
-    axis and similar. One common implementation is used for these axes and
-    this method is used to signal that the  &quot;self&quot;  node should
-    also be included in the node-set.</p>
-
-    <p>The <code>returnNode()</code> method is called by the implementation of
-    the <code>next()</code> method. <code>returnNode()</code> increments an
-    internal node counter/cursor that keeps track of the current position within
-    the node set. This counter/cursor is then used by the 
-    <code>getPosition()</code> implementation to return the current position.
-    The node cursor can be reset by calling <code>resetPosition()</code>. This
-    method is normally called by an iterator's <code>reset()</code> method.</p>
-
-  </s2>
-
-  <!--==================== DETAILS SECTION ===========================--> 
-
-  <anchor name="details"/>
-  <s2 title="Node Iterator Implementation Details">
-
-    <s3 title="Axis iterators">
-
-    <p>All axis iterators are implemented as inner classes of the internal
-    DOM implementation <code>org.apache.xalan.xsltc.dom.DOMImpl</code>. In this
-    way all axis iterator classes have direct access to the internal node
-    type- and navigation arrays of the DOM:</p><source>
-    private short[]   _type;          // Node types
-    private short[]   _namespace;     // Namespace URI types
-    private short[]   _prefix;        // Namespace prefix types
-
-    private int[]     _parent;        // Index of a node's parent
-    private int[]     _nextSibling;   // Index of a node's next sibling node
-    private int[]     _offsetOrChild; // Index of an elements first child node
-    private int[]     _lengthOrAttr;  // Index of an elements first attribute node</source>
-
-    <p>The axis iterators can be instanciated by calling either of these two
-    methods of the DOM:</p><source>
-    public NodeIterator getAxisIterator(final int axis);
-    public NodeIterator getTypedAxisIterator(final int axis, final int type);</source>
-
-    </s3>
-
-    <s3 title="StepIterator">
-    
-    <p>The <code>StepIterator</code> is used to  chain  other iterators. A
-    very basic example is this XPath expression:</p><source>
-    &lt;xsl:for-each select="foo/bar"></source>
-
-    <p>To generate the appropriate node-set for this loop we need three
-    iterators. The compiler will generate code that first creates a typed axis
-    iterator; the axis will be  child  and the type will be that assigned
-    to <code>&lt;foo&gt;</code> elements. Then a second typed axis iterator will
-    be created; this also a  child -iterator, but this one with the type
-    assigned to <code>&lt;bar&gt;</code> elements. The third iterator is a
-    step iterator that encapsulates the two axis iterators. The step iterator is
-    the initialized with the context node.</p>
-
-    <p>The step iterator will use the first axis iterator to generate
-    start-nodes for the second axis iterator. In plain english this means that
-    the step iterator will scan all <code>foo</code> elements for any
-    <code>bar</code> child elements. When a <code>StepIterator</code> is
-    initialized with a start-node it passes the start node to the
-    <code>setStartNode()</code> method of its  source -iterator (left).
-    It then calls <code>next()</code> on that iterator to get the start-node
-    for the  iterator  iterator (right):</p><source>
-    // Set start node for left-hand iterator...
-    _source.setStartNode(_startNode);
-    // ... and get start node for right-hand iterator from left-hand,
-    _iterator.setStartNode(_source.next());</source>
-
-    <p>The step iterator will keep returning nodes from its right iterator until
-    it runs out of nodes. Then a new start-node is retrieved by again calling
-    <code>next()</code> on the  source -iterator. This is why the
-    right-hand iterator always has to be restartable - even if the step iterator
-    is placed inside a variable or parameter. This becomes even more complicated
-    for step iterators that encapsulate other step iterators. We'll make our
-    previous example a bit more interesting:</p><source>
-    &lt;xsl:for-each select="foo/bar[@name='cat and cage']/baz"></source>
-
-    <p>This will result in an iterator-tree similar to this:</p>
-
-    <p><img src="iterator_stack.gif" alt="iterator_stack.gif"/></p>
-    <p><ref>Figure 1: Stacked step iterators</ref></p>
-
-    <p>The  &quot;foo&quot;  iterator is used to supply the second step
-    iterator with start nodes. The second step iterator will pass these start
-    nodes to the  &quot;bar&quot;  iterator, which will be used to get the
-    start nodes for the third step iterator, and so on....</p>
-
-    </s3>
-
-    <s3 title="Iterators for Filtering/Predicates">
-
-    <p>The <code>org.apache.xalan.xsltc.dom</code> package contains a few
-    iterators that are used to implement predicates and filters. Such iterators
-    are normally placed on top of another iterator, and return only those nodes
-    that match a specific node value, position, etc.
-    These iterators include:</p>
-
-    <ul>
-      <li>NthIterator</li>
-      <li>NodeValueIterator</li>
-      <li>FilteredStepIterator</li>
-      <li>CurrentNodeListIterator</li>
-    </ul>
-
-    <p>The last one is the most interesting. This iterator is used to implement
-    chained predicates, such as:</p><source>
-    &lt;xsl:value-of select="foo[@blob='boo'][2]"></source>
-
-    <p>The first predicate reduces the node set from containing all
-    <code>&lt;foo&gt;</code> elements, to containing only those elements that
-    have a  &quot;blob&quot;  attribute with the value 'boo'. The
-    <code>CurrentNodeListIterator</code> is used to contain this reduced
-    node-set. The iterator is constructed by passing it a source iterator (in
-    this case an iterator that contains all <code>&lt;foo&gt;</code> elements)
-    and a filter that implements the predicate (<code>@blob = 'boo'</code>).</p>
-
-    </s3>
-
-    <s3 title="SortingIterator">
-
-    <p>The sorting iterator is one of the main functional components behind the
-    implementation of the <code>&lt;xsl:sort&gt;</code> element. This element,
-    including the sorting iterator, is described in detail in the
-    <code>&lt;xsl:sort&gt;</code>
-    <link idref="xsl_sort_design">design document</link>.</p>
-
-    </s3>
-
-    <s3 title="SingletonIterator"></s3>
-
-    <p>The singleton iterator is a wrapper for a single node. The node passed
-    in to the <code>setStartNode()</code> method is the only node that will be
-    returned by the <code>next()</code> method. The singleton iterator is used
-    mainly for node to node-set type conversions.</p>
-
-    <s3 title="UnionIterator">
-
-    <p>The union iterator is used to contain unions of node-sets contained in
-    other iterators. Some of the methods in this iterator are unnecessary
-    comlicated. The <code>next()</code> method contains an algorithm for
-    ensuring that the union node-set is returned in document order. We might be
-    better off by simply wrapping the union iterator inside a duplicate filter
-    iterator, but there could be some performance implications. Worth checking.
-    </p>
-
-    </s3>
-
-    <s3 title="KeyIndex">
-
-    <p>This is not just an node iterator. An index used for keys and ids will
-    return a set of nodes that are contained within the named index and that
-    share a certain property. The <code>KeyIndex</code> implements the node
-    iterator interface, so that these nodes can be returned and handled just
-    like any other node set. See the
-    <link idref="xsl_key_design">design document</link> for 
-    <code>&lt;xsl:key&gt;</code>, <code>key()</code> and <code>id()</code>
-    for further details.</p>
-
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_namespace.xml b/xdocs/sources/xsltc/xsltc_namespace.xml
deleted file mode 100644
index f8ff1fe..0000000
--- a/xdocs/sources/xsltc/xsltc_namespace.xml
+++ /dev/null
@@ -1,607 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-  <s1 title="XSLTC and Namespaces">
-
-  <ul>
-    <li><link anchor="functionality">Functionality</link></li>
-    <li><link anchor="overview">Namespace overview</link></li>
-    <li><link anchor="NSA">The DOM &amp; namespaces</link></li>    
-    <li><link anchor="NSB">Namespaces in the XSL stylesheet</link></li>
-    <li><link anchor="NSC">Namespaces in the output document</link></li>
-  </ul>
-  <anchor name="functionality"/>
-  <s2 title="Functionality">
-
-    <p>Namespaces are used when an XML documents has elements have the same
-    name, but are from different contexts, and thus have different meanings
-    and interpretations. For instance, a <code>&lt;TITLE&gt;</code> element can
-    be a HTML title element in one part of the XML document, while it in other
-    parts of the document the <code>&lt;TITLE&gt;</code> element is used for
-    encapsulating the title of a play or a book. This sort of confusion is
-    very common when reading XML source from multiple documents, but can also
-    occur within a single document.</p>
-
-    <p>Namespaces have three very important properties: a name, a prefix (an
-    alias for its name) and a scope. Namespaces are declared as attributes of
-    almost any node in an XML document. The declaration looks like this:</p>
-
-<source>
-    &lt;element xmlns:prefix="http://some.site/spec"&gt;....&lt;/element&gt;
-</source>
-
-    <p>The <code>"xmlns"</code> tells that this is a namespace declaration. The
-    scope of the namespace declaration is the element in which it is defined
-    and all the children of that element.The prefix is the local alias we use
-    for referencing the namespace, and the URL (it can be anything, really) is
-    the name/definition of the namespace. Note that even though the namespace
-    definition is normally an URL, it does not have to point to anything. It
-    is recommended that it points to a page that describes the elements in the
-    namespace, but it does not have to. The prefix can be just about anything
-    - or nothing (in which case it is the default namespace). Any prefix,
-    including the empty prefix for the default namespace, can be redefined to
-    refer to a different namespace at any time in an XML document. This is
-    more likely to happen to the default namespace than any other prefix. Here
-    is an example of this:</p>
-
-    <anchor name="xml_sample_1"/>
-<source>
-    &lt;?xml version="1.0"?&gt;
-    
-    &lt;employees xmlns:postal="http://postal.ie/spec-1.0"
-               xmlns:email="http://www.w3c.org/some-spec-3.2"&gt;
-        &lt;employee&gt;
-            &lt;name&gt;Bob Worker&lt;/name&gt;
-            &lt;postal:address&gt;
-                &lt;postal:street&gt;Nassau Street&lt;/postal:street&gt;
-                &lt;postal:city&gt;Dublin 3&lt;/postal:city&gt;
-                &lt;postal:country&gt;Ireland&lt;/postal:country&gt;
-            &lt;/postal:address&gt;
-            &lt;email:address&gt;bob.worker@hisjob.ie&lt;/email:address&gt;
-        &lt;/employee&gt;
-    &lt;/employees&gt;
-</source>
-
-    <p>This short document has two namespace declarations, one with the prefix
-    <code>"postal"</code> and another with the prefix <code>"email"</code>. The
-    prefixes are used to distinguish between elements for e-mail addresses and
-    regular postal addresses. In addition to these two namespaces there is also
-    an initial (unnamed) default namespace being used for the
-    <code>&lt;name&gt;</code> and <code>&lt;employee&gt;</code> tags. The scope of the
-    default namespace is in this case the whole document, while the scope of
-    the other two declared namespaces is the <code>&lt;employees&gt;</code>
-    element and its children.</p>
-
-    <p>By changing the default namespace we could have made the document a
-    little bit simpler and more readable:</p>
-
-    <anchor name="xml_sample_2"/>
-<source>
-    &lt;?xml version="1.0"?&gt;
-    
-    &lt;employees xmlns:email="http://www.w3c.org/some-spec-3.2"&gt;
-        &lt;employee&gt;
-            &lt;name&gt;Bob Worker&lt;/name&gt;
-            &lt;address xmlns="http://postal.ie/spec-1.0"&gt;
-                &lt;street&gt;Nassau Street&lt;/street&gt;
-                &lt;city&gt;Dublin 3&lt;/city&gt;
-                &lt;country&gt;Ireland&lt;/country&gt;
-            &lt;/address&gt;
-            &lt;email:address&gt;bob.worker@hisjob.ie&lt;/email:address&gt;
-        &lt;/employee&gt;
-    &lt;/employees&gt;
-</source>
-
-    <p>The default namespace is redefined for the <code>&lt;address&gt;</code> node
-    and its children, so there is no need to specify the street as
-    <code>&lt;postal:street&gt;</code> - just plain <code>&lt;street&gt;</code> is
-    sufficient. Note that this also applies to the <code>&lt;address&gt;</code>
-    where the namespace is first defined. This is in effect a redefinition of
-    the default namespace.</p>
-  </s2><anchor name="overview"/>
-  <s2 title="Namespace overview">
-
-    <p>Namespaces will have to be handled in three separate parts of the XSLT
-    compiler:</p>
-
-    <anchor name="all_namespaces"/>
-      <p><img src="all_namespaces.gif" alt="all_namespaces.gif"/></p>
-      <p><ref>Figure 1: Namespace handlers in the XSLTC</ref></p>
-
-    <p>The most obvious is the namespaces in the source XML document
-    (marked <link anchor="NSA">"NS A"</link> in figure 1). These namespaces will be
-    handled by our DOM implementation class. The source XSL stylesheet also
-    has its own set of namespaces (<link idref="NSB">"NS B"</link>) - one of which
-    is the XSL namespace. These namespaces will be handled at run-time and
-    whatever information that is needed to process there should be compiled
-    into the translet. There is also a set of namespaces that will be used in
-    the resulting document (<link idref="NSC">"NS C"</link>). This is an
-    intersection of the first two. The output document should not contain any
-    more namespace declarations than necessary.</p>
-
-    </s2><anchor name="NSA"/>
-    <s2 title="The DOM &amp; namespaces">
-    <ul>
-      <li><link anchor="dom-namespace">DOM node types and namespace types</link></li>
-      <li><link anchor="assign">Assigning namespace types to DOM nodes</link></li>                
-    </ul>
-    <anchor name="dom-namespace"/>
-    <s3 title="DOM node types and namespace types">
-
-    <p>Refer to the XSLTC <link idref="xsltc_runtime">runtime
-    environment design</link> document for a description of node types before
-    proceeding. In short, each node in the our DOM implementation is
-    represented by a simple integer. By using this integer as an index into an
-    array called <code>_type[]</code> we can find the type of the node.</p>
-
-    <p>The type of the node is an integer representing the type of element the
-    node is. All elements <code>&lt;bob&gt;</code> will be given the same type,
-    all text nodes will be given the same type, and so on. By using the node
-    type as an index an array called <code>_namesArray[]</code> we can find the
-    name of the element type - in this case "bob". This code fragment shows
-    how you can, with our current implementation, find the name of a node:</p>
-
-<source>
-    int    node = iterator.getNext();  // get next node
-    int    type = _type[node];         // get node type
-    String name = _namesArray[type];   // get node name
-</source>
-
-    <p>We want to keep the one-type-per-node arrangement, since that lets us
-    produce fairly efficient code. One type in the DOM maps to one type in
-    the compiled translet. What we could do to represent the namespace for
-    each node in the DOM is to add a <code>_namespaceType[]</code> array that holds
-    namespace types. Each node type maps to a namespace type, and each
-    namespace type maps to a namespace name (and a prefix with a limited
-    scope):</p>
-
-    <anchor name="type_mappings"/>
-    <p><img src="type_mappings.gif" alt="type_mappings.gif"/></p>
-      <p><ref>Figure 2: Mapping between node types/names, namespace types/names</ref></p>
-
-    <p>This code fragment shows how we could get the namespace name for a node:</p>
-
-<source>
-    int    node      = iterator.getNext();    // get next node
-    int    type      = _type[node];           // get node type
-    int    nstype    = _namespace[type];      // get namespace type
-    String name      = _namesArray[type];     // get node element name
-    String namespace = _nsNamesArray[nstype]; // get node namespace name
-</source>
-
-    <p>Note that namespace prefixes are not included here. Namespace prefixes
-    are local to the XML document and will be expanded to the full namespace
-    names when the nodes are put into the DOM. This, however, is not a trivial
-    matter.</p>
-    </s3><anchor name="assign"/>
-    <s3 title="Assigning namespace types to DOM nodes">
-
-    <p>We cannot simply have a single namespace prefix array similar to the
-    <code>_namespaceArray[]</code> array for mapping a namespace type to a single
-    prefix. This because prefixes can refer to different namespaces depending
-    on where in the document the prefixes are being used. In our last example's
-    <link idref="xml_sample_2">XML fragment</link> the empty prefix <code>""</code>
-    initially referred to the default namespace (the one with no name - just
-    like a Clint Eastwood character). Later on in the document the empty
-    prefix is changed to refer to a namespace called 
-    <code>"http://postal.ie/spec-1.0"</code>.</p>
-
-    <p>Namespace prefixes are only relevant at the time when the XML document
-    is parsed and the DOM is built. Once we have the DOM completed we only need
-    a table that maps each node type to a namespace type, and another array of
-    all the names of the different namespaces. So what we want to end up with
-    is something like this:</p>
-
-     <p><img src="dom_namespace1.gif" alt="dom_namespace1.gif"/></p>
-     <p><ref>Figure 3: Each namespace references in the DOM gets one entry</ref></p>
-
-    <p>The namespace table has one entry for each namespace, nomatter how many
-    prefixes were used ro reference this namespace in the DOM. To build this
-    array we need a temporary data structure used by the DOM builder. This
-    structure is a hashtable - where the various prefixes are used for the
-    hash values. The contents of each entry in the table will be a small stack
-    where previous meanings of each prefix will be stored:</p>
-
-     <p><img src="dom_namespace2.gif" alt="dom_namespace2.gif"/></p>
-     <p><ref>Figure 4: Temporary data structure used by the DOM builder</ref></p>
-
-    <p>When the first node is encountered we define a new namespace
-    <code>"foo"</code> and assign this namespace type/index 1 (the default 
-    namespace <code>""</code> has index 0). At the same time we use the prefix
-    <code>"A"</code> for a lookup in the hashtable. This gives us
-    an integer stack used for the prefix <code>"A"</code>. We push the namespace
-    type 1 on this stack. From now on, until <code>"A"</code> is pop'ed off this
-    stack, the prefix <code>"A"</code> will map to namespace type 1, which
-    represents the namespace URI <code>"foo"</code>.</p>
-
-    <p>We then encounter the next node with a new namespace definition with
-    the same namespace prefix, we create a new namespace <code>"bar"</code> and
-    we put that in the namespace table under type 2. Again we use the prefix
-    <code>"A"</code> as an entry into the namespace prefix table and we get the
-    same integer stack. We now push namespace type 2 on the stack, so that
-    namespace prefix <code>"A"</code> maps to namespace URI <code>"bar"</code>. When
-    we have traversed this node's children we need to pop the integer off the
-    stack, so when we're back at the first node the prefix <code>"A"</code> again
-    will point to namespace type 0, which maps to <code>"foo"</code>. To keep
-    track of what nodes had what namespace declarations, we use a namespace
-    declaration stack:</p>
-
-    <p><img src="dom_namespace3.gif" alt="dom_namespace3.gif"/></p>
-     <p><ref>Figure 5: Namespace declaration stack</ref></p>
-     
-    <p>Every namespace declaration is pushed on the namespace declaration
-    stack. This stack holds the node index for where the namespace was
-    declared, and a reference to the prefix stack for this declaration.
-    The <code>endElement()</code> method of the DOMBuilder class will need to
-    remove namespace declaration for the node that is closed. This is done
-    by first checking the namespace declaration stack for any namespaces
-    declared by this node. If any declarations are found these are un-declared
-    by poping the namespace prefixes off the respective prefix stack(s), and
-    then poping the entry/entries for this node off the namespace declaration
-    stack.</p>
-
-    <p>The <code>endDocument()</code> method will build an array that contains
-    all namespaces used in the source XML document - <code>_nsNamesArray[]</code>
-    - which holds the URIs of all refered namespaces. This method also builds
-    an array that maps all DOM node types to namespace types. This two arrays
-    are accessed through two new methods in the DOM interface:</p>
-
-<source>
-    public String getNamespaceName(int node);
-    public int    getNamespaceType(int node);
-</source>
-
-  </s3></s2><anchor name="NSB"/>
-  <s2 title="Namespaces in the XSL stylesheet">
-  <ul>
-    <li><link anchor="store-access">Storing and accessing namespace information</link></li>
-    <li><link anchor="mapdom-stylesheet">Mapping DOM namespaces to stylesheet namespaces</link></li>
-    <li><link anchor="wildcards">Wildcards and namespaces</link></li>
-  </ul>
-    <anchor name="store-access"/>
-    <s3 title="Storing and accessing namespace information">
-    <p>The SymbolTable class has three datastructures that are used to hold
-    namespace information:</p>
-
-    <ul>
-      <li>
-        First there is the <code>_namespaces[]</code> Hashtable that maps the names
-        of in-scope namespace to their respective prefixes. Each key in the
-        Hashtable object has a stack. A new prefix is pushed on the stack for
-        each new declaration of a namespace.
-      </li>
-      <li>
-        Then there is the <code>_prefixes[]</code> Hashtable. This has the reverse
-        function of the <code>_namespaces[]</code> Hashtable - it maps from
-        prefixes to namespaces.
-      </li>
-      <li>
-        There is also a hashtable that is used for implementing the
-        <code>&lt;xsl:namespace-alias&gt;</code> element. The keys in this
-        hashtable is taken from the <code>stylesheet-prefix</code> attribute of
-        this element, and the resulting prefix (from the <code>result-prefix</code>
-        attribute) is used as the value for each key.
-      </li>
-    </ul>
-
-    <p>The SymbolTable class offers 4 methods for accessing these data
-    structures:</p>
-
-<source>
-    public void   pushNamespace(String prefix, String uri);
-    public void   popNamespace(String prefix);
-    public String lookupPrefix(String uri);
-    public String lookupNamespace(String prefix);
-</source>
-
-    <p>These methods are wrapped by two methods in the Parser class (a Parser
-    object alwas has a SymbolTable object):</p>
-<source>
-    // This method pushes all namespaces declared within a single element
-    public void pushNamespaces(ElementEx element);
-    // This method pops all namespaces declared within a single element
-    public void popNamespaces(ElementEx element);
-</source>
-
-    <p>The translet class has, just like the DOM, a <code>namesArray[]</code>
-    structure for holding the expanded QNames of all accessed elements. The
-    compiled translet fills this array in its constructor. When the translet
-    has built the DOM (a DOMImpl object), it passes the DOM to the a DOM
-    adapter (a DOMAdapter object) together with the names array. The DOM
-    adapter then maps the translet's types to the DOM's types.</p>
-   </s3><anchor name="mapdom-stylesheet"/>
-  <s3 title="Mapping DOM namespaces and stylesheet namespaces">
-
-    <p>Each entry in the DOM's <code>_namesArray[]</code> is expanded to contain
-    the full QName, so that instead of containing <code>prefix:localname</code> it
-    will now contain <code>namespace-uri:localname</code>. In this way the expanded
-    QName in the translet will match the exanded QName in the DOM. This assures
-    matches on full QNames, but does not do much for <code>match="A:*"</code> type
-    XPath patterns. This is where our main challenge lies.</p>
-    </s3><anchor name="wildcards"/>
-    <s3 title="Wildcards and namespaces">
-
-    <p>The original implementation of the XSLTC runtime environment would
-    only allow matches on "<code>*</code>" and "<code>@*</code>" patterns. This was
-    achieved by mapping all elements that could not be mapped to a translet
-    type to 3 (DOM.ELEMENT type), and similarly all unknown attributes to
-    type 4 (DOM.ATTRIBUTE type). The main <code>switch()</code> statement in
-    <code>applyTemplates()</code> would then have a separate "<code>case()</code>"
-    for each of these. (Under each <code>case()</code> you might have to check
-    for the node's parents in case you were matching on "<code>path/*</code>"-type
-    patterns.) This figure shows how that was done:</p>
-
-    <anchor name="match_namespace1"/>
-    <p><img src="match_namespace1.gif" alt="match_namespace1.gif"/></p>
-    <p><ref>Figure 6: Previous pattern matching</ref></p>
-
-    <p>The "Node test" box here represents the "<code>switch()</code>" statement.
-    The "Node parent test" box represent each "<code>case:</code>" for that 
-    <code>switch()</code> statement. There is one <code>case:</code> for each know
-    translet node type. For each node type we have to check for any parent
-    patterns - for instance, for the pattern "<code>/foo/bar/baz</code>", we will
-    get a match with <code>case "baz"</code>, and we have to check that the parent
-    node is "<code>bar</code>" and that the grandparent is "<code>foo</code>" before
-    we can say that we have a hit. The "Element parent test" is the test that
-    is done all DOM nodes that do not directly match any translet types. This
-    is the test for "<code>*</code>" or "<code>foo/*</code>". Similarly we have a
-    "<code>case:</code>" for match on attributes ("<code>@*</code>").</p>
-
-    <p>What we now want to achieve is to insert a check for patterns on the
-    format "<code>ns:*</code>", "<code>foo/ns:*</code>" or "<code>ns:@*</code>", which
-    this figure illustrates:</p>
-
-    <anchor name="match_namespace2"/>
-      <p><img src="match_namespace2.gif" alt="match_namespace2.gif"/></p>
-      <p><ref>Figure 7: Pattern matching with namespace tests</ref></p>
-
-
-    <p>Each node in the DOM needs a namespace type as well as the QName type.
-    With this type we can match wildcard rules to any specific namespace.
-    So after any checks have been done on the whole QName of a node (the type),
-    we can match on the namespace type of the node. The main dispatch
-    <code>switch()</code> in <code>applyTemplates()</code> must be changed from this:</p>
-
-    <source>
-        public void applyTemplates(DOM dom, NodeIterator iterator,
-                                   TransletOutputHandler handler) {
-
-            // Get next node from iterator
-            while ((node = iterator.next()) != END) {
-                // Get internal node type
-                final int type = DOM.getType(node);
-                switch(type) {
-                case DOM.ROOT:      // Match on "/" pattern
-                    handleRootNode();       
-                    break;
-                case DOM.TEXT:      // Handle text nodes
-                    handleText();
-                    break;
-                case DOM.ELEMENT:   // Match on "*" pattern
-                    handleWildcardElement();
-                    break;
-                case DOM.ATTRIBUTE: // Handle on "@*" pattern
-                    handleWildcardElement();
-                    break;
-                case nodeType1:     // Handle 1st known element type
-                    compiledCodeForType1();
-                    break;
-                    :
-                    :
-                    :
-                case nodeTypeN:   // Handle nth known element type
-                    compiledCodeForTypeN();
-                    break;
-                default:
-                   NodeIterator newIterator = DOM.getChildren(node);
-                   applyTemplates(DOM, newIterator, handler);
-                   break;
-                }
-            }
-            return;
-        }
-</source>
-
-    <p>To something like this:</p>
-
-    <source>
-        public void applyTemplates(DOM dom, NodeIterator iterator,
-                                   TransletOutputHandler handler) {
-
-            // Get next node from iterator
-            while ((node = iterator.next()) != END) {
-
-                // First run check on node type
-                final int type = DOM.getType(node);
-                switch(type) {
-                case DOM.ROOT:      // Match on "/" pattern
-                    handleRootNode();
-                    continue;
-                case DOM.TEXT:      // Handle text nodes
-                    handleText();
-                    continue;
-                case DOM.ELEMENT:   // Not handled here!!!
-                    break;
-                case DOM.ATTRIBUTE: // Not handled here!!!
-                    break;
-                case nodeType1:     // Handle 1st known element type
-                    if (compiledCodeForType1() == match) continue;
-                    break;
-                    :
-                    :
-                    :
-                case nodeTypeN:     // Handle nth known element type
-                    if (compiledCodeForTypeN() == match) continue;
-                    break;
-                default:
-                    break;
-                }
-
-                // Then run check on namespace type
-                final int namespace = DOM.getNamespace(type);
-                switch(namespace) {
-                case 0: // Handle nodes matching 1st known namespace
-                    if (handleThisNamespace() == match) continue;
-                    break;
-                case 1: // Handle nodes matching 2nd known namespace
-                    if (handleOtherNamespace() == match) continue;
-                    break;
-                }
-
-                // Finally check on element/attribute wildcard
-                if (type == DOM.ELEMENT) {
-                    if (handleWildcardElement() == match)
-                        continue;
-                    else {
-                       // The default action for elements
-                       NodeIterator newIterator = DOM.getChildren(node);
-                       applyTemplates(DOM, newIterator, handler);
-                    }
-                }
-                else if (type == DOM.ATTRIBUTE) {
-                    handleWildcardAttribute();
-                    continue; 
-                }
-            }
-        }
-</source>
-
-    <p>First note that the default action (iterate on children) does not hold for
-    attributes, since attribute nodes do not have children. Then note that the way
-    the three levels of tests are ordered is consistent with the way patterns
-    should be prioritised:</p>
-
-    <ul>
-
-      <li><em>Match on element/attribute types:</em></li>
-        <ul>
-          <li><code>match="/"</code> - match on the root node</li>
-          <li><code>match="B"</code> - match on any B element</li>
-          <li><code>match="A/B"</code> - match on B elements with A parent</li>
-          <li><code>match="A | B"</code> - match on B or A element</li>
-          <li><code>match="foo:B"</code> - match on B element within "foo" namespace</li>
-        </ul>
-        <li><em>Match on namespace:</em></li>
-        <ul>
-          <li><code>match="foo:*"</code> - match on any element within "foo" namespace</li>
-          <li><code>match="foo:@*"</code> - match on any attribute within "foo" namespace</li>
-          <li><code>match="A/foo:*"</code> - match on any element within "foo" namespace with A parent</li>
-          <li><code>match="A/foo:@*"</code> - match on any attribute within "foo" namespace with A parent</li>
-        </ul>      
-
-      <li><em>Match on wildcard:</em> </li>
-        <ul>
-          <li><code>match="*"</code> - match on any element</li>
-          <li><code>match="@*"</code> - match on any attribute</li>
-          <li><code>match="A/*"</code> - match on any element with A parent</li>
-          <li><code>match="A/@*"</code> - match on any attribute with A parent</li>
-        </ul>
-     
-    </ul>
-
-     </s3></s2><anchor name="NSC"/>
-     <s2 title="Namespaces in the output document">
-
-    <p>These are the categories of namespaces that end up in the output
-    document:</p>
-
-    <ul>
-      <li>
-        Namespaces used in literal elements/attributes in the stylesheet. These
-        namespaces should be declared <em>once</em> before use in the output
-        document. These elements are copied to the output document independent
-        of namespaces in the input XML document. However, the namespaces can
-        be declared using the same prefix, such that a namespace used by a
-        literal result element can overshadow a namespace from the DOM.
-      </li>
-      <li>
-        Namespaces from elements in the stylesheet that match elements in the
-        DOM. No namespaces from the DOM should be copied to the output document
-        unless they are actually referenced in the stylesheet. No namespaces
-        from the stylesheet should be copied to the output document unless the
-        elements in which they are references match elements in the DOM.
-      </li>
-    </ul>
-
-      <anchor name="output_namespaces1"/>
-      <p><img src="output_namespaces1.gif" alt="output_namespaces1.gif"/></p>
-      <p><ref>Figure 8: Namespace declaration in the output document</ref></p>    
-
-    <p>Any literal element that ends up in the output document must declare all
-    namespaces that were declared in the <code>&lt;xsl:stylesheet&lt;</code>
-    element. Exceptions are namespaces that are listed in this element's
-    <code>exclude-result-prefixes</code> or <code>extension-element-prefixes</code>
-    attributes. These namespaces should only be declared if they are referenced
-    in the output.</p>
-
-    <p>Literal elements should only declare namespaces when necessary. A
-    literal element should only declare a namespace in the case where it
-    references a namespace using prefix that is not in scope for this
-    namespace. The output handler will take care of this problem. All namespace
-    declarations are put in the output document using the output handler's
-    <code>declarenamespace()</code> method. This method will monitor all namespace
-    declarations and make sure that no unnecessary declarations are output.
-    The datastructures used for this are similar to those used to track
-    namespaces in the XSL stylesheet:</p>
-
-    <anchor name="output_namespaces2"/>
-    <p><img src="output_namespaces2.gif" alt="output_namespaces2.gif"/></p>
-      <p><ref>Figure 9: Handling Namespace declarations in the output document</ref></p>
-
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_native_api.xml b/xdocs/sources/xsltc/xsltc_native_api.xml
deleted file mode 100644
index 3f4f5f4..0000000
--- a/xdocs/sources/xsltc/xsltc_native_api.xml
+++ /dev/null
@@ -1,345 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC Native API Documentation">
-
-  <s2 title="XSLTC Compiler API">
-
-    <p>XSLTC's native API is represented by the
-    <code>org.apache.xalan.xsltc.compiler.XSLTC</code> class. Any application
-    using XSLTC's native API should only have to access methods in this class
-    in order to compile a stylesheet (or a set or stylesheets) into one or
-    more Java classes. The <code>XSLTC</code> has an empty constructor. The
-    class needs to be initialized before each compilation by a call to:</p>
-<source>
-    public void init();
-</source>
-
-    <s3 title="Compile methods">
-    <p>There is a set of methods for compiling one or more stylesheets into a
-    set of Java classes. The stylesheet can be specified either as a
-    <code>URL</code>, <code>InputStream</code>, <code>InputSource</code> or
-    a <code>Vector</code> containing a set of <code>URL</code>s pointing to
-    stylesheets:</p><source>
-    public boolean compile(URL url);
-    public boolean compile(URL url, String transletName);
-    public boolean compile(InputStream stream, String transletName);
-    public boolean compile(InputSource input, String transletName);
-    public boolean compile(Vector stylesheets);</source>
-
-    <p>The default behaviour is to output the compiled Java class(es) to one or
-    more Java classes in the current working directory. The name of the main
-    translet class will be obtained from (in order of priority):</p>
-
-    <ul>
-      <li>that specified in the <code>compile()</code> method</li>
-      <li>if none is specified (if the parameter is 'null') the name will be
-      generated from the filename specified by the input URL/file/stream</li>
-      <li>the default translet name (set by <code>setClassName()</code>)</li>
-      <li>the built-in default class name <code>&quot;GregorSamsa&quot;</code></li>
-    </ul>
-
-    <p>Additional Java classes will be generated for complex stylesheets. These
-    classes represent elements such as predicates, sort-records, etc. in the
-    stylesheet. Additional classes share the same root name as the main translet
-    class, with a suffix containing a '$'-sign and a sequence number. The result
-    of a single compilation of a complex stylesheet could be:</p><source>
-    GregorSamsa.java
-    GregorSamsa$0.java
-    GregorSamsa$1.java
-    GregorSamsa$2.java
-    GregorSamsa$3.java</source>
-
-    <p>It is not always desireable having these classes dumped to files in the
-    current working directory. There is one <code>compile()</code> method that
-    will return the Java class definitions as bytecodes. The bytecodes are
-    returned in a two-dimmensional <code>byte</code> array. Each byte-array
-    contains the bytecodes for one Java class:</p><source>
-    public byte[][] compile(String name, InputSource input);</source>
-
-    <p>Alternatively, one can first compile the stylesheet into one or more
-    Java class files, and then also retrieve the bytecodes from the compiler:</p><source>
-    public byte[][] getBytecodes();</source>
-
-    </s3>
-
-    <s3 title="Output settings">
-
-    <p>The default (root) name for the generated Java classes can be set and
-    retrieved by calls to these methods:</p><source>
-    public void setClassName(String className);
-    public String getClassName();</source>
-
-    <p>One can also specify a package to place the classes in:</p><source>
-    public void setPackageName(String package);</source>
-
-    <p>The generated classes can also be wrapped inside a single Java archive
-    (JAR-file):</p><source>
-    public void setJarFileName(String jarFileName);
-    public String getJarFileName();</source>
-
-    <p>The result file(s) need not be output in the current working directory.
-    Specify the directory to output to by calling:</p><source>
-    public boolean setDestDirectory(String directory);</source>
-
-    </s3>
-
-    <anchor name="document-locator"/>
-    <s3 title="Input document locator interface">
-
-    <p>XSLTC's compiler has an interface that a client application can implement
-    to provide XSL input from alternative sources. Implementing and using this
-    interface is necessary when the top-level stylesheet contains one or more
-    <code>&lt;xsl:include&gt;</code> and <code>&lt;xsl:import&gt;</code>
-    elements that reference stylesheets that cannot be read using standard
-    <code>File</code> or <code>URL</code> classes. The interface that a client
-    must implement is <code>org.apache.xalan.xsltc.compiler.SourceLoader</code>,
-    and its only method is:</p><source>
-    public InputSource loadSource(String href, String context, XSLTC xsltc);</source>
-
-    <p>The compiler class, <code>XSLTC</code>, has a method for specifying the
-    implementation of this interface:</p><source>
-    public void setSourceLoader(SourceLoader loader);</source>
-
-    <p>This interface shares the same purpose as the <code>URIResolver</code>
-    interface in the JAXP/TrAX API.</p>
-
-    </s3>
-
-    <s3 title="Debug settings">
-
-    <p>XSLTC can be forced to output debug messages and stack dumps:</p><source>
-    public void setDebug(boolean debug);
-    public boolean debug();</source>
-
-    </s3>
-
-    <s3 title="Error handling">
-
-    <p>All <code>compile()</code> methods return 'true' if the compilation
-    succeeded. The compiler could in such case still generate warning messages.
-    These message could be retrieved a <code>Vector</code> of strings or
-    output directlry to stderr:</p><source>
-    public Vector getWarnings();
-    public void printWarnings();</source>
-
-    <p>All <code>compile()</code> methods will return 'false' if any serious
-    errors prevented the compiler from generating any Java classes. Error
-    messages are handled similar to warning messages:</p><source>
-    public Vector getErrors();
-    public void printErrors();</source>
-
-    <p>Note that warning messages are not returned/output by these two methods.
-    A client application should pass both warning  and error messages
-    to its user.</p>
-
-    </s3>
-
-  </s2>
-
-  <s2 title="XSLTC Transform API">
-
-    <p>The steps described in this chapter are covered in these sample
-    source code files:</p>
-
-    <ul>
-      <li><code>org.apache.xalan.xsltc.cmdline.Transform</code></li>
-      <li><code>$XML-XALAN/java/samples/CompiledApplet/TransformApplet</code></li>
-      <li><code>$XML-XALAN/java/samples/CompiledApplet/TransformApplet</code></li>
-      <li><code>$XML-XALAN/java/samples/CompiledServlet/TransformServlet</code></li>
-      <li><code>$XML-XALAN/java/samples/CompiledBrazil/TransformHandler</code></li>
-      <li><code>$XML-XALAN/java/samples/CompiledEJB/Transform</code></li>
-
-    </ul>
-
-    <s3 title="Transformation input handling">
-
-    <p>The main input document must be parsed using a SAX handler. The main SAX
-    events (<code>ContentHandler</code>) and lexical declarations
-    (<code>LexicalHandler</code>) are handled by the internal DOM builder.
-    The classes that make up the internal DOM are:</p><source>
-    org.apache.xalan.xsltc.DOM;             - DOM interface
-    org.apache.xalan.xsltc.dom.DOMImpl;     - DOM implementation
-    org.apache.xalan.xsltc.dom.DOMAdapter;  - DOM-to-translet mapper
-    org.apache.xalan.xsltc.dom.MultiDOM;    - DOM multiplexer
-    org.apache.xalan.xsltc.dom.DOMBuilder;  - DOM builder interface</source>
-
-    <p>The <code>DOMBuilder</code> interface is a wrapper for the standard SAX
-    <code>ContentHandler</code> and <code>LexicalHandler</code> interfaces.
-    The <code>DOMBuilder</code> contains both these interfaces, and it is
-    implemented by an inner class of the <code>DOMImpl</code> class. To build
-    the internal DOM, one has to go through these steps:</p><source>
-    // Create a SAX parser and get the XMLReader object it uses
-    final SAXParserFactory factory = SAXParserFactory.newInstance();
-    try {
-	factory.setFeature(Constants.NAMESPACE_FEATURE,true);
-    }
-    catch (Exception e) {
-	factory.setNamespaceAware(true);
-    }
-    final SAXParser parser = factory.newSAXParser();
-    final XMLReader reader = parser.getXMLReader();
-
-     // Set the DOM's DOM builder as the XMLReader's SAX2 ContentHandler
-    final DOMImpl dom = new DOMImpl();
-    DOMBuilder builder = dom.getBuilder();
-    reader.setContentHandler(builder);
-
-     // Set the DOM's DOM builder as the XMLReader's SAX2 LexicalHandler
-    try {
-	String prop = "http://xml.org/sax/properties/lexical-handler";
-	reader.setProperty(prop, builder);
-    }
-    catch (SAXException e) {
-	 // Can be quitely ignored...
-    }
-
-     // Pass the document URI or file-name to the DOM
-    dom.setDocumentURI(uri);
-     // Parse the input document to populate the DOM
-    reader.parse(uri);</source>
-
-    <p>The input XML document may contain of reference a DTD. A DTD must be
-    processed by XSLTC in order to support the <code>id()</code> and
-    <code>unparsed-entity-uri()</code> functions.
-    The <code>org.apache.xalan.xsltc.dom.DTDMonitor</code> class can handle
-    DTD declarations and aggregate them for use by a translet. Create your
-    <code>DTDMonitor</code> instance by passing it a reference to your SAX
-    parser:</p><source>
-     // Create a DTD monitor and pass it to the XMLReader object
-    final DTDMonitor dtd = new DTDMonitor(reader);</source>
-
-    <p>This call ensures that an index is built for all <code>ID</code>
-    attributes described in the DTD:</p><source>
-     // If there are any elements with ID attributes, build an index
-    dtd.buildIdIndex(dom, 0, _translet);</source>
-
-    <p>And this call ensures that the translet is passed all unparsed entities
-    described in the DTD:</p><source>
-    translet.setDTDMonitor(dtd);</source>
-
-    <p>We'll tell you how to create the translet instance in the next section.</p>
-
-    </s3>
-
-    <s3 title="The translet instance">
-
-    <p>All compiled translets inherit from the <code>AbstractTranslet</code>
-    class, so it is safe to cast your tranlet instance to that class:</p><source>
-    Class transletClass = Class.forName(transletName);
-    AbstractTranslet translet = (AbstractTranslet)transletClass.newInstance();</source>
-
-    <p>Note that the translet  instance  is not reusable, so you would
-    benefit from keeping the reference to the translet class.</p>
-
-    <p>Once you have your translet instance you can start playing around with
-    it. First you want to pass parameters to it:</p><source>
-    // Pass global parameters
-    translet.addParameter("my-param", "my-value");</source>
-
-    <p>You also want to remember to pass your DTD handler to the translet.
-    (See previous section.)</p>
-
-    </s3>
-
-    <s3 title="Preparing the output handler">
-
-    <p>The compiled translet does not contain all the functionality needed to
-    format the output document. This is handled by our output post-processor
-    <code>org.apache.xalan.xsltc.runtime.TextOutput</code>. This class needs
-    to be instanciated with three parameters; a SAX <code>ContentHandler</code>,
-    a <code>LexicalHandler</code> and a string containing the desired output
-    encoding. The user should normally provide the two handlers, and the
-    output encoding can be obtained from a field in the translet:</p><source>
-    // Get the output encoding (from any &lt;xsl:output&gt; element
-    String encoding = translet._encoding;
-
-    // Create a translet output handler and plug in the SAX handlers
-    TextOutput textOutput = new TextOutput(myContentHandler, myLexicalHandlere, encoding);</source>
-    </s3>
-
-    <s3 title="Transformation">
-
-    <p>With the internal DOM built, the DTD monitor in place, and the output
-    handler set up, we're ready to run the actual transformation:</p><source>
-    // Transform and pass output to the translet output handler
-    translet.transform(dom, textOutput);</source>
- 
-    </s3>
-
-    <s3 title="The DOM cache interface">
-
-    <p>Parsing the input document and building the internal DOM is a fairly
-    expensive operation, and it is often desireable to build a cache holding
-    frequently accessed internal DOMs. An application using XSLTC's native
-    API can accomplish this by implementing the
-    <code>org.apache.xalan.xsltc.DOMCache</code> interface. The application will
-    still have to call the translet's <code>transform()</code> method with a
-    DOM from the cache. But, the translet may have to load additional documents
-    if the original stylesheet contained calls to the <code>document()</code>
-    function. The translet can be instructed to read DOMs from a cache by
-    calling this method:</p><source>
-    public void setDOMCache(DOMCache cache);
-    public DOMCache getDOMCache();</source>
-
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_overview.xml b/xdocs/sources/xsltc/xsltc_overview.xml
deleted file mode 100644
index d291e79..0000000
--- a/xdocs/sources/xsltc/xsltc_overview.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- 
-<s1 title="XSLTC stylesheet compiler overview">
-   
-  <s2 title="Using the Command-Line Utility">
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_performance.xml b/xdocs/sources/xsltc/xsltc_performance.xml
deleted file mode 100644
index 992bc86..0000000
--- a/xdocs/sources/xsltc/xsltc_performance.xml
+++ /dev/null
@@ -1,307 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC Performance">
-
-  <s2 title="Introduction">
-
-    <p><em>XSLT is not a programming language!</em> Just so you remember.
-    XSLT is a declarative language and can be used by you to describe
-    <em>what</em> you want put in your output document and
-    <em>what</em> you want this output to look like. It does not describe
-    <em>how</em> these taks should be carried. That is the job of the XSLT
-    processor. This document is <em>not</em> a "<ref>programmer's guide to XSLT</ref>"
-    and should not be considered as such. All XSLT processors have their
-    properties and ways of handling XSL elements and XPath properties. This
-    document will give you some insight into the XSLTC internals, so that you
-    can channel your stylesheets through XSLTC's shortest and most efficient
-    code paths.</p>
-
-    <p>XSLTC's performance has always been one of its key selling points.
-    (I should probably find a better term here, since we're giving XSLTC away
-    for free.) But, there are some specific patterns and expressions that are
-    not handled much better than with other interpretive XSLT processors, and
-    this document is an attempt to pinpoint these and to outline alternatives.
-    </p>
-
-  </s2>
-
-  <s2 title="Contents">
-    <ul>
-      <li><link anchor="pred">Avoid using predicates in '*' patterns</link></li>
-      <li><link anchor="idkey">Avoid using id/key-patterns</link></li>
-      <li><link anchor="union">Avoid union expressions where possible</link></li>
-      <li><link anchor="sort">Sort stored node-sets once</link></li>
-      <li><link anchor="cache">Cache input documents</link></li>
-      <li><link anchor="trax">TrAX vs. native API</link></li>
-    </ul>
-  </s2>
-
-  <anchor name="pred"/>
-  <s2 title="Avoid using predicates in wildcard patterns">
-
-    <p>XSLTC gains its speed from the simple dispatch loop in the translet's
-    <code>applyTemplates()</code> method. This method uses a simple
-    <code>switch()</code> statement to choose the desired template based on
-    the current node's node type (an integer). By adding a pattern with a
-    wildcard (no type) and a predicate, XSLTC is forced to evaluate the
-    predicate for every single node.</p><source>
-    &lt;xsl:template match="*[2]"></source>
-
-    <p>The above pattern should be avoided by selecting the desired node when
-    using <code>&lt;xsl:apply-templates&gt;</code>. Use named templates or
-    modes to make sure you trigger the correct template:</p><source>
-    &lt;xsl:template match="/">
-      &lt;xsl:apply-templates select="bar"/>
-    &lt;/xsl:template>
-
-    &lt;xsl:template match="*[2]"/>
-
-    &lt;xsl:template match="*"/></source>
-
-    <p>can be replaced by:</p><source>
-    &lt;xsl:template match="/">
-      &lt;xsl:apply-templates select="bar"/>
-      &lt;xsl:apply-templates select="bar[2]" mode="second"/>
-    &lt;/xsl:template>
-
-    &lt;xsl:template match="*" mode="second"/>
-
-    &lt;xsl:template match="*"/></source>
-
-    <p>This change will only improve performance if the stylesheet is fairly
-    large and has a good few templates (10 or more). Also note that the order
-    of the output is changed by this approach, so if the order is significant
-    you'll have to stick to the original stylesheet.</p>
-
-    <p><em>Important note:</em> The type of pattern referred to as a
-    type-less pattern, as it does not match any specific node type. Such
-    patterns do in general degrade the performance of XSLTC. Type-less patterns
-    must be evaluated for every single node in the input document - causing a
-    general performance degradation.</p>
-
-  </s2>
-
-  <anchor name="idkey"/>
-  <s2 title="Avoid using id/key-patterns">
-
-    <p>Id and key patterns can be used to trigger a template if the current
-    node has a specific id or has a specific value in a key's index:</p><source>
-    &lt;xsl:template match="id('some-value')"/>
-
-    &lt;xsl:template match="key('key-name', 'some-value')"/></source>
-
-    <p>Looking up a value/node-pair in an index does not require much processing
-    time at all. But, this is also a type-less pattern and can match any type
-    of node. This degrades XSLTC's performenace, just like wildcard patterns
-    with predicates (see above paragraph).</p>
-
-  </s2>
-
-  <anchor name="union"/>
-  <s2 title="Avoid union expressions where possible">
-
-    <p>Union expressions provide an all-in-one-go easy way of applying templates
-    to sets of nodes:</p><source>
-    &lt;xsl:apply-templates select="foo|bar|baz"/></source>
-
-    <p>The union iterator that is used to implement union expressions is 
-    unfortunately not very efficient. If node order is not of importance, then
-    one can benefit from breaking the union up in several elements:</p><source>
-    &lt;xsl:apply-templates select="foo"/>
-    &lt;xsl:apply-templates select="bar"/>
-    &lt;xsl:apply-templates select="baz"/></source>
-
-    <p>But, remeber that this will give you all <code>&lt;foo&gt;</code>
-    elements first, then all <code>&lt;bar&gt;</code> elements, and so on.
-    This is not always desireable. You may want to handle these elements in
-    the order in which they appear in the input document.</p>
-
-    <p><em>Important note:</em> This does <em>not</em> apply to union patterns.
-    Using unions in patterns actually makes smaller and more efficient code,
-    as only one copy of the templete body has to be compiled. Use:</p><source>
-    &lt;xsl:template match="foo|bar|baz"/></source>
-
-    <p>instead of:</p><source>
-    &lt;xsl:template match="foo"/>
-    &lt;xsl:template match="bar"/>
-    &lt;xsl:template match="baz"/></source>
- 
-  </s2>
-
-  <anchor name="sort"/>
-  <s2 title="Sort stored node-sets once">
-
-    <p>This item is very obvious, but nevertheless easy to forget in some
-    complicated cases. If you put a result-tree fragment inside a variable, and
-    you want the nodes in a specific, sorted order, then sort the nodes as you
-    create the variable and not when you use it. Instead of:</p><source>
-
-    &lt;xsl:variable name="bars">
-      &lt;xsl:copy-of select="//foo/bar"/>
-    &lt;/xsl:variable>
-
-    &lt;xsl:template match="/">
-      &lt;xsl:text>List of bar's in sorted order:&amp;#xa;&lt;/xsl:text>
-      &lt;xsl:for-each select="$bars-sorted">
-        &lt;xsl:value-of select="@name"/>
-        &lt;xsl:text>&amp;#xa;&lt;/xsl:text>
-      &lt;/xsl:for-each>
-    &lt;/xsl:template></source>
-
-    <p>A better way, and with most XSLT processors the only legal way, is to
-    sort the result tree when creating it:</p><source>
-
-    &lt;xsl:variable name="bars">
-      &lt;xsl:for-each select="//foo/bar">
-        &lt;xsl:sort select="@name"/>
-        &lt;xsl:copy-of select="."/>
-      &lt;/xsl:for-each>
-    &lt;/xsl:variable>
-
-    &lt;xsl:template match="/">
-      &lt;xsl:text>List of bar's in sorted order:&amp;#xa;&lt;/xsl:text>
-      &lt;xsl:for-each select="$bars">
-        &lt;xsl:value-of select="@name"/>
-        &lt;xsl:text>&amp;#xa;&lt;/xsl:text>
-      &lt;/xsl:for-each>
-    &lt;/xsl:template></source>
-
-    <p>It is very common to sort node-sets returned by the id() and key()
-    functions. Instead of doing this sorting over and over again, one should
-    use a variable and store the node set in the desired sort order, and read
-    the node set from the variable whenever used.</p>
-
-  </s2>
-
-  <anchor name="cache"/>
-  <s2 title="Cache the input document">
-
-    <p>All XSLT processors use an internal DOM-like structure, and XSLTC is no
-    exception. The internal DOM is tailored for the XSLTC design and can be
-    navigated efficiently by the translet. Building the internal DOM is a
-    rather slow process, and does very many cases take more time than the
-    actual transformation. This is a general rule, and does not only apply to
-    XSLTC. It is advisable, and common in most large-scale XSLT-based
-    applications, to create a cache for the input documents. Not only does this
-    prevent CPU- and memory-intensive DOM creation, but it also prevents several
-    translets from having their own private copies of common input documents.
-    Both XSLTC's  internal API and TrAX implementation provide ways of
-    implementing a decent input document cache:</p>
-
-    <ul>
-      <li>See <link anchor="trax-cache">below</link> for a description of how
-      to do this using the TrAX interface.</li>
-
-      <li>The <jump href="xsltc_native_api.html#document-locator">native API
-      documentation</jump> contains a section on using the internal
-      <code>org.apache.xalan.xsltc.compiler.SourceLoader</code> interface.</li>
-    </ul>
-  </s2>
-
-  <anchor name="trax"/>
-  <s2 title="TrAX vs. native API">
-
-    <s4 title="TrAX performance benefits">
-
-    <p>If XSLTC's two-step approach to XSLT processing suits your application
-    then there is no reason why you should not use the TrAX API. The API fits
-    very nicely in with XSLTC internals and processing model. In fact, you may
-    even benefit from using TrAX in cases where your stylesheet is compiled
-    into a large ammount of auxiliary classes. The most obvious benefit is that
-    the translet class and auxiliary classes are all bundled inside the
-    <code>Templates</code> object. Performance can also be improved due to the
-    fact that XSLTC chaches all auxiliary classes inside <code>Templates</code>
-    code, preventing the class loader from being invoked more than necessary.
-    This is just theory and no tests have been done, but you should see a
-    performance improvement when using XSLTC and TrAX in such cases.</p>
-
-    </s4>
-
-    <s4 title="Treat Templates objects as compiled translets">
-
-    <p>When using TrAX, the <code>Templates</code> object should be considered
-    the result of a compilation. With XSLTC this is the actual case - the
-    <code>Templates</code> object contains the translet Java class(es). With
-    other XSLT processors the <code>Templates</code> directly or indirectly
-    contains data-structures represent all or parts of the input stylesheet.
-    The bottom line is: Create your <code>Templates</code> object once, cache
-    and re-use it as often as possible.</p>
-
-    </s4>
-
-    <anchor name="trax-cache"/>
-    <s4 title="Input document caching">
-
-    <p>An extension to the TrAX API allows input documents to be cached. The
-    extensions is a sub-class to the TrAX <code>Source</code> class, which can
-    be used to wrap XSLTC's internal DOM structures. This is described in
-    detail in the <link idref="xsltc_trax_api">XSLTC TrAX API reference</link>.
-    </p>
-
-    <p>If you do chose to implement a DOM cache, you should have your cache
-    implement the <code>javax.xml.transform.URIResolver</code> interface so
-    that documents loaded by the <code>document()</code> function are also read
-    from your cache.</p>
-
-    </s4>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_predicates.xml b/xdocs/sources/xsltc/xsltc_predicates.xml
deleted file mode 100644
index 64a9052..0000000
--- a/xdocs/sources/xsltc/xsltc_predicates.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC Predicate Handling">
-
-  <s2 title="Definition">
-
-  <p>According to Michael Kay's &quot;XSLT Programmer's Reference&quot; page
-  736, a predicate is &quot;An expression used to filter which nodes are
-  selected by a particular step in a path expression, or to select a subset of
-  the nodes in a node-set. A Boolean expression selects the nodes for which the
-  predicate is true; a numeric expression selects the node at the position
-  given by the value of the expression, for example '[1]' selects the first
-  node.&quot;. Note that a predicate containing a boolean expression can
-  return zero, one or more nodes, while a predicate containing a numeric
-  expression can return only zero or one node.</p>
-
-  </s2>
-
-  <s2 title="Examples">
-
-  <p>I'll list a few examples that I can refer back to later on in this
-  document. All examples will use this XML document:</p><source>
-    &lt;?xml version="1.0"?>
-    &lt;doc>
-      &lt;foo location="Drumcondra">
-        &lt;bar name="Cat and Cage"/>
-        &lt;bar name="Fagan's"/>
-        &lt;bar name="Gravedigger's"/>
-        &lt;bar name="Ivy House"/>
-      &lt;foo>
-      &lt;foo location="Town">
-        &lt;bar name="Peter's Pub"/>
-        &lt;bar name="Grogan's"/>
-        &lt;bar name="Hogans's"/>
-        &lt;bar name="Brogan's"/>
-      &lt;/foo>
-    &lt;/doc></source>
-
-  <p>Here are some examples of a predicate with boolean expressions:</p><source>
-    &lt;xsl:for-each select="//bar[contains(@name,'ogan')]">
-    &lt;xsl:for-each select="//bar[parent::*/@location = 'Drumcondra']">
-    &lt;xsl:for-each select="//bar[@name = 'Cat and Cage']"></source>
-
-  <p>The first two select more than one node, while the last selects only one.
-  The last expression could select more nodes if the input document was
-  different. Now, here are a few examples of predicates with numeric
-  expressions:</p><source>
-    &lt;xsl:value-of select="//bar[1]">
-    &lt;xsl:value-of select="/doc/foo[2]/bar[1]">
-    &lt;xsl:value-of select="/doc/foo[2]/bar"></source>
-  <p>The last expression will return more than one node, but the step that
-  contains the predicate returns only one (the second <code>&lt;foo&gt;</code>
-  element).</p>
-
-  <p>The above are the basic types of predicates. These can be grouped to create
-  a predicate pipeline, where the first predicate reduces the node-set that the
-  second predicate filters, and so on. Here are some examples:</p><source>
-    A: &lt;for-each select="//bar[contains(@name,'ogan')][2]">
-    C: &lt;for-each select="//bar[2][contains(@name,'ogan')]">
-    B: &lt;for-each select="//bar[position() > 3][2]"></source>
-
-  <p>It is easier to figure out which nodes these expressions should return if
-  one goes through the steps and predicates one by one. In expression
-  <code>A:</code> we first get all <code>&lt;bar&gt;</code> elements from the
-  whole document. Then the first predicate selects from that node-set only
-  those elements that have a <code>@name</code> attribute that contains
-  &quot;ogan&quot;, and we're left with these elements:</p><source>
-        &lt;bar name="Grogan's">
-        &lt;bar name="Hogans's">
-        &lt;bar name="Brogan's"></source>
-  <p>And finally, the last predicate then selects the second of those
-  elements:</p><source>
-        &lt;bar name="Hogans's"></source>
-
-  <p>Expression <code>B:</code> contains the same predicates as <code>A:</code>,
-  but the resulting node set if completely different. We start off with the same
-  set of <code>&lt;bar&gt;</code> elements, but we apply the
-  <code>&quot;[2]&quot;</code> predicate first, and end up with this
-  element:</p><source>
-        &lt;bar name="Fagan's"></source>
-
-  <p>Fagan's is the bar where the Irish Taoiseach (prime minister) drinks his
-  pints, but its name does not contain the string &quot;<code>ogan</code>&quot;,
-  so the resulting node-set is empty.</p>
-
-  <p>The third expressions also starts off with all <code>&lt;bar&gt;</code>
-  elements, applies the predicate &quot;<code>[position() > 3]</code>&quot;,
-  and reduces the node set to these:</p><source>
-        &lt;bar name="Ivy House">
-        &lt;bar name="Peter's Pub">
-        &lt;bar name="Grogan's">
-        &lt;bar name="Hogans's">
-        &lt;bar name="Brogan's"></source>
-  <p>The last predicate &quot;<code>[2]</code>&quot; is applied to this node-set
-  and set is further reduced to:</p><source>
-        &lt;bar name="Peter's Pub"></source>
-
-  </s2>
-
-  <s2 title="Categories">
-
-  <p>From the examples in the last chapter we can try to categorize predicate
-  chains/pipelines to simplify our implementation. We can speed up processing
-  significantly if we can avoid using a data-structure (iterator) to represent
-  the intermediate step between predicates. The goal of setting up these
-  categories is to pinpoint those cases where an intermediate iterator has
-  to be used and when it can be avoided.</p>
-
-    <s3 title="Single predicate expressions">
-
-    <p>Expressions containing just a single predicate have no intermediate step
-    and there is no need for any extra iterator. The expression inside the
-    predicate can be applied directly to the original iterator. We call this
-    category <em>SIMPLE_CONTEXT</em>.</p>
-
-    </s3>
-
-    <s3 title="Expressions containing only non-position predicates">
-    
-    <p>Predicate-order is significant when the predicate-chain contains one or
-    more predicate with an expression similar to
-    &quot;<code>position() > 3</code>&quot; or &quot;<code>2</code>&quot;. This
-    is because the <code>position()</code> and <code>last()</code> explicitly
-    refer to the intermediate step between applying each predicate. The
-    expression:</p><source>
-    &lt;xsl:for-each select="//bar[contains(@name,'ogan')][parent::*/@location = 'Town']"></source>
-    <p>has two predicates that can be applied in any order and still produce the
-    desired node-set. Such predicates can be merged to:</p><source>
-    &lt;xsl:for-each select="//bar[contains(@name,'ogan') &amp; (parent::*/@location = 'Town')]"></source>
-    <p>We call this category NO_CONTEXT.</p>
-
-    </s3>
-
-    <s3 title="Expressions containing position predicates">
-
-    <p>A predicate-chain, whose predicates' expressions contain any use of the
-    <code>position()</code> or <code>last()</code> functions require some way
-    of representing the intermediate step in an iterator. The first predicate
-    is applied to the original node-set, and the resulting node-set must then
-    be stored in some other iterator, from which the second predicate can get
-    the current position from the iterator's <code>getPosition()</code> and
-    <code>getLast()</code> methods. We call this category
-    GENERAL_CONTEXT</p>
-
-    </s3>
-
-    <anchor name="exception"/>
-    <s3 title="Expressions containing one position predicate">
-
-    <p>There is one expection from the GENERAL_CONTEXT category. If the
-    predicate-chain contains only one position-predicate, and that predicate is
-    the very first one, then that predicate can call the iterator that contains
-    the first node-set directly. Just look:</p><source>
-    &lt;xsl:for-each select="//bar[2][parent::*/@location = 'Drumcondra']"></source>
-    <p>The <code>[2]</code> predicate can be applied to the original iterator
-    for the <code>//bar</code> step. And so can the
-    <code>[parent::*/@location = 'Drumcondra']</code> predicate as well. This
-    is only the case when the position predicate is first in the predicate
-    chain. These types of predicate chains belong in the
-     NO_CONTEXT  category.</p>
-
-    </s3>
-
-  </s2>
-
-  <s2 title="Design details">
-
-    <p>Predicates are handled quite differently in step expressions and step
-    patterns. Step expressions are not implemented with the various contexts in
-    mind and use a specialised iterator to wrap the code for each predicate.
-    Step patterns are more complicated and CPU (or should I say JVM?)
-    exhaustive. Step patterns containing predicates are analysed to determine
-    context type and compiled accordingly.</p>
-
-    <s3 title="Predicates and Step expressions">
-
-    <p>The basic behaviour for a predicate is to compile a <em>filter</em>. This
-    filter is an auxiliary class that implements the
-    <code>org.apache.xalan.xsltc.dom.CurrentNodeListFilter</code> interface. The
-    <code>Step</code> or <code>StepPattern</code> that uses the predicate will
-    create a <code>org.apache.xalan.xsltc.dom.CurrentNodeListFilter</code>. This
-    iterator contains the nodes that pass through the predicate. The compiled
-    filter is used by the iterator to determine which nodes that should be
-    included. The <code>org.apache.xalan.xsltc.dom.CurrentNodeListFilter</code>
-    interface contains only a single method:</p><source>
-    public interface CurrentNodeListFilter {
-    public abstract boolean test(int node, int position, int last, int current,
-                                 AbstractTranslet translet, NodeIterator iter);
-    }</source>
-
-    <p>The code that is compiled into the <code>test()</code> method is the
-    code for the predicate's expression. The <code>Predicate</code> class
-    compiles the filter class and a <code>test()</code> method skeleton, while
-    some sub-class of the <code>Expression</code> class compiles the actual
-    code that goes into this method.</p>
-
-    <p>The iterator is initialised with a filter that implements this interface:
-    </p><source>
-    public CurrentNodeListIterator(NodeIterator source, 
-				   CurrentNodeListFilter filter,
-				   int currentNode,
-				   AbstractTranslet translet) {
-	this(source, !source.isReverse(), filter, currentNode, translet);
-    }</source>
-
-    <p>The iterator will use its source iterator to provide it with the initial
-    node-set. Each node that is returned from this set is passed through the
-    filter before returned by the <code>next()</code> method. Note that the
-    source iterator can also be a current node-list iterator (if two or more
-    predicates are chained together).</p>
-
-    </s3>
-
-    <s3 title="Optimisations in Step expressions">
-
-    <s4 title="Node-value iterators">
-
-    <p>Some simple predicates that test for node values are handled by the
-    <code>NodeValueIterator</code> class at runtime. These are:</p><source>
-    A: foo[@attr = &lt;value&gt;]
-    B: foo[bar = &lt;value&gt;]
-    C: foo/bar[. = &lt;value&gt;]</source>
-
-    <p>The first case is handled by creating an iterator that represents
-    <code>foo/@attr</code>, then passing this iterator and a test-value to
-    a <code>NodeValueIterator</code>. The <em>&lt;value&gt;</em> is an
-    expression that is compiled and passed to the iterator as a string. It
-    does <em>not</em> have to be a literal string as the string value is
-    found at runtime. The last two cases are similarly handled by creating an
-    iterator for <code>foo/bar</code> and passing that and the test-value to
-    a <code>NodeValueIterator</code>.</p>
-
-    </s4>
-
-    <s4 title="Nth descendant iterators">
-
-    <p>The <code>Step</code> class is also optimised for position-predicates
-    that are applied to descendant iterators:</p><source>
-    &lt;xsl:for-each select="//bar[3]"></source>
-
-    <p>Such step/predicate combinations are handled by the internal DOM's
-    inner class <code>NthDescendantIterator</code>.</p>
-
-    </s4>
-
-    <s4 title="Nth position iterators">
-
-    <p>Similarly, the <code>Step</code> class is optimised for
-    position-predicates that are applied to basic steps:</p><source>
-    &lt;xsl:for-each select="bar[3]"></source>
-
-    <p>Such step/predicate combinations are handled by the internal DOM's
-    inner class <code>NthPositionIterator</code>.</p>
-
-    </s4>
-
-    <s4 title="Node test">
-
-    <p>The predicate class contains a method that tells you if it is a boolean
-    test:</p><source>
-    public boolean isBooleanTest();</source>
-
-    <p>This can be, but it currently is not, used by the <code>Step</code> class
-    to compile in optimised code. Some work to be done here!</p>
-
-    </s4>
-
-    </s3>
-
-    <anchor name="step-patterns"/>
-    <s3 title="Predicates and StepPatterns">
-
-    <p>Using predicates in patterns is slow on any XSLT processor, and XSLTC
-    is no exception. This is why the predicate context is carefully analysed
-    by the <code>StepPattern</code> class, so that the compiled code is
-    specialised to handle the specific predicate(s) in use. First we should
-    consider the basic step pattern.</p>
-
-    <s4 title="Basic pattern handling">
-
-    <p>All patterns are grouped (by the <code>Mode</code> class) according to
-    their <ref>kernel</ref>-node type. The kernel node-type is node-type of the
-    <em>last</em> step in a pattern:</p><source>
-    &lt;xsl:template match="foo/bar/baz"&gt;  ...  &lt;xsl:template&gt;</source>
-
-    <p>In this case the type for elements <code>&lt;baz&gt;</code> is the
-    kernel type. This step is <em>not</em> compiled as a step pattern. The node
-    type is passed to the <code>Mode</code> class and is used to place the
-    remainder of the pattern code inside the big <code>switch()</code> statement
-    in the translet's <code>applyTemplates()</code> method. The whole pattern
-    is then <em>reduced</em> to:</p><source>
-    match="foo/bar"</source>
-
-    <p>The <code>StepPattern</code> representing the <code>&lt;bar&gt;</code>
-    element test is compiled under the appropriate <code>case:</code> section
-    of the <code>switch()</code> statement. The code compiled for the step
-    pattern is basically just a call to the DOM's <code>getType()</code>
-    method and a test for the desired node type. There are two special cases
-    for:</p><source>
-    &lt;xsl:template match="foo/*/baz"&gt;  ...  &lt;xsl:template&gt;
-    &lt;xsl:template match="foo/*@[2]"&gt;  ...  &lt;xsl:template&gt;</source>
-
-    <p>In the first case we call <code>isElement()</code> and in the second case
-    we call <code>isAttribute()</code>, instead of <code>getType()</code>.</p>
-
-    </s4>
-
-    <s4 title="Patterns with predicates">
-
-    <p>The <code>typeCheck()</code> method of the <code>StepPattern</code>
-    invokes a method that analyses the predicates of the step pattern and
-    determines their context. (Note that this method needs to be updated to
-    handle the exception to the GENERAL_CONTEXT metioned in the section
-    <link anchor="exception">Expressions containing one position predicate</link> earlier in this document.) The <code>translate()</code> method of the
-    <code>StepPattern</code> class contains a <code>switch()</code> statement
-    that calls methods that are tailored for compiling code for the various
-    predicate contexts.</p>
-
-    </s4>
-
-    </s3>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_runtime.xml b/xdocs/sources/xsltc/xsltc_runtime.xml
deleted file mode 100644
index ddec192..0000000
--- a/xdocs/sources/xsltc/xsltc_runtime.xml
+++ /dev/null
@@ -1,508 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC runtime environment">
-
-  <s2 title="Contents">
-
-  <p>This document describes the design and overall architecture of XSLTC's
-  runtime environment. This does not include the internal DOM and the DOM
-  iterators, which are all covered in separate documents.</p>
-
-  <ul>
-    <li><link anchor="overview">Runtime overview</link></li>
-    <li><link anchor="translet">The compiled translet</link></li>
-    <li><link anchor="types">External/internal type mapping</link></li>    
-    <li><link anchor="mainloop">Main program loop</link></li>
-    <li><link anchor="library">Runtime library</link></li>
-    <li><link anchor="output">Output handling</link></li>
-  </ul>
-
-  </s2>
-
-  <!--=================== OVERVIEW SECTION ===========================--> 
-
-  <anchor name="overview"/>
-  <s2 title="Runtime overview">
-
-    <p>This figure shows the main components of XSLTC's runtime environment:</p>
- 
-    <p><img src="runtime_design.gif" alt="runtime_design.gif"/></p>
-    <p><ref>Figure 1: Runtime environment overview</ref></p>
-
-    <p>The various steps these components have to go through to transform a
-    document are:</p>
-
-    <ul>
-      <li>instanciate a parser and hand it the input document</li>
-      <li>build an internal DOM from the parser's SAX events</li>
-      <li>instanciate the translet object</li>
-      <li>pass control to the translet object</li>
-      <li>receive output events from the translet</li>
-      <li>format the output document</li>
-    </ul>
-
-    <p>This process can be initiated either through XSLTC's native API or
-    through the implementation of the JAXP/TrAX API.</p>
-
-    </s2><anchor name="translet"/>
-    <s2 title="The compiled translet">
-
-    <p>A translet is always a subclass of <code>AbstractTranslet</code>. As well
-    as having access to the public/protected methods in this class, the
-    translet is compiled with these methods:</p><source>
-    public void transform(DOM, NodeIterator, TransletOutputHandler);</source>
-
-    <p>This method is passed a <code>DOMImpl</code> object. Depending on whether
-    the stylesheet had any calls to the <code>document()</code> function this
-    method will either generate a <code>DOMAdapter</code> object (when only one
-    XML document is used as input) or a <code>MultiDOM</code> object (when there
-    are more than one XML input documents). This DOM object is passed on to
-    the <code>topLevel()</code> method.</p>
-
-    <p>When the <code>topLevel()</code> method returns, we initiate the output
-    document by calling <code>startDocument()</code> on the supplied output
-    handler object. We then call <code>applyTemplates()</code> to get the actual
-    output contents, before we close the output document by calling
-    <code>endDocument()</code> on the output handler.</p><source>
-    public void topLevel(DOM, NodeIterator, TransletOutputHandler);</source>
-
-    <p>This method handles all of these top-level elements:</p>
-    <ul>
-      <li><code>&lt;xsl:output&gt;</code></li>
-      <li><code>&lt;xsl:decimal-format&gt;</code></li>
-      <li><code>&lt;xsl:key&gt;</code></li>
-      <li><code>&lt;xsl:param&gt;</code> (for global parameters)</li>
-      <li><code>&lt;xsl:variable&gt;</code> (for global variables)</li>
-    </ul><source>
-    public void applyTemplates(DOM, NodeIterator, TransletOutputHandler);</source>
-
-    <p>This is the method that produces the actual output. Its central element
-    is a big <code>switch()</code> statement that is used to trigger the code
-    that represent the available templates for the various node in the input
-    document. See the chapter on the
-    <link anchor="mainloop">main program loop</link> for details on this method.
-    </p><source>
-    public void &lt;init&gt;();</source>
-
-    <anchor name="namesarray"/>
-    <p>The translet's constructor initializes a table of all the elements we
-    want to search for in the XML input document. This table is called the
-    <code>namesArray</code>, and maps each element name to an unique integer
-    value, know as the elements &quot;translet-type&quot;.
-    The DOMAdapter, which acts as a mediator between the DOM and the translet,
-    will map these element identifier to the element identifiers used internally
-    in the DOM. See the section on <link anchor="types">extern/internal type
-    mapping</link> and the internal DOM design document for details on this.</p>
-
-    <p>The constructor also initializes any <code>DecimalFormatSymbol</code>
-    objects that are used to format numbers before passing them to the
-    output post-processor. The output processor uses thes symbols to format
-    decimal numbers in the output.</p><source>
-    public boolean stripSpace(int nodeType);</source>
-
-    <p>This method is only present if any <code>&lt;xsl:strip-space&gt;</code>
-    or <code>&lt;xsl:preserve-space&gt;</code> elements are present in the
-    stylesheet. If that is the case, the translet implements the
-    <code>StripWhitespaceFilter</code> interface by containing this method.</p>
-
-  </s2>
-
-  <!--=================== TYPE MAPPING SECTION ===========================--> 
-
-  <anchor name="types"/>
-  <s2 title="External/internal type mapping">
-
-    <p>This is the very core of XSL transformations:
-    <em>Read carefully!!!</em></p>
-
-    <anchor name="external-types"/>
-    <p>Every node in the input XML document(s) is assigned a type by the DOM
-    builder class. This type is a unique integer value which represents the
-    element, so that for instance all <code>&lt;bob&gt;</code> elements in the
-    input document will be given type <code>7</code> and can be referred to by
-    that integer. These types can be used for lookups in the
-    <link anchor="namesarray">namesArray</link> table to get the actual
-    element name (in this case "bob"). The type identifiers used in the DOM are
-    referred to as <em>external types</em> or <em>DOM types</em>, as they are
-    types known only outside of the translet.</p>
-
-    <anchor name="internal-types"/>
-    <p>Similarly the translet assignes types to all element and attribute names
-    that are referenced in the stylesheet. This type assignment is done at
-    compile-time, while the DOM builder assigns the external types at runtime.
-    The element type identifiers used by the translet are referred to as
-    <em>internal types</em> or <em>translet types</em>.</p>
-
-    <p>It is not very probable that there will be a one-to-one mapping between
-    internal and external types. There will most often be elements in the DOM
-    (ie. the input document) that are not mentioned in the stylesheet, and
-    there could be elements in the stylesheet that do not match any elements
-    in the DOM. Here is an example:</p>
-
-<source>
-      &lt;?xml version="1.0"?&gt;
-      &lt;xsl:stylesheet version="1.0" xmlns:xsl="blahblahblah"&gt;
-
-      &lt;xsl:template match="/"&gt;
-        &lt;xsl:for-each select="//B"&gt;
-          &lt;xsl:apply-templates select="." /&gt;
-        &lt;/xsl:for-each&gt;
-        &lt;xsl:for-each select="C"&gt;
-          &lt;xsl:apply-templates select="." /&gt;
-        &lt;/xsl:for-each&gt;
-        &lt;xsl:for-each select="A/B"&gt;
-          &lt;xsl:apply-templates select="." /&gt;
-        &lt;/xsl:for-each&gt;
-      &lt;/xsl:template&gt;
-
-    &lt;/xsl:stylesheet&gt;
-</source>
-
-    <p>In this stylesheet we are looking for elements <code>&lt;B&gt;</code>,
-    <code>&lt;C&gt;</code> and <code>&lt;A&gt;</code>. For this example we can
-    assume that these element types will be assigned the values 0, 1 and 2.
-    Now, lets say we are transforming this XML document:</p>
-
-<source>
-      &lt;?xml version="1.0"?&gt;
-
-      &lt;A&gt;
-        The crocodile cried:
-        &lt;F&gt;foo&lt;/F&gt;
-        &lt;B&gt;bar&lt;/B&gt;
-        &lt;B&gt;baz&lt;/B&gt;
-      &lt;/A&gt;
-</source>
-
-    <p>This XML document has the elements <code>&lt;A&gt;</code>,
-    <code>&lt;B&gt;</code> and <code>&lt;F&gt;</code>, which we assume are
-    assigned the types 7, 8 and 9 respectively  (the numbers below that are
-    assigned for specific element types, such as the root node, text nodes,etc).
-    This causes a mismatch between the type used for <code>&lt;B&gt;</code> in
-    the translet and the type used for <code>&lt;B&gt;</code> in the DOM. The
-    DOMAdapter class (which mediates between the DOM and the translet) has been
-    given two tables for convertint between the two types; <code>mapping</code>
-    for mapping from internal to external types, and <code>reverseMapping</code>
-    for the other way around.</p>
-
-    <p>The translet contains a <code>String[]</code> array called
-    <code>namesArray</code>. This array contains all the element and attribute
-    names that were referenced in the stylesheet. In our example, this array
-    would contain these string (in this specific order): &quot;B&quot;, 
-    &quot;C&quot; and &quot;A&quot;. This array is passed as one of the
-    parameters to the DOM adapter constructor (the other parameter is the DOM
-    itself). The DOM adapter passes this table on to the DOM. The DOM generates
-    a hashtable that maps its known element names to the types the translet
-    knows. The DOM does this by going through the <code>namesArray</code> from
-    the translet sequentially, looks up each name in the hashtable, and is then
-    able to map the internal type to an external type. The result is then passed
-    back to the DOM adapter.</p>
-
-    <p>External types that are not interesting for the translet (such as the
-    type for <code>&lt;F&gt;</code> elements in the example above) are mapped
-    to a generic <code>"ELEMENT"</code> type (integer value 3), and are more or
-    less ignored by the translet. Uninterresting attributes are similarly
-    mapped to internal type <code>"ATTRIBUTE"</code> (integer value 4).</p>
-
-    <p>It is important that we separate the DOM from the translet. In several
-    cases we want the DOM as a structure completely independent from the
-    translet - even though the DOM is a structure internal to XSLTC. One such
-    case is when transformations are offered by a servlet as a web service.
-    Any DOM that is built should potentially be stored in a cache and made
-    available for simultaneous access by several translet/servlet couples.</p>
-
-    <p><img src="runtime_type_mapping.gif" alt="runtime_type_mapping.gif"/></p>
-    <p><ref>Figure 2: Two translets accessing a single dom using different type mappings</ref></p>
-
-  </s2>
-
-  <!--===================== MAIN LOOP SECTION ============================--> 
-
-  <anchor name="mainloop"/>
-  <s2 title="Main program loop">
-
-    <p>The main body of the translet is the <code>applyTemplates()</code>
-    method. This method goes through these steps:</p>
-
-    <ul>
-      <li>
-        Get the next node from the node iterator
-      </li>
-      <li>
-        Get the internal type of this node. The DOMAdapter object holds the
-        internal/external type mapping table, and it will supply the translet
-        with the internal type of the current node.
-      </li>
-      <li>
-        Execute a switch statement on the internal node type. There will be
-        one "case" label for each recognised node type - this includes the
-        first 7 internal node types.
-      </li>
-    </ul>
-
-    <p>The root node will have internal type 0 and will cause any initial
-    literal elements to be output. Text nodes will have internal node type 1
-    and will simply be dumped to the output handler. Unrecognized elements
-    will have internal node type 3 and will be given the default treatment
-    (a new iterator is created for the node's children, and this iterator
-    is passed with a recursive call to <code>applyTemplates()</code>).
-    Unrecognised attribute nodes (type 4) will be handled like text nodes.
-    This makes up the default (built in) templates of any stylesheet. Then,
-    we add one <code>"case"</code>for each node type that is matched by any
-    pattern in the stylesheet. The <code>switch()</code> statement in
-    <code>applyTemplates</code> will thereby look something like this:</p>
-
-<source>
-        public void applyTemplates(DOM dom, NodeIterator,
-                                   TransletOutputHandler handler) {
-
-            // get nodes from iterator
-            while ((node = iterator.next()) != END) {
-                // get internal node type
-                switch(DOM.getType(node)) {
-
-                case 0: // root
-                    outputPreable(handler);
-                    break;
-                case 1: // text
-                    DOM.characters(node,handler);
-                    break;
-                case 3: // unrecognised element
-                    NodeIterator newIterator = DOM.getChildren(node);
-                    applyTemplates(DOM,newIterator,handler);
-                    break;
-                case 4: // unrecognised attribute
-                    DOM.characters(node,handler);
-                    break;
-                case 7: // elements of type &lt;B&gt;
-                    someCompiledCode();
-                    break;
-                case 8: // elements of type &lt;C&gt;
-                    otherCompiledCode();
-                    break;
-                default:
-                    break;
-                }
-            }
-        }
-</source>
-
-    <p>Each recognised element will have its own piece of compiled code.</p>
-
-    <p>Note that each "case" will not lead directly to a single template.
-    There may be several templates that match node type 7
-    (say <code>&lt;B&gt;</code>). In the sample stylesheet in the previous
-    chapter we have to templates that would match a node <code>&lt;B&gt;</code>.
-    We have one <code>match="//B"</code> (match just any <code>&lt;B&gt;</code>
-    element) and one <code>match="A/B"</code> (match a <code>&lt;B&gt;</code>
-    element that is a child of a <code>&lt;A&gt;</code> element). In this case
-    we would have to compile code that first gets the type of the current node's
-    parent, and then compared this type with the type for
-    <code>&lt;A&gt;</code>. If there was no match we will have executed the
-    first <code>&lt;xsl:for-each&gt;</code> element, but if there was a match
-    we will have executed the last one. Consequentally, the compiler will
-    generate the following code (well, it will look like this anyway):</p>
-
-<source>
-        switch(DOM.getType(node)) {
-          :
-          :
-        case 7: // elements of type &lt;B&gt;
-            int parent = DOM.getParent(node);
-            if (DOM.getType(parent) == 9) // type 9 = elements &lt;A&gt;
-                someCompiledCode();
-            else
-                evenOtherCompiledCode();
-            break;
-          :
-          :
-        }
-</source>
-
-    <p>We could do the same for namespaces, that is, assign a numeric value
-    to every namespace that is references in the stylesheet, and use an
-    <code>"if"</code> statement for each namespace that needs to be checked for
-    each type. Lets say we had a stylesheet like this:</p>
-
-<source>
-      &lt;?xml version="1.0"?&gt;
-      &lt;xsl:stylesheet version="1.0" xmlns:xsl="blahblahblah"&gt;
-
-      &lt;xsl:template match="/"
-          xmlns:foo="http://foo.com/spec"
-          xmlns:bar="http://bar.net/ref"&gt;
-        &lt;xsl:for-each select="foo:A"&gt;
-          &lt;xsl:apply-templates select="." /&gt;
-        &lt;/xsl:for-each&gt;
-        &lt;xsl:for-each select="bar:A"&gt;
-          &lt;xsl:apply-templates select="." /&gt;
-        &lt;/xsl:for-each&gt;
-      &lt;/xsl:template&gt;
-
-    &lt;/xsl:stylesheet&gt;
-</source>
-
-    <p>And a stylesheet like this:</p>
-
-<source>
-      &lt;?xml version="1.0"?&gt;
-
-      &lt;DOC xmlns:foo="http://foo.com/spec"
-           xmlns:bar="http://bar.net/ref"&gt;
-        &lt;foo:A&gt;In foo namespace&lt;/foo:A&gt;
-        &lt;bar:A&gt;In bar namespace&lt;/bar:A&gt;
-      &lt;/DOC&gt;
-</source>
-
-    <p>We could still keep the same type for all <code>&lt;A&gt;</code> elements
-    regardless of what namespace they are in, and use the same <code>"if"</code>
-    structure within the <code>switch()</code> statement above. The other option
-    is to assign different types to <code>&lt;foo:A&gt;</code> and
-    <code>&lt;bar:A&gt;</code> elements. The latter is the option we chose, and
-    it is described in detail in the namespace design document.</p>
-
-  </s2>
-
-  <!--===================== RUNTIME SECTION =============================--> 
-
-  <anchor name="library"/>
-  <s2 title="Runtime library">
-
-    <p>The runtime library offers basic functionality to the translet at
-    runtime. It is analoguous to UNIX's <code>libc</code>. The whole runtime
-    library is contained in a single class file:</p>
-
-<source>
-    org.apache.xalan.xsltc.runtime.BasisLibrary
-</source>
-
-    <p>This class contains a large set of static methods that are invoked by
-    the translet. These methods are largely independent from eachother, and
-    they implement the following:</p>
-
-    <ul>
-      <li>simple XPath functions that do not require a lot of code
-      compiled into the translet class</li>
-      <li>functions for formatting decimal numbers to strings</li>
-      <li>functions for comparing nodes, node-sets and strings - used by
-      equality expressions, predicates and other</li>
-      <li>functions for generating localised error messages</li>
-    </ul>
-
-    <p>The runtime library is a central part of XSLTC. But, as metioned earlier,
-    the functions within the library are rarely related, so there is no real
-    overall design/architecture. The only common attribute of many of the
-    methods in the library is that all static methods that implement an XPath
-    function and with a capital <code>F</code>.</p>
-
-  </s2>
-
-  <!--====================== OUTPUT SECTION =============================--> 
-
-  <anchor name="output"/>
-  <s2 title="Output handler">
-
-    <p>The translet passes its output to an output post-processor before the
-    final result is handed to the client application over a standard SAX
-    interface. The interface between the translet and the output handler is
-    very similar to a SAX interface, but it has a few non-standard additions.
-    This interface is described in this file:</p>
-
-<source>
-    org.apache.xalan.xsltc.TransletOutputHandler
-</source>
-
-    <p>This interface is implemented by:</p>
-
-<source>
-    org.apache.xalan.xsltc.runtime.TextOutput
-</source>
-
-    <p>This class, despite its name, handles all types of output (XML, HTML and
-    TEXT). Our initial idea was to have a base class implementing the
-    <code>TransletOutputHandler</code> interface, and then have one subclass
-    for each of the output types. This proved very difficult, as the output
-    type is not always known until after the transformation has started and
-    some elements have been output. But, this is an area where a change like
-    that has the potential to increase performance significantly. Output
-    handling has a lot to do with analyzing string contents, and by narrowing
-    down the number of string comparisons and string updates one can acomplish
-    a lot.</p>
- 
-    <p>The main tasks of the output handler are:</p>
-
-    <ul>
-      <li>determine the output type based on the output generated by the
-      translet (not always necessary)</li>
-      <li>generate SAX events for the client application</li>
-      <li>insert the necessary namespace declarations in the output</li>
-      <li>escape special characters in the output</li>
-      <li>insert &lt;DOCTYPE&gt; and &lt;META&gt; elements in HTML output</li>
-    </ul>
-
-    <p>There is a very clear link between the output handler and the
-    <code>org.apache.xalan.xsltc.compiler.Output</code> class that handles
-    the <code>&lt;xsl:output&gt;</code> element. The <code>Output</code> class
-    stores many output settings and parameters in the translet class file and
-    the translet passes these on to the output handler.</p>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_trax.xml b/xdocs/sources/xsltc/xsltc_trax.xml
deleted file mode 100644
index 431c677..0000000
--- a/xdocs/sources/xsltc/xsltc_trax.xml
+++ /dev/null
@@ -1,625 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="The Translet API and TrAX">
-
-  <s2 title="Contents">
-
-  <p>Note: This document describes the design of XSLTC's TrAX implementation.
-  The XSLTC <link idref="xsltc_trax_api">TrAX API user documentation</link>
-  is kept in a separate document.</p>
-
-  <p>The structure of this document is, and should be kept, as follows:</p>
-
-  <ul>
-    <li>A brief introduction to TrAX/JAXP</li>
-    <li>Overall design of the XSLTC TrAX implementation</li>
-    <li>Detailed design of various TrAX components</li>
-  </ul>
-
-  <ul>
-    <li><link anchor="abstract">Abstract</link></li>
-    <li><link anchor="trax">TrAX basics</link></li>
-    <li><link anchor="config">TrAX configuration</link></li>
-    <li><link anchor="design">XSLTC TrAX architecture</link></li>
-    <li><link anchor="detailed_design">XSLTC TrAX detailed design</link></li>
-      <ul>
-        <li><link anchor="factory_design">TransformerFactory design</link></li>
-        <li><link anchor="templates_design">Templates design</link></li>
-        <li><link anchor="transformer_design">Transformer design</link></li>
-        <li><link anchor="config_design">TrAX configuration design</link></li>
-      </ul>
-  </ul>
-  </s2>
-
-  <!--====================== ABSTRACT SECTION ===========================-->
-
-  <anchor name="abstract"/>
-  <s2 title="Abstract">
-
-  <p>JAXP is the Java extension API for XML parsing. TrAX is an API for XML
-  transformations and is included in the later versions of JAXP. JAXP includes
-  two packages, one for XML parsing and one for XML transformations (TrAX):</p>
-<source>
-    javax.xml.parsers
-    javax.xml.transform</source>
-
-  <p>XSLTC is an XSLT processing engine and fulfills the role as an XML
-  transformation engine behind the TrAX portion of the JAXP API. XSLTC is a
-  provider for the TrAX API and a client of the JAXP parser API.</p>
-
-  <p>This document describes the design used for integrating XSLTC translets
-  with the JAXP TrAX API. The heart of the design is a wrapper class around the
-  XSLTC compiler that extends the JAXP <code>SAXTransformerFactory</code>
-  interface. This factory delivers translet class definitions (Java bytecodes)
-  wrapped inside TrAX <code>Templates</code> objects. These
-  <code>Templates</code> objects can be used to instanciate 
-  <code>Transformer</code> objects that transform XML documents into markup or
-  plain text. Alternatively a <code>Transformer</code> object can be created
-  directly by the <code>TransformerFactory</code>, but this approach is not
-  recommended with XSLTC. The reason for this will be explained later in this
-  document.</p>
-
-  </s2>
-
-  <!--====================== TRAX BASICS SECTION =========================-->
-
-  <anchor name="trax"/>
-  <s2 title="TrAX basics">
-
-  <p>The Java API for XML Processing (JAXP) includes an XSLT framework based
-  on the Transformation API for XML (TrAX). A JAXP transformation application
-  can use the TrAX framework in two ways. The simplest way is:</p>
-
-  <ul>
-    <li>create an instance of the TransformerFactory class</li>
-    <li>from the factory instance and a given XSLT stylesheet, create a new
-    Transformer object</li>
-    <li>call the Transformer object's transform() method, specifying the XML
-    input and a Result object.</li>
-  </ul><source>
-    import javax.xml.transform.*;
-
-        public class Compile {
-
-            public void run(Source xsl) {
-                ....
-                TransformerFactory factory = TransformerFactory.newInstance();
-                Transformer transformer = factory.newTransformer(xsl);
-                ....
-            }
-        }</source>
-
-  <p>This suits most conventional XSLT processors that transform XML documents
-  in one go. XSLTC needs one extra step to compile the XSL stylesheet into a
-  Java class (a &quot;translet&quot;). Fortunately TrAX has another approach
-  that suits XSLTC two-step transformation model:</p>
-
-  <ul>
-    <li>create an instance of the TransformerFactory class</li>
-    <li>from the factory instance and a given XSLTC, stylesheet, create a new
-    Templates object (this step will compile the stylesheet and put the
-    bytecodes for translet class(es) into the Templates object)</li>
-    <li>from the Template object create a Transformer object (this will
-    instanciate a new translet object).</li>
-    <li>call the Transformer object's transform() method, specifying the XML
-    input and a Result object.</li>
-  </ul><source>
-    import javax.xml.transform.*;
-
-        public class Compile {
-
-            public void run(Source xsl) {
-                ....
-                TransformerFactory factory = TransformerFactory.newInstance();
-                Templates templates = factory.newTemplates(xsl);
-                Transformer transformer = templates.newTransformer();
-                ....
-            }
-        }</source>
-
-  <p>Note that the first two steps need be performed only once for each
-  stylesheet. Once the stylesheet is compiled into a translet and wrapped in a
-  <code>Templates</code> object, the <code>Templates</code> object can be used
-  over and over again to create Transformer object (instances of the translet).
-  The <code>Templates</code> instances can even be serialized and stored on
-  stable storage (ie. in a memory or disk cache) for later use.</p>
-
-  <p>The code below illustrates a simple JAXP transformation application that
-  creates the <code>Transformer</code> directly. Remember that this is not the
-  ideal approach with XSLTC, as the stylesheet is compiled for each
-  transformation.</p><source>
-    import javax.xml.transform.stream.StreamSource;
-    import javax.xml.transform.stream.StreamResult;
-    import javax.xml.transform.Transformer;
-    import javax.xml.transform.TransformerFactory;
-
-    public class Proto {
-
-        public void run(String xmlfile, String xslfile) {
-            Transformer transformer;
-            TransformerFactory factory = TransformerFactory.newInstance();
-
-        try {
-            StreamSource stylesheet = new StreamSource(xslfile);
-            transformer = factory.newTransformer(stylesheet);
-            transformer.transform(new StreamSource(xmlfile),
-                                  new StreamResult(System.out));
-        }
-        catch (Exception e) {
-            // handle errors...
-        }
-        :
-        :
-    }</source>
-
-  <p>This approach seems simple is probably used in many applications. But, the
-  use of <code>Templates</code> objects is useful when multiple instances of
-  the same <code>Transformer</code> are needed. <code>Transformer</code>
-  objects are not thread safe, and if a server wants to handle several clients
-  requests it would be best off to create one global <code>Templates</code>
-  object, and then from this create a <code>Transformer</code> object for each
-  thread handling the requests. This approach is also by far the best for
-  XSLTC, as the <code>Templates</code> object will hold the class definitions
-  that make up the translet and its auxiliary classes. (Note that the bytecodes
-  and not the actuall class definitions are stored when serializing a
-  <code>Templates</code> object to disk. This is because of class loader
-  security restrictions.) To accomodate this second approach to TrAX
-  transformations, the above class would be modified  as follows:</p><source>
-    try {
-        StreamSource stylesheet = new StreamSource(xslfile);
-        Templates templates = factory.newTemplates(stylesheet);
-        transformer = templates.newTransformer();
-        transformer.transform(new StreamSource(inputFilename),
-                              new StreamResult(System.out));
-    }
-    catch (Exception e) {
-        // handle errors...
-    }</source>
-
-  </s2>
-
-  <!--====================== TRAX CONFIG SECTION =========================-->
-
-  <anchor name="config"/>
-  <s2 title="TrAX configuration">
-
-  <p>JAXP's <code>TransformerFactory</code> is configurable similar to the
-  other Java extensions. The API supports configuring thefactory by:</p>
-
-  <ul>
-    <li>passing vendor-specific attributes from the application, through the
-    TrAX interface, to the underlying XSL processor</li>
-    <li>registering an ErrorListener that will be used to pass error and
-    warning messages from the XSL processor to the application</li>
-    <li>registering an URIResolver that the application can use to load XSL
-    and XML documents on behalf of the XSL processor (the XSL processor will
-    use this to support the xsl:include and xsl:import elements and the
-    document() functions.</li>
-  </ul>
-
-  <p>The JAXP TransformerFactory can be queried at runtime to discover what
-  features it supports. For example, an application might want to know if a
-  particular factory implementation supports the use of SAX events as a source,
-  or whether it can write out transformation results as a DOM. The factory API
-  queries with the getFeature() method. In the above code, we could add the
-  following code before the try-catch block:</p><source>
-    if (!factory.getFeature(StreamSource.FEATURE) || !factory.getFeature(StreamResult.FEATURE)) {
-        System.err.println("Stream Source/Result not supported by TransformerFactory\nExiting....");
-        System.exit(1);
-    }</source>
-
-  <p>Other elements in the TrAX API are configurable. A Transformer object can
-  be passed settings that override the default output settings and the settings
-  defined in the stylesheet for indentation, output document type, etc.</p>
-
-  </s2>
-
-  <!--====================== ARCHITECTURE SECTION ========================-->
-
-  <anchor name="design"/>
-  <s2 title="XSLTC TrAX architecture">
-
-  <p>XSLTC's architecture fits nicely in behind the TrAX interface. XSLTC's
-  compiler is put behind the <code>TransformerFactory</code> interface, the
-  translet class definition (either as a set of in-memory
-  <code>Class</code> objects or as a two-dimmensional array of bytecodes on
-  disk) is encapsulated in the <code>Templates</code> implementation and the
-  instanciated translet object is wrapped inside the <code>Transformer</code>
-  implementation. Figure 1 (below) shows this two-layered TrAX architecture:
-  </p>
-  
-  <p><img src="trax_translet_wrapping.gif" alt="TransletWrapping"/></p>
-  <p><ref>Figure 1: Translet class definitions are wrapped inside Templates objects</ref></p>
-
-  <p>The <code>TransformerFactory</code> implementation also implements the
-  <code>SAXTransformerFactory</code> and <code>ErrorListener</code>
-  interfaces from the TrAX API.</p>
-
-  <p>The TrAX implementation has intentionally been kept completely separate
-  from the XSLTC native code. This prevents users of XSLTC's native API from
-  having to include the TrAX code in an application. All the code that makes
-  up our TrAX implementation resides in this package:</p><source>
-    org.apache.xalan.xsltc.trax</source>
-
-  <p>Message to all XSLTC developers: Keep it this way! Do not mix TrAX
-  and Native code!</p>
-
-  </s2>
-
-  <!--======================= TRAX DESIGN SECTION ========================-->
-
-  <anchor name="detailed_design"/>
-  <s2 title="TrAX implementation details">
-
-  <p>The main components of our TrAX implementation are:</p>
-
-  <ul>
-    <li><link anchor="transformer_factory">the TransformerFactory class</link></li>
-    <li><link anchor="templates">the Templates class</link></li>
-    <li><link anchor="transformer">the Transformer class</link></li>
-    <li><link anchor="transformer">output properties handling</link></li>
-  </ul>
-
-  <anchor name="factory_design"/>
-  <s3 title="TransformerFactory implementation">
-
-  <p>The methods that make up the basic <code>TransformerFactory</code>
-  iterface are: </p><source>
-    public Templates newTemplates(Source source);
-    public Transformer newTransformer();
-    public ErrorListener getErrorListener();
-    public void setErrorListener(ErrorListener listener);
-    public Object getAttribute(String name);
-    public void setAttribute(String name, Object value);
-    public boolean getFeature(String name);
-    public URIResolver getURIResolver();
-    public void setURIResolver(URIResolver resolver);
-    public Source getAssociatedStylesheet(Source src, String media, String title, String charset);</source>
-
-  <p>And for the <code>SAXTransformerFactory</code> interface:</p><source>
-    public TemplatesHandler   newTemplatesHandler();
-    public TransformerHandler newTransformerHandler();
-    public TransformerHandler newTransformerHandler(Source src);
-    public TransformerHandler newTransformerHandler(Templates templates);
-    public XMLFilter newXMLFilter(Source src);
-    public XMLFilter newXMLFilter(Templates templates);</source>
-
-  <p>And for the <code>ErrorListener</code> interface:</p><source>
-    public void error(TransformerException exception);
-    public void fatalError(TransformerException exception);
-    public void warning(TransformerException exception);</source>
-
-  <s4 title="TransformerFactory basics">
-    <p>The very core of XSLTC TrAX support for XSLTC is the implementation of
-    the basic <code>TransformerFactory</code> interface. This factory class is
-    more or less a wrapper around the the XSLTC compiler and creates
-    <code>Templates</code> objects in which compiled translet classes can
-    reside. These <code>Templates</code> objects can then be used to create
-    <code>Transformer</code> objects. In cases where the
-    <code>Transformer</code>  is created directly by the factory we will use
-    the <code>Templates</code> class internally. In that way the transformation
-    will appear to be done in one step from the users point of view, while we
-    in reality use to steps. As described earler, this is not the best approach
-    when using XSLTC, as it causes the stylesheet to be compiled for each and
-    every transformation.</p>
-  </s4>
-
-  <s4 title="TransformerFactory attribute settings">
-    <p>The <code>getAttribute()</code> and <code>setAttribute()</code> methods
-    only recognise two attributes: <code>translet-name</code> and
-    <code>debug</code>. The latter is obvious - it forces XSLTC to output debug
-    information (dumps the stack in the very unlikely case of a failure). The
-    <code>translet-name</code> attribute can be used to set the default class
-    name for any nameless translet classes that the factory creates. A nameless
-    translet will, for instance, be created when the factory compiles a translet
-    for the identity transformation. There is a default name,
-    <code>GregorSamsa</code>, for nameless translets, so there is no absolute
-    need to set this attribute. (Gregor Samsa is the main character from Kafka's
-    &quot;Metamorphosis&quot; - transformations, metamorphosis - I am sure you
-    see the connection.)</p>
-  </s4>
-
-  <s4 title="TransformerFactory stylesheet handling">
-    <p>The compiler is can be passed a stylesheet through various methods in
-    the <code>TransformerFactory</code> interface. A stylesheet is passed in as
-    a <code>Source</code> object that containin either a DOM, a SAX parser or
-    a stream. The <code>getInputSource()</code> method handles all inputs and
-    converts them, if necessary, to SAX. The TrAX implementation contains an
-    adapter that will generate SAX events from a DOM, and this adapter is used
-    for DOM input. If the <code>Source</code> object contains a SAX parser, this
-    parser is just passed directly to the compiler. A SAX parse is instanciated
-    (using JAXP) if the <code>Source</code> object contains a stream.</p>
-  </s4>
-
-  <s4 title="TransformerFactory URI resolver">
-    <p>A TransformerFactory needs a <code>URIResolver</code> to locate documents
-    that are referenced in <code>&lt;xsl:import&gt;</code> and
-    <code>&lt;xsl:include&gt;</code> elements. XSLTC has an internal interface
-    that shares the same purpose. This internal interface is implemented by the
-    <code>TransformerFactory</code>:</p><source>
-    public InputSource loadSource(String href, String context, XSLTC xsltc);</source>
-    <p>This method will simply use any defined <code>URIResolver</code> and
-    proxy the call on to the URI resolver's <code>resolve()</code> method. This
-    method returns a <code>Source</code> object, which is converted to SAX
-    events and passed back to the compiler.</p>
-  </s4>
-
-  </s3>
-
-  <anchor name="template_design"/>
-  <s3 title="Templates design">
-
-  <s4 title="Templates creation">
-    <p>The <code>TransformerFactory</code> implementation invokes the XSLTC
-    compiler to generate the translet class and auxiliary classes. These classes
-    are stored inside our <code>Templates</code> implementation in a manner
-    which allows the <code>Templates</code> object to be serialized. By making
-    it possible to store <code>Templates</code> on stable storage we allow the
-    TrAX user to store/cache translet class(es), thus making room for XSLTC's
-    one-compilation-multiple-transformations approach. This was done by giving
-    the <code>Templates</code> implementation an array of byte-arrays that
-    contain the bytecodes for the translet class and its auxiliary classes. When
-    the user first requests a <code>Transformer</code> instance from the
-    <code>Templates</code> object for the first time we create one or more
-    <code>Class</code> objects from these byte arrays. Note that this is done
-    only once as long as the <code>Template</code> object resides in memory. The
-    <code>Templates</code> object then invokes the JVM's class loader with the
-    class definition(s) to instanciate the translet class(es). The translet
-    objects are then wraped inside a <code>Transformer</code> object, which is
-    returned to the client code:</p><source>
-
-    // Contains the name of the main translet class
-    private String   _transletName = null;
-
-    // Contains the actual class definition for the translet class and
-    // any auxiliary classes (representing node sort records, predicates, etc.)
-    private byte[][] _bytecodes = null;
-    
-    /**
-     * Defines the translet class and auxiliary classes.
-     * Returns a reference to the Class object that defines the main class
-     */
-    private Class defineTransletClasses() {
-	TransletClassLoader loader = getTransletClassLoader();
-
-	try {
-	    Class transletClass = null;
-	    final int classCount = _bytecodes.length;
-	    for (int i = 0; i &lt; classCount; i++) {
-		Class clazz = loader.defineClass(_bytecodes[i]);
-		if (clazz.getName().equals(_transletName))
-		    transletClass = clazz;
-	    }
-	    return transletClass; // Could still be 'null'
-	}
-	catch (ClassFormatError e) {
-	    return null;
-	}
-    }</source>
-  </s4>
-
-  <s4 title="Translet class loader">
-
-    <p>The <code>Templates</code> object will create the actual translet
-    <code>Class</code> object(s) the first time the
-    <code>newTransformer()</code> method is called. (The "first time" means the
-    first time either after the object was instanciated or the first time after
-    it has been read from storage using serialization.) These class(es) cannot
-    be created using the standard class loader since the method:</p><source>
-    Class defineClass(String name, byte[] b, int off, int len);</source>
-
-    <p>of the ClassLoader is protected. XSLTC uses its own class loader that
-    extends the standard class loader:</p><source>
-    // Our own private class loader - builds Class definitions from bytecodes
-    private class TransletClassLoader extends ClassLoader {
-        public Class defineClass(byte[] b) {
-            return super.defineClass(null, b, 0, b.length);
-        }
-    }</source>
-    <p>This class loader is instanciated inside a privileged code section:</p><source>
-    TransletClassLoader loader = 
-        (TransletClassLoader) AccessController.doPrivileged(
-            new PrivilegedAction() {
-                public Object run() {
-                    return new TransletClassLoader();
-                }
-            }
-        );</source>
-
-    <p>Then, when the newTransformer() method returns it passes back and
-    instance of XSLTC's <code>Transformer</code> implementation that contains
-    an instance of the main translet class. (One transformation may need several
-    Java classes - for sort-records, predicates, etc. - but there is always one
-    main translet class.)</p>
-
-  </s4>
-
-  <s4 title="Class loader security issues">
-
-    <p>When XSLTC is placed inside a JAR-file in the
-    <code>$JAVA_HOME/jre/lib/ext</code> it is loaded by the extensions class
-    loader and not the default (bootstrap) class loader. The extensions class
-    loader does not look for class files/definitions in the user's
-    <code>CLASSPATH</code>. This can cause two problems: A) XSLTC does not find
-    classes for external Java functions, and B) XSLTC does not find translet or
-    auxiliary classes when used through the native API.</p>
-
-    <p>Both of these problems are caused by XSLTC internally calling the
-    <code>Class.forName()</code> method. This method will use the current class
-    loader to locate the desired class (be it an external Java class or a
-    translet/aux class). This is prevented by forcing XSLTC to use the bootstrap
-    class loader, as illustrated below:</p>
-
-    <p><img src="class_loader.gif" alt="ClassLoader"/></p>
-    <p><ref>Figure 2: Avoiding the extensions class loader</ref></p>
-
-    <p>These are the steps that XSLTC will go through to load a class:</p>
-
-    <ol>
-      <li>the application requests an instance of the transformer factory </li>
-      <li>the Java extensions mechanism locates XSLTC as the transformer
-      factory implementation using the extensions class loader</li>
-      <li>the extensions class loader loads XSLTC</li>
-      <li>XSLTC's compiler attempts to get a reference to an external Java
-      class, but the call to Class.forName() fails, as the extensions class
-      loader does not use the user's class path</li>
-      <li>XSLTC attempts to get a reference to the bootstrap class loader, and
-      requests it to load the external class</li>
-      <li>the bootstrap class loader loads the requested class</li>
-    </ol>
-
-    <p>Step 5) is only allowed if XSLTC has special permissions. But, remember
-    that this problem only occurs when XSLTC is put in the
-    <code>$JAVA_HOME/jre/lib/ext</code> directory, where it is given all
-    permissions (by the default security file).</p>
-
-  </s4>
-
-  </s3>
-
-  <anchor name="transformer_design"/>
-  <s3 title="Transformer detailed design">
-
-    <p>The <code>Transformer</code> class is a simple proxy that passes
-    transformation settings on to its translet instance before it invokes the
-    translet's <code>doTransform()</code> method. The <code>Transformer</code>'s
-    <code>transform()</code> method maps directly to the translet's
-    <code>doTransform()</code> method.</p>
-
-    <s4 title="Transformer input and output handling">
-      <p>The <code>Transformer</code> handles its input in a manner similar to
-      that of the <code>TransformerFactory</code>. It has two methods for
-      creating standard SAX input and output handlers for its input and output
-      files:</p><source>
-    private DOMImpl getDOM(Source source, int mask);
-    private ContentHandler getOutputHandler(Result result);</source>
-
-      <p>One aspect of the <code>getDOM</code> method is that it handles four
-      various types of <code>Source</code> objects. In addition to the standard
-      DOM, SAX and stream types, it also handles an extended
-      <code>XSLTCSource</code> input type. This input type is a lightweight
-      wrapper from XSLTC's internal DOM-like input tree. This allows the user
-      to create a cache or pool of XSLTC's native input data structures
-      containing the input XML document. The <code>XSLTCSource</code> class
-      is located in:</p><source>
-    org.apache.xalan.xsltc.trax.XSLTCSource</source>
-    </s4>
-
-    <s4 title="Transformer parameter settings">
-      <p>XSLTC's native interface has get/set methods for stylesheet parameters,
-      identical to those of the TrAX API. The parameter handling methods of
-      the <code>Transformer</code> implementation are pure proxies.</p>
-    </s4>
-
-    <s4 title="Transformer output settings">
-      <p>The Transformer interface of TrAX has for methods for retrieving and
-      defining the transformation output document settings:</p><source>
-    public Properties getOutputProperties();
-    public String getOutputProperty(String name);
-    public void setOutputProperties(Properties properties);
-    public void setOutputProperty(String name, String value);</source>
-
-      <p>There are three levels of output settings. First there are the default
-      settings defined in the <link anchor="">XSLT 1.0 spec</link>, then there
-      are the settings defined in the attributes of the &lt;xsl:output&gt;
-      element, and finally there are the settings passed in through the TrAX
-      get/setOutputProperty() methods.</p>
-
-      <p><img src="trax_output_settings.gif" alt="Output settings"/></p>
-      <p><ref>Figure 3: Passing output settings from TrAX to the translet</ref></p>
-
-      <p>The AbstractTranslet class has a series of fields that contain the
-      default values for the output settings. The compiler/Output class will
-      compile code into the translet's constructor that updates these values
-      depending on the attributes in the &lt;xsl:output&gt; element. The
-      Transformer implementation keeps in instance of the java.util.Properties
-      class where it keeps all properties that are set by the
-      <code>setOutputProperty()</code> and the
-      <code>setOutputProperties()</code> methods. These settings are written to
-      the translet's output settings fields prior to initiating the
-      transformation.</p>
-
-    </s4>
-
-    <s4 title="Transformer URI resolver">
-      <p>The <code>uriResolver()</code> method of the Transformer interface is
-      used to set a locator for documents referenced by the document() function
-      in XSL. The native XSLTC API has a defined interface for a DocumentCache.
-      The functionality provided by XSLTC's internal <code>DocumentCache</code>
-      interface is somewhat complimentary to the <code>URIResolver</code>, and
-      can be used side-by-side. To acomplish this we needed to find out in which
-      ways the translet can load an external document:</p>
-
-      <p><img src="uri_resolver.gif" alt="URIResolver"/></p>
-      <p><ref>Figure 4: Using URIResolver and DocumentCache objects</ref></p>
-
-      <p>From the diagram we see that these three ways are:</p>
-      <ul>
-        <li>LoadDocument -> .xml</li>
-        <li>LoadDocument -> DocumentCache -> .xml</li>
-        <li>LoadDocument -> URIResolver -> .xml</li>
-        <li>LoadDocument -> DocumentCache -> URIResolver -> .xml</li>
-      </ul>
-
-    </s4>
-
-    </s3>
-  </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_trax_api.xml b/xdocs/sources/xsltc/xsltc_trax_api.xml
deleted file mode 100644
index 9eb1ef0..0000000
--- a/xdocs/sources/xsltc/xsltc_trax_api.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!-- 
- * 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) 2001, Sun
- * Microsystems., http://www.sun.com.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-<s1 title="XSLTC TrAX API">
-
-  <s2 title="The JAXP/TrAX API">
-
-  <p>XSLTC is 100% compliant with the TrAX poriton of the
-  <jump href="http://java.sun.com/xml/jaxp/index.html">JAXP API</jump>. This
-  API is a standard extension to Java and there is not much point in describing
-  it in detail in this document.</p>
-
-  </s2>
-
-  <s2 title="XSLTC's extensions to JAXP/TrAX">
-
-  <p>The <code>Source</code> and <code>Result</code> classes within TrAX are
-  used to handle input and output documents. These classes can be extended to
-  encapsulate additional input types. XSLTC's TrAX implementation contains an
-  extension to the <code>Source</code> class:</p><source>
-    org.apache.xalan.xsltc.trax.XSLTCSource</source>
-
-  <p>This extension class can be used to build and encapsulate XSLTC's internal
-  DOM and DTD handler:</p><source>
-    public void run(String xmlfile, String xslfile) {
-
-        // Set up your factory classes
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        TransformerFactory factory = TransformerFactory.newInstance();
-
-        try {
-            // Create a namespace-aware parser
-            try {
-                factory.setFeature(Constants.NAMESPACE_FEATURE,true);
-            }
-            catch (Exception e) {
-                factory.setNamespaceAware(true);
-            }
-            final SAXParser parser = factory.newSAXParser();
-            final XMLReader reader = parser.getXMLReader();
-
-            // Build an XSLTCSource for the input XML document
-            XSLTCSource source = new XSLTCSource();
-            source.build(reader, xmlfile);
-
-            // Build a StreamSource for the stylesheet
-            StreamSource stylesheet = new StreamSource(xslfile);
-
-            // Create a Transformer instance and process the input
-            Transformer transformer = factory.newTransformer(stylesheet);
-            transformer.transform(source, new StreamResult(System.out));
-        }
-	:
-	:
-    }</source>
-
-  <p>If you do chose to implement a DOM cache, you should have your cache
-  implement the <code>javax.xml.transform.URIResolver</code> interface so
-  that documents loaded by the <code>document()</code> function are also read
-  from your cache.</p>
-
-  </s2>
-
-</s1>
diff --git a/xdocs/style/dtd/spec.dtd b/xdocs/style/dtd/spec.dtd
deleted file mode 100644
index 8720289..0000000
--- a/xdocs/style/dtd/spec.dtd
+++ /dev/null
@@ -1,578 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- ============================================================= -->
-<!--  MODULE:    spec DTD                                          -->
-<!--  VERSION:   1.0                                               -->
-<!--  DATE:      October 18, 2000                                  -->
-
-
-<!-- ============================================================= -->
-<!--                   ISO STANDARD SPECIAL CHARACTER SETS         -->
-<!-- ============================================================= -->
-<!--
-<!ENTITY % isolat1      PUBLIC
-"ISO 8879-1986//ENTITIES Added Latin 1//EN"
-"entities/ISOlat1.pen"
-                                                                    >
-
-<!ENTITY % isonum       PUBLIC
-"ISO 8879-1986//ENTITIES Numeric and Special Graphic//EN"
-"entities/ISOnum.pen"
-                                                                    >
-
-<!ENTITY % isopub       PUBLIC
-"ISO 8879-1986//ENTITIES Publishing//EN"
-"entities/ISOpub.pen"
-                                                                    >
-
-<!ENTITY % isotech      PUBLIC
-"ISO 8879-1986//ENTITIES General Technical//EN"
-"entities/ISOtech.pen"
-                                                                    >
-
-%isolat1; %isonum; %isopub; %isotech;
--->
-
-<!-- ============================================================= -->
-<!--                    parameter entities for content models      -->
-<!-- ============================================================= -->
-
-
-<!--                    list elements                              -->
-<!ENTITY % lists       "itemizedlist | orderedlist | variablelist"   >
-
-
-<!--                    linespecific elements                      -->
-<!--                    elements where line endings and whitespace
-                        are significant                            -->
-<!ENTITY % linespecific
-                       "literallayout | programlisting"              >
-
-
-<!--                    phrase-level elements                      -->
-<!--                    elements allowed at the same level as text -->
-<!ENTITY % phraselevel "citation | emphasis | inlinegraphic | link | plink |
-                        subscript | superscript | ulink | termref"   >
-
-
-<!--                    paragraph-level elements                   -->
-<!--                    elements (including paragraphs) allowed at
-                        the level of paragraphs                    -->
-<!ENTITY % paralevel   "%linespecific; | %lists; | note | para | issue |
-                        table | figure | graphic"                    >
-
-
-<!-- ============================================================= -->
-<!--                    parameter entities for attributes          -->
-<!-- ============================================================= -->
-
-
-<!--                    common attributes                          -->
-<!ENTITY % common.atts
-             "id         ID                                 #IMPLIED
-              link-url   CDATA                              #IMPLIED" >
-
-<!--                    graphic-related attributes                 -->
-<!ENTITY % graphic.atts
-            "fileref    CDATA                              #IMPLIED
-             alt        CDATA                              #IMPLIED
-             srccredit  CDATA                              #IMPLIED
-             width      NMTOKEN                            #IMPLIED
-             depth      NMTOKEN                            #IMPLIED
-             scale      NMTOKEN                            #IMPLIED
-             scalefit   NMTOKEN                            #IMPLIED" >
-
-<!-- ============================================================= -->
-<!--                    external modules                           -->
-<!-- ============================================================= -->
-
-<!--
-<!ENTITY % table.ent SYSTEM "table.ent"                              >
-%table.ent;
--->
-
-<!-- ============================================================= -->
-<!--                    element definitions                        -->
-<!-- ============================================================= -->
-
-
-<!--                    specification                              -->
-<!ELEMENT  spec         (title, frontmatter, introduction, requirements, model, sect1+,
-                         appendix*, bibliography?)                   >
-
-<!ATTLIST  spec
-            %common.atts;                                            >
-
-<!ELEMENT  frontmatter   (pubdate, copyright, author*, abstract?)    >
-
-<!--                    title                                      -->
-<!ELEMENT  title        (#PCDATA | %phraselevel;)*                   >
-<!ATTLIST  title
-            %common.atts;                                            >
-
-
-<!--                    issue                                      -->
-<!ELEMENT  issue        (#PCDATA | %phraselevel;)*                   >
-<!ATTLIST  issue
-            %common.atts;                                            >
-
-
-<!--                    publication date                           -->
-<!--                    publication date and, possibly, time       -->
-<!ELEMENT  pubdate      (#PCDATA)                                    >
-<!ATTLIST  pubdate
-            %common.atts;                                            >
-
-
-<!--                    copyright statement                        -->
-<!ELEMENT  copyright    (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  copyright
-            %common.atts;                                            >
-
-
-<!--                    author                                     -->
-<!ELEMENT  author       (firstname, surname, jobtitle?, orgname?,
-                         address?)                                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  author
-            %common.atts;                                            >
-
-
-<!--                    abstract                                   -->
-<!ELEMENT  abstract     (para+)                                      >
-<!--         id         unique identifier                          -->
-<!ATTLIST  abstract
-            %common.atts;                                            >
-
-<!ELEMENT  introduction        (title, (((%paralevel;)+, sect2*) | sect2+)) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  introduction
-            %common.atts;                                            >
-
-<!ELEMENT  requirements        (title, (((%paralevel;)+, sect2*) | sect2+)) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  requirements
-            %common.atts; >    
-
-<!ELEMENT  model        (title, (((%paralevel;)+, patterns) | sect2+)) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  model
-            %common.atts;                                            >
-
-<!ELEMENT  patterns        (pattern+) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  patterns
-            %common.atts; 
-			module  CDATA                              #IMPLIED
-            > 
-                        
-<!ELEMENT  pattern        (pattern-name, potential-alternate-name?, intent, responsibilities, thread-safety, notes?) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  pattern
-            %common.atts;  
-                                                      >
-<!ELEMENT  pattern-name        (#PCDATA | %phraselevel;)* >
-<!--         id         unique identifier                          -->
-<!ATTLIST  pattern-name
-            %common.atts; >
-            
-<!ELEMENT  potential-alternate-name        (#PCDATA | %phraselevel;)* >
-<!--         id         unique identifier                          -->
-<!ATTLIST  potential-alternate-name
-            %common.atts; >  
-
-<!ELEMENT  intent        (#PCDATA | %phraselevel;)* >
-<!--         id         unique identifier                          -->
-<!ATTLIST  intent
-            %common.atts; >  
-
-<!ELEMENT  responsibilities        (#PCDATA | %phraselevel;)* >
-<!--         id         unique identifier                          -->
-<!ATTLIST  responsibilities
-            %common.atts; >  
-
-<!ELEMENT  thread-safety        (#PCDATA | %phraselevel;)* >
-<!--         id         unique identifier                          -->
-<!ATTLIST  thread-safety
-            %common.atts; >
-
-<!ELEMENT  notes         (#PCDATA | %phraselevel;)*                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  notes
-            %common.atts;                                            >
-
-<!--         id         unique identifier                          -->
-<!ATTLIST  sect1
-            %common.atts;                                            >
-
-<!--                    section 1                                  -->
-<!ELEMENT  sect1        (title, (((%paralevel;)+, sect2*) | sect2+)) >						   
-<!--                    section 2                                  -->
-<!ELEMENT  sect2        (title, (((%paralevel;)+, sect3*) | sect3+)) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  sect2
-            %common.atts;                                            >
-
-
-<!--                    section 3                                  -->
-<!ELEMENT  sect3        (title, (((%paralevel;)+, sect4*) | sect4+)) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  sect3
-            %common.atts;                                            >
-
-
-<!--                    section 4                                  -->
-<!ELEMENT  sect4        (title, (%paralevel;)+)                      >
-<!--         id         unique identifier                          -->
-<!ATTLIST  sect4
-            %common.atts;                                            >
-
-
-<!--                    appendix                                   -->
-<!ELEMENT  appendix     (title, (((%paralevel;)+, sect1*) | sect1+)) >
-<!--         id         unique identifier                          -->
-<!ATTLIST  appendix
-            %common.atts;                                            >
-
-
-<!--                    bibliography                               -->
-<!ELEMENT  bibliography (title, biblioitem+)                         >
-<!--         id         unique identifier                          -->
-<!ATTLIST  bibliography
-            %common.atts;                                            >
-
-
-<!--                    bibliography item                          -->
-<!ELEMENT  biblioitem   (designator, biblioentry)                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  biblioitem
-            %common.atts;                                            >
-
-
-<!--                    bibliography item designator               -->
-<!--                    designator contains whatever designator the
-                        author uses to identify publications listed in
-                        the bibliography (e.g., [lab 87]).  the
-                        stylesheet generates the square "[]" brackets
-                        fore & aft.                                -->
-<!ELEMENT  designator   (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  designator
-            %common.atts;                                            >
-
-
-<!--                    bibliography entry                         -->
-<!ELEMENT  biblioentry  (#PCDATA | %phraselevel;)*                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  biblioentry
-            %common.atts;                                            >
-
-
-<!-- ============================================================= -->
-<!--                    author-related elements                    -->
-<!-- ============================================================= -->
-
-
-<!--                    first name                                 -->
-<!ELEMENT  firstname    (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  firstname
-            %common.atts;                                            >
-
-
-<!--                    surname                                    -->
-<!ELEMENT  surname      (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  surname
-            %common.atts;                                            >
-
-
-<!--                    job title                                  -->
-<!ELEMENT  jobtitle     (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  jobtitle
-            %common.atts;                                            >
-
-
-<!--                    organization name                          -->
-<!ELEMENT  orgname      (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  orgname
-            %common.atts;                                            >
-
-
-<!--                    address                                    -->
-<!ELEMENT  address      (street?, pob?, city?, state?, postcode?, 
-                         country?, phone?, fax?, email?)             >
-<!--         id         unique identifier                          -->
-<!ATTLIST  address
-            %common.atts;                                            >
-
-
-<!-- ============================================================= -->
-<!--                    address elements                           -->
-<!-- ============================================================= -->
-
-
-<!--                    street address                             -->
-<!ELEMENT  street       (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  street
-            %common.atts;                                            >
-
-
-<!--                    post office box                            -->
-<!ELEMENT  pob          (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  pob
-            %common.atts;                                            >
-
-
-<!--                    postcode                                   -->
-<!ELEMENT  postcode     (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  postcode
-            %common.atts;                                            >
-
-
-<!--                    city                                       -->
-<!ELEMENT  city         (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  city
-            %common.atts;                                            >
-
-
-<!--                    state                                      -->
-<!ELEMENT  state        (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  state
-            %common.atts;                                            >
-
-
-<!--                    country                                    -->
-<!ELEMENT  country      (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  country
-            %common.atts;                                            >
-
-
-<!--                    phone number                               -->
-<!ELEMENT  phone        (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  phone
-            %common.atts;                                            >
-
-
-<!--                    fax number                                 -->
-<!ELEMENT  fax          (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  fax
-            %common.atts;                                            >
-
-
-<!--                    email address                              -->
-<!ELEMENT  email        (#PCDATA)                                    >
-<!--         id         unique identifier                          -->
-<!ATTLIST  email
-            %common.atts;                                            >
-
-
-<!-- ============================================================= -->
-<!--                    paragraph-level elements                   -->
-<!-- ============================================================= -->
-
-
-<!--                    paragraph                                  -->
-<!ELEMENT  para         (#PCDATA | %phraselevel;)*                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  para
-            %common.atts;                                            >
-
-
-<!--                    note                                       -->
-<!ELEMENT  note         (%paralevel;)+                               >
-<!--         id         unique identifier                          -->
-<!ATTLIST  note
-            %common.atts;                                            >
-
-
-<!--                    itemized list                              -->
-<!ELEMENT  itemizedlist (listitem+)                                  >
-<!--         id         unique identifier                          -->
-<!ATTLIST  itemizedlist
-            %common.atts;                                            >
-
-
-<!--                    ordered list                               -->
-<!ELEMENT  orderedlist  (listitem+)                                  >
-<!--         id         unique identifier                          -->
-<!ATTLIST  orderedlist
-            %common.atts;                                            >
-
-
-<!--                    variable list                              -->
-<!ELEMENT  variablelist (varlistentry+)                              >
-<!--         id         unique identifier                          -->
-<!ATTLIST  variablelist
-            %common.atts;                                            >
-
-
-<!--                    list item                                  -->
-<!ELEMENT  listitem     (#PCDATA | %phraselevel; | %paralevel;)*     >
-<!--         id         unique identifier                          -->
-<!ATTLIST  listitem
-            %common.atts;                                            >
-
-
-<!--                    variable list entry                        -->
-<!ELEMENT  varlistentry (term+, listitem)                            >
-<!--         id         unique identifier                          -->
-<!ATTLIST  varlistentry
-            %common.atts;                                            >
-
-
-<!--                    term                                       -->
-<!ELEMENT  term         (#PCDATA | %phraselevel;)*                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  term
-            %common.atts;                                            >
-
-<!--                    termref                                       -->
-<!ELEMENT  termref         (#PCDATA | %phraselevel;)*                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  termref
-            %common.atts;	   >
-
-<!--                    literal layout                             -->
-<!ELEMENT  literallayout
-                        (#PCDATA | %phraselevel;)*                   >
-<!--         xml:space  whitespace handling
-             id         unique identifier                          -->
-<!ATTLIST  literallayout
-            %common.atts;                                            >
-
-
-<!--                    program listing                            -->
-<!ELEMENT  programlisting
-                        (#PCDATA | %phraselevel;)*                   >
-<!--         xml:space  whitespace handling
-             id         unique identifier                          -->
-<!ATTLIST  programlisting
-            %common.atts;                                            >
-
-
-<!--                    figure                                     -->
-<!ELEMENT  figure       (title, graphic)                             >
-<!--         id         unique identifier                          -->
-<!ATTLIST  figure
-            %common.atts;                                            >
-
-
-<!--                    graphic                                    -->
-<!ELEMENT  graphic      EMPTY                                        >
-<!--         align      alignment of graphic image.  values are:
-                          left          left aligned
-                          right         right aligned
-                          center        centered
-             fileref    path to external file
-             alt        alternate text
-             srccredit  source of graphic
-             width      width of area in which to fit graphic
-             depth      depth of area in which to fit graphic
-             scale      percentage scaling factor
-             scalefit   scale to fit width and/or depth
-             id         unique identifier                          -->
-<!ATTLIST  graphic
-             align      (left |right |center)              #IMPLIED
-            %graphic.atts;
-            %common.atts;                                            >
-
-<!--                    inline graphic                             -->
-<!ELEMENT  inlinegraphic
-                        EMPTY                                        >
-<!--         fileref    path to external file
-             alt        alternate text
-             srccredit  source of graphic
-             width      width of area in which to fit graphic
-             depth      depth of area in which to fit graphic
-             scale      percentage scaling factor
-             scalefit   scale to fit width and/or depth
-             id         unique identifier                          -->
-<!ATTLIST  inlinegraphic
-            %graphic.atts;
-            %common.atts;                                            >
-
-<!-- ============================================================= -->
-<!--                    text-level elements                        -->
-<!-- ============================================================= -->
-
-
-<!--                    bibliographic citation                     -->
-<!--                    a <citation> appears in the body of the
-                        article, and it refers through its
-                        "linkend" attribute to the id of the
-                        relevant bibliography item.
-                          the <citation> receives the same
-                        formatting as the <designator> element
-                        within the <biblioitem> being referenced.
-                        for example, when for the bibitem
-                        <biblioitem id="bib1"><designator>lab
-                        87</designator>...</biblioitem> is
-                        formatted as "[lab 87]", the bibliographic
-                        citation <citation linkend="bib1">lab
-                        87</citation> also formats as "[lab 87]".  -->
-<!ELEMENT  citation     (#PCDATA | emphasis | inlinegraphic |
-                         subscript | superscript)*                   >
-<!--         linkend    id of referenced bibliography entry
-             id         unique identifier                          -->
-<!ATTLIST  citation
-             linkend    IDREF                              #REQUIRED
-            %common.atts;                                            >
-
-
-<!--                    emphasis                                   -->
-<!ELEMENT  emphasis     (#PCDATA | %phraselevel;)*                   >
-<!--         id         unique identifier                          -->
-<!ATTLIST  emphasis
-            %common.atts;                                            >
-
-
-<!--                    subscript                                  -->
-<!ELEMENT  subscript    (#PCDATA | emphasis | subscript |
-                         superscript)*                               >
-<!--         id         unique identifier                          -->
-<!ATTLIST  subscript
-            %common.atts;                                            >
-
-
-<!--                    superscript                                -->
-<!ELEMENT  superscript  (#PCDATA | emphasis | subscript |
-                         superscript)*                               >
-<!--         id         unique identifier                          -->
-<!ATTLIST  superscript
-            %common.atts;                                            >
-
-
-<!--                    link                                       -->
-<!ELEMENT  link         (#PCDATA)                                    >
-<!--         linkend    id of referenced element
-             id         unique identifier                          -->
-<!ATTLIST  link
-             linkend    IDREF                              #REQUIRED
-            %common.atts;                                            >
-
-<!--  package link (for {@link org.xml.trax.Processor} type links, for javadocs.                              -->
-<!ELEMENT  plink         (#PCDATA)                                   >
-<!ATTLIST  plink
-            %common.atts;                                            >
-
-<!--                    ulink (external link)                      -->
-<!ELEMENT  ulink        (#PCDATA)                                    >
-<!--         url        uniform resource locator; the target of the
-                        ulink
-             id         unique identifier                          -->
-<!ATTLIST  ulink
-             url        CDATA                              #REQUIRED
-            %common.atts;                                            >
-
-
diff --git a/xdocs/style/dtd/xsl-html40s.dtd b/xdocs/style/dtd/xsl-html40s.dtd
deleted file mode 100644
index a8848bd..0000000
--- a/xdocs/style/dtd/xsl-html40s.dtd
+++ /dev/null
@@ -1,1505 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- 
-     XSLT (WD-19990813) DTD and HTML 4.0 Strict (REC-HTML40-19980424) DTD
-     This DTD defines a XSLT stylesheet with a result-ns of html
-
-     Credits:
-       Original XSLT DTD from W3C XSLT WD-19990813
-       Original XML  DTD for HTML 4.0 Strict by
-         TAMURA, Kent <kent@trl.ibm.co.jp>, for IBM's XML4J package
-       Minor fixes to XSLT & HTML DTDs by 
-         Scott Boag <scott_boag@lotus.com>
-         Henrique M. Holschuh <henriqmh@dca.fee.unicamp.br>
-       HTML/XSLT composite DTD by
-         Henrique M. Holschuh <henriqmh@dca.fee.unicamp.br>
-
-     Caveats: It is possible to generate invalid XSLT and HTML documents 
-       using this DTD, as the result-ns elements (HTML) must allow all 
-       possible xsl elements as content, and all result-ns elements had 
-       to be relaxed on their element content rules.
-
-     TODO:
-       - A XSLT/XHTML1.0 Strict DTD to use instead of this one. Lowercase
-         element names allow for better compression ratios, at least in
-         English documents.
-       - Update to HTML 4.01
-
-     $Id$
--->
-
-<!-- Predefined XML (REC-XML-19980210) entities -->
-<!ENTITY lt     "&#38;#60;">
-<!ENTITY gt     "&#62;">
-<!ENTITY amp    "&#38;#38;">
-<!ENTITY apos   "&#39;">
-<!ENTITY quot   "&#34;">
-
-<!-- 
-  Result elements allowed (inside xsl elements). These are actually
-  all of the HTML40 Strict elements. 
--->
-
-<!ENTITY % result-elements "
-  | TT
-  | I
-  | B
-  | BIG
-  | SMALL
-  | EM
-  | STRONG
-  | DFN
-  | CODE
-  | SAMP
-  | KBD
-  | VAR
-  | CITE
-  | ABBR
-  | ACRONYM
-  | SUP
-  | SUB
-  | SPAN
-  | BDO
-  | BR
-  | BODY
-  | ADDRESS
-  | DIV
-  | A
-  | MAP
-  | AREA
-  | LINK
-  | IMG
-  | OBJECT
-  | PARAM
-  | HR
-  | P
-  | H1
-  | H2
-  | H3
-  | H4
-  | H5
-  | H6
-  | PRE
-  | Q
-  | BLOCKQUOTE
-  | INS
-  | DEL
-  | DL
-  | DT
-  | DD
-  | OL
-  | UL
-  | LI
-  | FORM
-  | LABEL
-  | INPUT
-  | SELECT
-  | OPTGROUP
-  | OPTION
-  | TEXTAREA
-  | FIELDSET
-  | LEGEND
-  | BUTTON
-  | TABLE
-  | CAPTION
-  | THEAD
-  | TFOOT
-  | TBODY
-  | COLGROUP
-  | COL
-  | TR
-  | TH
-  | TD
-  | HEAD
-  | TITLE
-  | BASE
-  | META
-  | STYLE
-  | SCRIPT
-  | NOSCRIPT
-  | HTML
-">
-
-<!-- begin XSLT DTD, patched -->
-
-<!ENTITY % char-instructions "
- | xsl:apply-templates
- | xsl:call-template
- | xsl:apply-imports
- | xsl:for-each
- | xsl:value-of
- | xsl:copy-of
- | xsl:number
- | xsl:choose
- | xsl:if
- | xsl:text
- | xsl:copy
- | xsl:variable
- | xsl:message
-">
-
-<!ENTITY % instructions "
- %char-instructions;
- | xsl:processing-instruction
- | xsl:comment
- | xsl:element
- | xsl:attribute
-">
-
-<!ENTITY % char-template "
-(#PCDATA
- %char-instructions;)*
-">
-
-<!ENTITY % template "
-(#PCDATA
- %instructions;
- %result-elements;)*
-">
-
-<!-- Used for the type of an attribute value that is a URI reference.-->
-<!ENTITY % URI "CDATA">
-
-<!-- Used for the type of an attribute value that is a pattern.-->
-<!ENTITY % pattern "CDATA">
-
-<!-- Used for the type of an attribute value that is an
-    attribute value template.-->
-<!ENTITY % avt "CDATA">
-
-<!-- Used for the type of an attribute value that is a QName; the prefix
-    gets expanded by the XSLT processor. -->
-<!ENTITY % qname "NMTOKEN">
-
-<!-- Like qname but a whitespace-separated list of QNames. -->
-<!ENTITY % qnames "NMTOKENS">
-
-<!-- Used for the type of an attribute value that is an expression.-->
-<!ENTITY % expr "CDATA">
-
-<!-- Used for the type of an attribute value that consists
-    of a single character.-->
-<!ENTITY % char "CDATA">
-
-<!-- Used for the type of an attribute value that is a priority. -->
-<!ENTITY % priority "NMTOKEN">
-
-<!ENTITY % space-att "xml:space (default|preserve) #IMPLIED">
-
-<!-- This may be overridden to customize the set of elements allowed
-at the top-level. -->
-
-<!ENTITY % non-xsl-top-level "">
-
-<!ENTITY % top-level "
-(xsl:import*,
- (xsl:include
- | xsl:strip-space
- | xsl:preserve-space
- | xsl:output
- | xsl:key
- | xsl:locale
- | xsl:attribute-set
- | xsl:variable
- | xsl:param
- | xsl:template
- %non-xsl-top-level;)*)
-">
-
-<!-- added xmlns attribute suitable for this DTD -->
-<!ENTITY % top-level-atts '
- extension-element-prefixes CDATA #IMPLIED
- id ID #IMPLIED
- xmlns:xsl CDATA #FIXED "http://www.w3.org/XSL/1999/Transform"
- xmlns CDATA #FIXED "http://www.w3.org/TR/REC-html40"
- %space-att;
-'>
-
-<!-- This entity is defined for use in the ATTLIST declaration
-for result elements. -->
-
-<!ENTITY % result-element-atts '
- xsl:extension-element-prefixes CDATA #IMPLIED
- xsl:use-attribute-sets %qnames; #IMPLIED
-'>
-
-<!ELEMENT xsl:stylesheet %top-level;>
-<!ATTLIST xsl:stylesheet %top-level-atts;>
-
-<!ELEMENT xsl:transform %top-level;>
-<!ATTLIST xsl:transform %top-level-atts;>
-
-<!ELEMENT xsl:import EMPTY>
-<!ATTLIST xsl:import href %URI; #REQUIRED>
-
-<!ELEMENT xsl:include EMPTY>
-<!ATTLIST xsl:include href %URI; #REQUIRED>
-
-<!ELEMENT xsl:strip-space EMPTY>
-<!ATTLIST xsl:strip-space elements CDATA #REQUIRED>
-
-<!ELEMENT xsl:preserve-space EMPTY>
-<!ATTLIST xsl:preserve-space elements CDATA #REQUIRED>
-
-<!ELEMENT xsl:output EMPTY>
-<!ATTLIST xsl:output
- method %qname; #IMPLIED
- version NMTOKEN #IMPLIED
- encoding NMTOKEN #IMPLIED
- xml-declaration (yes|no) #IMPLIED
- standalone (yes|no) #IMPLIED
- doctype-public CDATA #IMPLIED
- doctype-system CDATA #IMPLIED
- cdata-section-elements %qnames; #IMPLIED
- indent (yes|no) #IMPLIED
- media-type CDATA #IMPLIED
->
-
-<!ELEMENT xsl:key EMPTY>
-<!ATTLIST xsl:key
- name %qname; #REQUIRED
- match %pattern; #REQUIRED
- use %expr; #REQUIRED
->
-
-<!ELEMENT xsl:locale EMPTY>
-<!ATTLIST xsl:locale
- name %qname; #IMPLIED
- decimal-separator %char; "."
- grouping-separator %char; ","
- infinity CDATA "&#x221E;"
- minus-sign %char; "-"
- NaN CDATA "&#xFFFD;"
- percent %char; "%"
- per-mille %char; "&#x2030;"
- zero-digit %char; "0"
- digit %char; "#"
- pattern-separator %char; ";"
->
-
-<!ELEMENT xsl:template
-(#PCDATA
- %instructions;
- %result-elements;
- | xsl:param)*
->
-
-<!ATTLIST xsl:template
- match %pattern; #IMPLIED
- name %qname; #IMPLIED
- priority %priority; #IMPLIED
- mode %qname; #IMPLIED
- %space-att;
->
-
-<!ELEMENT xsl:value-of EMPTY>
-<!ATTLIST xsl:value-of
- select %expr; #REQUIRED
- disable-output-escaping (yes|no) "no"
->
-
-<!ELEMENT xsl:copy-of EMPTY>
-<!ATTLIST xsl:copy-of select %expr; #REQUIRED>
-
-<!ELEMENT xsl:number EMPTY>
-<!ATTLIST xsl:number
-  level (single|multiple|any) "single"
-  count %pattern; #IMPLIED
-  from %pattern; #IMPLIED
-  value %expr; #IMPLIED
-  format %avt; '1'
-  lang %avt; #IMPLIED
-  letter-value %avt; #IMPLIED
-  grouping-separator%avt; #IMPLIED
-  grouping-size %avt; #IMPLIED
->
-
-<!ELEMENT xsl:apply-templates (xsl:sort|xsl:with-param)*>
-<!ATTLIST xsl:apply-templates
- select %expr; "node()"
- mode %qname; #IMPLIED
->
-
-<!ELEMENT xsl:apply-imports EMPTY>
-
-<!-- xsl:sort cannot occur after any other elements or
-any non-whitespace character -->
-
-<!ELEMENT xsl:for-each
-(#PCDATA
- %instructions;
- %result-elements;
- | xsl:sort)*
->
-
-<!ATTLIST xsl:for-each
- select %expr; #REQUIRED
- %space-att;
->
-
-<!ELEMENT xsl:sort EMPTY>
-<!ATTLIST xsl:sort
- select %expr; "."
- lang %avt; #IMPLIED
- data-type %avt; "text"
- order %avt; "ascending"
- case-order %avt; #IMPLIED
->
-
-<!ELEMENT xsl:if %template;>
-<!ATTLIST xsl:if
- test %expr; #REQUIRED
- %space-att;
->
-
-<!ELEMENT xsl:choose (xsl:when+, xsl:otherwise?)>
-<!ATTLIST xsl:choose %space-att;>
-
-<!ELEMENT xsl:when %template;>
-<!ATTLIST xsl:when
- test %expr; #REQUIRED
- %space-att;
->
-
-<!ELEMENT xsl:otherwise %template;>
-<!ATTLIST xsl:otherwise %space-att;>
-
-<!ELEMENT xsl:attribute-set (xsl:attribute)*>
-<!ATTLIST xsl:attribute-set
- name %qname; #REQUIRED
- use-attribute-sets %qnames; #IMPLIED
->
-
-<!ELEMENT xsl:call-template (xsl:with-param)*>
-<!ATTLIST xsl:call-template
- name %qname; #REQUIRED
->
-
-<!ELEMENT xsl:with-param %template;>
-<!ATTLIST xsl:with-param
- name %qname; #REQUIRED
- select %expr; #IMPLIED
->
-
-<!ELEMENT xsl:variable %template;>
-<!ATTLIST xsl:variable 
- name %qname; #REQUIRED
- select %expr; #IMPLIED
->
-
-<!ELEMENT xsl:param %template;>
-<!ATTLIST xsl:param 
- name %qname; #REQUIRED
- select %expr; #IMPLIED
->
-
-<!ELEMENT xsl:text (#PCDATA)>
-<!ATTLIST xsl:text
- disable-output-escaping (yes|no) "no"
->
-
-<!ELEMENT xsl:processing-instruction %char-template;>
-<!ATTLIST xsl:processing-instruction 
- name %avt; #REQUIRED
- %space-att;
->
-
-<!ELEMENT xsl:element %template;>
-<!ATTLIST xsl:element 
- name %avt; #REQUIRED
- namespace %avt; #IMPLIED
- use-attribute-sets %qnames; #IMPLIED
- %space-att;
->
-
-<!ELEMENT xsl:attribute %char-template;>
-<!ATTLIST xsl:attribute 
- name %avt; #REQUIRED
- namespace %avt; #IMPLIED
- %space-att;
->
-
-<!ELEMENT xsl:comment %char-template;>
-<!ATTLIST xsl:comment %space-att;>
-
-<!ELEMENT xsl:copy %template;>
-<!ATTLIST xsl:copy
- %space-att;
- use-attribute-sets %qnames; #IMPLIED
->
-
-<!ELEMENT xsl:message %template;>
-<!ATTLIST xsl:message %space-att;>
-
-<!ELEMENT xsl:fallback %template;>
-<!ATTLIST xsl:fallback %space-att;>
-
-
-
-<!-- ######################################################################## -->
-<!--   HTML 4.0 Strict DTD   (revised to allow for xsl content)               -->
-<!--   Original DTD from XML4J package                                        -->
-<!--   Original SGML to XML conversion by TAMURA, Kent for IBM's XML4J        -->
-
-<!-- 
-     Container for all xsl elements allowed inside result-elements elements,
-     i.e.: all xsl elements which are valid where a result-element is valid,
-     and therefore must be valid inside ALL non-empty HTML elements.
-
-     You'll notice this does allow the user to create invalid XSL documents.
-
-  xsl:sort, xsl:param, xsl:param-variable were not inluded because
-  IMHO it is bad practice (and an error?) not to include them before 
-  other siblings, especially result-ns ones.
--->
-
-<!-- While the content should be simply %instructions; we cannot do that
-     due to the first '|' in %instructions -->
-<!ENTITY % xsl-valid-in-resultns "
-  xsl:processing-instruction
-  | xsl:comment
-  | xsl:element
-  | xsl:attribute
-  %char-instructions;
-">
-
-<!-- Also, %result-element-atts; was added to the ATTLIST of all html
-     elments -->
-
-<!-- Revision: 23 1.3 docs/data/HTML40strict.xml.dtd, xml4jdocs, xml4j-jtcsv, xml4j_1_1_9  -->
-
-<!--
-    This is HTML 4.0 Strict DTD, which excludes the presentation 
-    attributes and elements that W3C expects to phase out as 
-    support for style sheets matures. Authors should use the Strict
-    DTD when possible, but may use the Transitional DTD when support
-    for presentation attribute and elements is required.
-    
-    HTML 4.0 includes mechanisms for style sheets, scripting,
-    embedding objects, improved support for right to left and mixed
-    direction text, and enhancements to forms for improved
-    accessibility for people with disabilities.
-
-          Draft: Date: 1998/07/06 17:50:32
-
-          Authors:
-              Dave Raggett <dsr@w3.org>
-              Arnaud Le Hors <lehors@w3.org>
-              Ian Jacobs <ij@w3.org>
-
-    Further information about HTML 4.0 is available at:
-
-        http://www.w3.org/TR/REC-html40
--->
-
-<!--
-    ================================================================
-    Modified for XML 1.0 by:
-	"TAMURA, Kent" <kent@trl.ibm.co.jp>
-
-    o HTMLspecial, HTMLsymbol, HTMLlat1 aren't included in this DTD.
-    o The `lang' attribute was renamed to `xml:lang'.
-
-
-    Typical usage:
-
-    <?xml version="1.0" encoding="..."?>
-    <!DOCTYPE HTML SYSTEM ".../HTML40strict.xml.dtd">
-    <HTML>
-      <HEAD>
-        ...
-        <TITLE>...</TITLE>
-        ...
-      </HEAD>
-      <BODY>
-        ...
-      </BODY>
-    </HTML>
-
-    Note: XML is case-sensitive.  So element names must be written
-    in uppercase and attribute names must be written in lowercase.
-    ================================================================
--->
-
-<!--
-    Typical usage:
-
-    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
-            "http://www.w3.org/TR/REC-html40/strict.dtd">
-    <html>
-    <head>
-    ...
-    </head>
-    <body>
-    ...
-    </body>
-    </html>
-
-    The URI used as a system identifier with the public identifier allows
-    the user agent to download the DTD and entity sets as needed.
-
-    The FPI for the Transitional HTML 4.0 DTD is:
-
-        "-//W3C//DTD HTML 4.0 Transitional//EN"
-
-    and its URI is:
-
-        http://www.w3.org/TR/REC-html40/loose.dtd
-
-    If you are writing a document that includes frames, use 
-    the following FPI:
-
-        "-//W3C//DTD HTML 4.0 Frameset//EN"
-
-    with the URI:
-
-        http://www.w3.org/TR/REC-html40/frameset.dtd
-
-    The following URIs are supported in relation to HTML 4.0
-
-    "http://www.w3.org/TR/REC-html40/strict.dtd" (Strict DTD)
-    "http://www.w3.org/TR/REC-html40/loose.dtd" (Loose DTD)
-    "http://www.w3.org/TR/REC-html40/frameset.dtd" (Frameset DTD)
-    "http://www.w3.org/TR/REC-html40/HTMLlat1.ent" (Latin-1 entities)
-    "http://www.w3.org/TR/REC-html40/HTMLsymbol.ent" (Symbol entities)
-    "http://www.w3.org/TR/REC-html40/HTMLspecial.ent" (Special entities)
-
-    These URIs point to the latest version of each file. To reference
-    this specific revision use the following URIs:
-
-    "http://www.w3.org/TR/REC-html40-971218/strict.dtd"
-    "http://www.w3.org/TR/REC-html40-971218/loose.dtd"
-    "http://www.w3.org/TR/REC-html40-971218/frameset.dtd"
-    "http://www.w3.org/TR/REC-html40-971218/HTMLlat1.ent"
-    "http://www.w3.org/TR/REC-html40-971218/HTMLsymbol.ent"
-    "http://www.w3.org/TR/REC-html40-971218/HTMLspecial.ent"
-
--->
-
-<!--=== for XML ===-->
-<!ENTITY % Number "CDATA">
-<!ENTITY % Name "NMTOKEN">
-
-
-<!--================== Imported Names ====================================-->
-
-<!ENTITY % ContentType "CDATA"
-> <!-- media type, as per [RFC2045]
-    -->
-
-<!ENTITY % ContentTypes "CDATA"
-> <!-- comma-separated list of media types, as per [RFC2045]
-    -->
-
-<!ENTITY % Charset "CDATA"
-> <!-- a character encoding, as per [RFC2045]
-    -->
-
-<!ENTITY % Charsets "CDATA"
-> <!-- a space separated list of character encodings, as per [RFC2045]
-    -->
-
-<!ENTITY % LanguageCode "NMTOKEN"
-> <!-- a language code, as per [RFC1766]
-    -->
-
-<!ENTITY % Character "CDATA"
-> <!-- a single character from [ISO10646] 
-    -->
-
-<!ENTITY % LinkTypes "CDATA"
-> <!-- space-separated list of link types
-    -->
-
-<!ENTITY % MediaDesc "CDATA"
-> <!-- single or comma-separated list of media descriptors
-    -->
-
-<!-- Defined elsewhere in this DTD
-<!ENTITY % URI "CDATA"
-> <! a Uniform Resource Identifier,
-       see [URI]
-    -->
-
-<!ENTITY % Datetime "CDATA"><!-- date and time information. ISO date format -->
-
-
-<!ENTITY % Script "CDATA"><!-- script expression -->
-
-<!ENTITY % StyleSheet "CDATA"><!-- style sheet data -->
-
-
-
-<!ENTITY % Text "CDATA">
-
-
-<!-- Parameter Entities -->
-
-<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT"><!-- repeatable head elements -->
-<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
-<!ENTITY % list "UL | OL">
-<!ENTITY % preformatted "PRE">
-
-
-<!--================ Character mnemonic entities =========================-->
-
-<!--ENTITY % HTMLlat1 PUBLIC
-   "-//W3C//ENTITIES Latin1//EN//HTML"
-   "HTMLlat1.ent"-->
-<!--   "http://www.w3.org/TR/REC-html40-971218/HTMLlat1.ent"-->
-<!--%HTMLlat1;-->
-
-<!--ENTITY % HTMLsymbol PUBLIC
-   "-//W3C//ENTITIES Symbols//EN//HTML"
-   "HTMLsymbol.ent"-->
-<!--   "http://www.w3.org/TR/REC-html40-971218/HTMLsymbol.ent"-->
-<!--%HTMLsymbol;-->
-
-<!--ENTITY % HTMLspecial PUBLIC
-   "-//W3C//ENTITIES Special//EN//HTML"
-   "HTMLspecial.ent"-->
-<!--   "http://www.w3.org/TR/REC-html40-971218/HTMLspecial.ent"-->
-<!--%HTMLspecial;-->
-
-<!-- We define these elsewhere in this mixed DTD
-<!ENTITY quot "&#34;">
-<!ENTITY amp  "&#38;">
-<!ENTITY lt   "&#60;">
-<!ENTITY gt   "&#62;">
--->
-
-<!--=================== Generic Attributes ===============================-->
-
-<!ENTITY % coreattrs
- "id          ID             #IMPLIED
-  class       CDATA          #IMPLIED
-  style       %StyleSheet;   #IMPLIED
-  title       %Text;         #IMPLIED
-  %result-element-atts;"
->
-
-<!ENTITY % i18n
- "xml:lang    %LanguageCode; #IMPLIED
-  dir         (ltr|rtl)      #IMPLIED"
-  >
-
-<!ENTITY % events
- "onclick     %Script;       #IMPLIED
-  ondblclick  %Script;       #IMPLIED
-  onmousedown %Script;       #IMPLIED
-  onmouseup   %Script;       #IMPLIED
-  onmouseover %Script;       #IMPLIED
-  onmousemove %Script;       #IMPLIED
-  onmouseout  %Script;       #IMPLIED
-  onkeypress  %Script;       #IMPLIED
-  onkeydown   %Script;       #IMPLIED
-  onkeyup     %Script;       #IMPLIED"
-  >
-
-<!-- Reserved Feature Switch -->
-<!ENTITY % HTML.Reserved "IGNORE">
-
-<!-- The following attributes are reserved for possible future use -->
-<![ %HTML.Reserved; [
-<!ENTITY % reserved
- "datasrc     %URI;          #IMPLIED
-  datafld     CDATA          #IMPLIED
-  dataformatas (plaintext|html) plaintext"
-  >
-]]>
-
-<!ENTITY % reserved "">
-
-<!ENTITY % attrs "%coreattrs; %i18n; %events;">
-
-
-<!--=================== Text Markup ======================================-->
-
-<!ENTITY % fontstyle
- "TT | I | B | BIG | SMALL">
-
-<!ENTITY % phrase "EM | STRONG | DFN | CODE |
-                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
-
-<!ENTITY % special
-   "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
-<!ENTITY % special-A
-   "IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
-
-<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
-
-<!-- %inline; covers inline or "text-level" elements -->
-<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
-<!ENTITY % inline-A "#PCDATA | %fontstyle; | %phrase; | %special-A; | %formctrl;">
-<!ENTITY % inline-LABEL "#PCDATA | %fontstyle; | %phrase; | %special; | INPUT | SELECT | TEXTAREA | BUTTON">
-
-<!--
-<!ELEMENT (%fontstyle;|%phrase;)     (%inline;)*>
-<!ATTLIST (%fontstyle;|%phrase;)
-  %attrs;
-  >-->
-<!ELEMENT TT (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST TT %attrs;>
-<!ELEMENT I (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST I %attrs;>
-<!ELEMENT B (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST B %attrs;>
-<!ELEMENT BIG (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST BIG %attrs;>
-<!ELEMENT SMALL (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST SMALL %attrs;>
-<!ELEMENT EM (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST EM %attrs;>
-<!ELEMENT STRONG (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST STRONG %attrs;>
-<!ELEMENT DFN (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST DFN %attrs;>
-<!ELEMENT CODE (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST CODE %attrs;>
-<!ELEMENT SAMP (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST SAMP %attrs;>
-<!ELEMENT KBD (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST KBD %attrs;>
-<!ELEMENT VAR (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST VAR %attrs;>
-<!ELEMENT CITE (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST CITE %attrs;>
-<!ELEMENT ABBR (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST ABBR %attrs;>
-<!ELEMENT ACRONYM (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST ACRONYM %attrs;>
-
-
-<!ELEMENT SUP (%inline; | %xsl-valid-in-resultns;)*><!-- subscript, superscript -->
-<!ATTLIST SUP
-  %attrs;
-  >
-<!ELEMENT SUB (%inline; | %xsl-valid-in-resultns;)*><!-- subscript, superscript -->
-<!ATTLIST SUB
-  %attrs;
-  >
-
-<!ELEMENT SPAN (%inline; | %xsl-valid-in-resultns;)*><!-- generic language/style container -->
-<!ATTLIST SPAN
-  %attrs;
-  %reserved;			
-  >
-
-<!ELEMENT BDO (%inline; | %xsl-valid-in-resultns;)*><!-- I18N BiDi over-ride -->
-<!ATTLIST BDO
-  %coreattrs;
-  lang        %LanguageCode; #IMPLIED
-  dir         (ltr|rtl)      #REQUIRED
-  >
-
-
-<!ELEMENT BR     EMPTY><!-- forced line break -->
-<!ATTLIST BR
-  %coreattrs;
-  >
-
-<!--================== HTML content models ===============================-->
-
-<!--
-    HTML has two basic content models:
-
-        %inline;     character level elements and text strings
-        %block;      block-like elements e.g. paragraphs and lists
--->
-
-<!ENTITY % block
-     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
-      BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
-<!ENTITY % block-FORM
-     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
-      BLOCKQUOTE | HR | TABLE | FIELDSET | ADDRESS">
-<!ENTITY % block-FORM-FIELDSET
-     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
-      BLOCKQUOTE | HR | TABLE | ADDRESS">
-
-<!--<!ENTITY % flow "%block; | %inline;">-->
-<!ENTITY % flow "%inline; | %block;">
-
-<!--=================== Document Body ====================================-->
-
-<!--ELEMENT BODY     (%block;|SCRIPT)+ +(INS|DEL)  document body -->
-<!ELEMENT BODY ((INS|DEL)*, (%xsl-valid-in-resultns;|%block;|SCRIPT), (INS|DEL)*)+ ><!-- document body -->
-<!ATTLIST BODY
-  %attrs;
-  onload          %Script;   #IMPLIED
-  onunload        %Script;   #IMPLIED
-  >
-
-<!ELEMENT ADDRESS (%inline; | %xsl-valid-in-resultns;)*><!-- information on author -->
-<!ATTLIST ADDRESS
-  %attrs;
-  >
-
-<!ELEMENT DIV (%flow; | %xsl-valid-in-resultns;)*><!-- generic language/style container -->
-<!ATTLIST DIV
-  %attrs;
-  %reserved;
-  >
-
-
-<!--================== The Anchor Element ================================-->
-
-<!ENTITY % Shape "(rect|circle|poly|default)">
-<!ENTITY % Coords "CDATA"><!-- comma separated list of lengths -->
-
-<!ELEMENT A (%inline-A; | %xsl-valid-in-resultns;)*><!-- anchor -->
-<!ATTLIST A
-  %attrs;
-  charset     %Charset;      #IMPLIED
-  type        %ContentType;  #IMPLIED
-  name        CDATA          #IMPLIED
-  href        %URI;          #IMPLIED
-  hreflang    %LanguageCode; #IMPLIED
-  rel         %LinkTypes;    #IMPLIED
-  rev         %LinkTypes;    #IMPLIED
-  accesskey   %Character;    #IMPLIED
-  shape       %Shape;        "rect"
-  coords      %Coords;       #IMPLIED
-  tabindex    %Number;       #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  >
-
-<!--================== Client-side image maps ============================-->
-
-<!-- These can be placed in the same document or grouped in a
-     separate document although this isn't yet widely supported -->
-
-<!ELEMENT MAP  ((%xsl-valid-in-resultns;|%block;)+ | (%xsl-valid-in-resultns;|AREA+))><!-- client-side image map -->
-<!ATTLIST MAP
-  %attrs;
-  name        CDATA          #REQUIRED
-  >
-
-<!ELEMENT AREA     EMPTY><!-- client-side image map area -->
-<!ATTLIST AREA
-  %attrs;
-  shape       %Shape;        "rect"
-  coords      %Coords;       #IMPLIED
-  href        %URI;          #IMPLIED
-  nohref      (nohref)       #IMPLIED
-  alt         %Text;         #REQUIRED
-  tabindex    %Number;       #IMPLIED
-  accesskey   %Character;    #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  >
-
-<!--================== The LINK Element ==================================-->
-
-<!--
-  Relationship values can be used in principle:
-
-   a) for document specific toolbars/menus when used
-      with the LINK element in document head e.g.
-        start, contents, previous, next, index, end, help
-   b) to link to a separate style sheet (rel=stylesheet)
-   c) to make a link to a script (rel=script)
-   d) by stylesheets to control how collections of
-      html nodes are rendered into printed documents
-   e) to make a link to a printable version of this document
-      e.g. a postscript or pdf version (rel=alternate media=print)
--->
-
-<!ELEMENT LINK     EMPTY><!-- a media-independent link -->
-<!ATTLIST LINK
-  %attrs;
-  charset     %Charset;      #IMPLIED
-  href        %URI;          #IMPLIED
-  hreflang    %LanguageCode; #IMPLIED
-  type        %ContentType;  #IMPLIED
-  rel         %LinkTypes;    #IMPLIED
-  rev         %LinkTypes;    #IMPLIED
-  media       %MediaDesc;    #IMPLIED
-  >
-
-<!--=================== Images ===========================================-->
-
-<!-- Length defined in strict DTD for cellpadding/cellspacing -->
-<!ENTITY % Length "CDATA"><!-- nn for pixels or nn% for percentage length -->
-<!ENTITY % MultiLength "CDATA"><!-- pixel, percentage, or relative -->
-
-<!ENTITY % MultiLengths "CDATA"><!-- comma-separated list of MultiLength -->
-
-<!ENTITY % Pixels "CDATA"><!-- integer representing length in pixels -->
-
-
-<!-- To avoid problems with text-only UAs as well as 
-   to make image content understandable and navigable 
-   to users of non-visual UAs, you need to provide
-   a description with ALT, and avoid server-side image maps -->
-<!ELEMENT IMG     EMPTY><!-- Embedded image -->
-<!ATTLIST IMG
-  %attrs;
-  src         %URI;          #REQUIRED
-  alt         %Text;         #REQUIRED
-  longdesc    %URI;          #IMPLIED
-  height      %Length;       #IMPLIED
-  width       %Length;       #IMPLIED
-  usemap      %URI;          #IMPLIED
-  ismap       (ismap)        #IMPLIED
-  >
-
-<!-- USEMAP points to a MAP element which may be in this document
-  or an external document, although the latter is not widely supported -->
-
-<!--==================== OBJECT ======================================-->
-<!--
-  OBJECT is used to embed objects as part of HTML pages 
-  PARAM elements should precede other content. SGML mixed content
-  model technicality precludes specifying this formally ...
--->
-
-<!ELEMENT OBJECT (%flow; | %xsl-valid-in-resultns; | PARAM)*
-><!-- generic embedded object -->
-<!ATTLIST OBJECT
-  %attrs;
-  declare     (declare)      #IMPLIED
-  classid     %URI;          #IMPLIED
-  codebase    %URI;          #IMPLIED
-  data        %URI;          #IMPLIED
-  type        %ContentType;  #IMPLIED
-  codetype    %ContentType;  #IMPLIED
-  archive     %URI;          #IMPLIED
-  standby     %Text;         #IMPLIED
-  height      %Length;       #IMPLIED
-  width       %Length;       #IMPLIED
-  usemap      %URI;          #IMPLIED
-  name        CDATA          #IMPLIED
-  tabindex    %Number;       #IMPLIED
-  %reserved;
-  >
-
-<!ELEMENT PARAM     EMPTY><!-- named property value -->
-<!ATTLIST PARAM
-  id          ID             #IMPLIED
-  name        CDATA          #REQUIRED
-  value       CDATA          #IMPLIED
-  valuetype   (DATA|REF|OBJECT) "DATA"
-  type        %ContentType;  #IMPLIED
-  >
-
-
-<!--=================== Horizontal Rule ==================================-->
-
-<!ELEMENT HR     EMPTY><!-- horizontal rule -->
-<!ATTLIST HR
-  %coreattrs;
-  %events;
-  >
-
-<!--=================== Paragraphs =======================================-->
-
-<!ELEMENT P (%inline; | %xsl-valid-in-resultns;)*><!-- paragraph -->
-<!ATTLIST P
-  %attrs;
-  >
-
-<!--=================== Headings =========================================-->
-
-<!--
-  There are six levels of headings from H1 (the most important)
-  to H6 (the least important).
--->
-
-<!--
-<!ELEMENT (%heading;)      (%inline;)*>
-<!ATTLIST (%heading;)
-  %attrs;
-  >-->
-<!ELEMENT H1 (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST H1 %attrs;>
-<!ELEMENT H2 (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST H2 %attrs;>
-<!ELEMENT H3 (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST H3 %attrs;>
-<!ELEMENT H4 (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST H4 %attrs;>
-<!ELEMENT H5 (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST H5 %attrs;>
-<!ELEMENT H6 (%inline; | %xsl-valid-in-resultns;)*>
-<!ATTLIST H6 %attrs;>
-
-
-<!--=================== Preformatted Text ================================-->
-
-<!-- excludes markup for images and changes in font size -->
-<!--
-<!ENTITY % pre.exclusion "IMG|OBJECT|BIG|SMALL|SUB|SUP">
-
-<!ELEMENT PRE  (%inline;)* -(%pre.exclusion;)><! preformatted text -->
-
-<!ELEMENT PRE (#PCDATA |%xsl-valid-in-resultns;| TT|I|B|%phrase;|A|BR|SCRIPT|MAP|Q|SPAN|BDO|%formctrl;)*>
-			<!-- preformatted text -->
-<!ATTLIST PRE
-  %attrs;>
-<!-- Should the attribute below be incuded in PRE?
-  xml:space (default|preserve) #FIXED "preserve"
--->
-
-<!--===================== Inline Quotes ==================================-->
-
-<!ELEMENT Q  (%inline; | %xsl-valid-in-resultns;)*><!-- short inline quotation -->
-<!ATTLIST Q
-  %attrs;
-  cite        %URI;          #IMPLIED
-  >
-
-<!--=================== Block-like Quotes ================================-->
-
-<!ELEMENT BLOCKQUOTE  (%block;|%xsl-valid-in-resultns;|SCRIPT)+><!-- long quotation -->
-<!ATTLIST BLOCKQUOTE
-  %attrs;
-  cite        %URI;          #IMPLIED
-  >
-
-<!--=================== Inserted/Deleted Text ============================-->
-
-
-<!-- INS/DEL are handled by inclusion on BODY -->
-<!ELEMENT INS (%flow;|%xsl-valid-in-resultns;)*><!-- inserted text, deleted text -->
-<!ATTLIST INS
-  %attrs;
-  cite        %URI;          #IMPLIED
-  datetime    %Datetime;     #IMPLIED
-  >
-<!ELEMENT DEL (%flow;|%xsl-valid-in-resultns;)*><!-- inserted text, deleted text -->
-<!ATTLIST DEL
-  %attrs;
-  cite        %URI;          #IMPLIED
-  datetime    %Datetime;     #IMPLIED
-  >
-
-<!--=================== Lists ============================================-->
-
-<!-- definition lists - DT for term, DD for its definition -->
-
-<!ELEMENT DL  (%xsl-valid-in-resultns;| DT|DD)+><!-- definition list -->
-<!ATTLIST DL
-  %attrs;
-  >
-
-<!ELEMENT DT (%inline; | %xsl-valid-in-resultns;)*><!-- definition term -->
-<!ELEMENT DD (%flow; | %xsl-valid-in-resultns;)*><!-- definition description -->
-<!ATTLIST DT
-  %attrs;
-  >
-<!ATTLIST DD
-  %attrs;
-  >
-
-
-<!ELEMENT OL (%xsl-valid-in-resultns; | LI)+><!-- ordered list -->
-<!ATTLIST OL
-  %attrs;
-  >
-
-<!-- Unordered Lists (UL) bullet styles -->
-<!ELEMENT UL (%xsl-valid-in-resultns; | LI)+><!-- unordered list -->
-<!ATTLIST UL
-  %attrs;
-  >
-
-
-
-<!ELEMENT LI (%flow; | %xsl-valid-in-resultns;)*><!-- list item -->
-<!ATTLIST LI
-  %attrs;
-  >
-
-<!--================ Forms ===============================================-->
-<!ELEMENT FORM (%xsl-valid-in-resultns;|%block-FORM;|SCRIPT)+>
-
-<!-- interactive form -->
-<!ATTLIST FORM
-  %attrs;
-  action      %URI;          #REQUIRED
-  method      (GET|POST)     "GET"
-  enctype     %ContentType;  "application/x-www-form-urlencoded"
-  onsubmit    %Script;       #IMPLIED
-  onreset     %Script;       #IMPLIED
-  accept-charset %Charsets;  #IMPLIED
-  >
-
-<!-- Each label must not contain more than ONE field -->
-<!ELEMENT LABEL  (%inline-LABEL; | %xsl-valid-in-resultns;)*><!-- form field label text -->
-<!ATTLIST LABEL
-  %attrs;
-  for         IDREF          #IMPLIED
-  accesskey   %Character;    #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  >
-
-<!ENTITY % InputType
-  "(TEXT | PASSWORD | CHECKBOX |
-    RADIO | SUBMIT | RESET |
-    FILE | HIDDEN | IMAGE | BUTTON)"
-   >
-
-<!-- attribute name required for all but submit & reset -->
-<!ELEMENT INPUT     EMPTY><!-- form control -->
-<!ATTLIST INPUT
-  %attrs;
-  type        %InputType;    "TEXT"
-  name        CDATA          #IMPLIED
-  value       CDATA          #IMPLIED
-  checked     (checked)      #IMPLIED
-  disabled    (disabled)     #IMPLIED
-  readonly    (readonly)     #IMPLIED
-  size        CDATA          #IMPLIED
-  maxlength   %Number;       #IMPLIED
-  src         %URI;          #IMPLIED
-  alt         CDATA          #IMPLIED
-  usemap      %URI;          #IMPLIED
-  tabindex    %Number;       #IMPLIED
-  accesskey   %Character;    #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  onselect    %Script;       #IMPLIED
-  onchange    %Script;       #IMPLIED
-  accept      %ContentTypes; #IMPLIED
-  %reserved;
-  >
-
-<!ELEMENT SELECT ((%xsl-valid-in-resultns;|OPTGROUP)|(%xsl-valid-in-resultns;|OPTION))+ ><!-- option selector -->
-<!ATTLIST SELECT
-  %attrs;
-  name        CDATA          #IMPLIED
-  size        %Number;       #IMPLIED
-  multiple    (multiple)     #IMPLIED
-  disabled    (disabled)     #IMPLIED
-  tabindex    %Number;       #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  onchange    %Script;       #IMPLIED
-  %reserved;
-  >
-
-<!ELEMENT OPTGROUP (%xsl-valid-in-resultns;|OPTION)+>  <!-- option group -->
-<!ATTLIST OPTGROUP
-  %attrs;
-  disabled    (disabled)     #IMPLIED
-  label       %Text;         #REQUIRED
-  >
-
-<!ELEMENT OPTION  (#PCDATA | %xsl-valid-in-resultns;)*><!-- selectable choice -->
-<!ATTLIST OPTION
-  %attrs;
-  selected    (selected)     #IMPLIED
-  disabled    (disabled)     #IMPLIED
-  label       %Text;         #IMPLIED
-  value       CDATA          #IMPLIED
-  >
-
-<!ELEMENT TEXTAREA (#PCDATA | %xsl-valid-in-resultns;)*><!-- multi-line text field -->
-<!ATTLIST TEXTAREA
-  %attrs;
-  name        CDATA          #IMPLIED
-  rows        %Number;       #REQUIRED
-  cols        %Number;       #REQUIRED
-  disabled    (disabled)     #IMPLIED
-  readonly    (readonly)     #IMPLIED
-  tabindex    %Number;       #IMPLIED
-  accesskey   %Character;    #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  onselect    %Script;       #IMPLIED
-  onchange    %Script;       #IMPLIED
-  %reserved;
-  >
-
-<!--
-  #PCDATA is to solve the mixed content problem,
-  per specification only whitespace is allowed there!
-
-  We do allow XSL inside as well
- -->
-<!--ELEMENT FIELDSET     (#PCDATA,LEGEND,(%flow;)*)    form control group -->
-<!ELEMENT FIELDSET  (%flow;|%xsl-valid-in-resultns;|LEGEND)*><!-- form control group -->
-<!ATTLIST FIELDSET
-  %attrs;
-  >
-
-<!ELEMENT LEGEND (%inline;|%xsl-valid-in-resultns;)*><!-- fieldset legend -->
-<!ENTITY % LAlign "(top|bottom|left|right)">
-
-<!ATTLIST LEGEND
-  %attrs;
-  accesskey   %Character;    #IMPLIED
-  >
-
-<!ELEMENT BUTTON
-     (#PCDATA | %xsl-valid-in-resultns; | %fontstyle; | %phrase; | %special-A; | %block;)*
-><!-- push button -->
-<!ATTLIST BUTTON
-  %attrs;
-  name        CDATA          #IMPLIED
-  value       CDATA          #IMPLIED
-  type        (button|submit|reset) "submit"
-  disabled    (disabled)     #IMPLIED
-  tabindex    %Number;       #IMPLIED
-  accesskey   %Character;    #IMPLIED
-  onfocus     %Script;       #IMPLIED
-  onblur      %Script;       #IMPLIED
-  %reserved;
-  >
-
-<!--======================= Tables =======================================-->
-
-<!-- IETF HTML table standard, see [RFC1942] -->
-
-<!--
- The BORDER attribute sets the thickness of the frame around the
- table. The default units are screen pixels.
-
- The FRAME attribute specifies which parts of the frame around
- the table should be rendered. The values are not the same as
- CALS to avoid a name clash with the VALIGN attribute.
-
- The value "border" is included for backwards compatibility with
- <TABLE BORDER> which yields frame=border and border=implied
- For <TABLE BORDER=1> you get border=1 and frame=implied. In this
- case, it is appropriate to treat this as frame=border for backwards
- compatibility with deployed browsers.
--->
-<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
-
-<!--
- The RULES attribute defines which rules to draw between cells:
-
- If RULES is absent then assume:
-     "none" if BORDER is absent or BORDER=0 otherwise "all"
--->
-
-<!ENTITY % TRules "(none | groups | rows | cols | all)">
-  
-<!-- horizontal placement of table relative to document -->
-<!ENTITY % TAlign "(left|center|right)">
-
-<!-- horizontal alignment attributes for cell contents -->
-<!ENTITY % cellhalign
-  "align      (left|center|right|justify|char) #IMPLIED
-   char       %Character;    #IMPLIED
-   charoff    %Length;       #IMPLIED"
-  >
-
-<!-- vertical alignment attributes for cell contents -->
-<!ENTITY % cellvalign
-  "valign     (top|middle|bottom|baseline) #IMPLIED"
-  >
-
-<!ELEMENT TABLE 
-  ((%xsl-valid-in-resultns;)*, CAPTION?, (%xsl-valid-in-resultns;)*,
-   ((COL | %xsl-valid-in-resultns;)*|(COLGROUP | %xsl-valid-in-resultns;)*),
-   ((THEAD?,(%xsl-valid-in-resultns;)*,TFOOT?,(%xsl-valid-in-resultns;|TBODY)+)
-    | (%xsl-valid-in-resultns;|TR)+) )>
-
-<!ELEMENT CAPTION   (%inline; | %xsl-valid-in-resultns;)*><!-- table caption -->
-<!ELEMENT THEAD     (TR|%xsl-valid-in-resultns;)+><!-- table header -->
-<!ELEMENT TFOOT     (TR|%xsl-valid-in-resultns;)+><!-- table footer -->
-<!ELEMENT TBODY     (TR|%xsl-valid-in-resultns;)+><!-- table body -->
-<!ELEMENT COLGROUP  (%xsl-valid-in-resultns; | COL)*><!-- table column group -->
-<!ELEMENT COL       EMPTY><!-- table column -->
-<!ELEMENT TR        (TH|TD| %xsl-valid-in-resultns;)+><!-- table row -->
-<!ELEMENT TH        (%flow; | %xsl-valid-in-resultns;)*><!-- table header cell, table data cell-->
-<!ELEMENT TD        (%flow; | %xsl-valid-in-resultns;)*><!-- table header cell, table data cell-->
-
-<!ATTLIST TABLE
-  %attrs;
-  summary     %Text;         #IMPLIED
-  width       %Length;       #IMPLIED
-  border      %Pixels;       #IMPLIED
-  frame       %TFrame;       #IMPLIED
-  rules       %TRules;       #IMPLIED
-  cellspacing %Length;       #IMPLIED
-  cellpadding %Length;       #IMPLIED
-  %reserved;
-  datapagesize CDATA         #IMPLIED
-  >
-
-<!ENTITY % CAlign "(top|bottom|left|right)">
-
-<!ATTLIST CAPTION
-  %attrs;
-  >
-
-<!--
-COLGROUP groups a set of COL elements. It allows you to group
-several semantically related columns together.
--->
-<!ATTLIST COLGROUP
-  %attrs;
-  span        %Number;       "1"
-  width       %MultiLength;  #IMPLIED
-  %cellhalign;
-  %cellvalign;
-  >
-
-<!--
- COL elements define the alignment properties for cells in
- one or more columns.
-
- The WIDTH attribute specifies the width of the columns, e.g.
-
-     width=64        width in screen pixels
-     width=0.5*      relative width of 0.5
-
- The SPAN attribute causes the attributes of one
- COL element to apply to more than one column.
--->
-<!ATTLIST COL
-  %attrs;
-  span        %Number;       "1"
-  width       %MultiLength;  #IMPLIED
-  %cellhalign;
-  %cellvalign;
-  >
-
-<!--
-    Use THEAD to duplicate headers when breaking table
-    across page boundaries, or for static headers when
-    TBODY sections are rendered in scrolling panel.
-
-    Use TFOOT to duplicate footers when breaking table
-    across page boundaries, or for static footers when
-    TBODY sections are rendered in scrolling panel.
-
-    Use multiple TBODY sections when rules are needed
-    between groups of table rows.
--->
-<!ATTLIST THEAD
-  %attrs;
-  %cellhalign;
-  %cellvalign;
-  >
-<!ATTLIST TBODY
-  %attrs;
-  %cellhalign;
-  %cellvalign;
-  >
-<!ATTLIST TFOOT
-  %attrs;
-  %cellhalign;
-  %cellvalign;
-  >
-
-<!ATTLIST TR
-  %attrs;
-  %cellhalign;
-  %cellvalign;
-  >
-
-
-<!-- Scope is simpler than axes attribute for common tables -->
-<!ENTITY % Scope "(ROW|COL|ROWGROUP|COLGROUP)">
-
-<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
-<!ATTLIST TH
-  %attrs;
-  abbr        %Text;         #IMPLIED
-  axis        CDATA          #IMPLIED
-  headers     IDREFS         #IMPLIED
-  scope       %Scope;        #IMPLIED
-  rowspan     %Number;       "1"
-  colspan     %Number;       "1"
-  %cellhalign;
-  %cellvalign;
-  >
-<!ATTLIST TD
-  %attrs;
-  abbr        %Text;         #IMPLIED
-  axis        CDATA          #IMPLIED
-  headers     IDREFS         #IMPLIED
-  scope       %Scope;        #IMPLIED
-  rowspan     %Number;       "1"
-  colspan     %Number;       "1"
-  %cellhalign;
-  %cellvalign;
-  >
-
-
-<!--================ Document Head =======================================-->
-<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT",
-     extended now to allow xsl -->
-<!ENTITY % head.misc-HEAD "%head.misc;|%xsl-valid-in-resultns;">
-
-<!ENTITY % head.content "TITLE &amp; BASE?">
-
-<!--ELEMENT HEAD     (%head.content;) +(%head.misc;)   document head -->
-<!ELEMENT HEAD
-   ((%head.misc-HEAD;)*, ((BASE?,(%head.misc-HEAD;)*,TITLE?) | (TITLE?,(%head.misc-HEAD;)*,BASE?)|(%head.misc-HEAD;)*)+, (%head.misc-HEAD;)*)>
-<!ATTLIST HEAD
-  %i18n;
-  profile     %URI;          #IMPLIED
-  %result-element-atts;
-  >
-
-<!-- The TITLE element is not considered part of the flow of text.
-       It should be displayed, for example as the page header or
-       window title. Exactly one title is required per document.
-    -->
-<!--ELEMENT TITLE     (#PCDATA) -(%head.misc;)  document title -->
-<!ELEMENT TITLE  (#PCDATA |  %xsl-valid-in-resultns;)*><!-- document title -->
-<!ATTLIST TITLE %i18n; %result-element-atts;>
-
-
-<!ELEMENT BASE     EMPTY><!-- document base URI -->
-<!ATTLIST BASE
-  href        %URI;          #REQUIRED
-  >
-
-<!ELEMENT META     EMPTY><!-- generic metainformation -->
-<!ATTLIST META
-  %i18n;
-  http-equiv  %Name;         #IMPLIED
-  name        %Name;         #IMPLIED
-  content     CDATA          #REQUIRED
-  scheme      CDATA          #IMPLIED
-  %result-element-atts;
-  >
-
-<!--ELEMENT STYLE     %StyleSheet;  style info -->
-<!ELEMENT STYLE (#PCDATA | %xsl-valid-in-resultns;)*><!-- style info -->
-<!ATTLIST STYLE
-  %i18n;
-  type        %ContentType;  #REQUIRED
-  media       %MediaDesc;    #IMPLIED
-  title       %Text;         #IMPLIED
-  %result-element-atts;
-  >
-
-<!--ELEMENT SCRIPT     %Script; script statements -->
-<!ELEMENT SCRIPT (#PCDATA | %xsl-valid-in-resultns;)*><!-- script statements -->
-<!ATTLIST SCRIPT
-  charset     %Charset;      #IMPLIED
-  type        %ContentType;  #REQUIRED
-  language    CDATA          #IMPLIED
-  src         %URI;          #IMPLIED
-  defer       (defer)        #IMPLIED
-  event       CDATA          #IMPLIED
-  for         %URI;          #IMPLIED
-  %result-element-atts;
-  >
-
-<!ELEMENT NOSCRIPT (%xsl-valid-in-resultns;|%block;)+
-><!-- alternate content container for non script-based rendering -->
-<!ATTLIST NOSCRIPT
-  %attrs;
-  >
-
-<!--================ Document Structure ==================================-->
-<!ENTITY % html.content "HEAD, BODY">
-
-<!--<!ELEMENT HTML     (%html.content;)> --><!-- document root element -->
-<!ELEMENT HTML (((%xsl-valid-in-resultns;)*,HEAD?,(%xsl-valid-in-resultns;)*,BODY?,
-                (%xsl-valid-in-resultns;)*) | (%xsl-valid-in-resultns;)*)>
-<!-- document root element -->
-<!ATTLIST HTML
-  %i18n;
-  %result-element-atts;
-  >
diff --git a/xdocs/style/loaderdesign.xml b/xdocs/style/loaderdesign.xml
deleted file mode 100644
index 975055b..0000000
--- a/xdocs/style/loaderdesign.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0"?>
-
-<loader>
-  <processor name="xslt">
-    <parameter name="stylesheet" value="sbk:/style/stylesheets/design2project.xsl"/>
-  </processor>
-</loader>
diff --git a/xdocs/style/stylesheets/design2project.xsl b/xdocs/style/stylesheets/design2project.xsl
deleted file mode 100644
index 8d23940..0000000
--- a/xdocs/style/stylesheets/design2project.xsl
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-  <xsl:template match="/">
-    <xsl:apply-templates/>
-  </xsl:template>
-
-  <!-- match the root book element -->
-  <xsl:template match="book">
-    <project>
-      <parameter name="copyright" value="{@copyright}"/>
-      <xsl:apply-templates/>
-    </project>
-  </xsl:template>
-
- <xsl:template match="document">
-
-    <process source="{@source}" producer="parser">
-      <processor name="xslt">
-        <parameter name="stylesheet" value="sbk:/style/stylesheets/any2project.xsl"/>
-      </processor>
-    </process>
-
-    <create source="{@source}" target="{@id}.html" producer="parser" printer="html">
-      <processor name="xslt">
-        <parameter name="id" value="{@id}"/>
-        <parameter name="stylesheet" value="sbk:/style/stylesheets/designdoc2html.xsl"/>
-      </processor>
-    </create>
-  </xsl:template>
-  
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/xdocs/style/stylesheets/designdoc2html.xsl b/xdocs/style/stylesheets/designdoc2html.xsl
deleted file mode 100644
index c0aebae..0000000
--- a/xdocs/style/stylesheets/designdoc2html.xsl
+++ /dev/null
@@ -1,256 +0,0 @@
-<?xml version="1.0"?>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-  <xsl:param name="stylebook.project"/>
-  <xsl:param name="copyright"/>
-  <xsl:param name="id"/>
-
-  <xsl:template match="/">
-    <xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="s1">
-    <html>
-      <head>
-        <title><xsl:value-of select="@title"/></title>
-      </head>
-      <body text="#000000" link="#0000ff" vlink="#0000aa" alink="#ff0000"
-            topmargin="4" leftmargin="4" marginwidth="4" marginheight="4"
-            bgcolor="#ffffff">
-         <xsl:variable name="topimage" select="./p/img/@src"/>
-         <h1><a href="http://xml.apache.org"><img src="images/{$topimage}"/></a>&#160;&#160;
-         <xsl:value-of select="@title"/></h1><hr/>
-             <xsl:apply-templates/>
-         <hr/>
-            <font size="-1" color="#0086b2"><i>
-              Copyright &#169; <xsl:value-of select="$copyright"/>
-            </i></font>
-      </body>
-    </html>
-  </xsl:template>
-
-  <xsl:template match="s2">
-      
-      <h2><xsl:value-of select="@title"/></h2>
-      <xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="s3">
-      <h3><xsl:value-of select="@title"/></h3>
-      <xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="s4">
-      <h4><xsl:value-of select="@title"/></h4>
-      <xsl:apply-templates/>
-  </xsl:template>
-
-<!-- ###################################################################### -->
-<!-- blocks -->
-
-  <xsl:template match="p">
-    <p><xsl:apply-templates/></p>
-  </xsl:template>
-
-  <xsl:template match="note">
-    <table width="100%" cellspacing="3" cellpadding="0" border="0">
-      <tr>
-        <td width="20" valign="top">
-          <img src="resources/note.gif" width="20" height="24" vspace="0" hspace="0" border="0" alt="Note"/>
-        </td>
-        <td valign="top">
-          <font size="-1" face="arial,helvetica,sanserif" color="#000000">
-            <i>
-              <xsl:apply-templates/>
-            </i>
-          </font>
-        </td>
-      </tr>  
-    </table>
-  </xsl:template>
-
-  <xsl:template match="u">
-    <u><xsl:apply-templates/></u>
-  </xsl:template>
-
-  <xsl:template match="i">
-    <i><xsl:apply-templates/></i>
-  </xsl:template>
-
-  <xsl:template match="b">
-    <b><xsl:apply-templates/></b>
-  </xsl:template>
-
-  <xsl:template match="ul">
-    <ul><xsl:apply-templates/></ul>
-  </xsl:template>
-
-  <xsl:template match="ol">
-    <ol><xsl:apply-templates/></ol>
-  </xsl:template>
-
-  <xsl:template match="li">
-    <li><xsl:apply-templates/></li>
-  </xsl:template>
-  
-    <!--Definition lists: gloss, term, label, item -->
-  <xsl:template match="gloss">
-    <dl><xsl:apply-templates/></dl>
-  </xsl:template>
-   <!-- <term> contains a single-word, multi-word or symbolic 
-       designation which is regarded as a technical term. --> 
-  <xsl:template match="term">
-    <dfn><xsl:apply-templates/></dfn>
-  </xsl:template>
-  <xsl:template match="label" priority="1">
-    <dt><xsl:apply-templates/></dt>
-  </xsl:template>
-  <xsl:template match="item" priority="2">
-    <dd>
-      <xsl:apply-templates/>
-    </dd>
-  </xsl:template>
-
-  <xsl:template match="source">
-    <p><font size="-1"><pre><xsl:apply-templates/></pre></font></p>
-  </xsl:template>
-
-  <xsl:template match="small-table">
-    <center>
-      <xsl:choose>
-        <xsl:when test="@leave-me-alone = 'yes'">
-          <table>
-            <xsl:copy-of select="@*"/>
-            <xsl:copy-of select="*"/>
-          </table>
-        </xsl:when>
-        <xsl:otherwise>
-          <table width="90%" border="0" cellspacing="2">
-            <xsl:apply-templates mode="small-table"/>
-          </table>
-        </xsl:otherwise>
-      </xsl:choose>
-    </center>
-  </xsl:template>
-
-  <xsl:template match="tr" mode="small-table">
-    <tr><xsl:apply-templates mode="small-table"/></tr>
-  </xsl:template>
-
-  <xsl:template match="td" mode="small-table">
-    <td valign="top"><font size="-1"><xsl:apply-templates/></font></td>
-  </xsl:template>
-
-
-  <xsl:template match="table">
-    <table width="100%" border="0" cellspacing="2" cellpadding="2">
-      <xsl:apply-templates/>
-    </table>
-  </xsl:template>
-
-  <xsl:template match="tr">
-    <tr><xsl:apply-templates/></tr>
-  </xsl:template>
-
-  <xsl:template match="th">
-    <td bgcolor="#039acc" colspan="{@colspan}" rowspan="{@rowspan}" valign="center" align="center">
-      <font color="#ffffff" size="-1" face="arial,helvetica,sanserif">
-        <b><xsl:apply-templates/></b>&#160;
-      </font>
-    </td>
-  </xsl:template>
-
-  <xsl:template match="td">
-    <td bgcolor="#a0ddf0" colspan="{@colspan}" rowspan="{@rowspan}" valign="top" align="left">
-      <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-        <xsl:apply-templates/>&#160;
-      </font>
-    </td>
-  </xsl:template>
-
-  <xsl:template match="tn">
-    <td bgcolor="#ffffff" colspan="{@colspan}" rowspan="{@rowspan}">
-      &#160;
-    </td>
-  </xsl:template>
-
-<!-- ###################################################################### -->
-<!-- markup -->
-
-  <xsl:template match="em">
-    <b><xsl:apply-templates/></b>
-  </xsl:template>
-
-  <xsl:template match="ref">
-    <center><i><xsl:apply-templates/></i></center>
-  </xsl:template>
-  
-  <xsl:template match="code">
-    <code><font face="courier, monospaced"><xsl:apply-templates/></font></code>
-  </xsl:template>
-  
-  <xsl:template match="br">
-    <br/>
-  </xsl:template>
-  
-<!-- ###################################################################### -->
-<!-- links -->
-
-  <xsl:template match="link">
-    <xsl:if test="string-length(@anchor)=0">
-      <xsl:if test="string-length(@idref)=0">
-        <!--xsl:apply-templates/-->
-      </xsl:if>
-      <xsl:if test="string-length(@idref)>0">
-        <a href="{@idref}.html"><xsl:apply-templates/></a>
-      </xsl:if>
-    </xsl:if>
-
-    <xsl:if test="string-length(@anchor)>0">
-      <xsl:if test="string-length(@idref)=0">
-        <a href="#{@anchor}"><xsl:apply-templates/></a>
-      </xsl:if>
-      <xsl:if test="string-length(@idref)>0">
-        <a href="{@idref}.html#{@anchor}"><xsl:apply-templates/></a>
-      </xsl:if>
-    </xsl:if>
-  </xsl:template>
-
-  <xsl:template match="anchor">
-    <a name="{@name}"><xsl:comment>anchor</xsl:comment></a>
-  </xsl:template>
-
-  <xsl:template match="jump">
-    <a href="{@href}"><xsl:apply-templates/></a>
-  </xsl:template>
-
-  <xsl:template match="/s1/s2//img">
-    <center><img src="images/{@src}"/></center>
-  </xsl:template>
-
-  <xsl:template match="resource-ref">
-    <xsl:variable name="resourceFile" 
-          select="document($stylebook.project)/book/resources/@source"/>
-    <xsl:variable name="xref" select="@idref"/>
-    <xsl:variable name="href"
-          select="document($resourceFile)/resources/resource[@id=$xref]/@location"/>
-    <xsl:variable name="label"
-          select="document($resourceFile)/resources/resource[@id=$xref]/@title"/>
-    <A href="{$href}" target="_top"><xsl:value-of select="$label"/></A>
-  </xsl:template>
-
-  <xsl:template match="human-resource-ref">
-    <xsl:variable name="resourceFile" 
-          select="document($stylebook.project)/book/resources/@source"/>  
-    <xsl:variable name="ref"  select="@idref"/>
-    <xsl:variable name="mailto"
-          select="document($resourceFile)/resources/human-resource[@id=$ref]/@mailto"/>
-   <xsl:variable name="name"
-          select="document($resourceFile)/resources/human-resource[@id=$ref]/@name"/>                          
-    <A href="mailto:{$mailto}"><xsl:value-of select="$name"/></A>
-  </xsl:template>
-
-<!-- ###################################################################### -->
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/xdocs/style/stylesheets/done.xsl b/xdocs/style/stylesheets/done.xsl
deleted file mode 100644
index 4f4b9d2..0000000
--- a/xdocs/style/stylesheets/done.xsl
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!DOCTYPE xsl:stylesheet>
-
-<!-- XSL Style sheet, DTD omitted -->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    xmlns:lxslt="http://xml.apache.org/xslt"
-    xmlns:redirect="org.apache.xalan.lib.Redirect"
-    extension-element-prefixes="redirect">
-
-  <xsl:output method="xml"/>
-  
-  <xsl:param name="xsltcdone" select="'.\XSLTCDONE'"/>
-  
-  <xsl:template match="Commits">
-  <xsl:comment>This XML fragment contains a list of source code updates to place in an &lt;s3&gt; section of readme.xml</xsl:comment>
-    <xsl:if test="count(Commit[@category='core'])>0">
-      <p> Core (Non-XSLTC) source code updates:</p>
-      <ul>
-      <xsl:for-each select="Commit[@category='core']">
-        <li><xsl:apply-templates select="Who|DateCommitted|Modified|Added|Removed|Log"/></li>
-      </xsl:for-each>
-      </ul>
-    </xsl:if>
-    <xsl:if test="count(Commit[@category='core'])=0">
-      <note>This release includes no updates of the non-XSLTC core source code.</note>
-    </xsl:if>
-    
-    <xsl:if test="count(Commit[@category='xsltc'])>0">
-      <redirect:write file="{$xsltcdone}">
-        <p>XSLTC source code updates:</p>
-        <ul>
-        <xsl:for-each select="Commit[@category='xsltc']">
-          <li><xsl:apply-templates select="Who|DateCommitted|Modified|Added|Removed|Log"/></li>
-        </xsl:for-each>
-        </ul>
-      </redirect:write>
-    </xsl:if>    
-    <xsl:if test="count(Commit[@category='xsltc'])=0">
-      <redirect:write file="{$xsltcdone}">
-        <note>This release includes no updates of the XSLTC source code.</note>
-      </redirect:write>
-    </xsl:if>
-    
-  </xsl:template>
-  
-  <xsl:template match="Who">
-    <ref>Committed by </ref><xsl:value-of select="."/>
-  </xsl:template>
-  <xsl:template match="DateCommitted">
-    <ref> on </ref><xsl:value-of select="."/><br/>
-  </xsl:template>    
-  <xsl:template match="Modified">    
-    <ref>Modified: </ref><xsl:value-of select="."/><br/>
-  </xsl:template>    
-  <xsl:template match="Added">    
-    <ref>Added: </ref><xsl:value-of select="."/><br/>
-  </xsl:template>    
-  <xsl:template match="Removed">    
-    <ref>Removed: </ref><xsl:value-of select="."/><br/>
-  </xsl:template>    
-    <xsl:template match="Log">    
-    <ref>Committer's log entry: </ref><xsl:value-of select="."/><br/><br/>
-  </xsl:template>
-  
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/xdocs/style/stylesheets/spec.xsl b/xdocs/style/stylesheets/spec.xsl
deleted file mode 100644
index 26d73bd..0000000
--- a/xdocs/style/stylesheets/spec.xsl
+++ /dev/null
@@ -1,220 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!DOCTYPE xsl:stylesheet [
-<!ENTITY copy   "&#169;">
-<!ENTITY nbsp   "&#160;">
-]>
-
-<!-- XSL Style sheet, DTD omitted -->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:redirect="org.apache.xalan.lib.Redirect"
-                extension-element-prefixes="redirect">
-  <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN"/>
-  
-  <xsl:param name="package-root" select="'../../../src/'"/>  <!-- root of destination for package.html files -->
-
-  <xsl:template match="spec">
-    <html>
-      <head>
-        <title>
-          <xsl:value-of select="header/title"/>
-        </title>
-      </head>
-      <body>
-        <xsl:apply-templates/>
-      </body>
-    </html>
-  </xsl:template>
-  
-  <xsl:template match="spec/title[1]">
-    <h1><xsl:apply-templates/></h1>
-  </xsl:template>
-
-  <xsl:template match="frontmatter/pubdate">
-    <p><b>Edit Date: </b><xsl:apply-templates/></p>
-  </xsl:template>
-
-  <xsl:template match="frontmatter/copyright">
-    <!-- p>&copy;<xsl:apply-templates/></p -->
-  </xsl:template>
-
-  <xsl:template match="frontmatter/author">
-  </xsl:template>
-  
-  <xsl:template match="spec/title">
-    <h2>
-      <xsl:choose>
-        <xsl:when test="@id">
-          <a name="@id">
-            <xsl:apply-templates/>
-          </a>
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:apply-templates/>
-        </xsl:otherwise>
-      </xsl:choose>
-    </h2>
-  </xsl:template>
-  
-  <xsl:template name="apply-id-templates">
-    <xsl:choose>
-      <xsl:when test="@id">
-        <a name="{@id}">
-          <xsl:apply-templates/>
-        </a>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:apply-templates/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-  
-  <xsl:template match="sect2/title | spec/*/title">
-    <h3>
-      <xsl:call-template name="apply-id-templates"/>
-    </h3>
-  </xsl:template>
-  
-  <xsl:template match="sect3/title">
-    <h4>
-      <xsl:call-template name="apply-id-templates"/>
-    </h4>
-  </xsl:template>
-
-  <xsl:template match="sect4/title">
-    <h5>
-      <xsl:call-template name="apply-id-templates"/>
-    </h5>
-  </xsl:template>
-  
-  <xsl:template match="para">
-    <p><xsl:apply-templates/></p>
-  </xsl:template>
-
-  <xsl:template match="variablelist">
-    <ul>
-    <xsl:for-each select="varlistentry">
-      <li>
-        <p><b><xsl:apply-templates select="term"/></b><br/>
-        <xsl:apply-templates select="listitem"/></p>
-      </li>
-    </xsl:for-each>
-    </ul>
-  </xsl:template>
-
-  <xsl:template match="orderedlist">
-    <ol>
-    <xsl:for-each select="listitem">
-      <li><xsl:apply-templates/></li>
-    </xsl:for-each>
-    </ol>
-  </xsl:template>
-
-  <xsl:template match="patterns">
-    <H3><xsl:value-of select="@module"/><xsl:text> </xsl:text>Patterns</H3>
-    <ul>
-      <xsl:for-each select="pattern">
-        <p>
-          <b>
-            <xsl:for-each select="pattern-name">
-              <xsl:call-template name="apply-id-templates"/>
-            </xsl:for-each>
-          </b>
-          <br/>
-        <xsl:apply-templates select="*[name() != 'pattern-name']"/></p>
-      </xsl:for-each>
-    </ul>
-  </xsl:template>
-  
-  <xsl:template match="pattern/intent">
-    <br/><i>Intent: </i><xsl:apply-templates/>
-  </xsl:template>
-  
-  <xsl:template match="pattern/responsibilities">
-    <br/><i>Responsibilities: </i><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="pattern/potential-alternate-name">
-    <br/><i>Potential alternate name: </i><xsl:apply-templates/>
-  </xsl:template>
-  
-  <xsl:template match="pattern/thread-safety">
-    <br/><i>Thread safety: </i><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="pattern/notes">
-    <br/><i>Notes: </i><xsl:apply-templates/>
-  </xsl:template>
-
-  <xsl:template match="programlisting">
-    <code>
-    <pre>
-      <xsl:apply-templates/>
-    </pre>
-    </code>
-  </xsl:template>
-  
-  <xsl:template match="link">
-    <A href="#{@linkend}">
-      <xsl:apply-templates/>
-    </A>
-  </xsl:template>
-  <xsl:template match="ulink">
-    <A href="{@url}">
-      <xsl:apply-templates/>
-    </A>
-  </xsl:template>
-
-  <xsl:template match="termref">
-    <xsl:choose>
-      <xsl:when test="@link-url">
-        <A href="#{@link-url}">
-          <xsl:value-of select="."/>
-        </A>
-      </xsl:when>
-      <xsl:otherwise>
-        <U><xsl:value-of select="."/></U>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-  
-  <xsl:template match="plink">
-    <xsl:text>{@link </xsl:text>
-      <xsl:value-of select="."/>
-    <xsl:text>}</xsl:text>
-  </xsl:template>
-  
-  <xsl:template match="sect1[@id='package']">
-    <xsl:variable name="filename" select="concat($package-root,translate(title,'.', '/'),'/package.html')"/>
-    <redirect:write file="{$filename}">
-      <xsl:call-template name="sub-package"/>
-    </redirect:write>
-  </xsl:template>
-  
-  <xsl:template match="sect2[@id='specialized-packages']">
-    <xsl:message>Found specialized-packages</xsl:message>
-    <xsl:for-each select="sect3">
-	  <xsl:variable name="filename" select="concat($package-root,translate(title,'.', '/'),'/package.html')"/>
-      <redirect:write file="{$filename}">
-        <xsl:call-template name="sub-package"/>
-      </redirect:write>
-    </xsl:for-each>
-  </xsl:template>
-  
-  <xsl:template name="sub-package">
-    <html>
-       <head>
-         <title>
-           <xsl:value-of select="title"/>
-         </title>
-       </head>
-       <body>
-         <xsl:apply-templates select="*[not (name()='title')]"/>
-       </body>
-     </html>
-  </xsl:template>
-
-
-</xsl:stylesheet>
-
diff --git a/xdocs/style/stylesheets/xml2fo.xsl b/xdocs/style/stylesheets/xml2fo.xsl
deleted file mode 100644
index c05930d..0000000
--- a/xdocs/style/stylesheets/xml2fo.xsl
+++ /dev/null
@@ -1,489 +0,0 @@
-<?xml version="1.0"?>
-
-<!--    XSLT stylesheet to convert the Xalan documentation collected in one xml file into a fo file
-        for use in FOP 
-
-TBD: - The faq doesn't show in the content
-     - check why margin-bottom on the page with properties is too large
-     - check why keep-next not only doesn't work, but leads to repeating already printed lines
-     - make lines containing only code look nicer (smaller line height)
-     - replace bullets in ordered lists with numbers
-     - correct the hack replacing nbsp with '-'
-     - handle the links correctly which have been external in the html doc and are now internal
-
--->
-
-<xsl:stylesheet
-     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
-     xmlns:fo="http://www.w3.org/1999/XSL/Format">
-     
-     <!-- to use with document() to get resources.xml -->
-    <xsl:param name="resourceFile" select="'../../sources/xalan/resources.xml'"/>
-    <xsl:param name="project" select="Xalan"/>
-              
-<xsl:template match ="/">
-	<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-
-	  <!-- defines page layout -->
-	  <fo:layout-master-set>
-		<fo:simple-page-master master-name="simple"
-							   page-height="29.7cm" 
-							   page-width="21cm"
-							   margin-top="1.5cm" 
-							   margin-bottom="2cm" 
-							   margin-left="2.5cm" 
-							   margin-right="2.5cm">
-		  <fo:region-body margin-top="3cm"/>
-		  <fo:region-before extent="1.5cm"/>
-		  <fo:region-after extent="1.5cm"/>
-		</fo:simple-page-master>
-	  </fo:layout-master-set>
-
-	  <fo:page-sequence master-name="simple">
-		<fo:static-content flow-name="xsl-region-before">
-			<fo:block text-align="end" 
-			    	  font-size="10pt" 
-					  font-family="serif" 
-					  line-height="14pt" >
-				<xsl:value-of select="$project"/> documentation - p. <fo:page-number/>
-			</fo:block>
-		</fo:static-content> 
-
-		<fo:flow flow-name="xsl-region-body">
-
-          <fo:block font-size="18pt" 
-                    font-family="sans-serif" 
-                    line-height="24pt"
-                    space-after.optimum="15pt"
-                    background-color="blue"
-                    color="white"
-                    text-align="center">
-            <xsl:value-of select="$project"/> - an XSL Transformer
-          </fo:block>
-
-
-        <!-- generates table of contents and puts it into a table -->
-
-         <fo:block font-size="14pt" 
-                  font-family="sans-serif" 
-                  line-height="18pt"
-                  space-after.optimum="10pt"
-                  font-weight="bold"
-                  start-indent="15pt">
-            Content
-         </fo:block>
-
-         <fo:table>
-            <fo:table-column column-width="1cm"/>
-            <fo:table-column column-width="10cm"/>
-            <fo:table-column column-width="5cm"/>
-            <fo:table-body font-size="12pt" 
-                           line-height="16pt"
-                           font-family="sans-serif">
-              <fo:table-row>
-                  <fo:table-cell>
-                     <fo:block text-align="end" >
-                     </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell>
-                     <fo:block text-align="end" >
-                     </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell>
-                     <fo:block text-align="end" >
-                     page
-                     </fo:block>
-                  </fo:table-cell>
-              </fo:table-row>                                 
-              <xsl:for-each select="documentation/chapter"> 
-                <fo:table-row>
-                  <fo:table-cell>
-                     <fo:block text-align="end" >
-                        <xsl:number value="position()" format="I"/>.  
-                     </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell>
-                     <fo:block  text-align="start" >
-                        <fo:basic-link color="blue">
-                           <xsl:attribute name="internal-destination">
-                           <xsl:value-of select="@id"/>
-                           </xsl:attribute>
-                          <xsl:value-of select="s1/@title|faqs/@title"/>
-                        </fo:basic-link>
-                     </fo:block>
-                  </fo:table-cell>
-                  <fo:table-cell>
-                     <fo:block text-align="end">                                
-                       <fo:page-number-citation ref-id="{@id}"/>
-                     </fo:block>
-                  </fo:table-cell>
-               </fo:table-row>
-            </xsl:for-each>
-            </fo:table-body>
-         </fo:table>
-		 <xsl:apply-templates/> 
-	   </fo:flow>
-	   </fo:page-sequence>
-	</fo:root>
-</xsl:template>
-
-<!--chapter-->
-<xsl:template match="chapter">
-  <fo:block id="{@id}" break-before="page"/>
-	<xsl:apply-templates/>   
-</xsl:template>  
-
-<!-- s1 -->
-<xsl:template match ="s1">
-   <fo:block font-size="18pt" 
-            font-family="sans-serif" 
-            line-height="24pt"
-            space-before.optimum="15pt"
-            space-after.optimum="15pt"
-            background-color="blue"
-            color="white"
-            keep-with-next.within-page="always"
-            text-align="center">
-     <xsl:attribute name="id">
-     <xsl:value-of select="translate(@title,' ),-.(','____')"/>
-     </xsl:attribute>
-     <xsl:value-of select="@title"/>
-   </fo:block>
-    <xsl:apply-templates/> 
-</xsl:template>
-
-<!-- s2 -->
-<xsl:template match ="s2">
-   <fo:block font-size="16pt" 
-            font-family="sans-serif" 
-            line-height="20pt"
-            keep-with-next.within-page="always"            
-            space-before.optimum="15pt"
-            space-after.optimum="12pt"
-            text-align="start"
-            padding-top="3pt"
-            >
-     <xsl:value-of select="@title"/>
-   </fo:block>
-    <xsl:apply-templates/> 
-</xsl:template>
-
-<!-- s3 -->
-<xsl:template match ="s3">
-   <fo:block font-size="14pt" 
-            font-family="sans-serif" 
-            line-height="18pt"
-            keep-with-next.within-page="always"
-            space-before.optimum="10pt"
-            space-after.optimum="9pt"
-            text-align="start"
-            padding-top="3pt">
-     <xsl:value-of select="@title"/>
-   </fo:block>
-    <xsl:apply-templates/> 
-</xsl:template>
-
-<!-- p  [not(code)] -->
-<xsl:template match ="p"> 
-   <fo:block font-size="11pt" 
-            font-family="sans-serif" 
-            line-height="13pt"
-            space-after.optimum="3pt"
-            space-before.optimum="3pt"
-            text-align="start">
-     <xsl:apply-templates/> 
-   </fo:block>
-</xsl:template>
-
-<xsl:template match ="note"> 
-   <fo:block font-size="11pt" 
-            font-family="sans-serif" 
-            font-weight="italic"
-            line-height="13pt"
-            space-after.optimum="3pt"
-            space-before.optimum="3pt"
-            text-align="start">
-        Note:     
-     <xsl:apply-templates/> 
-   </fo:block>
-</xsl:template>
-
-<xsl:template match="anchor">
-  <fo:block> <!--id="concat(local-name(ancestor::node()="chapter"/@id.,'_',{./@name}"/-->
-    <xsl:attribute name="id">
-      <xsl:value-of select="concat(ancestor::chapter/@id,'_',./@name)"/>
-    </xsl:attribute>
-  </fo:block>    
-</xsl:template>
-
-<xsl:template match="table">
-  <xsl:variable name="colwidth" select="14.5 div count(tr[1]/td)"/>
-  <fo:table>
-  <xsl:for-each select="tr[1]/td">
-    <fo:table-column column-width="{$colwidth}cm"/>
-  </xsl:for-each>
-  <fo:table-body font-size="10pt" font-family="sans-serif">
-  <xsl:apply-templates/>
-  </fo:table-body>
-  </fo:table>  
-</xsl:template>  
-<xsl:template match="tr">
-  <fo:table-row>
-    <xsl:apply-templates/>
-  </fo:table-row>
-</xsl:template>
-<xsl:template match="td">
-  <fo:table-cell>
-    <fo:block>
-      <xsl:apply-templates/>
-    </fo:block>
-   </fo:table-cell>
-</xsl:template>
-
-<!-- p + code 
-<xsl:template match ="p[code]">
-   <fo:block font-size="11pt" 
-            font-family="sans-serif" 
-            line-height="11pt"
-            space-after.optimum="0pt"
-            space-before.optimum="0pt"
-            text-align="start">
-     <xsl:apply-templates/> 
-   </fo:block>
-</xsl:template>
--->
-
-<xsl:template match="img">
-  <fo:block>
-    <fo:external-graphic src="file:build/docs/images/{@src}"/>
-  </fo:block>
-</xsl:template>
-
-<!-- faqs -->
-<xsl:template match ="faqs">
-   <fo:block font-size="18pt" 
-            font-family="sans-serif" 
-            line-height="24pt"
-            space-before.optimum="15pt"
-            space-after.optimum="15pt"
-            background-color="blue"
-            color="white"
-            text-align="center"
-            >
-     <xsl:attribute name="id">
-     <xsl:value-of select="translate(.,' ),-.(','____')"/>
-     </xsl:attribute>
-     <xsl:value-of select="@title"/>
-   </fo:block>
-    <xsl:apply-templates/> 
-</xsl:template>
-
-<!-- faq -->
-<xsl:template match ="faq">
-    <xsl:apply-templates/> 
-</xsl:template>
-
-<!-- q in faq -->
-<xsl:template match="q">
-   <fo:block font-size="14pt" 
-            font-family="sans-serif" 
-            line-height="18pt"
-            keep-with-next.within-page="always"
-            space-before.optimum="10pt"
-            space-after.optimum="9pt"
-            text-align="start"
-            padding-top="3pt">     
-      <xsl:apply-templates/> 
-    </fo:block>
-</xsl:template>
-
-<!-- a in faq -->
-<xsl:template match ="a">
-      <xsl:apply-templates/> 
-</xsl:template>
-
-
-<!-- jump (links) -->
-<xsl:template match ="jump">
-  <fo:basic-link color="blue">
-     <xsl:attribute name="external-destination">
-       <xsl:if test="starts-with(@href,'apidocs')">
-         <xsl:value-of select="concat('http://xml.apache.org/xalan-j/',@href)"/>
-       </xsl:if>
-       <xsl:if test="not(starts-with(@href,'apidocs'))">
-         <xsl:value-of select="@href"/>
-       </xsl:if>    
-     </xsl:attribute>  
-   <xsl:value-of select="./text()"/>
-     <!--xsl:apply-templates/--> 
-   </fo:basic-link>
-</xsl:template>
-
-  <xsl:template match="link">
-    <xsl:if test="string-length(@anchor)=0">
-      <xsl:if test="string-length(@idref)=0">
-        <xsl:apply-templates/>
-      </xsl:if>
-      <xsl:if test="string-length(@idref)>0">
-        <fo:basic-link color="blue" internal-destination="{@idref}">
-        <xsl:value-of select="./text()"/></fo:basic-link>
-      </xsl:if>
-    </xsl:if>
-
-    <xsl:if test="string-length(@anchor)>0">
-      <xsl:if test="string-length(@idref)=0">
-        <fo:basic-link color="blue"
-                      internal-destination="{concat(ancestor::chapter/@id,'_',@anchor)}">
-        <xsl:value-of select="./text()"/></fo:basic-link>
-      </xsl:if>
-      <xsl:if test="string-length(@idref)>0">
-        <fo:basic-link color="blue" internal-destination="{@idref}_{@anchor}">
-        <xsl:value-of select="./text()"/></fo:basic-link>
-      </xsl:if>
-    </xsl:if>
-  </xsl:template>
-
-
-<xsl:template match="resource-ref">
-  <xsl:variable name="xref" select="@idref"/>
-  <xsl:variable name="href"
-          select="document($resourceFile)/resources/resource[@id=$xref]/@location"/>
-  <xsl:variable name="label"
-          select="document($resourceFile)/resources/resource[@id=$xref]/@title"/>
-  <fo:basic-link color="blue">
-     <xsl:attribute name="external-destination">
-       <xsl:if test="starts-with($href,'apidocs')">
-         <xsl:value-of select="concat('http://xml.apache.org/xalan-j/',$href)"/>
-       </xsl:if>
-       <xsl:if test="not(starts-with($href,'apidocs'))">
-         <xsl:value-of select="$href"/>
-       </xsl:if>    
-     </xsl:attribute>  
-     <xsl:value-of select="$label"/>
-     <!--xsl:apply-templates/--> 
-   </fo:basic-link>        
-  </xsl:template>
-
-  <xsl:template match="human-resource-ref">
-    <xsl:variable name="resourceFile" 
-          select="./xalan/resources.xml"/>  
-    <xsl:variable name="ref"  select="@idref"/>
-    <xsl:variable name="mailto"
-          select="document($resourceFile)/resources/human-resource[@id=$ref]/@mailto"/>
-    <xsl:variable name="name"
-          select="document($resourceFile)/resources/human-resource[@id=$ref]/@name"/>
-  <fo:basic-link color="blue" external-destination="mailto:{$mailto}">
-     <xsl:value-of select="$name"/>
-     <!--xsl:apply-templates/--> 
-   </fo:basic-link>          
-  </xsl:template>
-
-<xsl:template match ="source"> 
-   <fo:block font-size="10pt" 
-            font-family="Courier" 
-            text-align="start"
-            white-space-collapse="false">
-     <xsl:apply-templates/> 
-   </fo:block>
-
-</xsl:template>
-  <xsl:template match ="br">
-  <fo:block></fo:block>
-</xsl:template>
-
-<!-- code -->
-<xsl:template match ="*/code">
-   <fo:inline font-size="10pt" 
-            font-family="Courier">
-     <xsl:apply-templates/> 
-   </fo:inline>
-</xsl:template>
-
-<!-- ul (unordered list) -->
-<xsl:template match ="ul">
-  <fo:list-block start-indent="1cm" 
-                 provisional-distance-between-starts="12pt" 
-                 font-family="sans-serif" 
-                 font-size="11pt" 
-                 line-height="11pt">
-     <xsl:apply-templates/> 
-   </fo:list-block>
-</xsl:template>         
-          
-<!-- ol (ordered list) -->
-<xsl:template match ="ol">
-  <fo:list-block start-indent="1cm" 
-                 provisional-distance-between-starts="12pt" 
-                 font-family="sans-serif" 
-                 font-size="11pt" 
-                 line-height="11pt">
-     <xsl:apply-templates/> 
-   </fo:list-block>
-</xsl:template>
-
-
-<!-- li (list item) in unordered list -->
-<xsl:template match ="ul/li">
-    <fo:list-item>
-      <fo:list-item-label>
-        <fo:block><fo:inline font-family="Symbol">&#183;</fo:inline></fo:block>
-      </fo:list-item-label>
-      <fo:list-item-body>
-        <fo:block space-after.optimum="4pt"
-              text-align="start"
-              padding-top="3pt">
-          <xsl:apply-templates/> 
-       </fo:block>
-      </fo:list-item-body>
-    </fo:list-item>
-</xsl:template>
-
-<!-- li (list item) in ordered list -->
-<xsl:template match ="ol/li">
-    <fo:list-item>
-      <fo:list-item-label>
-        <fo:block>
-          <xsl:number level="multiple" count="li" format="1"/>)
-        </fo:block>
-      </fo:list-item-label>
-      <fo:list-item-body>
-        <fo:block space-after.optimum="4pt"
-              text-align="start"
-              padding-top="3pt">
-          <xsl:apply-templates/> 
-       </fo:block>
-      </fo:list-item-body>
-    </fo:list-item>
-</xsl:template>
-
-<!-- temporary kludge for definition list gloss with label-item pairs ) -->
-
-<xsl:template match="gloss">
-  <xsl:apply-templates/>
-</xsl:template>
-<xsl:template match="label">
-   <fo:block font-size="11pt" 
-            font-family="sans-serif" 
-            line-height="13pt"
-            space-after.optimum="3pt"
-            space-before.optimum="6pt"
-            text-align="start">
-     <xsl:apply-templates/> 
-   </fo:block>
-</xsl:template> 
-<xsl:template match="item">
-   <fo:block font-size="11pt" 
-            font-family="sans-serif" 
-            line-height="13pt"
-            space-after.optimum="6pt"
-            space-before.optimum="0pt"
-            margin-left="24pt"
-            text-align="start">
-     <xsl:apply-templates/>
-     <fo:block></fo:block> 
-   </fo:block>
-</xsl:template> 
-
-<!-- end body -->
-
-</xsl:stylesheet>
diff --git a/xdocs/xml-site-style.tar.gz b/xdocs/xml-site-style.tar.gz
deleted file mode 100644
index f477a84..0000000
--- a/xdocs/xml-site-style.tar.gz
+++ /dev/null
Binary files differ
diff --git a/xsltc_todo.xml b/xsltc_todo.xml
deleted file mode 100644
index 7448f93..0000000
--- a/xsltc_todo.xml
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0"?>
-
-<todo title="Things To Do" project="XSLTC" major-version="1">
-
-  <devs>
-   <person name="Jacek Ambroziak" email="jacek_ambroziak@yahoo.com" id="JA" expertise="code">
-     Inventor, architect, former lead developer and evangelist.
-   </person>  
-   <person name="Tom Amiro" email="Tom.Amiro@Sun.COM" id="TA" expertise="testing">
-     Testing.
-   </person>  
-   <person name="Morten J&#216;rgensen" email="morten@xml.apache.org" id="MJ" expertise="code, doc">
-     Lead developer - key contributor on design documentation, ID/Keys, performance, JAXP, and continuing development in general.
-   </person>
-   <person name="G. Todd Miller" email="Glenn.Miller@Sun.COM" id="TM" expertise="code">
-     Developer - key contributor on TrAX.
-   </person>
-   <person name="Santiago Pericas-Geertsen" email="santiago@cs.bu.edu" id="SP" expertise="code">
-     Developer - key contributor on compilation strategy.
-   </person>
-  </devs>
- 
-  <actions>
-
-   <target-release-description>
-    <date>09/??/01</date>
-    <level>????</level>
-    <goal type="conformance">XSLT 1.0 compliant 100%.</goal>
-    <goal type="performance">Maintain current level.</goal>
-    <goal type="stability"> Stable, reasonable.</goal>
-    <goal type="api">API Complete.</goal>
-    <goal type="documentation">Documentation functionally complete.</goal>
-   </target-release-description>
-   
-  <action context="test, packages:org.apache.xalan.xsltc"
-          category="tests"
-          who="TA, Shane"
-          priority="high">
-     Modify Xalan test enviroment to test XSLTC as a component of XalanJ2.
-   </action>       
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="feature"
-          who="MJ"
-          priority="high">
-       Finish the implementation of id() and key() in patterns.   
-   </action>       
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bug"
-          who="??"
-          priority="high">
-      Continue to improve the handling of name spaces. There are a number of
-      bugs that are independent of the lack of namespace nodes.  
-     (bugzilla 1411, 1506, 1518, 2582, 2801, 2857, 2859, 2863, 2535, 2954, 2840)    
-   </action>       
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bug"
-          who="??"
-          priority="high">
-    Fix bugs that impact the XSLTMark performance benchmark.
-    (bugzilla 1376, 1498, 1512, 1532, 2351, 2517, 2553, 3065, 3066).          
-   </action>
-        
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bugs"
-          who="TM"
-          priority="high">
-       Fix bugs reflecting positional problems (1410, 1532, 2939).          
-   </action>
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bug"
-          who="TM"
-          priority="high">
-      Fix bugs on dealing with XPATH/Axes expressions (1498, 2551, 2553, 2572, 2932).          
-   </action>       
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bug"
-          who="??"
-          priority="medium">
-      Fix bugs involving template selection (1397, 2749, 2582, 2585, 2695, 2749, 2754, 2886, 2937).
-   </action>
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bug"
-          who="??"
-          priority="medium">
-      Fix bugs affecting numbering (2901, 2931).
-   </action>
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="bug"
-          who="??"
-          priority="medium">
-      Fix bugs affecting comment and processing-intruction nodes (2599, 2834, 2858).
-   </action>
-
-  <action context="code, packages:org.apache.xalan.xsltc"
-          category="feature"
-          who="MJ"
-          priority="low">
-     Implement name space nodes (bugzilla 1379).
-   </action>       
-
-  <action context="code, packages:????"
-          category="feature, integration with Xalan"
-          who="??"
-          priority="medium">
-      Implement an extension to support the redirection of output to multiple
-      output files from within a stylesheet (equivalent to xalan:redirect or
-      saxon:output).  Note: Task may be implemented as a result of integrating Xsltc and Xalan 
-     and using shared code.
-   </action>       
-
-
-  <action context="code, packages:????"
-          category="feature, integration with Xalan"
-          who="??"
-          priority="medium">
-     Implement a node-set extension to convert result tree fragments to
-     node-sets. This enables sorting and grouping of nodes assigned to a tree 
-     variable. Note: Task may be implemented as a result of integrating Xsltc and Xalan 
-     and using shared code.
-   </action>       
-
-
-  <action context="code, packages:????"
-          category="feature, integration with Xalan"
-          who="??"
-          priority="medium">
-      Add support for nonstatic external Java functions.  
-      Note: Task may be implemented as a result of integrating Xsltc and Xalan 
-      and using shared code.
-   </action>       
-
-
-  <action context="code, packages:????"
-          category="feature, integration with Xalan"
-          who="??"
-          priority="medium">
-    Fix bugs affecting the correctness of ouput 
-    (1439, 1504, 1512, 1516, 1520, 1525, 2517, 2520, 2578, 2948, 2951, 2952, 2954, 3005, 3065).
-     Note: Task may be implemented as a result of integrating Xsltc and Xalan 
-     and using shared code.
-   </action>       
-
-  <action context="code, AST"
-          category="architecture"
-          who="??"
-          priority="medium">
-    Use SAX to build the AST. The DOM builder
-   (the real DOM builder, not our quasi-DOM builder) receives SAX
-   events when it builds the DOM. The compiler.Parser class could
-   possible receive these SAX events directly, and thereby eliminating
-   the need for a DOM (saves loads of time and memory).
-   </action>
-   
-   <action context="code, DOM"
-           category="architecture"
-           who="??"
-           priority="medium">
-      Consider building a DOM-2-'DOM' converter, perhaps by adding 
-      a second DOM builder inner class to our DOM. Then we would have 
-      one SAX DOM builder and one DOM DOM builder. I don't know if
-      JAXP lets you supply the stylesheet as a DOM. If it doesn't, 
-      we should assign this task a very low priority. There is no
-      point in spending a lot of time on this if JAXP users will 
-      never be able to use this functionality.
-    </action>       
-
-  </actions>
-</todo>
