diff --git a/src/MANIFEST.SERIALIZER b/src/MANIFEST.SERIALIZER
index eb5dfb3..8d6eb9c 100644
--- a/src/MANIFEST.SERIALIZER
+++ b/src/MANIFEST.SERIALIZER
@@ -1,20 +1,20 @@
-Manifest-Version: 1.0
-Created-By: @java.version@ (@java.vendor@)
-Main-Class: org.apache.xml.serializer.Version
-Class-Path: xml-apis.jar
-
-Name: org/apache/xml/serializer/
-Comment: Serializer to write out XML, HTML etc. as a stream of characters from an input DOM or from input SAX events.
-Specification-Title: XSL Transformations (XSLT), at http://www.w3.org/TR/xslt
-Specification-Vendor: W3C Recommendation 16 November 1999
-Specification-Version: 1.0
-Implementation-Title: org.apache.xml.serializer
-Implementation-Version: @impl.version@
-Implementation-Vendor: Apache Software Foundation
-Implementation-URL: http://xml.apache.org/xalan-j/usagepatterns.html
-
-Name: org/apache/xml/serializer/utils/
-Comment: Utilities used internally by the Serializer. Not for external use.
-Implementation-Title: org.apache.xml.serializer.utils
-Implementation-Version: @impl.version@
-Implementation-Vendor: Apache Software Foundation
+Manifest-Version: 1.0
+Created-By: @java.version@ (@java.vendor@)
+Main-Class: org.apache.xml.serializer.Version
+Class-Path: xml-apis.jar
+
+Name: org/apache/xml/serializer/
+Comment: Serializer to write out XML, HTML etc. as a stream of characters from an input DOM or from input SAX events.
+Specification-Title: XSL Transformations (XSLT), at http://www.w3.org/TR/xslt
+Specification-Vendor: W3C Recommendation 16 November 1999
+Specification-Version: 1.0
+Implementation-Title: org.apache.xml.serializer
+Implementation-Version: @impl.version@
+Implementation-Vendor: Apache Software Foundation
+Implementation-URL: http://xml.apache.org/xalan-j/usagepatterns.html
+
+Name: org/apache/xml/serializer/utils/
+Comment: Utilities used internally by the Serializer. Not for external use.
+Implementation-Title: org.apache.xml.serializer.utils
+Implementation-Version: @impl.version@
+Implementation-Vendor: Apache Software Foundation
diff --git a/src/org/apache/xalan/Version.src b/src/org/apache/xalan/Version.src
index f1fb77e..ae942c7 100644
--- a/src/org/apache/xalan/Version.src
+++ b/src/org/apache/xalan/Version.src
@@ -1,153 +1,153 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id$
- */
-package org.apache.xalan;
-
-/**
- * Administrative class to keep track of the version number of
- * the Xalan release.
- * <P>This class implements the upcoming standard of having
- * org.apache.project-name.Version.getVersion() be a standard way 
- * to get version information.  This class will replace the older 
- * org.apache.xalan.processor.Version class.</P>
- * <P>See also: org/apache/xalan/res/XSLTInfo.properties for 
- * information about the version of the XSLT spec we support.</P>
- * @xsl.usage general
- */
-public class Version
-{
-
-  /**
-   * Get the basic version string for the current Xalan release.
-   * Version String formatted like 
-   * <CODE>"<B>Xalan</B> <B>Java</B> v.r[.dd| <B>D</B>nn]"</CODE>.
-   *
-   * Futurework: have this read version info from jar manifest.
-   *
-   * @return String denoting our current version
-   */
-  public static String getVersion()
-  {
-     return getProduct()+" "+getImplementationLanguage()+" "
-           +getMajorVersionNum()+"."+getReleaseVersionNum()+"."
-           +( (getDevelopmentVersionNum() > 0) ? 
-               ("D"+getDevelopmentVersionNum()) : (""+getMaintenanceVersionNum()));  
-  }
-
-  /**
-   * Print the processor version to the command line.
-   *
-   * @param argv command line arguments, unused.
-   */
-  public static void main(String argv[])
-  {
-    System.out.println(getVersion());
-  }
-  
-  /**
-   * Name of product: Xalan.
-   */
-  public static String getProduct()
-  {
-    return "Xalan";
-  }
-
-  /**
-   * Implementation Language: Java.
-   */
-  public static String getImplementationLanguage()
-  {
-    return "Java";
-  }
-  
-  
-  /**
-   * Major version number.
-   * Version number. This changes only when there is a
-   *          significant, externally apparent enhancement from
-   *          the previous release. 'n' represents the n'th
-   *          version.
-   *
-   *          Clients should carefully consider the implications
-   *          of new versions as external interfaces and behaviour
-   *          may have changed.
-   */
-  public static int getMajorVersionNum()
-  {
-    return @version.VERSION@;
-    
-  }  
-
-  /**
-   * Release Number.
-   * Release number. This changes when:
-   *            -  a new set of functionality is to be added, eg,
-   *               implementation of a new W3C specification.
-   *            -  API or behaviour change.
-   *            -  its designated as a reference release.
-   */
-  public static int getReleaseVersionNum()
-  {
-    return @version.RELEASE@;
-  }
-  
-  /**
-   * Maintenance Drop Number.
-   * Optional identifier used to designate maintenance
-   *          drop applied to a specific release and contains
-   *          fixes for defects reported. It maintains compatibility
-   *          with the release and contains no API changes.
-   *          When missing, it designates the final and complete
-   *          development drop for a release.
-   */
-  public static int getMaintenanceVersionNum()
-  {
-    return @version.MINOR@;
-  }
-
-  /**
-   * Development Drop Number.
-   * Optional identifier designates development drop of
-   *          a specific release. D01 is the first development drop
-   *          of a new release.
-   *
-   *          Development drops are works in progress towards a
-   *          compeleted, final release. A specific development drop
-   *          may not completely implement all aspects of a new
-   *          feature, which may take several development drops to
-   *          complete. At the point of the final drop for the
-   *          release, the D suffix will be omitted.
-   *
-   *          Each 'D' drops can contain functional enhancements as
-   *          well as defect fixes. 'D' drops may not be as stable as
-   *          the final releases.
-   */
-  public static int getDevelopmentVersionNum()
-  { 
-    try {   
-        if ((new String("@version.DEVELOPER@")).length() == 0)
-          return 0;
-        else  
-          return Integer.parseInt("@version.DEVELOPER@");
-    } catch (NumberFormatException nfe) {
-           return 0;
-    }    
-  }      
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+package org.apache.xalan;
+
+/**
+ * Administrative class to keep track of the version number of
+ * the Xalan release.
+ * <P>This class implements the upcoming standard of having
+ * org.apache.project-name.Version.getVersion() be a standard way 
+ * to get version information.  This class will replace the older 
+ * org.apache.xalan.processor.Version class.</P>
+ * <P>See also: org/apache/xalan/res/XSLTInfo.properties for 
+ * information about the version of the XSLT spec we support.</P>
+ * @xsl.usage general
+ */
+public class Version
+{
+
+  /**
+   * Get the basic version string for the current Xalan release.
+   * Version String formatted like 
+   * <CODE>"<B>Xalan</B> <B>Java</B> v.r[.dd| <B>D</B>nn]"</CODE>.
+   *
+   * Futurework: have this read version info from jar manifest.
+   *
+   * @return String denoting our current version
+   */
+  public static String getVersion()
+  {
+     return getProduct()+" "+getImplementationLanguage()+" "
+           +getMajorVersionNum()+"."+getReleaseVersionNum()+"."
+           +( (getDevelopmentVersionNum() > 0) ? 
+               ("D"+getDevelopmentVersionNum()) : (""+getMaintenanceVersionNum()));  
+  }
+
+  /**
+   * Print the processor version to the command line.
+   *
+   * @param argv command line arguments, unused.
+   */
+  public static void main(String argv[])
+  {
+    System.out.println(getVersion());
+  }
+  
+  /**
+   * Name of product: Xalan.
+   */
+  public static String getProduct()
+  {
+    return "Xalan";
+  }
+
+  /**
+   * Implementation Language: Java.
+   */
+  public static String getImplementationLanguage()
+  {
+    return "Java";
+  }
+  
+  
+  /**
+   * Major version number.
+   * Version number. This changes only when there is a
+   *          significant, externally apparent enhancement from
+   *          the previous release. 'n' represents the n'th
+   *          version.
+   *
+   *          Clients should carefully consider the implications
+   *          of new versions as external interfaces and behaviour
+   *          may have changed.
+   */
+  public static int getMajorVersionNum()
+  {
+    return @version.VERSION@;
+    
+  }  
+
+  /**
+   * Release Number.
+   * Release number. This changes when:
+   *            -  a new set of functionality is to be added, eg,
+   *               implementation of a new W3C specification.
+   *            -  API or behaviour change.
+   *            -  its designated as a reference release.
+   */
+  public static int getReleaseVersionNum()
+  {
+    return @version.RELEASE@;
+  }
+  
+  /**
+   * Maintenance Drop Number.
+   * Optional identifier used to designate maintenance
+   *          drop applied to a specific release and contains
+   *          fixes for defects reported. It maintains compatibility
+   *          with the release and contains no API changes.
+   *          When missing, it designates the final and complete
+   *          development drop for a release.
+   */
+  public static int getMaintenanceVersionNum()
+  {
+    return @version.MINOR@;
+  }
+
+  /**
+   * Development Drop Number.
+   * Optional identifier designates development drop of
+   *          a specific release. D01 is the first development drop
+   *          of a new release.
+   *
+   *          Development drops are works in progress towards a
+   *          compeleted, final release. A specific development drop
+   *          may not completely implement all aspects of a new
+   *          feature, which may take several development drops to
+   *          complete. At the point of the final drop for the
+   *          release, the D suffix will be omitted.
+   *
+   *          Each 'D' drops can contain functional enhancements as
+   *          well as defect fixes. 'D' drops may not be as stable as
+   *          the final releases.
+   */
+  public static int getDevelopmentVersionNum()
+  { 
+    try {   
+        if ((new String("@version.DEVELOPER@")).length() == 0)
+          return 0;
+        else  
+          return Integer.parseInt("@version.DEVELOPER@");
+    } catch (NumberFormatException nfe) {
+           return 0;
+    }    
+  }      
+}
diff --git a/src/org/apache/xalan/res/XSLTErrorResources_sl.java b/src/org/apache/xalan/res/XSLTErrorResources_sl.java
old mode 100755
new mode 100644
index d77dcea..74fac02
--- a/src/org/apache/xalan/res/XSLTErrorResources_sl.java
+++ b/src/org/apache/xalan/res/XSLTErrorResources_sl.java
@@ -1,1517 +1,1517 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: XSLTErrorResources_sl.java 338081 2004-12-15 17:35:58Z jycli $
- */
-package org.apache.xalan.res;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Set up error messages.
- * We build a two dimensional array of message keys and
- * message strings. In order to add a new message here,
- * you need to first add a String constant. And
- *  you need to enter key , value pair as part of contents
- * Array. You also need to update MAX_CODE for error strings
- * and MAX_WARNING for warnings ( Needed for only information
- * purpose )
- */
-public class XSLTErrorResources_sl extends ListResourceBundle
-{
-
-/*
- * This file contains error and warning messages related to Xalan Error
- * Handling.
- *
- *  General notes to translators:
- *
- *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
- *     components.
- *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *     XSLTC is an acronym for XSLT Compiler.
- *
- *  2) A stylesheet is a description of how to transform an input XML document
- *     into a resultant XML document (or HTML document or text).  The
- *     stylesheet itself is described in the form of an XML document.
- *
- *  3) A template is a component of a stylesheet that is used to match a
- *     particular portion of an input document and specifies the form of the
- *     corresponding portion of the output document.
- *
- *  4) An element is a mark-up tag in an XML document; an attribute is a
- *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *     "elem" is an element name, "attr" and "attr2" are attribute names with
- *     the values "val" and "val2", respectively.
- *
- *  5) A namespace declaration is a special attribute that is used to associate
- *     a prefix with a URI (the namespace).  The meanings of element names and
- *     attribute names that use that prefix are defined with respect to that
- *     namespace.
- *
- *  6) "Translet" is an invented term that describes the class file that
- *     results from compiling an XML stylesheet into a Java class.
- *
- *  7) XPath is a specification that describes a notation for identifying
- *     nodes in a tree-structured representation of an XML document.  An
- *     instance of that notation is referred to as an XPath expression.
- *
- */
-
-  /*
-   * Static variables
-   */
-  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX =
-        "ER_INVALID_SET_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX";
-
-  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT =
-        "ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT";
-
-  public static final String ER_NO_CURLYBRACE = "ER_NO_CURLYBRACE";
-  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
-  public static final String ER_ILLEGAL_ATTRIBUTE = "ER_ILLEGAL_ATTRIBUTE";
-  public static final String ER_NULL_SOURCENODE_APPLYIMPORTS = "ER_NULL_SOURCENODE_APPLYIMPORTS";
-  public static final String ER_CANNOT_ADD = "ER_CANNOT_ADD";
-  public static final String ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES="ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES";
-  public static final String ER_NO_NAME_ATTRIB = "ER_NO_NAME_ATTRIB";
-  public static final String ER_TEMPLATE_NOT_FOUND = "ER_TEMPLATE_NOT_FOUND";
-  public static final String ER_CANT_RESOLVE_NAME_AVT = "ER_CANT_RESOLVE_NAME_AVT";
-  public static final String ER_REQUIRES_ATTRIB = "ER_REQUIRES_ATTRIB";
-  public static final String ER_MUST_HAVE_TEST_ATTRIB = "ER_MUST_HAVE_TEST_ATTRIB";
-  public static final String ER_BAD_VAL_ON_LEVEL_ATTRIB =
-         "ER_BAD_VAL_ON_LEVEL_ATTRIB";
-  public static final String ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
-         "ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
-  public static final String ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
-         "ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
-  public static final String ER_NEED_MATCH_ATTRIB = "ER_NEED_MATCH_ATTRIB";
-  public static final String ER_NEED_NAME_OR_MATCH_ATTRIB =
-         "ER_NEED_NAME_OR_MATCH_ATTRIB";
-  public static final String ER_CANT_RESOLVE_NSPREFIX =
-         "ER_CANT_RESOLVE_NSPREFIX";
-  public static final String ER_ILLEGAL_VALUE = "ER_ILLEGAL_VALUE";
-  public static final String ER_NO_OWNERDOC = "ER_NO_OWNERDOC";
-  public static final String ER_ELEMTEMPLATEELEM_ERR ="ER_ELEMTEMPLATEELEM_ERR";
-  public static final String ER_NULL_CHILD = "ER_NULL_CHILD";
-  public static final String ER_NEED_SELECT_ATTRIB = "ER_NEED_SELECT_ATTRIB";
-  public static final String ER_NEED_TEST_ATTRIB = "ER_NEED_TEST_ATTRIB";
-  public static final String ER_NEED_NAME_ATTRIB = "ER_NEED_NAME_ATTRIB";
-  public static final String ER_NO_CONTEXT_OWNERDOC = "ER_NO_CONTEXT_OWNERDOC";
-  public static final String ER_COULD_NOT_CREATE_XML_PROC_LIAISON =
-         "ER_COULD_NOT_CREATE_XML_PROC_LIAISON";
-  public static final String ER_PROCESS_NOT_SUCCESSFUL =
-         "ER_PROCESS_NOT_SUCCESSFUL";
-  public static final String ER_NOT_SUCCESSFUL = "ER_NOT_SUCCESSFUL";
-  public static final String ER_ENCODING_NOT_SUPPORTED =
-         "ER_ENCODING_NOT_SUPPORTED";
-  public static final String ER_COULD_NOT_CREATE_TRACELISTENER =
-         "ER_COULD_NOT_CREATE_TRACELISTENER";
-  public static final String ER_KEY_REQUIRES_NAME_ATTRIB =
-         "ER_KEY_REQUIRES_NAME_ATTRIB";
-  public static final String ER_KEY_REQUIRES_MATCH_ATTRIB =
-         "ER_KEY_REQUIRES_MATCH_ATTRIB";
-  public static final String ER_KEY_REQUIRES_USE_ATTRIB =
-         "ER_KEY_REQUIRES_USE_ATTRIB";
-  public static final String ER_REQUIRES_ELEMENTS_ATTRIB =
-         "ER_REQUIRES_ELEMENTS_ATTRIB";
-  public static final String ER_MISSING_PREFIX_ATTRIB =
-         "ER_MISSING_PREFIX_ATTRIB";
-  public static final String ER_BAD_STYLESHEET_URL = "ER_BAD_STYLESHEET_URL";
-  public static final String ER_FILE_NOT_FOUND = "ER_FILE_NOT_FOUND";
-  public static final String ER_IOEXCEPTION = "ER_IOEXCEPTION";
-  public static final String ER_NO_HREF_ATTRIB = "ER_NO_HREF_ATTRIB";
-  public static final String ER_STYLESHEET_INCLUDES_ITSELF =
-         "ER_STYLESHEET_INCLUDES_ITSELF";
-  public static final String ER_PROCESSINCLUDE_ERROR ="ER_PROCESSINCLUDE_ERROR";
-  public static final String ER_MISSING_LANG_ATTRIB = "ER_MISSING_LANG_ATTRIB";
-  public static final String ER_MISSING_CONTAINER_ELEMENT_COMPONENT =
-         "ER_MISSING_CONTAINER_ELEMENT_COMPONENT";
-  public static final String ER_CAN_ONLY_OUTPUT_TO_ELEMENT =
-         "ER_CAN_ONLY_OUTPUT_TO_ELEMENT";
-  public static final String ER_PROCESS_ERROR = "ER_PROCESS_ERROR";
-  public static final String ER_UNIMPLNODE_ERROR = "ER_UNIMPLNODE_ERROR";
-  public static final String ER_NO_SELECT_EXPRESSION ="ER_NO_SELECT_EXPRESSION";
-  public static final String ER_CANNOT_SERIALIZE_XSLPROCESSOR =
-         "ER_CANNOT_SERIALIZE_XSLPROCESSOR";
-  public static final String ER_NO_INPUT_STYLESHEET = "ER_NO_INPUT_STYLESHEET";
-  public static final String ER_FAILED_PROCESS_STYLESHEET =
-         "ER_FAILED_PROCESS_STYLESHEET";
-  public static final String ER_COULDNT_PARSE_DOC = "ER_COULDNT_PARSE_DOC";
-  public static final String ER_COULDNT_FIND_FRAGMENT =
-         "ER_COULDNT_FIND_FRAGMENT";
-  public static final String ER_NODE_NOT_ELEMENT = "ER_NODE_NOT_ELEMENT";
-  public static final String ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB =
-         "ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB";
-  public static final String ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB =
-         "ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB";
-  public static final String ER_NO_CLONE_OF_DOCUMENT_FRAG =
-         "ER_NO_CLONE_OF_DOCUMENT_FRAG";
-  public static final String ER_CANT_CREATE_ITEM = "ER_CANT_CREATE_ITEM";
-  public static final String ER_XMLSPACE_ILLEGAL_VALUE =
-         "ER_XMLSPACE_ILLEGAL_VALUE";
-  public static final String ER_NO_XSLKEY_DECLARATION =
-         "ER_NO_XSLKEY_DECLARATION";
-  public static final String ER_CANT_CREATE_URL = "ER_CANT_CREATE_URL";
-  public static final String ER_XSLFUNCTIONS_UNSUPPORTED =
-         "ER_XSLFUNCTIONS_UNSUPPORTED";
-  public static final String ER_PROCESSOR_ERROR = "ER_PROCESSOR_ERROR";
-  public static final String ER_NOT_ALLOWED_INSIDE_STYLESHEET =
-         "ER_NOT_ALLOWED_INSIDE_STYLESHEET";
-  public static final String ER_RESULTNS_NOT_SUPPORTED =
-         "ER_RESULTNS_NOT_SUPPORTED";
-  public static final String ER_DEFAULTSPACE_NOT_SUPPORTED =
-         "ER_DEFAULTSPACE_NOT_SUPPORTED";
-  public static final String ER_INDENTRESULT_NOT_SUPPORTED =
-         "ER_INDENTRESULT_NOT_SUPPORTED";
-  public static final String ER_ILLEGAL_ATTRIB = "ER_ILLEGAL_ATTRIB";
-  public static final String ER_UNKNOWN_XSL_ELEM = "ER_UNKNOWN_XSL_ELEM";
-  public static final String ER_BAD_XSLSORT_USE = "ER_BAD_XSLSORT_USE";
-  public static final String ER_MISPLACED_XSLWHEN = "ER_MISPLACED_XSLWHEN";
-  public static final String ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE =
-         "ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE";
-  public static final String ER_MISPLACED_XSLOTHERWISE =
-         "ER_MISPLACED_XSLOTHERWISE";
-  public static final String ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE =
-         "ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE";
-  public static final String ER_NOT_ALLOWED_INSIDE_TEMPLATE =
-         "ER_NOT_ALLOWED_INSIDE_TEMPLATE";
-  public static final String ER_UNKNOWN_EXT_NS_PREFIX =
-         "ER_UNKNOWN_EXT_NS_PREFIX";
-  public static final String ER_IMPORTS_AS_FIRST_ELEM =
-         "ER_IMPORTS_AS_FIRST_ELEM";
-  public static final String ER_IMPORTING_ITSELF = "ER_IMPORTING_ITSELF";
-  public static final String ER_XMLSPACE_ILLEGAL_VAL ="ER_XMLSPACE_ILLEGAL_VAL";
-  public static final String ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL =
-         "ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL";
-  public static final String ER_SAX_EXCEPTION = "ER_SAX_EXCEPTION";
-  public static final String ER_XSLT_ERROR = "ER_XSLT_ERROR";
-  public static final String ER_CURRENCY_SIGN_ILLEGAL=
-         "ER_CURRENCY_SIGN_ILLEGAL";
-  public static final String ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM =
-         "ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM";
-  public static final String ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER =
-         "ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER";
-  public static final String ER_REDIRECT_COULDNT_GET_FILENAME =
-         "ER_REDIRECT_COULDNT_GET_FILENAME";
-  public static final String ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT =
-         "ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT";
-  public static final String ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX =
-         "ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX";
-  public static final String ER_MISSING_NS_URI = "ER_MISSING_NS_URI";
-  public static final String ER_MISSING_ARG_FOR_OPTION =
-         "ER_MISSING_ARG_FOR_OPTION";
-  public static final String ER_INVALID_OPTION = "ER_INVALID_OPTION";
-  public static final String ER_MALFORMED_FORMAT_STRING =
-         "ER_MALFORMED_FORMAT_STRING";
-  public static final String ER_STYLESHEET_REQUIRES_VERSION_ATTRIB =
-         "ER_STYLESHEET_REQUIRES_VERSION_ATTRIB";
-  public static final String ER_ILLEGAL_ATTRIBUTE_VALUE =
-         "ER_ILLEGAL_ATTRIBUTE_VALUE";
-  public static final String ER_CHOOSE_REQUIRES_WHEN ="ER_CHOOSE_REQUIRES_WHEN";
-  public static final String ER_NO_APPLY_IMPORT_IN_FOR_EACH =
-         "ER_NO_APPLY_IMPORT_IN_FOR_EACH";
-  public static final String ER_CANT_USE_DTM_FOR_OUTPUT =
-         "ER_CANT_USE_DTM_FOR_OUTPUT";
-  public static final String ER_CANT_USE_DTM_FOR_INPUT =
-         "ER_CANT_USE_DTM_FOR_INPUT";
-  public static final String ER_CALL_TO_EXT_FAILED = "ER_CALL_TO_EXT_FAILED";
-  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
-  public static final String ER_INVALID_UTF16_SURROGATE =
-         "ER_INVALID_UTF16_SURROGATE";
-  public static final String ER_XSLATTRSET_USED_ITSELF =
-         "ER_XSLATTRSET_USED_ITSELF";
-  public static final String ER_CANNOT_MIX_XERCESDOM ="ER_CANNOT_MIX_XERCESDOM";
-  public static final String ER_TOO_MANY_LISTENERS = "ER_TOO_MANY_LISTENERS";
-  public static final String ER_IN_ELEMTEMPLATEELEM_READOBJECT =
-         "ER_IN_ELEMTEMPLATEELEM_READOBJECT";
-  public static final String ER_DUPLICATE_NAMED_TEMPLATE =
-         "ER_DUPLICATE_NAMED_TEMPLATE";
-  public static final String ER_INVALID_KEY_CALL = "ER_INVALID_KEY_CALL";
-  public static final String ER_REFERENCING_ITSELF = "ER_REFERENCING_ITSELF";
-  public static final String ER_ILLEGAL_DOMSOURCE_INPUT =
-         "ER_ILLEGAL_DOMSOURCE_INPUT";
-  public static final String ER_CLASS_NOT_FOUND_FOR_OPTION =
-         "ER_CLASS_NOT_FOUND_FOR_OPTION";
-  public static final String ER_REQUIRED_ELEM_NOT_FOUND =
-         "ER_REQUIRED_ELEM_NOT_FOUND";
-  public static final String ER_INPUT_CANNOT_BE_NULL ="ER_INPUT_CANNOT_BE_NULL";
-  public static final String ER_URI_CANNOT_BE_NULL = "ER_URI_CANNOT_BE_NULL";
-  public static final String ER_FILE_CANNOT_BE_NULL = "ER_FILE_CANNOT_BE_NULL";
-  public static final String ER_SOURCE_CANNOT_BE_NULL =
-         "ER_SOURCE_CANNOT_BE_NULL";
-  public static final String ER_CANNOT_INIT_BSFMGR = "ER_CANNOT_INIT_BSFMGR";
-  public static final String ER_CANNOT_CMPL_EXTENSN = "ER_CANNOT_CMPL_EXTENSN";
-  public static final String ER_CANNOT_CREATE_EXTENSN =
-         "ER_CANNOT_CREATE_EXTENSN";
-  public static final String ER_INSTANCE_MTHD_CALL_REQUIRES =
-         "ER_INSTANCE_MTHD_CALL_REQUIRES";
-  public static final String ER_INVALID_ELEMENT_NAME ="ER_INVALID_ELEMENT_NAME";
-  public static final String ER_ELEMENT_NAME_METHOD_STATIC =
-         "ER_ELEMENT_NAME_METHOD_STATIC";
-  public static final String ER_EXTENSION_FUNC_UNKNOWN =
-         "ER_EXTENSION_FUNC_UNKNOWN";
-  public static final String ER_MORE_MATCH_CONSTRUCTOR =
-         "ER_MORE_MATCH_CONSTRUCTOR";
-  public static final String ER_MORE_MATCH_METHOD = "ER_MORE_MATCH_METHOD";
-  public static final String ER_MORE_MATCH_ELEMENT = "ER_MORE_MATCH_ELEMENT";
-  public static final String ER_INVALID_CONTEXT_PASSED =
-         "ER_INVALID_CONTEXT_PASSED";
-  public static final String ER_POOL_EXISTS = "ER_POOL_EXISTS";
-  public static final String ER_NO_DRIVER_NAME = "ER_NO_DRIVER_NAME";
-  public static final String ER_NO_URL = "ER_NO_URL";
-  public static final String ER_POOL_SIZE_LESSTHAN_ONE =
-         "ER_POOL_SIZE_LESSTHAN_ONE";
-  public static final String ER_INVALID_DRIVER = "ER_INVALID_DRIVER";
-  public static final String ER_NO_STYLESHEETROOT = "ER_NO_STYLESHEETROOT";
-  public static final String ER_ILLEGAL_XMLSPACE_VALUE =
-         "ER_ILLEGAL_XMLSPACE_VALUE";
-  public static final String ER_PROCESSFROMNODE_FAILED =
-         "ER_PROCESSFROMNODE_FAILED";
-  public static final String ER_RESOURCE_COULD_NOT_LOAD =
-         "ER_RESOURCE_COULD_NOT_LOAD";
-  public static final String ER_BUFFER_SIZE_LESSTHAN_ZERO =
-         "ER_BUFFER_SIZE_LESSTHAN_ZERO";
-  public static final String ER_UNKNOWN_ERROR_CALLING_EXTENSION =
-         "ER_UNKNOWN_ERROR_CALLING_EXTENSION";
-  public static final String ER_NO_NAMESPACE_DECL = "ER_NO_NAMESPACE_DECL";
-  public static final String ER_ELEM_CONTENT_NOT_ALLOWED =
-         "ER_ELEM_CONTENT_NOT_ALLOWED";
-  public static final String ER_STYLESHEET_DIRECTED_TERMINATION =
-         "ER_STYLESHEET_DIRECTED_TERMINATION";
-  public static final String ER_ONE_OR_TWO = "ER_ONE_OR_TWO";
-  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
-  public static final String ER_COULD_NOT_LOAD_RESOURCE =
-         "ER_COULD_NOT_LOAD_RESOURCE";
-  public static final String ER_CANNOT_INIT_DEFAULT_TEMPLATES =
-         "ER_CANNOT_INIT_DEFAULT_TEMPLATES";
-  public static final String ER_RESULT_NULL = "ER_RESULT_NULL";
-  public static final String ER_RESULT_COULD_NOT_BE_SET =
-         "ER_RESULT_COULD_NOT_BE_SET";
-  public static final String ER_NO_OUTPUT_SPECIFIED = "ER_NO_OUTPUT_SPECIFIED";
-  public static final String ER_CANNOT_TRANSFORM_TO_RESULT_TYPE =
-         "ER_CANNOT_TRANSFORM_TO_RESULT_TYPE";
-  public static final String ER_CANNOT_TRANSFORM_SOURCE_TYPE =
-         "ER_CANNOT_TRANSFORM_SOURCE_TYPE";
-  public static final String ER_NULL_CONTENT_HANDLER ="ER_NULL_CONTENT_HANDLER";
-  public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
-  public static final String ER_CANNOT_CALL_PARSE = "ER_CANNOT_CALL_PARSE";
-  public static final String ER_NO_PARENT_FOR_FILTER ="ER_NO_PARENT_FOR_FILTER";
-  public static final String ER_NO_STYLESHEET_IN_MEDIA =
-         "ER_NO_STYLESHEET_IN_MEDIA";
-  public static final String ER_NO_STYLESHEET_PI = "ER_NO_STYLESHEET_PI";
-  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
-  public static final String ER_PROPERTY_VALUE_BOOLEAN =
-         "ER_PROPERTY_VALUE_BOOLEAN";
-  public static final String ER_COULD_NOT_FIND_EXTERN_SCRIPT =
-         "ER_COULD_NOT_FIND_EXTERN_SCRIPT";
-  public static final String ER_RESOURCE_COULD_NOT_FIND =
-         "ER_RESOURCE_COULD_NOT_FIND";
-  public static final String ER_OUTPUT_PROPERTY_NOT_RECOGNIZED =
-         "ER_OUTPUT_PROPERTY_NOT_RECOGNIZED";
-  public static final String ER_FAILED_CREATING_ELEMLITRSLT =
-         "ER_FAILED_CREATING_ELEMLITRSLT";
-  public static final String ER_VALUE_SHOULD_BE_NUMBER =
-         "ER_VALUE_SHOULD_BE_NUMBER";
-  public static final String ER_VALUE_SHOULD_EQUAL = "ER_VALUE_SHOULD_EQUAL";
-  public static final String ER_FAILED_CALLING_METHOD =
-         "ER_FAILED_CALLING_METHOD";
-  public static final String ER_FAILED_CREATING_ELEMTMPL =
-         "ER_FAILED_CREATING_ELEMTMPL";
-  public static final String ER_CHARS_NOT_ALLOWED = "ER_CHARS_NOT_ALLOWED";
-  public static final String ER_ATTR_NOT_ALLOWED = "ER_ATTR_NOT_ALLOWED";
-  public static final String ER_BAD_VALUE = "ER_BAD_VALUE";
-  public static final String ER_ATTRIB_VALUE_NOT_FOUND =
-         "ER_ATTRIB_VALUE_NOT_FOUND";
-  public static final String ER_ATTRIB_VALUE_NOT_RECOGNIZED =
-         "ER_ATTRIB_VALUE_NOT_RECOGNIZED";
-  public static final String ER_NULL_URI_NAMESPACE = "ER_NULL_URI_NAMESPACE";
-  public static final String ER_NUMBER_TOO_BIG = "ER_NUMBER_TOO_BIG";
-  public static final String  ER_CANNOT_FIND_SAX1_DRIVER =
-         "ER_CANNOT_FIND_SAX1_DRIVER";
-  public static final String  ER_SAX1_DRIVER_NOT_LOADED =
-         "ER_SAX1_DRIVER_NOT_LOADED";
-  public static final String  ER_SAX1_DRIVER_NOT_INSTANTIATED =
-         "ER_SAX1_DRIVER_NOT_INSTANTIATED" ;
-  public static final String ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER =
-         "ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER";
-  public static final String  ER_PARSER_PROPERTY_NOT_SPECIFIED =
-         "ER_PARSER_PROPERTY_NOT_SPECIFIED";
-  public static final String  ER_PARSER_ARG_CANNOT_BE_NULL =
-         "ER_PARSER_ARG_CANNOT_BE_NULL" ;
-  public static final String  ER_FEATURE = "ER_FEATURE";
-  public static final String ER_PROPERTY = "ER_PROPERTY" ;
-  public static final String ER_NULL_ENTITY_RESOLVER ="ER_NULL_ENTITY_RESOLVER";
-  public static final String  ER_NULL_DTD_HANDLER = "ER_NULL_DTD_HANDLER" ;
-  public static final String ER_NO_DRIVER_NAME_SPECIFIED =
-         "ER_NO_DRIVER_NAME_SPECIFIED";
-  public static final String ER_NO_URL_SPECIFIED = "ER_NO_URL_SPECIFIED";
-  public static final String ER_POOLSIZE_LESS_THAN_ONE =
-         "ER_POOLSIZE_LESS_THAN_ONE";
-  public static final String ER_INVALID_DRIVER_NAME = "ER_INVALID_DRIVER_NAME";
-  public static final String ER_ERRORLISTENER = "ER_ERRORLISTENER";
-  public static final String ER_ASSERT_NO_TEMPLATE_PARENT =
-         "ER_ASSERT_NO_TEMPLATE_PARENT";
-  public static final String ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR =
-         "ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR";
-  public static final String ER_NOT_ALLOWED_IN_POSITION =
-         "ER_NOT_ALLOWED_IN_POSITION";
-  public static final String ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION =
-         "ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION";
-  public static final String ER_NAMESPACE_CONTEXT_NULL_NAMESPACE =
-         "ER_NAMESPACE_CONTEXT_NULL_NAMESPACE";
-  public static final String ER_NAMESPACE_CONTEXT_NULL_PREFIX =
-         "ER_NAMESPACE_CONTEXT_NULL_PREFIX";
-  public static final String ER_XPATH_RESOLVER_NULL_QNAME =
-         "ER_XPATH_RESOLVER_NULL_QNAME";
-  public static final String ER_XPATH_RESOLVER_NEGATIVE_ARITY =
-         "ER_XPATH_RESOLVER_NEGATIVE_ARITY";
-  public static final String INVALID_TCHAR = "INVALID_TCHAR";
-  public static final String INVALID_QNAME = "INVALID_QNAME";
-  public static final String INVALID_ENUM = "INVALID_ENUM";
-  public static final String INVALID_NMTOKEN = "INVALID_NMTOKEN";
-  public static final String INVALID_NCNAME = "INVALID_NCNAME";
-  public static final String INVALID_BOOLEAN = "INVALID_BOOLEAN";
-  public static final String INVALID_NUMBER = "INVALID_NUMBER";
-  public static final String ER_ARG_LITERAL = "ER_ARG_LITERAL";
-  public static final String ER_DUPLICATE_GLOBAL_VAR ="ER_DUPLICATE_GLOBAL_VAR";
-  public static final String ER_DUPLICATE_VAR = "ER_DUPLICATE_VAR";
-  public static final String ER_TEMPLATE_NAME_MATCH = "ER_TEMPLATE_NAME_MATCH";
-  public static final String ER_INVALID_PREFIX = "ER_INVALID_PREFIX";
-  public static final String ER_NO_ATTRIB_SET = "ER_NO_ATTRIB_SET";
-  public static final String ER_FUNCTION_NOT_FOUND =
-         "ER_FUNCTION_NOT_FOUND";
-  public static final String ER_CANT_HAVE_CONTENT_AND_SELECT =
-     "ER_CANT_HAVE_CONTENT_AND_SELECT";
-  public static final String ER_INVALID_SET_PARAM_VALUE = "ER_INVALID_SET_PARAM_VALUE";
-  public static final String ER_SET_FEATURE_NULL_NAME =
-        "ER_SET_FEATURE_NULL_NAME";
-  public static final String ER_GET_FEATURE_NULL_NAME =
-        "ER_GET_FEATURE_NULL_NAME";
-  public static final String ER_UNSUPPORTED_FEATURE =
-        "ER_UNSUPPORTED_FEATURE";
-  public static final String ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING =
-        "ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING";
-
-  public static final String WG_FOUND_CURLYBRACE = "WG_FOUND_CURLYBRACE";
-  public static final String WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR =
-         "WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR";
-  public static final String WG_EXPR_ATTRIB_CHANGED_TO_SELECT =
-         "WG_EXPR_ATTRIB_CHANGED_TO_SELECT";
-  public static final String WG_NO_LOCALE_IN_FORMATNUMBER =
-         "WG_NO_LOCALE_IN_FORMATNUMBER";
-  public static final String WG_LOCALE_NOT_FOUND = "WG_LOCALE_NOT_FOUND";
-  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
-  public static final String WG_CANNOT_LOAD_REQUESTED_DOC =
-         "WG_CANNOT_LOAD_REQUESTED_DOC";
-  public static final String WG_CANNOT_FIND_COLLATOR ="WG_CANNOT_FIND_COLLATOR";
-  public static final String WG_FUNCTIONS_SHOULD_USE_URL =
-         "WG_FUNCTIONS_SHOULD_USE_URL";
-  public static final String WG_ENCODING_NOT_SUPPORTED_USING_UTF8 =
-         "WG_ENCODING_NOT_SUPPORTED_USING_UTF8";
-  public static final String WG_ENCODING_NOT_SUPPORTED_USING_JAVA =
-         "WG_ENCODING_NOT_SUPPORTED_USING_JAVA";
-  public static final String WG_SPECIFICITY_CONFLICTS =
-         "WG_SPECIFICITY_CONFLICTS";
-  public static final String WG_PARSING_AND_PREPARING =
-         "WG_PARSING_AND_PREPARING";
-  public static final String WG_ATTR_TEMPLATE = "WG_ATTR_TEMPLATE";
-  public static final String WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE = "WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESP";
-  public static final String WG_ATTRIB_NOT_HANDLED = "WG_ATTRIB_NOT_HANDLED";
-  public static final String WG_NO_DECIMALFORMAT_DECLARATION =
-         "WG_NO_DECIMALFORMAT_DECLARATION";
-  public static final String WG_OLD_XSLT_NS = "WG_OLD_XSLT_NS";
-  public static final String WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED =
-         "WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED";
-  public static final String WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE =
-         "WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE";
-  public static final String WG_ILLEGAL_ATTRIBUTE = "WG_ILLEGAL_ATTRIBUTE";
-  public static final String WG_COULD_NOT_RESOLVE_PREFIX =
-         "WG_COULD_NOT_RESOLVE_PREFIX";
-  public static final String WG_STYLESHEET_REQUIRES_VERSION_ATTRIB =
-         "WG_STYLESHEET_REQUIRES_VERSION_ATTRIB";
-  public static final String WG_ILLEGAL_ATTRIBUTE_NAME =
-         "WG_ILLEGAL_ATTRIBUTE_NAME";
-  public static final String WG_ILLEGAL_ATTRIBUTE_VALUE =
-         "WG_ILLEGAL_ATTRIBUTE_VALUE";
-  public static final String WG_EMPTY_SECOND_ARG = "WG_EMPTY_SECOND_ARG";
-  public static final String WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
-         "WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
-  public static final String WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
-         "WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
-  public static final String WG_ILLEGAL_ATTRIBUTE_POSITION =
-         "WG_ILLEGAL_ATTRIBUTE_POSITION";
-  public static final String NO_MODIFICATION_ALLOWED_ERR =
-         "NO_MODIFICATION_ALLOWED_ERR";
-
-  /*
-   * Now fill in the message text.
-   * Then fill in the message text for that message code in the
-   * array. Use the new error code as the index into the array.
-   */
-
-  // Error messages...
-
-  /** Get the lookup table for error messages.
-   *
-   * @return The message lookup table.
-   */
-  public Object[][] getContents()
-  {
-    return new Object[][] {
-
-  /** Error message ID that has a null message, but takes in a single object.    */
-  {"ER0000" , "{0}" },
-
-
-    { ER_NO_CURLYBRACE,
-      "Napaka: Izraz ne sme vsebovati '{'"},
-
-    { ER_ILLEGAL_ATTRIBUTE ,
-     "{0} vsebuje neveljaven atribut: {1}"},
-
-  {ER_NULL_SOURCENODE_APPLYIMPORTS ,
-      "sourceNode je NULL v xsl:apply-imports!"},
-
-  {ER_CANNOT_ADD,
-      "Ne morem dodati {0} k {1}"},
-
-    { ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES,
-      "sourceNode je NULL v handleApplyTemplatesInstruction!"},
-
-    { ER_NO_NAME_ATTRIB,
-     "{0} mora vsebovati atribut imena."},
-
-    {ER_TEMPLATE_NOT_FOUND,
-     "Nisem na\u0161em predloge z imenom: {0}"},
-
-    {ER_CANT_RESOLVE_NAME_AVT,
-      "Imena AVT v xsl:call-template ni bilo mogo\u010de razre\u0161iti."},
-
-    {ER_REQUIRES_ATTRIB,
-     "{0} zahteva atribut: {1}"},
-
-    { ER_MUST_HAVE_TEST_ATTRIB,
-      "{0} mora imeti atribut ''test''."},
-
-    {ER_BAD_VAL_ON_LEVEL_ATTRIB,
-      "Slaba vrednost pri atributu stopnje: {0}"},
-
-    {ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
-      "Ime navodila za obdelavo ne more biti 'xml'"},
-
-    { ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
-      "Ime navodila za obdelavo mora biti veljavno NCIme: {0}"},
-
-    { ER_NEED_MATCH_ATTRIB,
-      "{0} mora vsebovati primerjalni atribut, \u010de vsebuje vozli\u0161\u010de."},
-
-    { ER_NEED_NAME_OR_MATCH_ATTRIB,
-      "{0} zahteva atribut imena ali primerjalni atribut."},
-
-    {ER_CANT_RESOLVE_NSPREFIX,
-      "Predpone imenskega prostora ni mogo\u010de razre\u0161iti: {0}"},
-
-    { ER_ILLEGAL_VALUE,
-     "xml:space vsebuje neveljavno vrednost: {0}"},
-
-    { ER_NO_OWNERDOC,
-      "Podrejeno vozli\u0161\u010de ne vsebuje lastni\u0161kega dokumenta!"},
-
-    { ER_ELEMTEMPLATEELEM_ERR,
-     "Napaka ElemTemplateElement: {0}"},
-
-    { ER_NULL_CHILD,
-     "Poskus dodajanja podrejenega elementa z vrednostjo NULL!"},
-
-    { ER_NEED_SELECT_ATTRIB,
-     "{0} zahteva atribut izbire."},
-
-    { ER_NEED_TEST_ATTRIB ,
-      "xsl:when mora vsebovati atribut 'test'."},
-
-    { ER_NEED_NAME_ATTRIB,
-      "xsl:with-param mora vsebovati atribut 'ime'."},
-
-    { ER_NO_CONTEXT_OWNERDOC,
-      "Kontekst ne vsebuje lastni\u0161kega dokumenta!"},
-
-    {ER_COULD_NOT_CREATE_XML_PROC_LIAISON,
-      "Ne morem ustvariti zveze XML TransformerFactory: {0}"},
-
-    {ER_PROCESS_NOT_SUCCESSFUL,
-      "Xalan: postopek ni uspel."},
-
-    { ER_NOT_SUCCESSFUL,
-     "Xalan: ni uspel."},
-
-    { ER_ENCODING_NOT_SUPPORTED,
-     "Kodiranje ni podprto: {0}"},
-
-    {ER_COULD_NOT_CREATE_TRACELISTENER,
-      "Ne morem ustvariti javanskega razreda TraceListener: {0}"},
-
-    {ER_KEY_REQUIRES_NAME_ATTRIB,
-      "xsl:key zahteva atribut 'ime'!"},
-
-    { ER_KEY_REQUIRES_MATCH_ATTRIB,
-      "xsl:key zahteva atribut 'ujemanje'!"},
-
-    { ER_KEY_REQUIRES_USE_ATTRIB,
-      "xsl:key zahteva atribut 'uporaba'!"},
-
-    { ER_REQUIRES_ELEMENTS_ATTRIB,
-      "(StylesheetHandler) {0} zahteva atribut ''elementi''!"},
-
-    { ER_MISSING_PREFIX_ATTRIB,
-      "(StylesheetHandler) {0} manjka atribut ''predpona''"},
-
-    { ER_BAD_STYLESHEET_URL,
-     "URL slogovne datoteke je neveljaven: {0}"},
-
-    { ER_FILE_NOT_FOUND,
-     "Slogovne datoteke ni bilo mogo\u010de najti: {0}"},
-
-    { ER_IOEXCEPTION,
-      "Pri slogovni datoteki je pri\u0161lo do izjeme IO: {0}"},
-
-    { ER_NO_HREF_ATTRIB,
-      "(StylesheetHandler) Atributa href za {0} ni bilo mogo\u010de najti"},
-
-    { ER_STYLESHEET_INCLUDES_ITSELF,
-      "(StylesheetHandler) {0} neposredno ali posredno vklju\u010duje samega sebe!"},
-
-    { ER_PROCESSINCLUDE_ERROR,
-      "Napaka StylesheetHandler.processInclude, {0}"},
-
-    { ER_MISSING_LANG_ATTRIB,
-      "(StylesheetHandler) {0} manjka atribut ''lang'' "},
-
-    { ER_MISSING_CONTAINER_ELEMENT_COMPONENT,
-      "(StylesheetHandler) napa\u010dna postavitev elementa {0}?? Manjka vsebni element ''komponenta''"},
-
-    { ER_CAN_ONLY_OUTPUT_TO_ELEMENT,
-      "Prenos mogo\u010d samo v Element, DocumentFragment, Document, ali PrintWriter."},
-
-    { ER_PROCESS_ERROR,
-     "Napaka StylesheetRoot.process"},
-
-    { ER_UNIMPLNODE_ERROR,
-     "Napaka UnImplNode: {0}"},
-
-    { ER_NO_SELECT_EXPRESSION,
-      "Napaka! Ne najdem izbirnega izraza xpath (-select)."},
-
-    { ER_CANNOT_SERIALIZE_XSLPROCESSOR,
-      "Ne morem serializirati XSLProcessor!"},
-
-    { ER_NO_INPUT_STYLESHEET,
-      "Vnos slogovne datoteke ni dolo\u010den!"},
-
-    { ER_FAILED_PROCESS_STYLESHEET,
-      "Obdelava slogovne datoteke ni uspela!"},
-
-    { ER_COULDNT_PARSE_DOC,
-     "Dokumenta {0} ni mogo\u010de raz\u010dleniti!"},
-
-    { ER_COULDNT_FIND_FRAGMENT,
-     "Ne najdem fragmenta: {0}"},
-
-    { ER_NODE_NOT_ELEMENT,
-      "Vozli\u0161\u010de, na katerega ka\u017ee identifikator fragmenta, ni element: {0}"},
-
-    { ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB,
-      "vsak mora vsebovati primerjalni atribut ali atribut imena"},
-
-    { ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB,
-      "predloge morajo imeti primerjalni atribut ali atribut imena"},
-
-    { ER_NO_CLONE_OF_DOCUMENT_FRAG,
-      "Ni klona fragmenta dokumenta!"},
-
-    { ER_CANT_CREATE_ITEM,
-      "Ne morem ustvariti elementa v drevesu rezultatov: {0}"},
-
-    { ER_XMLSPACE_ILLEGAL_VALUE,
-      "xml:space v izvirnem XML ima neveljavno vrednost: {0}"},
-
-    { ER_NO_XSLKEY_DECLARATION,
-      "Ni deklaracije xsl:key za {0}!"},
-
-    { ER_CANT_CREATE_URL,
-     "Napaka! Ne morem ustvariti URL za: {0}"},
-
-    { ER_XSLFUNCTIONS_UNSUPPORTED,
-     "xsl:functions niso podprte"},
-
-    { ER_PROCESSOR_ERROR,
-     "Napaka XSLT TransformerFactory"},
-
-    { ER_NOT_ALLOWED_INSIDE_STYLESHEET,
-      "(StylesheetHandler) {0} ni dovoljen znotraj slogovne datoteke!"},
-
-    { ER_RESULTNS_NOT_SUPPORTED,
-      "result-ns ni ve\u010d podprt!  Namesto njega uporabite xsl:output."},
-
-    { ER_DEFAULTSPACE_NOT_SUPPORTED,
-      "default-space ni ve\u010d podprt!  Namesto njega uporabite xsl:strip-space ali xsl:preserve-space."},
-
-    { ER_INDENTRESULT_NOT_SUPPORTED,
-      "indent-result ni ve\u010d podprt!  Namesto njega uporabite xsl:output."},
-
-    { ER_ILLEGAL_ATTRIB,
-      "(StylesheetHandler) {0} ima neveljaven atribut: {1}"},
-
-    { ER_UNKNOWN_XSL_ELEM,
-     "Neznani element XSL: {0}"},
-
-    { ER_BAD_XSLSORT_USE,
-      "(StylesheetHandler) xsl:sort lahko uporabljamo samo z xsl:apply-templates ali z xsl:for-each."},
-
-    { ER_MISPLACED_XSLWHEN,
-      "(StylesheetHandler) napa\u010dna postavitev xsl:when!"},
-
-    { ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE,
-      "(StylesheetHandler) xsl:choose ni nadrejen xsl:when!"},
-
-    { ER_MISPLACED_XSLOTHERWISE,
-      "(StylesheetHandler) napa\u010dna postavitev xsl:otherwise!"},
-
-    { ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE,
-      "(StylesheetHandler) xsl:choose ni nadrejen xsl:otherwise!"},
-
-    { ER_NOT_ALLOWED_INSIDE_TEMPLATE,
-      "(StylesheetHandler) {0} ni dovoljen znotraj predloge!"},
-
-    { ER_UNKNOWN_EXT_NS_PREFIX,
-      "(StylesheetHandler) Neznana {0} kon\u010dnica predpone imenskega prostora {1}"},
-
-    { ER_IMPORTS_AS_FIRST_ELEM,
-      "(StylesheetHandler) Uvozi se lahko pojavijo samo kot prvi elementi v slogovni datoteki!"},
-
-    { ER_IMPORTING_ITSELF,
-      "(StylesheetHandler) {0} neposredno ali posredno uva\u017ea samega sebe!"},
-
-    { ER_XMLSPACE_ILLEGAL_VAL,
-      "(StylesheetHandler) xml:space vsebuje neveljavno vrednost: {0}"},
-
-    { ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL,
-      "processStylesheet ni uspelo!"},
-
-    { ER_SAX_EXCEPTION,
-     "Izjema SAX"},
-
-//  add this message to fix bug 21478
-    { ER_FUNCTION_NOT_SUPPORTED,
-     "Funkcija ni podprta!"},
-
-
-    { ER_XSLT_ERROR,
-     "Napaka XSLT"},
-
-    { ER_CURRENCY_SIGN_ILLEGAL,
-      "V oblikovnem nizu vzorca znak za denarno enoto ni dovoljen"},
-
-    { ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM,
-      "Funkcija dokumenta v slogovni datoteki DOM ni podprta!"},
-
-    { ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER,
-      "Ne morem razbrati predpone nepredponskega razre\u0161evalnika!"},
-
-    { ER_REDIRECT_COULDNT_GET_FILENAME,
-      "Preusmeri kon\u010dnico: ne morem pridobiti imena datoteke - atribut datoteke ali izbire mora vrniti veljaven niz."},
-
-    { ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT,
-      "V Preusmeritvi kon\u010dnice ne morem zgraditi FormatterListener!"},
-
-    { ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX,
-      "Predpona v izklju\u010di-predpone-rezultatov (exclude-result-prefixes) ni veljavna: {0}"},
-
-    { ER_MISSING_NS_URI,
-      "Za navedeno predpono manjka imenski prostor URI"},
-
-    { ER_MISSING_ARG_FOR_OPTION,
-      "Manjka argument za mo\u017enost: {0}"},
-
-    { ER_INVALID_OPTION,
-     "Neveljavna mo\u017enost: {0}"},
-
-    { ER_MALFORMED_FORMAT_STRING,
-     "Po\u0161kodovan niz sloga: {0}"},
-
-    { ER_STYLESHEET_REQUIRES_VERSION_ATTRIB,
-      "xsl:stylesheet zahteva atribut 'razli\u010dica'!"},
-
-    { ER_ILLEGAL_ATTRIBUTE_VALUE,
-      "Atribut: {0} ima neveljavno vrednost: {1}"},
-
-    { ER_CHOOSE_REQUIRES_WHEN,
-     "xsl:choose zahteva xsl:when"},
-
-    { ER_NO_APPLY_IMPORT_IN_FOR_EACH,
-      "xsl:apply-imports v xsl:for-each ni dovoljen"},
-
-    { ER_CANT_USE_DTM_FOR_OUTPUT,
-      "Za izhodno vozli\u0161\u010de DOM ne morem uporabiti DTMLiaison... namesto njega posredujte org.apache.xpath.DOM2Helper!"},
-
-    { ER_CANT_USE_DTM_FOR_INPUT,
-      "Za vhodno vozli\u0161\u010de DOM ne morem uporabiti DTMLiaison... namesto njega posredujte org.apache.xpath.DOM2Helper!"},
-
-    { ER_CALL_TO_EXT_FAILED,
-      "Klic elementa kon\u010dnice ni uspel: {0}"},
-
-    { ER_PREFIX_MUST_RESOLVE,
-      "Predpona se mora razre\u0161iti v imenski prostor: {0}"},
-
-    { ER_INVALID_UTF16_SURROGATE,
-      "Zaznan neveljaven nadomestek UTF-16: {0} ?"},
-
-    { ER_XSLATTRSET_USED_ITSELF,
-      "xsl:attribute-set {0} je uporabil samega sebe, kar bo povzro\u010dilo neskon\u010do ponavljanje."},
-
-    { ER_CANNOT_MIX_XERCESDOM,
-      "Prepletanje ne-Xerces-DOM vhoda s Xerces-DOM vhodom ni mogo\u010de!"},
-
-    { ER_TOO_MANY_LISTENERS,
-      "addTraceListenersToStylesheet - TooManyListenersException"},
-
-    { ER_IN_ELEMTEMPLATEELEM_READOBJECT,
-      "V ElemTemplateElement.readObject: {0}"},
-
-    { ER_DUPLICATE_NAMED_TEMPLATE,
-      "Na\u0161el ve\u010d predlog z istim imenom: {0}"},
-
-    { ER_INVALID_KEY_CALL,
-      "Neveljaven klic funkcije: povratni klici key() niso dovoljeni"},
-
-    { ER_REFERENCING_ITSELF,
-      "Spremenljivka {0} se neposredno ali posredno sklicuje sama nase!"},
-
-    { ER_ILLEGAL_DOMSOURCE_INPUT,
-      "Vhodno vozli\u0161\u010de za DOMSource za newTemplates ne more biti NULL!"},
-
-    { ER_CLASS_NOT_FOUND_FOR_OPTION,
-        "Datoteke razreda za mo\u017enost {0} ni bilo mogo\u010de najti"},
-
-    { ER_REQUIRED_ELEM_NOT_FOUND,
-        "Zahtevanega elementa ni bilo mogo\u010de najti: {0}"},
-
-    { ER_INPUT_CANNOT_BE_NULL,
-        "InputStream ne more biti NULL"},
-
-    { ER_URI_CANNOT_BE_NULL,
-        "URI ne more biti NULL"},
-
-    { ER_FILE_CANNOT_BE_NULL,
-        "Datoteka ne more biti NULL"},
-
-    { ER_SOURCE_CANNOT_BE_NULL,
-                "InputSource ne more biti NULL"},
-
-    { ER_CANNOT_INIT_BSFMGR,
-                "Inicializacija BSF Manager-ja ni mogo\u010da"},
-
-    { ER_CANNOT_CMPL_EXTENSN,
-                "Kon\u010dnice ni mogo\u010de prevesti"},
-
-    { ER_CANNOT_CREATE_EXTENSN,
-      "Ne morem ustvariti kon\u010dnice: {0} zaradi: {1}"},
-
-    { ER_INSTANCE_MTHD_CALL_REQUIRES,
-      "Klic primerkov metode za metodo {0} zahteva primerek objekta kot prvi argument"},
-
-    { ER_INVALID_ELEMENT_NAME,
-      "Navedeno neveljavno ime elementa {0}"},
-
-    { ER_ELEMENT_NAME_METHOD_STATIC,
-      "Metoda imena elementa mora biti stati\u010dna (static) {0}"},
-
-    { ER_EXTENSION_FUNC_UNKNOWN,
-             "Funkcija kon\u010dnice {0} : {1} je neznana"},
-
-    { ER_MORE_MATCH_CONSTRUCTOR,
-             "Ve\u010d kot eno najbolj\u0161e ujemanje za graditelja za {0}"},
-
-    { ER_MORE_MATCH_METHOD,
-             "Ve\u010d kot eno najbolj\u0161e ujemanje za metodo {0}"},
-
-    { ER_MORE_MATCH_ELEMENT,
-             "Ve\u010d kot eno najbolj\u0161e ujemanje za metodo elementa {0}"},
-
-    { ER_INVALID_CONTEXT_PASSED,
-             "Posredovan neveljaven kontekst za ovrednotenje {0}"},
-
-    { ER_POOL_EXISTS,
-             "Zaloga \u017ee obstaja"},
-
-    { ER_NO_DRIVER_NAME,
-             "Ime gonilnika ni dolo\u010deno"},
-
-    { ER_NO_URL,
-             "URL ni dolo\u010den"},
-
-    { ER_POOL_SIZE_LESSTHAN_ONE,
-             "Zaloga je manj\u0161a od ena!"},
-
-    { ER_INVALID_DRIVER,
-             "Navedeno neveljavno ime gonilnika!"},
-
-    { ER_NO_STYLESHEETROOT,
-             "Korena slogovne datoteke ni mogo\u010de najti!"},
-
-    { ER_ILLEGAL_XMLSPACE_VALUE,
-         "Neveljavna vrednost za xml:space"},
-
-    { ER_PROCESSFROMNODE_FAILED,
-         "processFromNode spodletelo"},
-
-    { ER_RESOURCE_COULD_NOT_LOAD,
-        "Sredstva [ {0} ] ni bilo mogo\u010de nalo\u017eiti: {1} \n {2} \t {3}"},
-
-    { ER_BUFFER_SIZE_LESSTHAN_ZERO,
-        "Velikost medpomnilnika <=0"},
-
-    { ER_UNKNOWN_ERROR_CALLING_EXTENSION,
-        "Neznana napaka pri klicu kon\u010dnice"},
-
-    { ER_NO_NAMESPACE_DECL,
-        "Predpona {0} nima ustrezne deklaracije imenskega prostora"},
-
-    { ER_ELEM_CONTENT_NOT_ALLOWED,
-        "Vsebina elementa za lang=javaclass {0} ni dovoljena"},
-
-    { ER_STYLESHEET_DIRECTED_TERMINATION,
-        "Prekinitev usmerja slogovna datoteka"},
-
-    { ER_ONE_OR_TWO,
-        "1 ali 2"},
-
-    { ER_TWO_OR_THREE,
-        "2 ali 3"},
-
-    { ER_COULD_NOT_LOAD_RESOURCE,
-        "Nisem mogel nalo\u017eiti {0} (preverite CLASSPATH), trenutno se uporabljajo privzete vrednosti"},
-
-    { ER_CANNOT_INIT_DEFAULT_TEMPLATES,
-        "Ne morem inicializirati privzetih predlog"},
-
-    { ER_RESULT_NULL,
-        "Rezultat naj ne bi bil NULL"},
-
-    { ER_RESULT_COULD_NOT_BE_SET,
-        "Rezultata ni bilo mogo\u010de nastaviti"},
-
-    { ER_NO_OUTPUT_SPECIFIED,
-        "Izhod ni naveden"},
-
-    { ER_CANNOT_TRANSFORM_TO_RESULT_TYPE,
-        "Ne morem pretvoriti v rezultat tipa {0}"},
-
-    { ER_CANNOT_TRANSFORM_SOURCE_TYPE,
-        "Ne morem pretvoriti vira tipa {0}"},
-
-    { ER_NULL_CONTENT_HANDLER,
-        "Program za obravnavo vsebine NULL"},
-
-    { ER_NULL_ERROR_HANDLER,
-        "Program za obravnavo napak NULL"},
-
-    { ER_CANNOT_CALL_PARSE,
-        "klic raz\u010dlenitve ni mo\u017een \u010de ContentHandler ni bil nastavljen"},
-
-    { ER_NO_PARENT_FOR_FILTER,
-        "Ni nadrejenega za filter"},
-
-    { ER_NO_STYLESHEET_IN_MEDIA,
-         "Ni mogo\u010de najti slogovne datoteke v: {0}, medij= {1}"},
-
-    { ER_NO_STYLESHEET_PI,
-         "Ne najdem xml-stylesheet PI v: {0}"},
-
-    { ER_NOT_SUPPORTED,
-       "Ni podprto: {0}"},
-
-    { ER_PROPERTY_VALUE_BOOLEAN,
-       "Vrednost lastnosti {0} bi morala biti ponovitev logi\u010dne vrednosti"},
-
-    { ER_COULD_NOT_FIND_EXTERN_SCRIPT,
-         "Ne morem dostopati do zunanje skripte na {0}"},
-
-    { ER_RESOURCE_COULD_NOT_FIND,
-        "Vira [ {0} ] ni mogo\u010de najti.\n {1}"},
-
-    { ER_OUTPUT_PROPERTY_NOT_RECOGNIZED,
-        "Izhodna lastnost ni prepoznana: {0}"},
-
-    { ER_FAILED_CREATING_ELEMLITRSLT,
-        "Priprava primerka ElemLiteralResult ni uspela"},
-
-  //Earlier (JDK 1.4 XALAN 2.2-D11) at key code '204' the key name was ER_PRIORITY_NOT_PARSABLE
-  // In latest Xalan code base key name is  ER_VALUE_SHOULD_BE_NUMBER. This should also be taken care
-  //in locale specific files like XSLTErrorResources_de.java, XSLTErrorResources_fr.java etc.
-  //NOTE: Not only the key name but message has also been changed.
-
-    { ER_VALUE_SHOULD_BE_NUMBER,
-        "Vrednost za {0} bi morala biti \u0161tevilka, ki jo je mogo\u010de raz\u010dleniti"},
-
-    { ER_VALUE_SHOULD_EQUAL,
-        "Vrednost za {0} bi morala biti enaka da ali ne"},
-
-    { ER_FAILED_CALLING_METHOD,
-        "Klic metode {0} ni uspel"},
-
-    { ER_FAILED_CREATING_ELEMTMPL,
-        "Priprava primerka ElemTemplateElement ni uspela"},
-
-    { ER_CHARS_NOT_ALLOWED,
-        "V tem trenutku znaki v dokumentu niso na voljo"},
-
-    { ER_ATTR_NOT_ALLOWED,
-        "Atribut \"{0}\" v elementu {1} ni dovoljen!"},
-
-    { ER_BAD_VALUE,
-     "{0} slaba vrednost {1} "},
-
-    { ER_ATTRIB_VALUE_NOT_FOUND,
-     "Vrednosti atributa {0} ni bilo mogo\u010de najti "},
-
-    { ER_ATTRIB_VALUE_NOT_RECOGNIZED,
-     "Vrednosti atributa {0} ni bilo mogo\u010de prepoznati "},
-
-    { ER_NULL_URI_NAMESPACE,
-     "Posku\u0161am generirati predpono imenskega prostora z URI z vrednostjo NULL"},
-
-  //New ERROR keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
-
-    { ER_NUMBER_TOO_BIG,
-     "Poskus oblikovanja \u0161tevilke, ve\u010dje od najve\u010djega dolgega celega \u0161tevila"},
-
-    { ER_CANNOT_FIND_SAX1_DRIVER,
-     "Ne najdem razreda gonilnika SAX1 {0}"},
-
-    { ER_SAX1_DRIVER_NOT_LOADED,
-     "Na\u0161el razred gonilnika SAX1 {0}, vendar ga ne morem nalo\u017eiti"},
-
-    { ER_SAX1_DRIVER_NOT_INSTANTIATED,
-     "Nalo\u017eil razred gonilnika SAX1 {0}, vendar ga ne morem udejaniti"},
-
-    { ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER,
-     "Razred gonilnika SAX1 {0} ne vklju\u010duje org.xml.sax.Parser"},
-
-    { ER_PARSER_PROPERTY_NOT_SPECIFIED,
-     "Sistemska lastnost org.xml.sax.parser ni dolo\u010dena"},
-
-    { ER_PARSER_ARG_CANNOT_BE_NULL,
-     "Argument raz\u010dlenjevalnika sme biti NULL"},
-
-    { ER_FEATURE,
-     "Zna\u010dilnost: {0}"},
-
-    { ER_PROPERTY,
-     "Lastnost: {0}"},
-
-    { ER_NULL_ENTITY_RESOLVER,
-     "Razre\u0161evalnik entitet NULL"},
-
-    { ER_NULL_DTD_HANDLER,
-     "Program za obravnavanje DTD z vrednostjo NULL"},
-
-    { ER_NO_DRIVER_NAME_SPECIFIED,
-     "Ime gonilnika ni dolo\u010deno!"},
-
-    { ER_NO_URL_SPECIFIED,
-     "URL ni dolo\u010den!"},
-
-    { ER_POOLSIZE_LESS_THAN_ONE,
-     "Zaloga je manj\u0161a od 1!"},
-
-    { ER_INVALID_DRIVER_NAME,
-     "Dolo\u010deno neveljavno ime gonilnika!"},
-
-    { ER_ERRORLISTENER,
-     "ErrorListener"},
-
-
-// Note to translators:  The following message should not normally be displayed
-//   to users.  It describes a situation in which the processor has detected
-//   an internal consistency problem in itself, and it provides this message
-//   for the developer to help diagnose the problem.  The name
-//   'ElemTemplateElement' is the name of a class, and should not be
-//   translated.
-    { ER_ASSERT_NO_TEMPLATE_PARENT,
-     "Programerjeva napaka! Izraz nima nadrejenega ElemTemplateElement!"},
-
-
-// Note to translators:  The following message should not normally be displayed
-//   to users.  It describes a situation in which the processor has detected
-//   an internal consistency problem in itself, and it provides this message
-//   for the developer to help diagnose the problem.  The substitution text
-//   provides further information in order to diagnose the problem.  The name
-//   'RedundentExprEliminator' is the name of a class, and should not be
-//   translated.
-    { ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR,
-     "Programerjeva izjava v RedundentExprEliminator: {0}"},
-
-    { ER_NOT_ALLOWED_IN_POSITION,
-     "Na tem polo\u017eaju v slogovni datoteki {0} ni dovoljen!"},
-
-    { ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION,
-     "Besedilo, ki niso presledki in drugi podobni znaki, na tem polo\u017eaju v slogovni datoteki ni dovoljeno.!"},
-
-  // This code is shared with warning codes.
-  // SystemId Unknown
-    { INVALID_TCHAR,
-     "Neveljavna vrednost: {1} uporabljena za atribut CHAR: {0}.  Atribut tipa CHAR mora biti samo 1 znak!"},
-
-    // Note to translators:  The following message is used if the value of
-    // an attribute in a stylesheet is invalid.  "QNAME" is the XML data-type of
-    // the attribute, and should not be translated.  The substitution text {1} is
-    // the attribute value and {0} is the attribute name.
-    //The following codes are shared with the warning codes...
-    { INVALID_QNAME,
-     "Neveljavna vrednost: {1} uporabljena za atribut QNAME: {0}"},
-
-    // Note to translators:  The following message is used if the value of
-    // an attribute in a stylesheet is invalid.  "ENUM" is the XML data-type of
-    // the attribute, and should not be translated.  The substitution text {1} is
-    // the attribute value, {0} is the attribute name, and {2} is a list of valid
-    // values.
-    { INVALID_ENUM,
-     "Neveljavna vrednost: {1} uporabljena za atribut ENUM: {0}.  Veljavne vrednosti so: {2}."},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "NMTOKEN" is the XML data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-    { INVALID_NMTOKEN,
-     "Neveljavna vrednost: {1} uporabljena za atribut NMTOKEN: {0} "},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "NCNAME" is the XML data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-    { INVALID_NCNAME,
-     "Neveljavna vrednost: {1} uporabljena za atribut NCNAME: {0} "},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "boolean" is the XSLT data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-    { INVALID_BOOLEAN,
-     "Neveljavna vrednost: {1} uporabljena za atribut boolean: {0} "},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "number" is the XSLT data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-     { INVALID_NUMBER,
-     "Neveljavna vrednost: {1} uporabljena za atribut number: {0} "},
-
-
-  // End of shared codes...
-
-// Note to translators:  A "match pattern" is a special form of XPath expression
-// that is used for matching patterns.  The substitution text is the name of
-// a function.  The message indicates that when this function is referenced in
-// a match pattern, its argument must be a string literal (or constant.)
-// ER_ARG_LITERAL - new error message for bugzilla //5202
-    { ER_ARG_LITERAL,
-     "Argument za {0} v primerjalnem vzorcu mora biti dobesedni niz."},
-
-// Note to translators:  The following message indicates that two definitions of
-// a variable.  A "global variable" is a variable that is accessible everywher
-// in the stylesheet.
-// ER_DUPLICATE_GLOBAL_VAR - new error message for bugzilla #790
-    { ER_DUPLICATE_GLOBAL_VAR,
-     "Dvojnik deklaracije globalne spremenljivke."},
-
-
-// Note to translators:  The following message indicates that two definitions of
-// a variable were encountered.
-// ER_DUPLICATE_VAR - new error message for bugzilla #790
-    { ER_DUPLICATE_VAR,
-     "Dvojnik deklaracije spremenljivke."},
-
-    // Note to translators:  "xsl:template, "name" and "match" are XSLT keywords
-    // which must not be translated.
-    // ER_TEMPLATE_NAME_MATCH - new error message for bugzilla #789
-    { ER_TEMPLATE_NAME_MATCH,
-     "xsl:template mora vsebovati atribut name ali match (ali oba)"},
-
-    // Note to translators:  "exclude-result-prefixes" is an XSLT keyword which
-    // should not be translated.  The message indicates that a namespace prefix
-    // encountered as part of the value of the exclude-result-prefixes attribute
-    // was in error.
-    // ER_INVALID_PREFIX - new error message for bugzilla #788
-    { ER_INVALID_PREFIX,
-     "Predpona v izklju\u010di-predpone-rezultatov (exclude-result-prefixes) ni veljavna: {0}"},
-
-    // Note to translators:  An "attribute set" is a set of attributes that can
-    // be added to an element in the output document as a group.  The message
-    // indicates that there was a reference to an attribute set named {0} that
-    // was never defined.
-    // ER_NO_ATTRIB_SET - new error message for bugzilla #782
-    { ER_NO_ATTRIB_SET,
-     "Nabor atributov, imenovana {0}, ne obstaja"},
-
-    // Note to translators:  This message indicates that there was a reference
-    // to a function named {0} for which no function definition could be found.
-    { ER_FUNCTION_NOT_FOUND,
-     "Funkcija, imenovana {0}, ne obstaja"},
-
-    // Note to translators:  This message indicates that the XSLT instruction
-    // that is named by the substitution text {0} must not contain other XSLT
-    // instructions (content) or a "select" attribute.  The word "select" is
-    // an XSLT keyword in this case and must not be translated.
-    { ER_CANT_HAVE_CONTENT_AND_SELECT,
-     "Element {0} ne sme imeti vsebine in atributa izbire hkrati."},
-
-    // Note to translators:  This message indicates that the value argument
-    // of setParameter must be a valid Java Object.
-    { ER_INVALID_SET_PARAM_VALUE,
-     "Vrednost parametra {0} mora biti veljaven javanski objekt"},
-
-        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT,
-         "Atribut result-prefix elementa xsl:namespace-alias element ima vrednost '#default' (privzeto), ampak ni deklaracije privzetega imenskega prostora v razponu za ta element."},
-
-        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX,
-         "Atribut result-prefix elementa xsl:namespace-alias ima vrednost ''{0}'', ampak ni deklaracije privzetega imenskega prostora za predpono ''{0}'' v razponu za ta element."},
-
-    { ER_SET_FEATURE_NULL_NAME,
-      "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza, vrednost boolean)."},
-
-    { ER_GET_FEATURE_NULL_NAME,
-      "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza)."},
-
-    { ER_UNSUPPORTED_FEATURE,
-      "Ni mogo\u010de nastaviti funkcije ''{0}'' v tem TransformerFactory."},
-
-    { ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING,
-        "Uporaba raz\u0161iritvene elementa ''{0}'' ni na voljo, ko je funkcija varnega procesiranja nastavljena na true."},
-
-        { ER_NAMESPACE_CONTEXT_NULL_NAMESPACE,
-          "Ni mogo\u010de dobiti predpone za URI imenskega prostora null."},
-
-        { ER_NAMESPACE_CONTEXT_NULL_PREFIX,
-          "Ni mogo\u010de dobiti URI-ja imenskega prostora za predpono null."},
-
-        { ER_XPATH_RESOLVER_NULL_QNAME,
-          "Ime funkcije ne more biti ni\u010d."},
-
-        { ER_XPATH_RESOLVER_NEGATIVE_ARITY,
-          "\u0160tevilo argumentov ne more biti negativno"},
-
-  // Warnings...
-
-    { WG_FOUND_CURLYBRACE,
-      "Najden '}' vendar ni odprtih predlog atributov!"},
-
-    { WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR,
-      "Opozorilo: \u0161tevni atribut ni skladen s prednikom v xsl:number! Cilj = {0}"},
-
-    { WG_EXPR_ATTRIB_CHANGED_TO_SELECT,
-      "Stara sintaksa: Ime atributa 'izraz' je bilo spremenjeno v 'izbira'."},
-
-    { WG_NO_LOCALE_IN_FORMATNUMBER,
-      "Xalan \u0161e ne podpira podro\u010dnih imen v funkciji za oblikovanje \u0161tevilk."},
-
-    { WG_LOCALE_NOT_FOUND,
-      "Opozorilo: ne najdem podro\u010dnih nastavitev za xml:lang={0}"},
-
-    { WG_CANNOT_MAKE_URL_FROM,
-      "Iz {0} ni mogo\u010de narediti naslova URL."},
-
-    { WG_CANNOT_LOAD_REQUESTED_DOC,
-      "Ne morem nalo\u017eiti zahtevanega dokumenta: {0}"},
-
-    { WG_CANNOT_FIND_COLLATOR,
-      "Ne najdem kolacionista (collator) za <sort xml:lang={0}"},
-
-    { WG_FUNCTIONS_SHOULD_USE_URL,
-      "Stara sintaksa: navodilo za funkcije bi moralo uporabljati URL {0}"},
-
-    { WG_ENCODING_NOT_SUPPORTED_USING_UTF8,
-      "Kodiranje ni podprto: {0}, uporabljen bo UTF-8"},
-
-    { WG_ENCODING_NOT_SUPPORTED_USING_JAVA,
-      "kodiranje ni podprto: {0}, uporabljena bo Java {1}"},
-
-    { WG_SPECIFICITY_CONFLICTS,
-      "Spori pri specifi\u010dnosti: uporabljen bo zadnji najdeni {0} v slogovni datoteki."},
-
-    { WG_PARSING_AND_PREPARING,
-      "========= Poteka raz\u010dlenjevanje in priprava {0} =========="},
-
-    { WG_ATTR_TEMPLATE,
-     "Predloga atributa, {0}"},
-
-    { WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE,
-      "Spor ujemanja med xsl:strip-space in xsl:preserve-space"},
-
-    { WG_ATTRIB_NOT_HANDLED,
-      "Xalan \u0161e ne podpira atributa {0}!"},
-
-    { WG_NO_DECIMALFORMAT_DECLARATION,
-      "Deklaracije za decimalno obliko ni bilo mogo\u010de najti: {0}"},
-
-    { WG_OLD_XSLT_NS,
-     "Manjkajo\u010d ali nepravilen imenski prostor XSLT. "},
-
-    { WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED,
-      "Dovoljena je samo ena privzeta deklaracija xsl:decimal-format."},
-
-    { WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE,
-      "Imena xsl:decimal-format morajo biti enoli\u010dna. Ime \"{0}\" je bilo podvojeno."},
-
-    { WG_ILLEGAL_ATTRIBUTE,
-      "{0} vsebuje neveljaven atribut: {1}"},
-
-    { WG_COULD_NOT_RESOLVE_PREFIX,
-      "Ne morem razre\u0161iti predpone imenskega prostora: {0}. Vozli\u0161\u010de bo prezrto."},
-
-    { WG_STYLESHEET_REQUIRES_VERSION_ATTRIB,
-      "xsl:stylesheet zahteva atribut 'razli\u010dica'!"},
-
-    { WG_ILLEGAL_ATTRIBUTE_NAME,
-      "Neveljavno ime atributa: {0}"},
-
-    { WG_ILLEGAL_ATTRIBUTE_VALUE,
-      "Uporabljena neveljavna vrednost za atribut {0}: {1}"},
-
-    { WG_EMPTY_SECOND_ARG,
-      "Posledi\u010dna skupina vozli\u0161\u010d iz drugega argumenta funkcije dokumenta je prazna. Posredujte prazno skupino vozli\u0161\u010d."},
-
-  //Following are the new WARNING keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
-
-    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
-    // and must not be translated.
-    { WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
-      "Vrednost atributa 'ime' iz imena xsl:processing-instruction ne sme biti 'xml'"},
-
-    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
-    // and must not be translated.  "NCName" is an XML data-type and must not be
-    // translated.
-    { WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
-      "Vrednost atributa ''ime'' iz xsl:processing-instruction mora biti veljavno NCIme: {0}"},
-
-    // Note to translators:  This message is reported if the stylesheet that is
-    // being processed attempted to construct an XML document with an attribute in a
-    // place other than on an element.  The substitution text specifies the name of
-    // the attribute.
-    { WG_ILLEGAL_ATTRIBUTE_POSITION,
-      "Atributa {0} ne morem dodati za podrejenimi vozli\u0161\u010di ali pred izdelavo elementa.  Atribut bo prezrt."},
-
-    { NO_MODIFICATION_ALLOWED_ERR,
-      "Izveden je poskus spremembe objekta tam, kjer spremembe niso dovoljene."
-    },
-
-    //Check: WHY THERE IS A GAP B/W NUMBERS in the XSLTErrorResources properties file?
-
-  // Other miscellaneous text used inside the code...
-  { "ui_language", "sl"},
-  {  "help_language",  "sl" },
-  {  "language",  "sl" },
-  { "BAD_CODE", "Parameter za createMessage presega meje"},
-  {  "FORMAT_FAILED", "Med klicem messageFormat naletel na izjemo"},
-  {  "version", ">>>>>>> Razli\u010dica Xalan "},
-  {  "version2",  "<<<<<<<"},
-  {  "yes", "da"},
-  { "line", "Vrstica #"},
-  { "column","Stolpec #"},
-  { "xsldone", "XSLProcessor: dokon\u010dano"},
-
-
-  // Note to translators:  The following messages provide usage information
-  // for the Xalan Process command line.  "Process" is the name of a Java class,
-  // and should not be translated.
-  { "xslProc_option", "Ukazna vrstica Xalan-J Mo\u017enosti razreda postopka:"},
-  { "xslProc_option", "Ukazna vrstica Xalan-J Mo\u017enosti razredov postopkov\u003a"},
-  { "xslProc_invalid_xsltc_option", "Mo\u017enost {0} v na\u010dinu XSLTC ni podprta."},
-  { "xslProc_invalid_xalan_option", "Mo\u017enost {0} se lahko uporablja samo z -XSLTC."},
-  { "xslProc_no_input", "Napaka: ni dolo\u010dene slogovne datoteke ali vhodnega xml. Po\u017eenite ta ukaz, za katerega ni na voljo napotkov za uporabo."},
-  { "xslProc_common_options", "-Splo\u0161ne mo\u017enosti-"},
-  { "xslProc_xalan_options", "-Mo\u017enosti za Xalan-"},
-  { "xslProc_xsltc_options", "-Mo\u017enosti za XSLTC-"},
-  { "xslProc_return_to_continue", "(za nadaljevanje pritisnite <return>)"},
-
-   // Note to translators: The option name and the parameter name do not need to
-   // be translated. Only translate the messages in parentheses.  Note also that
-   // leading whitespace in the messages is used to indent the usage information
-   // for each option in the English messages.
-   // Do not translate the keywords: XSLTC, SAX, DOM and DTM.
-  { "optionXSLTC", "   [-XSLTC (za preoblikovanje uporabite XSLTC)]"},
-  { "optionIN", "   [-IN vhodniXMLURL]"},
-  { "optionXSL", "   [-XSL XSLPreoblikovanjeURL]"},
-  { "optionOUT",  "   [-OUT ImeIzhodneDatoteke]"},
-  { "optionLXCIN", "   [-LXCIN ImeVhodneDatotekePrevedeneSlogovneDatoteke]"},
-  { "optionLXCOUT", "   [-LXCOUT ImeIzhodneDatotekePrevedeneSlogovneDatoteke]"},
-  { "optionPARSER", "   [-PARSER popolnoma ustrezno ime razreda zveze raz\u010dlenjevalnika]"},
-  {  "optionE", "   [-E (Ne raz\u0161irjajte sklicev entitet)]"},
-  {  "optionV",  "   [-E (Ne raz\u0161irjajte sklicev entitet)]"},
-  {  "optionQC", "   [-QC (Tiha opozorila o sporih vzorcev)]"},
-  {  "optionQ", "   [-Q  (Tihi na\u010din)]"},
-  {  "optionLF", "   [-LF (Uporabite pomike samo na izhodu {privzeto je CR/LF})]"},
-  {  "optionCR", "   [-CR (Uporabite prehode v novo vrstico samo na izhodu {privzeto je CR/LF})]"},
-  { "optionESCAPE", "   [-ESCAPE (Znaki za izogib {privzeto je <>&\"\'\\r\\n}]"},
-  { "optionINDENT", "   [-INDENT (Koliko presledkov zamika {privzeto je 0})]"},
-  { "optionTT", "   [-TT (Sledite predlogam glede na njihov poziv.)]"},
-  { "optionTG", "   [-TG (Sledite vsakemu dogodku rodu.)]"},
-  { "optionTS", "   [-TS (Sledite vsakemu dogodku izbire.)]"},
-  {  "optionTTC", "   [-TTC (Sledite podrejenim predloge kot se obdelujejo.)]"},
-  { "optionTCLASS", "   [-TCLASS (Razred TraceListener za kon\u010dnice sledi.)]"},
-  { "optionVALIDATE", "   [-VALIDATE (Nastavi v primeru preverjanja veljavnosti.  Privzeta vrednost za preverjanje veljavnosti je izklopljeno.)]"},
-  { "optionEDUMP", "   [-EDUMP {izbirno ime datoteke} (V primeru napake naredi izvoz skladov.)]"},
-  {  "optionXML", "   [-XML (Uporabite oblikovalnik XML in dodajte glavo XML.)]"},
-  {  "optionTEXT", "   [-TEXT (Uporabite preprost oblikovalnik besedila.)]"},
-  {  "optionHTML", "   [-HTML (Uporabite oblikovalnik za HTML.)]"},
-  {  "optionPARAM", "   [-PARAM izraz imena (nastavite parameter slogovne datoteke)]"},
-  {  "noParsermsg1", "Postopek XSL ni uspel."},
-  {  "noParsermsg2", "** Nisem na\u0161el raz\u010dlenjevalnika **"},
-  { "noParsermsg3",  "Preverite pot razreda."},
-  { "noParsermsg4", "\u010ce nimate IBM raz\u010dlenjevalnika za Javo, ga lahko prenesete iz"},
-  { "noParsermsg5", "IBM AlphaWorks: http://www.alphaworks.ibm.com/formula/xml"},
-  { "optionURIRESOLVER", "   [-URIRESOLVER polno ime razreda (URIResolver za razre\u0161evanje URL-jev)]"},
-  { "optionENTITYRESOLVER",  "   [-ENTITYRESOLVER polno ime razreda (EntityResolver za razre\u0161evanje entitet)]"},
-  { "optionCONTENTHANDLER",  "   [-CONTENTHANDLER polno ime razreda (ContentHandler za serializacijo izhoda)]"},
-  {  "optionLINENUMBERS",  "   [-L za izvorni dokument uporabite \u0161tevilke vrstic]"},
-  { "optionSECUREPROCESSING", "   [-SECURE (nastavite funkcijo varne obdelave na True.)]"},
-
-    // Following are the new options added in XSLTErrorResources.properties files after Jdk 1.4 (Xalan 2.2-D11)
-
-
-  {  "optionMEDIA",  "   [-MEDIA TipMedija (z atributom medija poi\u0161\u010dite slogovno datoteko, ki se nana\u0161a na dokument.)]"},
-  {  "optionFLAVOR",  "   [-FLAVOR ImePosebnosti (Za preoblikovanje izrecno uporabljajte s2s=SAX ali d2d=DOM.)] "}, // Added by sboag/scurcuru; experimental
-  { "optionDIAG", "   [-DIAG (Natisnite skupni \u010das trajanja pretvorbe v milisekundah.)]"},
-  { "optionINCREMENTAL",  "   [-INCREMENTAL (zahtevajte gradnjo prirastnega DTM tako, da nastavite http://xml.apache.org/xalan/features/incremental na resni\u010dno.)]"},
-  {  "optionNOOPTIMIMIZE",  "   [-NOOPTIMIMIZE (prepre\u010dite obdelavo optimiziranja slogovne datoteke, tako da nastavite http://xml.apache.org/xalan/features/optimize na false.)]"},
-  { "optionRL",  "   [-RL mejaRekurzije (zahtevajte numeri\u010dno mejo globine rekurzije slogovne datoteke.)]"},
-  {   "optionXO",  "   [-XO [imeTransleta] (dodelite ime ustvarjenemu transletu)]"},
-  {  "optionXD", "   [-XD ciljnaMapa (navedite ciljno mapo za translet)]"},
-  {  "optionXJ",  "   [-XJ datotekaJar (zdru\u017ei razrede transleta v datoteko jar z imenom <jarfile>)]"},
-  {   "optionXP",  "   [-XP paket (navede predpono imena paketa vsem ustvarjenim razredom transletov)]"},
-
-  //AddITIONAL  STRINGS that need L10n
-  // Note to translators:  The following message describes usage of a particular
-  // command-line option that is used to enable the "template inlining"
-  // optimization.  The optimization involves making a copy of the code
-  // generated for a template in another template that refers to it.
-  { "optionXN",  "   [-XN (omogo\u010da vstavljanje predlog)]" },
-  { "optionXX",  "   [-XX (vklopi izhod za dodatna sporo\u010dila za iskanje napak)]"},
-  { "optionXT" , "   [-XT (\u010de je mogo\u010de, uporabite translet za pretvorbo)]"},
-  { "diagTiming"," --------- Pretvorba {0} prek {1} je trajala {2} ms" },
-  { "recursionTooDeep","Predloga pregloboko vgnezdena. Gnezdenje = {0}, predloga {1} {2}" },
-  { "nameIs", "ime je" },
-  { "matchPatternIs", "primerjalni vzorec je" }
-
-  };
-  }
-  // ================= INFRASTRUCTURE ======================
-
-  /** String for use when a bad error code was encountered.    */
-  public static final String BAD_CODE = "BAD_CODE";
-
-  /** String for use when formatting of the error string failed.   */
-  public static final String FORMAT_FAILED = "FORMAT_FAILED";
-
-  /** General error string.   */
-  public static final String ERROR_STRING = "#error";
-
-  /** String to prepend to error messages.  */
-  public static final String ERROR_HEADER = "Napaka: ";
-
-  /** String to prepend to warning messages.    */
-  public static final String WARNING_HEADER = "Opozorilo: ";
-
-  /** String to specify the XSLT module.  */
-  public static final String XSL_HEADER = "XSLT ";
-
-  /** String to specify the XML parser module.  */
-  public static final String XML_HEADER = "XML ";
-
-  /** I don't think this is used any more.
-   * @deprecated  */
-  public static final String QUERY_HEADER = "VZOREC ";
-
-
-  /**
-   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
-   *   of ResourceBundle.getBundle().
-   *
-   *   @param className the name of the class that implements the resource bundle.
-   *   @return the ResourceBundle
-   *   @throws MissingResourceException
-   */
-  public static final XSLTErrorResources loadResourceBundle(String className)
-          throws MissingResourceException
-  {
-
-    Locale locale = Locale.getDefault();
-    String suffix = getResourceSuffix(locale);
-
-    try
-    {
-
-      // first try with the given locale
-      return (XSLTErrorResources) ResourceBundle.getBundle(className
-              + suffix, locale);
-    }
-    catch (MissingResourceException e)
-    {
-      try  // try to fall back to en_US if we can't load
-      {
-
-        // Since we can't find the localized property file,
-        // fall back to en_US.
-        return (XSLTErrorResources) ResourceBundle.getBundle(className,
-                new Locale("sl", "US"));
-      }
-      catch (MissingResourceException e2)
-      {
-
-        // Now we are really in trouble.
-        // very bad, definitely very bad...not going to get very far
-        throw new MissingResourceException(
-          "Could not load any resource bundles.", className, "");
-      }
-    }
-  }
-
-  /**
-   * Return the resource file suffic for the indicated locale
-   * For most locales, this will be based the language code.  However
-   * for Chinese, we do distinguish between Taiwan and PRC
-   *
-   * @param locale the locale
-   * @return an String suffix which canbe appended to a resource name
-   */
-  private static final String getResourceSuffix(Locale locale)
-  {
-
-    String suffix = "_" + locale.getLanguage();
-    String country = locale.getCountry();
-
-    if (country.equals("TW"))
-      suffix += "_" + country;
-
-    return suffix;
-  }
-
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+package org.apache.xalan.res;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Set up error messages.
+ * We build a two dimensional array of message keys and
+ * message strings. In order to add a new message here,
+ * you need to first add a String constant. And
+ *  you need to enter key , value pair as part of contents
+ * Array. You also need to update MAX_CODE for error strings
+ * and MAX_WARNING for warnings ( Needed for only information
+ * purpose )
+ */
+public class XSLTErrorResources_sl extends ListResourceBundle
+{
+
+/*
+ * This file contains error and warning messages related to Xalan Error
+ * Handling.
+ *
+ *  General notes to translators:
+ *
+ *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
+ *     components.
+ *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *     XSLTC is an acronym for XSLT Compiler.
+ *
+ *  2) A stylesheet is a description of how to transform an input XML document
+ *     into a resultant XML document (or HTML document or text).  The
+ *     stylesheet itself is described in the form of an XML document.
+ *
+ *  3) A template is a component of a stylesheet that is used to match a
+ *     particular portion of an input document and specifies the form of the
+ *     corresponding portion of the output document.
+ *
+ *  4) An element is a mark-up tag in an XML document; an attribute is a
+ *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *     "elem" is an element name, "attr" and "attr2" are attribute names with
+ *     the values "val" and "val2", respectively.
+ *
+ *  5) A namespace declaration is a special attribute that is used to associate
+ *     a prefix with a URI (the namespace).  The meanings of element names and
+ *     attribute names that use that prefix are defined with respect to that
+ *     namespace.
+ *
+ *  6) "Translet" is an invented term that describes the class file that
+ *     results from compiling an XML stylesheet into a Java class.
+ *
+ *  7) XPath is a specification that describes a notation for identifying
+ *     nodes in a tree-structured representation of an XML document.  An
+ *     instance of that notation is referred to as an XPath expression.
+ *
+ */
+
+  /*
+   * Static variables
+   */
+  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX =
+        "ER_INVALID_SET_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX";
+
+  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT =
+        "ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT";
+
+  public static final String ER_NO_CURLYBRACE = "ER_NO_CURLYBRACE";
+  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
+  public static final String ER_ILLEGAL_ATTRIBUTE = "ER_ILLEGAL_ATTRIBUTE";
+  public static final String ER_NULL_SOURCENODE_APPLYIMPORTS = "ER_NULL_SOURCENODE_APPLYIMPORTS";
+  public static final String ER_CANNOT_ADD = "ER_CANNOT_ADD";
+  public static final String ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES="ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES";
+  public static final String ER_NO_NAME_ATTRIB = "ER_NO_NAME_ATTRIB";
+  public static final String ER_TEMPLATE_NOT_FOUND = "ER_TEMPLATE_NOT_FOUND";
+  public static final String ER_CANT_RESOLVE_NAME_AVT = "ER_CANT_RESOLVE_NAME_AVT";
+  public static final String ER_REQUIRES_ATTRIB = "ER_REQUIRES_ATTRIB";
+  public static final String ER_MUST_HAVE_TEST_ATTRIB = "ER_MUST_HAVE_TEST_ATTRIB";
+  public static final String ER_BAD_VAL_ON_LEVEL_ATTRIB =
+         "ER_BAD_VAL_ON_LEVEL_ATTRIB";
+  public static final String ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
+         "ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
+  public static final String ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
+         "ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
+  public static final String ER_NEED_MATCH_ATTRIB = "ER_NEED_MATCH_ATTRIB";
+  public static final String ER_NEED_NAME_OR_MATCH_ATTRIB =
+         "ER_NEED_NAME_OR_MATCH_ATTRIB";
+  public static final String ER_CANT_RESOLVE_NSPREFIX =
+         "ER_CANT_RESOLVE_NSPREFIX";
+  public static final String ER_ILLEGAL_VALUE = "ER_ILLEGAL_VALUE";
+  public static final String ER_NO_OWNERDOC = "ER_NO_OWNERDOC";
+  public static final String ER_ELEMTEMPLATEELEM_ERR ="ER_ELEMTEMPLATEELEM_ERR";
+  public static final String ER_NULL_CHILD = "ER_NULL_CHILD";
+  public static final String ER_NEED_SELECT_ATTRIB = "ER_NEED_SELECT_ATTRIB";
+  public static final String ER_NEED_TEST_ATTRIB = "ER_NEED_TEST_ATTRIB";
+  public static final String ER_NEED_NAME_ATTRIB = "ER_NEED_NAME_ATTRIB";
+  public static final String ER_NO_CONTEXT_OWNERDOC = "ER_NO_CONTEXT_OWNERDOC";
+  public static final String ER_COULD_NOT_CREATE_XML_PROC_LIAISON =
+         "ER_COULD_NOT_CREATE_XML_PROC_LIAISON";
+  public static final String ER_PROCESS_NOT_SUCCESSFUL =
+         "ER_PROCESS_NOT_SUCCESSFUL";
+  public static final String ER_NOT_SUCCESSFUL = "ER_NOT_SUCCESSFUL";
+  public static final String ER_ENCODING_NOT_SUPPORTED =
+         "ER_ENCODING_NOT_SUPPORTED";
+  public static final String ER_COULD_NOT_CREATE_TRACELISTENER =
+         "ER_COULD_NOT_CREATE_TRACELISTENER";
+  public static final String ER_KEY_REQUIRES_NAME_ATTRIB =
+         "ER_KEY_REQUIRES_NAME_ATTRIB";
+  public static final String ER_KEY_REQUIRES_MATCH_ATTRIB =
+         "ER_KEY_REQUIRES_MATCH_ATTRIB";
+  public static final String ER_KEY_REQUIRES_USE_ATTRIB =
+         "ER_KEY_REQUIRES_USE_ATTRIB";
+  public static final String ER_REQUIRES_ELEMENTS_ATTRIB =
+         "ER_REQUIRES_ELEMENTS_ATTRIB";
+  public static final String ER_MISSING_PREFIX_ATTRIB =
+         "ER_MISSING_PREFIX_ATTRIB";
+  public static final String ER_BAD_STYLESHEET_URL = "ER_BAD_STYLESHEET_URL";
+  public static final String ER_FILE_NOT_FOUND = "ER_FILE_NOT_FOUND";
+  public static final String ER_IOEXCEPTION = "ER_IOEXCEPTION";
+  public static final String ER_NO_HREF_ATTRIB = "ER_NO_HREF_ATTRIB";
+  public static final String ER_STYLESHEET_INCLUDES_ITSELF =
+         "ER_STYLESHEET_INCLUDES_ITSELF";
+  public static final String ER_PROCESSINCLUDE_ERROR ="ER_PROCESSINCLUDE_ERROR";
+  public static final String ER_MISSING_LANG_ATTRIB = "ER_MISSING_LANG_ATTRIB";
+  public static final String ER_MISSING_CONTAINER_ELEMENT_COMPONENT =
+         "ER_MISSING_CONTAINER_ELEMENT_COMPONENT";
+  public static final String ER_CAN_ONLY_OUTPUT_TO_ELEMENT =
+         "ER_CAN_ONLY_OUTPUT_TO_ELEMENT";
+  public static final String ER_PROCESS_ERROR = "ER_PROCESS_ERROR";
+  public static final String ER_UNIMPLNODE_ERROR = "ER_UNIMPLNODE_ERROR";
+  public static final String ER_NO_SELECT_EXPRESSION ="ER_NO_SELECT_EXPRESSION";
+  public static final String ER_CANNOT_SERIALIZE_XSLPROCESSOR =
+         "ER_CANNOT_SERIALIZE_XSLPROCESSOR";
+  public static final String ER_NO_INPUT_STYLESHEET = "ER_NO_INPUT_STYLESHEET";
+  public static final String ER_FAILED_PROCESS_STYLESHEET =
+         "ER_FAILED_PROCESS_STYLESHEET";
+  public static final String ER_COULDNT_PARSE_DOC = "ER_COULDNT_PARSE_DOC";
+  public static final String ER_COULDNT_FIND_FRAGMENT =
+         "ER_COULDNT_FIND_FRAGMENT";
+  public static final String ER_NODE_NOT_ELEMENT = "ER_NODE_NOT_ELEMENT";
+  public static final String ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB =
+         "ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB";
+  public static final String ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB =
+         "ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB";
+  public static final String ER_NO_CLONE_OF_DOCUMENT_FRAG =
+         "ER_NO_CLONE_OF_DOCUMENT_FRAG";
+  public static final String ER_CANT_CREATE_ITEM = "ER_CANT_CREATE_ITEM";
+  public static final String ER_XMLSPACE_ILLEGAL_VALUE =
+         "ER_XMLSPACE_ILLEGAL_VALUE";
+  public static final String ER_NO_XSLKEY_DECLARATION =
+         "ER_NO_XSLKEY_DECLARATION";
+  public static final String ER_CANT_CREATE_URL = "ER_CANT_CREATE_URL";
+  public static final String ER_XSLFUNCTIONS_UNSUPPORTED =
+         "ER_XSLFUNCTIONS_UNSUPPORTED";
+  public static final String ER_PROCESSOR_ERROR = "ER_PROCESSOR_ERROR";
+  public static final String ER_NOT_ALLOWED_INSIDE_STYLESHEET =
+         "ER_NOT_ALLOWED_INSIDE_STYLESHEET";
+  public static final String ER_RESULTNS_NOT_SUPPORTED =
+         "ER_RESULTNS_NOT_SUPPORTED";
+  public static final String ER_DEFAULTSPACE_NOT_SUPPORTED =
+         "ER_DEFAULTSPACE_NOT_SUPPORTED";
+  public static final String ER_INDENTRESULT_NOT_SUPPORTED =
+         "ER_INDENTRESULT_NOT_SUPPORTED";
+  public static final String ER_ILLEGAL_ATTRIB = "ER_ILLEGAL_ATTRIB";
+  public static final String ER_UNKNOWN_XSL_ELEM = "ER_UNKNOWN_XSL_ELEM";
+  public static final String ER_BAD_XSLSORT_USE = "ER_BAD_XSLSORT_USE";
+  public static final String ER_MISPLACED_XSLWHEN = "ER_MISPLACED_XSLWHEN";
+  public static final String ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE =
+         "ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE";
+  public static final String ER_MISPLACED_XSLOTHERWISE =
+         "ER_MISPLACED_XSLOTHERWISE";
+  public static final String ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE =
+         "ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE";
+  public static final String ER_NOT_ALLOWED_INSIDE_TEMPLATE =
+         "ER_NOT_ALLOWED_INSIDE_TEMPLATE";
+  public static final String ER_UNKNOWN_EXT_NS_PREFIX =
+         "ER_UNKNOWN_EXT_NS_PREFIX";
+  public static final String ER_IMPORTS_AS_FIRST_ELEM =
+         "ER_IMPORTS_AS_FIRST_ELEM";
+  public static final String ER_IMPORTING_ITSELF = "ER_IMPORTING_ITSELF";
+  public static final String ER_XMLSPACE_ILLEGAL_VAL ="ER_XMLSPACE_ILLEGAL_VAL";
+  public static final String ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL =
+         "ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL";
+  public static final String ER_SAX_EXCEPTION = "ER_SAX_EXCEPTION";
+  public static final String ER_XSLT_ERROR = "ER_XSLT_ERROR";
+  public static final String ER_CURRENCY_SIGN_ILLEGAL=
+         "ER_CURRENCY_SIGN_ILLEGAL";
+  public static final String ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM =
+         "ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM";
+  public static final String ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER =
+         "ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER";
+  public static final String ER_REDIRECT_COULDNT_GET_FILENAME =
+         "ER_REDIRECT_COULDNT_GET_FILENAME";
+  public static final String ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT =
+         "ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT";
+  public static final String ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX =
+         "ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX";
+  public static final String ER_MISSING_NS_URI = "ER_MISSING_NS_URI";
+  public static final String ER_MISSING_ARG_FOR_OPTION =
+         "ER_MISSING_ARG_FOR_OPTION";
+  public static final String ER_INVALID_OPTION = "ER_INVALID_OPTION";
+  public static final String ER_MALFORMED_FORMAT_STRING =
+         "ER_MALFORMED_FORMAT_STRING";
+  public static final String ER_STYLESHEET_REQUIRES_VERSION_ATTRIB =
+         "ER_STYLESHEET_REQUIRES_VERSION_ATTRIB";
+  public static final String ER_ILLEGAL_ATTRIBUTE_VALUE =
+         "ER_ILLEGAL_ATTRIBUTE_VALUE";
+  public static final String ER_CHOOSE_REQUIRES_WHEN ="ER_CHOOSE_REQUIRES_WHEN";
+  public static final String ER_NO_APPLY_IMPORT_IN_FOR_EACH =
+         "ER_NO_APPLY_IMPORT_IN_FOR_EACH";
+  public static final String ER_CANT_USE_DTM_FOR_OUTPUT =
+         "ER_CANT_USE_DTM_FOR_OUTPUT";
+  public static final String ER_CANT_USE_DTM_FOR_INPUT =
+         "ER_CANT_USE_DTM_FOR_INPUT";
+  public static final String ER_CALL_TO_EXT_FAILED = "ER_CALL_TO_EXT_FAILED";
+  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
+  public static final String ER_INVALID_UTF16_SURROGATE =
+         "ER_INVALID_UTF16_SURROGATE";
+  public static final String ER_XSLATTRSET_USED_ITSELF =
+         "ER_XSLATTRSET_USED_ITSELF";
+  public static final String ER_CANNOT_MIX_XERCESDOM ="ER_CANNOT_MIX_XERCESDOM";
+  public static final String ER_TOO_MANY_LISTENERS = "ER_TOO_MANY_LISTENERS";
+  public static final String ER_IN_ELEMTEMPLATEELEM_READOBJECT =
+         "ER_IN_ELEMTEMPLATEELEM_READOBJECT";
+  public static final String ER_DUPLICATE_NAMED_TEMPLATE =
+         "ER_DUPLICATE_NAMED_TEMPLATE";
+  public static final String ER_INVALID_KEY_CALL = "ER_INVALID_KEY_CALL";
+  public static final String ER_REFERENCING_ITSELF = "ER_REFERENCING_ITSELF";
+  public static final String ER_ILLEGAL_DOMSOURCE_INPUT =
+         "ER_ILLEGAL_DOMSOURCE_INPUT";
+  public static final String ER_CLASS_NOT_FOUND_FOR_OPTION =
+         "ER_CLASS_NOT_FOUND_FOR_OPTION";
+  public static final String ER_REQUIRED_ELEM_NOT_FOUND =
+         "ER_REQUIRED_ELEM_NOT_FOUND";
+  public static final String ER_INPUT_CANNOT_BE_NULL ="ER_INPUT_CANNOT_BE_NULL";
+  public static final String ER_URI_CANNOT_BE_NULL = "ER_URI_CANNOT_BE_NULL";
+  public static final String ER_FILE_CANNOT_BE_NULL = "ER_FILE_CANNOT_BE_NULL";
+  public static final String ER_SOURCE_CANNOT_BE_NULL =
+         "ER_SOURCE_CANNOT_BE_NULL";
+  public static final String ER_CANNOT_INIT_BSFMGR = "ER_CANNOT_INIT_BSFMGR";
+  public static final String ER_CANNOT_CMPL_EXTENSN = "ER_CANNOT_CMPL_EXTENSN";
+  public static final String ER_CANNOT_CREATE_EXTENSN =
+         "ER_CANNOT_CREATE_EXTENSN";
+  public static final String ER_INSTANCE_MTHD_CALL_REQUIRES =
+         "ER_INSTANCE_MTHD_CALL_REQUIRES";
+  public static final String ER_INVALID_ELEMENT_NAME ="ER_INVALID_ELEMENT_NAME";
+  public static final String ER_ELEMENT_NAME_METHOD_STATIC =
+         "ER_ELEMENT_NAME_METHOD_STATIC";
+  public static final String ER_EXTENSION_FUNC_UNKNOWN =
+         "ER_EXTENSION_FUNC_UNKNOWN";
+  public static final String ER_MORE_MATCH_CONSTRUCTOR =
+         "ER_MORE_MATCH_CONSTRUCTOR";
+  public static final String ER_MORE_MATCH_METHOD = "ER_MORE_MATCH_METHOD";
+  public static final String ER_MORE_MATCH_ELEMENT = "ER_MORE_MATCH_ELEMENT";
+  public static final String ER_INVALID_CONTEXT_PASSED =
+         "ER_INVALID_CONTEXT_PASSED";
+  public static final String ER_POOL_EXISTS = "ER_POOL_EXISTS";
+  public static final String ER_NO_DRIVER_NAME = "ER_NO_DRIVER_NAME";
+  public static final String ER_NO_URL = "ER_NO_URL";
+  public static final String ER_POOL_SIZE_LESSTHAN_ONE =
+         "ER_POOL_SIZE_LESSTHAN_ONE";
+  public static final String ER_INVALID_DRIVER = "ER_INVALID_DRIVER";
+  public static final String ER_NO_STYLESHEETROOT = "ER_NO_STYLESHEETROOT";
+  public static final String ER_ILLEGAL_XMLSPACE_VALUE =
+         "ER_ILLEGAL_XMLSPACE_VALUE";
+  public static final String ER_PROCESSFROMNODE_FAILED =
+         "ER_PROCESSFROMNODE_FAILED";
+  public static final String ER_RESOURCE_COULD_NOT_LOAD =
+         "ER_RESOURCE_COULD_NOT_LOAD";
+  public static final String ER_BUFFER_SIZE_LESSTHAN_ZERO =
+         "ER_BUFFER_SIZE_LESSTHAN_ZERO";
+  public static final String ER_UNKNOWN_ERROR_CALLING_EXTENSION =
+         "ER_UNKNOWN_ERROR_CALLING_EXTENSION";
+  public static final String ER_NO_NAMESPACE_DECL = "ER_NO_NAMESPACE_DECL";
+  public static final String ER_ELEM_CONTENT_NOT_ALLOWED =
+         "ER_ELEM_CONTENT_NOT_ALLOWED";
+  public static final String ER_STYLESHEET_DIRECTED_TERMINATION =
+         "ER_STYLESHEET_DIRECTED_TERMINATION";
+  public static final String ER_ONE_OR_TWO = "ER_ONE_OR_TWO";
+  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
+  public static final String ER_COULD_NOT_LOAD_RESOURCE =
+         "ER_COULD_NOT_LOAD_RESOURCE";
+  public static final String ER_CANNOT_INIT_DEFAULT_TEMPLATES =
+         "ER_CANNOT_INIT_DEFAULT_TEMPLATES";
+  public static final String ER_RESULT_NULL = "ER_RESULT_NULL";
+  public static final String ER_RESULT_COULD_NOT_BE_SET =
+         "ER_RESULT_COULD_NOT_BE_SET";
+  public static final String ER_NO_OUTPUT_SPECIFIED = "ER_NO_OUTPUT_SPECIFIED";
+  public static final String ER_CANNOT_TRANSFORM_TO_RESULT_TYPE =
+         "ER_CANNOT_TRANSFORM_TO_RESULT_TYPE";
+  public static final String ER_CANNOT_TRANSFORM_SOURCE_TYPE =
+         "ER_CANNOT_TRANSFORM_SOURCE_TYPE";
+  public static final String ER_NULL_CONTENT_HANDLER ="ER_NULL_CONTENT_HANDLER";
+  public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
+  public static final String ER_CANNOT_CALL_PARSE = "ER_CANNOT_CALL_PARSE";
+  public static final String ER_NO_PARENT_FOR_FILTER ="ER_NO_PARENT_FOR_FILTER";
+  public static final String ER_NO_STYLESHEET_IN_MEDIA =
+         "ER_NO_STYLESHEET_IN_MEDIA";
+  public static final String ER_NO_STYLESHEET_PI = "ER_NO_STYLESHEET_PI";
+  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
+  public static final String ER_PROPERTY_VALUE_BOOLEAN =
+         "ER_PROPERTY_VALUE_BOOLEAN";
+  public static final String ER_COULD_NOT_FIND_EXTERN_SCRIPT =
+         "ER_COULD_NOT_FIND_EXTERN_SCRIPT";
+  public static final String ER_RESOURCE_COULD_NOT_FIND =
+         "ER_RESOURCE_COULD_NOT_FIND";
+  public static final String ER_OUTPUT_PROPERTY_NOT_RECOGNIZED =
+         "ER_OUTPUT_PROPERTY_NOT_RECOGNIZED";
+  public static final String ER_FAILED_CREATING_ELEMLITRSLT =
+         "ER_FAILED_CREATING_ELEMLITRSLT";
+  public static final String ER_VALUE_SHOULD_BE_NUMBER =
+         "ER_VALUE_SHOULD_BE_NUMBER";
+  public static final String ER_VALUE_SHOULD_EQUAL = "ER_VALUE_SHOULD_EQUAL";
+  public static final String ER_FAILED_CALLING_METHOD =
+         "ER_FAILED_CALLING_METHOD";
+  public static final String ER_FAILED_CREATING_ELEMTMPL =
+         "ER_FAILED_CREATING_ELEMTMPL";
+  public static final String ER_CHARS_NOT_ALLOWED = "ER_CHARS_NOT_ALLOWED";
+  public static final String ER_ATTR_NOT_ALLOWED = "ER_ATTR_NOT_ALLOWED";
+  public static final String ER_BAD_VALUE = "ER_BAD_VALUE";
+  public static final String ER_ATTRIB_VALUE_NOT_FOUND =
+         "ER_ATTRIB_VALUE_NOT_FOUND";
+  public static final String ER_ATTRIB_VALUE_NOT_RECOGNIZED =
+         "ER_ATTRIB_VALUE_NOT_RECOGNIZED";
+  public static final String ER_NULL_URI_NAMESPACE = "ER_NULL_URI_NAMESPACE";
+  public static final String ER_NUMBER_TOO_BIG = "ER_NUMBER_TOO_BIG";
+  public static final String  ER_CANNOT_FIND_SAX1_DRIVER =
+         "ER_CANNOT_FIND_SAX1_DRIVER";
+  public static final String  ER_SAX1_DRIVER_NOT_LOADED =
+         "ER_SAX1_DRIVER_NOT_LOADED";
+  public static final String  ER_SAX1_DRIVER_NOT_INSTANTIATED =
+         "ER_SAX1_DRIVER_NOT_INSTANTIATED" ;
+  public static final String ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER =
+         "ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER";
+  public static final String  ER_PARSER_PROPERTY_NOT_SPECIFIED =
+         "ER_PARSER_PROPERTY_NOT_SPECIFIED";
+  public static final String  ER_PARSER_ARG_CANNOT_BE_NULL =
+         "ER_PARSER_ARG_CANNOT_BE_NULL" ;
+  public static final String  ER_FEATURE = "ER_FEATURE";
+  public static final String ER_PROPERTY = "ER_PROPERTY" ;
+  public static final String ER_NULL_ENTITY_RESOLVER ="ER_NULL_ENTITY_RESOLVER";
+  public static final String  ER_NULL_DTD_HANDLER = "ER_NULL_DTD_HANDLER" ;
+  public static final String ER_NO_DRIVER_NAME_SPECIFIED =
+         "ER_NO_DRIVER_NAME_SPECIFIED";
+  public static final String ER_NO_URL_SPECIFIED = "ER_NO_URL_SPECIFIED";
+  public static final String ER_POOLSIZE_LESS_THAN_ONE =
+         "ER_POOLSIZE_LESS_THAN_ONE";
+  public static final String ER_INVALID_DRIVER_NAME = "ER_INVALID_DRIVER_NAME";
+  public static final String ER_ERRORLISTENER = "ER_ERRORLISTENER";
+  public static final String ER_ASSERT_NO_TEMPLATE_PARENT =
+         "ER_ASSERT_NO_TEMPLATE_PARENT";
+  public static final String ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR =
+         "ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR";
+  public static final String ER_NOT_ALLOWED_IN_POSITION =
+         "ER_NOT_ALLOWED_IN_POSITION";
+  public static final String ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION =
+         "ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION";
+  public static final String ER_NAMESPACE_CONTEXT_NULL_NAMESPACE =
+         "ER_NAMESPACE_CONTEXT_NULL_NAMESPACE";
+  public static final String ER_NAMESPACE_CONTEXT_NULL_PREFIX =
+         "ER_NAMESPACE_CONTEXT_NULL_PREFIX";
+  public static final String ER_XPATH_RESOLVER_NULL_QNAME =
+         "ER_XPATH_RESOLVER_NULL_QNAME";
+  public static final String ER_XPATH_RESOLVER_NEGATIVE_ARITY =
+         "ER_XPATH_RESOLVER_NEGATIVE_ARITY";
+  public static final String INVALID_TCHAR = "INVALID_TCHAR";
+  public static final String INVALID_QNAME = "INVALID_QNAME";
+  public static final String INVALID_ENUM = "INVALID_ENUM";
+  public static final String INVALID_NMTOKEN = "INVALID_NMTOKEN";
+  public static final String INVALID_NCNAME = "INVALID_NCNAME";
+  public static final String INVALID_BOOLEAN = "INVALID_BOOLEAN";
+  public static final String INVALID_NUMBER = "INVALID_NUMBER";
+  public static final String ER_ARG_LITERAL = "ER_ARG_LITERAL";
+  public static final String ER_DUPLICATE_GLOBAL_VAR ="ER_DUPLICATE_GLOBAL_VAR";
+  public static final String ER_DUPLICATE_VAR = "ER_DUPLICATE_VAR";
+  public static final String ER_TEMPLATE_NAME_MATCH = "ER_TEMPLATE_NAME_MATCH";
+  public static final String ER_INVALID_PREFIX = "ER_INVALID_PREFIX";
+  public static final String ER_NO_ATTRIB_SET = "ER_NO_ATTRIB_SET";
+  public static final String ER_FUNCTION_NOT_FOUND =
+         "ER_FUNCTION_NOT_FOUND";
+  public static final String ER_CANT_HAVE_CONTENT_AND_SELECT =
+     "ER_CANT_HAVE_CONTENT_AND_SELECT";
+  public static final String ER_INVALID_SET_PARAM_VALUE = "ER_INVALID_SET_PARAM_VALUE";
+  public static final String ER_SET_FEATURE_NULL_NAME =
+        "ER_SET_FEATURE_NULL_NAME";
+  public static final String ER_GET_FEATURE_NULL_NAME =
+        "ER_GET_FEATURE_NULL_NAME";
+  public static final String ER_UNSUPPORTED_FEATURE =
+        "ER_UNSUPPORTED_FEATURE";
+  public static final String ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING =
+        "ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING";
+
+  public static final String WG_FOUND_CURLYBRACE = "WG_FOUND_CURLYBRACE";
+  public static final String WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR =
+         "WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR";
+  public static final String WG_EXPR_ATTRIB_CHANGED_TO_SELECT =
+         "WG_EXPR_ATTRIB_CHANGED_TO_SELECT";
+  public static final String WG_NO_LOCALE_IN_FORMATNUMBER =
+         "WG_NO_LOCALE_IN_FORMATNUMBER";
+  public static final String WG_LOCALE_NOT_FOUND = "WG_LOCALE_NOT_FOUND";
+  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
+  public static final String WG_CANNOT_LOAD_REQUESTED_DOC =
+         "WG_CANNOT_LOAD_REQUESTED_DOC";
+  public static final String WG_CANNOT_FIND_COLLATOR ="WG_CANNOT_FIND_COLLATOR";
+  public static final String WG_FUNCTIONS_SHOULD_USE_URL =
+         "WG_FUNCTIONS_SHOULD_USE_URL";
+  public static final String WG_ENCODING_NOT_SUPPORTED_USING_UTF8 =
+         "WG_ENCODING_NOT_SUPPORTED_USING_UTF8";
+  public static final String WG_ENCODING_NOT_SUPPORTED_USING_JAVA =
+         "WG_ENCODING_NOT_SUPPORTED_USING_JAVA";
+  public static final String WG_SPECIFICITY_CONFLICTS =
+         "WG_SPECIFICITY_CONFLICTS";
+  public static final String WG_PARSING_AND_PREPARING =
+         "WG_PARSING_AND_PREPARING";
+  public static final String WG_ATTR_TEMPLATE = "WG_ATTR_TEMPLATE";
+  public static final String WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE = "WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESP";
+  public static final String WG_ATTRIB_NOT_HANDLED = "WG_ATTRIB_NOT_HANDLED";
+  public static final String WG_NO_DECIMALFORMAT_DECLARATION =
+         "WG_NO_DECIMALFORMAT_DECLARATION";
+  public static final String WG_OLD_XSLT_NS = "WG_OLD_XSLT_NS";
+  public static final String WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED =
+         "WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED";
+  public static final String WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE =
+         "WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE";
+  public static final String WG_ILLEGAL_ATTRIBUTE = "WG_ILLEGAL_ATTRIBUTE";
+  public static final String WG_COULD_NOT_RESOLVE_PREFIX =
+         "WG_COULD_NOT_RESOLVE_PREFIX";
+  public static final String WG_STYLESHEET_REQUIRES_VERSION_ATTRIB =
+         "WG_STYLESHEET_REQUIRES_VERSION_ATTRIB";
+  public static final String WG_ILLEGAL_ATTRIBUTE_NAME =
+         "WG_ILLEGAL_ATTRIBUTE_NAME";
+  public static final String WG_ILLEGAL_ATTRIBUTE_VALUE =
+         "WG_ILLEGAL_ATTRIBUTE_VALUE";
+  public static final String WG_EMPTY_SECOND_ARG = "WG_EMPTY_SECOND_ARG";
+  public static final String WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
+         "WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
+  public static final String WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
+         "WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
+  public static final String WG_ILLEGAL_ATTRIBUTE_POSITION =
+         "WG_ILLEGAL_ATTRIBUTE_POSITION";
+  public static final String NO_MODIFICATION_ALLOWED_ERR =
+         "NO_MODIFICATION_ALLOWED_ERR";
+
+  /*
+   * Now fill in the message text.
+   * Then fill in the message text for that message code in the
+   * array. Use the new error code as the index into the array.
+   */
+
+  // Error messages...
+
+  /** Get the lookup table for error messages.
+   *
+   * @return The message lookup table.
+   */
+  public Object[][] getContents()
+  {
+    return new Object[][] {
+
+  /** Error message ID that has a null message, but takes in a single object.    */
+  {"ER0000" , "{0}" },
+
+
+    { ER_NO_CURLYBRACE,
+      "Napaka: Izraz ne sme vsebovati '{'"},
+
+    { ER_ILLEGAL_ATTRIBUTE ,
+     "{0} vsebuje neveljaven atribut: {1}"},
+
+  {ER_NULL_SOURCENODE_APPLYIMPORTS ,
+      "sourceNode je NULL v xsl:apply-imports!"},
+
+  {ER_CANNOT_ADD,
+      "Ne morem dodati {0} k {1}"},
+
+    { ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES,
+      "sourceNode je NULL v handleApplyTemplatesInstruction!"},
+
+    { ER_NO_NAME_ATTRIB,
+     "{0} mora vsebovati atribut imena."},
+
+    {ER_TEMPLATE_NOT_FOUND,
+     "Nisem na\u0161em predloge z imenom: {0}"},
+
+    {ER_CANT_RESOLVE_NAME_AVT,
+      "Imena AVT v xsl:call-template ni bilo mogo\u010de razre\u0161iti."},
+
+    {ER_REQUIRES_ATTRIB,
+     "{0} zahteva atribut: {1}"},
+
+    { ER_MUST_HAVE_TEST_ATTRIB,
+      "{0} mora imeti atribut ''test''."},
+
+    {ER_BAD_VAL_ON_LEVEL_ATTRIB,
+      "Slaba vrednost pri atributu stopnje: {0}"},
+
+    {ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
+      "Ime navodila za obdelavo ne more biti 'xml'"},
+
+    { ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
+      "Ime navodila za obdelavo mora biti veljavno NCIme: {0}"},
+
+    { ER_NEED_MATCH_ATTRIB,
+      "{0} mora vsebovati primerjalni atribut, \u010de vsebuje vozli\u0161\u010de."},
+
+    { ER_NEED_NAME_OR_MATCH_ATTRIB,
+      "{0} zahteva atribut imena ali primerjalni atribut."},
+
+    {ER_CANT_RESOLVE_NSPREFIX,
+      "Predpone imenskega prostora ni mogo\u010de razre\u0161iti: {0}"},
+
+    { ER_ILLEGAL_VALUE,
+     "xml:space vsebuje neveljavno vrednost: {0}"},
+
+    { ER_NO_OWNERDOC,
+      "Podrejeno vozli\u0161\u010de ne vsebuje lastni\u0161kega dokumenta!"},
+
+    { ER_ELEMTEMPLATEELEM_ERR,
+     "Napaka ElemTemplateElement: {0}"},
+
+    { ER_NULL_CHILD,
+     "Poskus dodajanja podrejenega elementa z vrednostjo NULL!"},
+
+    { ER_NEED_SELECT_ATTRIB,
+     "{0} zahteva atribut izbire."},
+
+    { ER_NEED_TEST_ATTRIB ,
+      "xsl:when mora vsebovati atribut 'test'."},
+
+    { ER_NEED_NAME_ATTRIB,
+      "xsl:with-param mora vsebovati atribut 'ime'."},
+
+    { ER_NO_CONTEXT_OWNERDOC,
+      "Kontekst ne vsebuje lastni\u0161kega dokumenta!"},
+
+    {ER_COULD_NOT_CREATE_XML_PROC_LIAISON,
+      "Ne morem ustvariti zveze XML TransformerFactory: {0}"},
+
+    {ER_PROCESS_NOT_SUCCESSFUL,
+      "Xalan: postopek ni uspel."},
+
+    { ER_NOT_SUCCESSFUL,
+     "Xalan: ni uspel."},
+
+    { ER_ENCODING_NOT_SUPPORTED,
+     "Kodiranje ni podprto: {0}"},
+
+    {ER_COULD_NOT_CREATE_TRACELISTENER,
+      "Ne morem ustvariti javanskega razreda TraceListener: {0}"},
+
+    {ER_KEY_REQUIRES_NAME_ATTRIB,
+      "xsl:key zahteva atribut 'ime'!"},
+
+    { ER_KEY_REQUIRES_MATCH_ATTRIB,
+      "xsl:key zahteva atribut 'ujemanje'!"},
+
+    { ER_KEY_REQUIRES_USE_ATTRIB,
+      "xsl:key zahteva atribut 'uporaba'!"},
+
+    { ER_REQUIRES_ELEMENTS_ATTRIB,
+      "(StylesheetHandler) {0} zahteva atribut ''elementi''!"},
+
+    { ER_MISSING_PREFIX_ATTRIB,
+      "(StylesheetHandler) {0} manjka atribut ''predpona''"},
+
+    { ER_BAD_STYLESHEET_URL,
+     "URL slogovne datoteke je neveljaven: {0}"},
+
+    { ER_FILE_NOT_FOUND,
+     "Slogovne datoteke ni bilo mogo\u010de najti: {0}"},
+
+    { ER_IOEXCEPTION,
+      "Pri slogovni datoteki je pri\u0161lo do izjeme IO: {0}"},
+
+    { ER_NO_HREF_ATTRIB,
+      "(StylesheetHandler) Atributa href za {0} ni bilo mogo\u010de najti"},
+
+    { ER_STYLESHEET_INCLUDES_ITSELF,
+      "(StylesheetHandler) {0} neposredno ali posredno vklju\u010duje samega sebe!"},
+
+    { ER_PROCESSINCLUDE_ERROR,
+      "Napaka StylesheetHandler.processInclude, {0}"},
+
+    { ER_MISSING_LANG_ATTRIB,
+      "(StylesheetHandler) {0} manjka atribut ''lang'' "},
+
+    { ER_MISSING_CONTAINER_ELEMENT_COMPONENT,
+      "(StylesheetHandler) napa\u010dna postavitev elementa {0}?? Manjka vsebni element ''komponenta''"},
+
+    { ER_CAN_ONLY_OUTPUT_TO_ELEMENT,
+      "Prenos mogo\u010d samo v Element, DocumentFragment, Document, ali PrintWriter."},
+
+    { ER_PROCESS_ERROR,
+     "Napaka StylesheetRoot.process"},
+
+    { ER_UNIMPLNODE_ERROR,
+     "Napaka UnImplNode: {0}"},
+
+    { ER_NO_SELECT_EXPRESSION,
+      "Napaka! Ne najdem izbirnega izraza xpath (-select)."},
+
+    { ER_CANNOT_SERIALIZE_XSLPROCESSOR,
+      "Ne morem serializirati XSLProcessor!"},
+
+    { ER_NO_INPUT_STYLESHEET,
+      "Vnos slogovne datoteke ni dolo\u010den!"},
+
+    { ER_FAILED_PROCESS_STYLESHEET,
+      "Obdelava slogovne datoteke ni uspela!"},
+
+    { ER_COULDNT_PARSE_DOC,
+     "Dokumenta {0} ni mogo\u010de raz\u010dleniti!"},
+
+    { ER_COULDNT_FIND_FRAGMENT,
+     "Ne najdem fragmenta: {0}"},
+
+    { ER_NODE_NOT_ELEMENT,
+      "Vozli\u0161\u010de, na katerega ka\u017ee identifikator fragmenta, ni element: {0}"},
+
+    { ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB,
+      "vsak mora vsebovati primerjalni atribut ali atribut imena"},
+
+    { ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB,
+      "predloge morajo imeti primerjalni atribut ali atribut imena"},
+
+    { ER_NO_CLONE_OF_DOCUMENT_FRAG,
+      "Ni klona fragmenta dokumenta!"},
+
+    { ER_CANT_CREATE_ITEM,
+      "Ne morem ustvariti elementa v drevesu rezultatov: {0}"},
+
+    { ER_XMLSPACE_ILLEGAL_VALUE,
+      "xml:space v izvirnem XML ima neveljavno vrednost: {0}"},
+
+    { ER_NO_XSLKEY_DECLARATION,
+      "Ni deklaracije xsl:key za {0}!"},
+
+    { ER_CANT_CREATE_URL,
+     "Napaka! Ne morem ustvariti URL za: {0}"},
+
+    { ER_XSLFUNCTIONS_UNSUPPORTED,
+     "xsl:functions niso podprte"},
+
+    { ER_PROCESSOR_ERROR,
+     "Napaka XSLT TransformerFactory"},
+
+    { ER_NOT_ALLOWED_INSIDE_STYLESHEET,
+      "(StylesheetHandler) {0} ni dovoljen znotraj slogovne datoteke!"},
+
+    { ER_RESULTNS_NOT_SUPPORTED,
+      "result-ns ni ve\u010d podprt!  Namesto njega uporabite xsl:output."},
+
+    { ER_DEFAULTSPACE_NOT_SUPPORTED,
+      "default-space ni ve\u010d podprt!  Namesto njega uporabite xsl:strip-space ali xsl:preserve-space."},
+
+    { ER_INDENTRESULT_NOT_SUPPORTED,
+      "indent-result ni ve\u010d podprt!  Namesto njega uporabite xsl:output."},
+
+    { ER_ILLEGAL_ATTRIB,
+      "(StylesheetHandler) {0} ima neveljaven atribut: {1}"},
+
+    { ER_UNKNOWN_XSL_ELEM,
+     "Neznani element XSL: {0}"},
+
+    { ER_BAD_XSLSORT_USE,
+      "(StylesheetHandler) xsl:sort lahko uporabljamo samo z xsl:apply-templates ali z xsl:for-each."},
+
+    { ER_MISPLACED_XSLWHEN,
+      "(StylesheetHandler) napa\u010dna postavitev xsl:when!"},
+
+    { ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE,
+      "(StylesheetHandler) xsl:choose ni nadrejen xsl:when!"},
+
+    { ER_MISPLACED_XSLOTHERWISE,
+      "(StylesheetHandler) napa\u010dna postavitev xsl:otherwise!"},
+
+    { ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE,
+      "(StylesheetHandler) xsl:choose ni nadrejen xsl:otherwise!"},
+
+    { ER_NOT_ALLOWED_INSIDE_TEMPLATE,
+      "(StylesheetHandler) {0} ni dovoljen znotraj predloge!"},
+
+    { ER_UNKNOWN_EXT_NS_PREFIX,
+      "(StylesheetHandler) Neznana {0} kon\u010dnica predpone imenskega prostora {1}"},
+
+    { ER_IMPORTS_AS_FIRST_ELEM,
+      "(StylesheetHandler) Uvozi se lahko pojavijo samo kot prvi elementi v slogovni datoteki!"},
+
+    { ER_IMPORTING_ITSELF,
+      "(StylesheetHandler) {0} neposredno ali posredno uva\u017ea samega sebe!"},
+
+    { ER_XMLSPACE_ILLEGAL_VAL,
+      "(StylesheetHandler) xml:space vsebuje neveljavno vrednost: {0}"},
+
+    { ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL,
+      "processStylesheet ni uspelo!"},
+
+    { ER_SAX_EXCEPTION,
+     "Izjema SAX"},
+
+//  add this message to fix bug 21478
+    { ER_FUNCTION_NOT_SUPPORTED,
+     "Funkcija ni podprta!"},
+
+
+    { ER_XSLT_ERROR,
+     "Napaka XSLT"},
+
+    { ER_CURRENCY_SIGN_ILLEGAL,
+      "V oblikovnem nizu vzorca znak za denarno enoto ni dovoljen"},
+
+    { ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM,
+      "Funkcija dokumenta v slogovni datoteki DOM ni podprta!"},
+
+    { ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER,
+      "Ne morem razbrati predpone nepredponskega razre\u0161evalnika!"},
+
+    { ER_REDIRECT_COULDNT_GET_FILENAME,
+      "Preusmeri kon\u010dnico: ne morem pridobiti imena datoteke - atribut datoteke ali izbire mora vrniti veljaven niz."},
+
+    { ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT,
+      "V Preusmeritvi kon\u010dnice ne morem zgraditi FormatterListener!"},
+
+    { ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX,
+      "Predpona v izklju\u010di-predpone-rezultatov (exclude-result-prefixes) ni veljavna: {0}"},
+
+    { ER_MISSING_NS_URI,
+      "Za navedeno predpono manjka imenski prostor URI"},
+
+    { ER_MISSING_ARG_FOR_OPTION,
+      "Manjka argument za mo\u017enost: {0}"},
+
+    { ER_INVALID_OPTION,
+     "Neveljavna mo\u017enost: {0}"},
+
+    { ER_MALFORMED_FORMAT_STRING,
+     "Po\u0161kodovan niz sloga: {0}"},
+
+    { ER_STYLESHEET_REQUIRES_VERSION_ATTRIB,
+      "xsl:stylesheet zahteva atribut 'razli\u010dica'!"},
+
+    { ER_ILLEGAL_ATTRIBUTE_VALUE,
+      "Atribut: {0} ima neveljavno vrednost: {1}"},
+
+    { ER_CHOOSE_REQUIRES_WHEN,
+     "xsl:choose zahteva xsl:when"},
+
+    { ER_NO_APPLY_IMPORT_IN_FOR_EACH,
+      "xsl:apply-imports v xsl:for-each ni dovoljen"},
+
+    { ER_CANT_USE_DTM_FOR_OUTPUT,
+      "Za izhodno vozli\u0161\u010de DOM ne morem uporabiti DTMLiaison... namesto njega posredujte org.apache.xpath.DOM2Helper!"},
+
+    { ER_CANT_USE_DTM_FOR_INPUT,
+      "Za vhodno vozli\u0161\u010de DOM ne morem uporabiti DTMLiaison... namesto njega posredujte org.apache.xpath.DOM2Helper!"},
+
+    { ER_CALL_TO_EXT_FAILED,
+      "Klic elementa kon\u010dnice ni uspel: {0}"},
+
+    { ER_PREFIX_MUST_RESOLVE,
+      "Predpona se mora razre\u0161iti v imenski prostor: {0}"},
+
+    { ER_INVALID_UTF16_SURROGATE,
+      "Zaznan neveljaven nadomestek UTF-16: {0} ?"},
+
+    { ER_XSLATTRSET_USED_ITSELF,
+      "xsl:attribute-set {0} je uporabil samega sebe, kar bo povzro\u010dilo neskon\u010do ponavljanje."},
+
+    { ER_CANNOT_MIX_XERCESDOM,
+      "Prepletanje ne-Xerces-DOM vhoda s Xerces-DOM vhodom ni mogo\u010de!"},
+
+    { ER_TOO_MANY_LISTENERS,
+      "addTraceListenersToStylesheet - TooManyListenersException"},
+
+    { ER_IN_ELEMTEMPLATEELEM_READOBJECT,
+      "V ElemTemplateElement.readObject: {0}"},
+
+    { ER_DUPLICATE_NAMED_TEMPLATE,
+      "Na\u0161el ve\u010d predlog z istim imenom: {0}"},
+
+    { ER_INVALID_KEY_CALL,
+      "Neveljaven klic funkcije: povratni klici key() niso dovoljeni"},
+
+    { ER_REFERENCING_ITSELF,
+      "Spremenljivka {0} se neposredno ali posredno sklicuje sama nase!"},
+
+    { ER_ILLEGAL_DOMSOURCE_INPUT,
+      "Vhodno vozli\u0161\u010de za DOMSource za newTemplates ne more biti NULL!"},
+
+    { ER_CLASS_NOT_FOUND_FOR_OPTION,
+        "Datoteke razreda za mo\u017enost {0} ni bilo mogo\u010de najti"},
+
+    { ER_REQUIRED_ELEM_NOT_FOUND,
+        "Zahtevanega elementa ni bilo mogo\u010de najti: {0}"},
+
+    { ER_INPUT_CANNOT_BE_NULL,
+        "InputStream ne more biti NULL"},
+
+    { ER_URI_CANNOT_BE_NULL,
+        "URI ne more biti NULL"},
+
+    { ER_FILE_CANNOT_BE_NULL,
+        "Datoteka ne more biti NULL"},
+
+    { ER_SOURCE_CANNOT_BE_NULL,
+                "InputSource ne more biti NULL"},
+
+    { ER_CANNOT_INIT_BSFMGR,
+                "Inicializacija BSF Manager-ja ni mogo\u010da"},
+
+    { ER_CANNOT_CMPL_EXTENSN,
+                "Kon\u010dnice ni mogo\u010de prevesti"},
+
+    { ER_CANNOT_CREATE_EXTENSN,
+      "Ne morem ustvariti kon\u010dnice: {0} zaradi: {1}"},
+
+    { ER_INSTANCE_MTHD_CALL_REQUIRES,
+      "Klic primerkov metode za metodo {0} zahteva primerek objekta kot prvi argument"},
+
+    { ER_INVALID_ELEMENT_NAME,
+      "Navedeno neveljavno ime elementa {0}"},
+
+    { ER_ELEMENT_NAME_METHOD_STATIC,
+      "Metoda imena elementa mora biti stati\u010dna (static) {0}"},
+
+    { ER_EXTENSION_FUNC_UNKNOWN,
+             "Funkcija kon\u010dnice {0} : {1} je neznana"},
+
+    { ER_MORE_MATCH_CONSTRUCTOR,
+             "Ve\u010d kot eno najbolj\u0161e ujemanje za graditelja za {0}"},
+
+    { ER_MORE_MATCH_METHOD,
+             "Ve\u010d kot eno najbolj\u0161e ujemanje za metodo {0}"},
+
+    { ER_MORE_MATCH_ELEMENT,
+             "Ve\u010d kot eno najbolj\u0161e ujemanje za metodo elementa {0}"},
+
+    { ER_INVALID_CONTEXT_PASSED,
+             "Posredovan neveljaven kontekst za ovrednotenje {0}"},
+
+    { ER_POOL_EXISTS,
+             "Zaloga \u017ee obstaja"},
+
+    { ER_NO_DRIVER_NAME,
+             "Ime gonilnika ni dolo\u010deno"},
+
+    { ER_NO_URL,
+             "URL ni dolo\u010den"},
+
+    { ER_POOL_SIZE_LESSTHAN_ONE,
+             "Zaloga je manj\u0161a od ena!"},
+
+    { ER_INVALID_DRIVER,
+             "Navedeno neveljavno ime gonilnika!"},
+
+    { ER_NO_STYLESHEETROOT,
+             "Korena slogovne datoteke ni mogo\u010de najti!"},
+
+    { ER_ILLEGAL_XMLSPACE_VALUE,
+         "Neveljavna vrednost za xml:space"},
+
+    { ER_PROCESSFROMNODE_FAILED,
+         "processFromNode spodletelo"},
+
+    { ER_RESOURCE_COULD_NOT_LOAD,
+        "Sredstva [ {0} ] ni bilo mogo\u010de nalo\u017eiti: {1} \n {2} \t {3}"},
+
+    { ER_BUFFER_SIZE_LESSTHAN_ZERO,
+        "Velikost medpomnilnika <=0"},
+
+    { ER_UNKNOWN_ERROR_CALLING_EXTENSION,
+        "Neznana napaka pri klicu kon\u010dnice"},
+
+    { ER_NO_NAMESPACE_DECL,
+        "Predpona {0} nima ustrezne deklaracije imenskega prostora"},
+
+    { ER_ELEM_CONTENT_NOT_ALLOWED,
+        "Vsebina elementa za lang=javaclass {0} ni dovoljena"},
+
+    { ER_STYLESHEET_DIRECTED_TERMINATION,
+        "Prekinitev usmerja slogovna datoteka"},
+
+    { ER_ONE_OR_TWO,
+        "1 ali 2"},
+
+    { ER_TWO_OR_THREE,
+        "2 ali 3"},
+
+    { ER_COULD_NOT_LOAD_RESOURCE,
+        "Nisem mogel nalo\u017eiti {0} (preverite CLASSPATH), trenutno se uporabljajo privzete vrednosti"},
+
+    { ER_CANNOT_INIT_DEFAULT_TEMPLATES,
+        "Ne morem inicializirati privzetih predlog"},
+
+    { ER_RESULT_NULL,
+        "Rezultat naj ne bi bil NULL"},
+
+    { ER_RESULT_COULD_NOT_BE_SET,
+        "Rezultata ni bilo mogo\u010de nastaviti"},
+
+    { ER_NO_OUTPUT_SPECIFIED,
+        "Izhod ni naveden"},
+
+    { ER_CANNOT_TRANSFORM_TO_RESULT_TYPE,
+        "Ne morem pretvoriti v rezultat tipa {0}"},
+
+    { ER_CANNOT_TRANSFORM_SOURCE_TYPE,
+        "Ne morem pretvoriti vira tipa {0}"},
+
+    { ER_NULL_CONTENT_HANDLER,
+        "Program za obravnavo vsebine NULL"},
+
+    { ER_NULL_ERROR_HANDLER,
+        "Program za obravnavo napak NULL"},
+
+    { ER_CANNOT_CALL_PARSE,
+        "klic raz\u010dlenitve ni mo\u017een \u010de ContentHandler ni bil nastavljen"},
+
+    { ER_NO_PARENT_FOR_FILTER,
+        "Ni nadrejenega za filter"},
+
+    { ER_NO_STYLESHEET_IN_MEDIA,
+         "Ni mogo\u010de najti slogovne datoteke v: {0}, medij= {1}"},
+
+    { ER_NO_STYLESHEET_PI,
+         "Ne najdem xml-stylesheet PI v: {0}"},
+
+    { ER_NOT_SUPPORTED,
+       "Ni podprto: {0}"},
+
+    { ER_PROPERTY_VALUE_BOOLEAN,
+       "Vrednost lastnosti {0} bi morala biti ponovitev logi\u010dne vrednosti"},
+
+    { ER_COULD_NOT_FIND_EXTERN_SCRIPT,
+         "Ne morem dostopati do zunanje skripte na {0}"},
+
+    { ER_RESOURCE_COULD_NOT_FIND,
+        "Vira [ {0} ] ni mogo\u010de najti.\n {1}"},
+
+    { ER_OUTPUT_PROPERTY_NOT_RECOGNIZED,
+        "Izhodna lastnost ni prepoznana: {0}"},
+
+    { ER_FAILED_CREATING_ELEMLITRSLT,
+        "Priprava primerka ElemLiteralResult ni uspela"},
+
+  //Earlier (JDK 1.4 XALAN 2.2-D11) at key code '204' the key name was ER_PRIORITY_NOT_PARSABLE
+  // In latest Xalan code base key name is  ER_VALUE_SHOULD_BE_NUMBER. This should also be taken care
+  //in locale specific files like XSLTErrorResources_de.java, XSLTErrorResources_fr.java etc.
+  //NOTE: Not only the key name but message has also been changed.
+
+    { ER_VALUE_SHOULD_BE_NUMBER,
+        "Vrednost za {0} bi morala biti \u0161tevilka, ki jo je mogo\u010de raz\u010dleniti"},
+
+    { ER_VALUE_SHOULD_EQUAL,
+        "Vrednost za {0} bi morala biti enaka da ali ne"},
+
+    { ER_FAILED_CALLING_METHOD,
+        "Klic metode {0} ni uspel"},
+
+    { ER_FAILED_CREATING_ELEMTMPL,
+        "Priprava primerka ElemTemplateElement ni uspela"},
+
+    { ER_CHARS_NOT_ALLOWED,
+        "V tem trenutku znaki v dokumentu niso na voljo"},
+
+    { ER_ATTR_NOT_ALLOWED,
+        "Atribut \"{0}\" v elementu {1} ni dovoljen!"},
+
+    { ER_BAD_VALUE,
+     "{0} slaba vrednost {1} "},
+
+    { ER_ATTRIB_VALUE_NOT_FOUND,
+     "Vrednosti atributa {0} ni bilo mogo\u010de najti "},
+
+    { ER_ATTRIB_VALUE_NOT_RECOGNIZED,
+     "Vrednosti atributa {0} ni bilo mogo\u010de prepoznati "},
+
+    { ER_NULL_URI_NAMESPACE,
+     "Posku\u0161am generirati predpono imenskega prostora z URI z vrednostjo NULL"},
+
+  //New ERROR keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
+
+    { ER_NUMBER_TOO_BIG,
+     "Poskus oblikovanja \u0161tevilke, ve\u010dje od najve\u010djega dolgega celega \u0161tevila"},
+
+    { ER_CANNOT_FIND_SAX1_DRIVER,
+     "Ne najdem razreda gonilnika SAX1 {0}"},
+
+    { ER_SAX1_DRIVER_NOT_LOADED,
+     "Na\u0161el razred gonilnika SAX1 {0}, vendar ga ne morem nalo\u017eiti"},
+
+    { ER_SAX1_DRIVER_NOT_INSTANTIATED,
+     "Nalo\u017eil razred gonilnika SAX1 {0}, vendar ga ne morem udejaniti"},
+
+    { ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER,
+     "Razred gonilnika SAX1 {0} ne vklju\u010duje org.xml.sax.Parser"},
+
+    { ER_PARSER_PROPERTY_NOT_SPECIFIED,
+     "Sistemska lastnost org.xml.sax.parser ni dolo\u010dena"},
+
+    { ER_PARSER_ARG_CANNOT_BE_NULL,
+     "Argument raz\u010dlenjevalnika sme biti NULL"},
+
+    { ER_FEATURE,
+     "Zna\u010dilnost: {0}"},
+
+    { ER_PROPERTY,
+     "Lastnost: {0}"},
+
+    { ER_NULL_ENTITY_RESOLVER,
+     "Razre\u0161evalnik entitet NULL"},
+
+    { ER_NULL_DTD_HANDLER,
+     "Program za obravnavanje DTD z vrednostjo NULL"},
+
+    { ER_NO_DRIVER_NAME_SPECIFIED,
+     "Ime gonilnika ni dolo\u010deno!"},
+
+    { ER_NO_URL_SPECIFIED,
+     "URL ni dolo\u010den!"},
+
+    { ER_POOLSIZE_LESS_THAN_ONE,
+     "Zaloga je manj\u0161a od 1!"},
+
+    { ER_INVALID_DRIVER_NAME,
+     "Dolo\u010deno neveljavno ime gonilnika!"},
+
+    { ER_ERRORLISTENER,
+     "ErrorListener"},
+
+
+// Note to translators:  The following message should not normally be displayed
+//   to users.  It describes a situation in which the processor has detected
+//   an internal consistency problem in itself, and it provides this message
+//   for the developer to help diagnose the problem.  The name
+//   'ElemTemplateElement' is the name of a class, and should not be
+//   translated.
+    { ER_ASSERT_NO_TEMPLATE_PARENT,
+     "Programerjeva napaka! Izraz nima nadrejenega ElemTemplateElement!"},
+
+
+// Note to translators:  The following message should not normally be displayed
+//   to users.  It describes a situation in which the processor has detected
+//   an internal consistency problem in itself, and it provides this message
+//   for the developer to help diagnose the problem.  The substitution text
+//   provides further information in order to diagnose the problem.  The name
+//   'RedundentExprEliminator' is the name of a class, and should not be
+//   translated.
+    { ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR,
+     "Programerjeva izjava v RedundentExprEliminator: {0}"},
+
+    { ER_NOT_ALLOWED_IN_POSITION,
+     "Na tem polo\u017eaju v slogovni datoteki {0} ni dovoljen!"},
+
+    { ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION,
+     "Besedilo, ki niso presledki in drugi podobni znaki, na tem polo\u017eaju v slogovni datoteki ni dovoljeno.!"},
+
+  // This code is shared with warning codes.
+  // SystemId Unknown
+    { INVALID_TCHAR,
+     "Neveljavna vrednost: {1} uporabljena za atribut CHAR: {0}.  Atribut tipa CHAR mora biti samo 1 znak!"},
+
+    // Note to translators:  The following message is used if the value of
+    // an attribute in a stylesheet is invalid.  "QNAME" is the XML data-type of
+    // the attribute, and should not be translated.  The substitution text {1} is
+    // the attribute value and {0} is the attribute name.
+    //The following codes are shared with the warning codes...
+    { INVALID_QNAME,
+     "Neveljavna vrednost: {1} uporabljena za atribut QNAME: {0}"},
+
+    // Note to translators:  The following message is used if the value of
+    // an attribute in a stylesheet is invalid.  "ENUM" is the XML data-type of
+    // the attribute, and should not be translated.  The substitution text {1} is
+    // the attribute value, {0} is the attribute name, and {2} is a list of valid
+    // values.
+    { INVALID_ENUM,
+     "Neveljavna vrednost: {1} uporabljena za atribut ENUM: {0}.  Veljavne vrednosti so: {2}."},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "NMTOKEN" is the XML data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+    { INVALID_NMTOKEN,
+     "Neveljavna vrednost: {1} uporabljena za atribut NMTOKEN: {0} "},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "NCNAME" is the XML data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+    { INVALID_NCNAME,
+     "Neveljavna vrednost: {1} uporabljena za atribut NCNAME: {0} "},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "boolean" is the XSLT data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+    { INVALID_BOOLEAN,
+     "Neveljavna vrednost: {1} uporabljena za atribut boolean: {0} "},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "number" is the XSLT data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+     { INVALID_NUMBER,
+     "Neveljavna vrednost: {1} uporabljena za atribut number: {0} "},
+
+
+  // End of shared codes...
+
+// Note to translators:  A "match pattern" is a special form of XPath expression
+// that is used for matching patterns.  The substitution text is the name of
+// a function.  The message indicates that when this function is referenced in
+// a match pattern, its argument must be a string literal (or constant.)
+// ER_ARG_LITERAL - new error message for bugzilla //5202
+    { ER_ARG_LITERAL,
+     "Argument za {0} v primerjalnem vzorcu mora biti dobesedni niz."},
+
+// Note to translators:  The following message indicates that two definitions of
+// a variable.  A "global variable" is a variable that is accessible everywher
+// in the stylesheet.
+// ER_DUPLICATE_GLOBAL_VAR - new error message for bugzilla #790
+    { ER_DUPLICATE_GLOBAL_VAR,
+     "Dvojnik deklaracije globalne spremenljivke."},
+
+
+// Note to translators:  The following message indicates that two definitions of
+// a variable were encountered.
+// ER_DUPLICATE_VAR - new error message for bugzilla #790
+    { ER_DUPLICATE_VAR,
+     "Dvojnik deklaracije spremenljivke."},
+
+    // Note to translators:  "xsl:template, "name" and "match" are XSLT keywords
+    // which must not be translated.
+    // ER_TEMPLATE_NAME_MATCH - new error message for bugzilla #789
+    { ER_TEMPLATE_NAME_MATCH,
+     "xsl:template mora vsebovati atribut name ali match (ali oba)"},
+
+    // Note to translators:  "exclude-result-prefixes" is an XSLT keyword which
+    // should not be translated.  The message indicates that a namespace prefix
+    // encountered as part of the value of the exclude-result-prefixes attribute
+    // was in error.
+    // ER_INVALID_PREFIX - new error message for bugzilla #788
+    { ER_INVALID_PREFIX,
+     "Predpona v izklju\u010di-predpone-rezultatov (exclude-result-prefixes) ni veljavna: {0}"},
+
+    // Note to translators:  An "attribute set" is a set of attributes that can
+    // be added to an element in the output document as a group.  The message
+    // indicates that there was a reference to an attribute set named {0} that
+    // was never defined.
+    // ER_NO_ATTRIB_SET - new error message for bugzilla #782
+    { ER_NO_ATTRIB_SET,
+     "Nabor atributov, imenovana {0}, ne obstaja"},
+
+    // Note to translators:  This message indicates that there was a reference
+    // to a function named {0} for which no function definition could be found.
+    { ER_FUNCTION_NOT_FOUND,
+     "Funkcija, imenovana {0}, ne obstaja"},
+
+    // Note to translators:  This message indicates that the XSLT instruction
+    // that is named by the substitution text {0} must not contain other XSLT
+    // instructions (content) or a "select" attribute.  The word "select" is
+    // an XSLT keyword in this case and must not be translated.
+    { ER_CANT_HAVE_CONTENT_AND_SELECT,
+     "Element {0} ne sme imeti vsebine in atributa izbire hkrati."},
+
+    // Note to translators:  This message indicates that the value argument
+    // of setParameter must be a valid Java Object.
+    { ER_INVALID_SET_PARAM_VALUE,
+     "Vrednost parametra {0} mora biti veljaven javanski objekt"},
+
+        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT,
+         "Atribut result-prefix elementa xsl:namespace-alias element ima vrednost '#default' (privzeto), ampak ni deklaracije privzetega imenskega prostora v razponu za ta element."},
+
+        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX,
+         "Atribut result-prefix elementa xsl:namespace-alias ima vrednost ''{0}'', ampak ni deklaracije privzetega imenskega prostora za predpono ''{0}'' v razponu za ta element."},
+
+    { ER_SET_FEATURE_NULL_NAME,
+      "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza, vrednost boolean)."},
+
+    { ER_GET_FEATURE_NULL_NAME,
+      "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza)."},
+
+    { ER_UNSUPPORTED_FEATURE,
+      "Ni mogo\u010de nastaviti funkcije ''{0}'' v tem TransformerFactory."},
+
+    { ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING,
+        "Uporaba raz\u0161iritvene elementa ''{0}'' ni na voljo, ko je funkcija varnega procesiranja nastavljena na true."},
+
+        { ER_NAMESPACE_CONTEXT_NULL_NAMESPACE,
+          "Ni mogo\u010de dobiti predpone za URI imenskega prostora null."},
+
+        { ER_NAMESPACE_CONTEXT_NULL_PREFIX,
+          "Ni mogo\u010de dobiti URI-ja imenskega prostora za predpono null."},
+
+        { ER_XPATH_RESOLVER_NULL_QNAME,
+          "Ime funkcije ne more biti ni\u010d."},
+
+        { ER_XPATH_RESOLVER_NEGATIVE_ARITY,
+          "\u0160tevilo argumentov ne more biti negativno"},
+
+  // Warnings...
+
+    { WG_FOUND_CURLYBRACE,
+      "Najden '}' vendar ni odprtih predlog atributov!"},
+
+    { WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR,
+      "Opozorilo: \u0161tevni atribut ni skladen s prednikom v xsl:number! Cilj = {0}"},
+
+    { WG_EXPR_ATTRIB_CHANGED_TO_SELECT,
+      "Stara sintaksa: Ime atributa 'izraz' je bilo spremenjeno v 'izbira'."},
+
+    { WG_NO_LOCALE_IN_FORMATNUMBER,
+      "Xalan \u0161e ne podpira podro\u010dnih imen v funkciji za oblikovanje \u0161tevilk."},
+
+    { WG_LOCALE_NOT_FOUND,
+      "Opozorilo: ne najdem podro\u010dnih nastavitev za xml:lang={0}"},
+
+    { WG_CANNOT_MAKE_URL_FROM,
+      "Iz {0} ni mogo\u010de narediti naslova URL."},
+
+    { WG_CANNOT_LOAD_REQUESTED_DOC,
+      "Ne morem nalo\u017eiti zahtevanega dokumenta: {0}"},
+
+    { WG_CANNOT_FIND_COLLATOR,
+      "Ne najdem kolacionista (collator) za <sort xml:lang={0}"},
+
+    { WG_FUNCTIONS_SHOULD_USE_URL,
+      "Stara sintaksa: navodilo za funkcije bi moralo uporabljati URL {0}"},
+
+    { WG_ENCODING_NOT_SUPPORTED_USING_UTF8,
+      "Kodiranje ni podprto: {0}, uporabljen bo UTF-8"},
+
+    { WG_ENCODING_NOT_SUPPORTED_USING_JAVA,
+      "kodiranje ni podprto: {0}, uporabljena bo Java {1}"},
+
+    { WG_SPECIFICITY_CONFLICTS,
+      "Spori pri specifi\u010dnosti: uporabljen bo zadnji najdeni {0} v slogovni datoteki."},
+
+    { WG_PARSING_AND_PREPARING,
+      "========= Poteka raz\u010dlenjevanje in priprava {0} =========="},
+
+    { WG_ATTR_TEMPLATE,
+     "Predloga atributa, {0}"},
+
+    { WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE,
+      "Spor ujemanja med xsl:strip-space in xsl:preserve-space"},
+
+    { WG_ATTRIB_NOT_HANDLED,
+      "Xalan \u0161e ne podpira atributa {0}!"},
+
+    { WG_NO_DECIMALFORMAT_DECLARATION,
+      "Deklaracije za decimalno obliko ni bilo mogo\u010de najti: {0}"},
+
+    { WG_OLD_XSLT_NS,
+     "Manjkajo\u010d ali nepravilen imenski prostor XSLT. "},
+
+    { WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED,
+      "Dovoljena je samo ena privzeta deklaracija xsl:decimal-format."},
+
+    { WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE,
+      "Imena xsl:decimal-format morajo biti enoli\u010dna. Ime \"{0}\" je bilo podvojeno."},
+
+    { WG_ILLEGAL_ATTRIBUTE,
+      "{0} vsebuje neveljaven atribut: {1}"},
+
+    { WG_COULD_NOT_RESOLVE_PREFIX,
+      "Ne morem razre\u0161iti predpone imenskega prostora: {0}. Vozli\u0161\u010de bo prezrto."},
+
+    { WG_STYLESHEET_REQUIRES_VERSION_ATTRIB,
+      "xsl:stylesheet zahteva atribut 'razli\u010dica'!"},
+
+    { WG_ILLEGAL_ATTRIBUTE_NAME,
+      "Neveljavno ime atributa: {0}"},
+
+    { WG_ILLEGAL_ATTRIBUTE_VALUE,
+      "Uporabljena neveljavna vrednost za atribut {0}: {1}"},
+
+    { WG_EMPTY_SECOND_ARG,
+      "Posledi\u010dna skupina vozli\u0161\u010d iz drugega argumenta funkcije dokumenta je prazna. Posredujte prazno skupino vozli\u0161\u010d."},
+
+  //Following are the new WARNING keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
+
+    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
+    // and must not be translated.
+    { WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
+      "Vrednost atributa 'ime' iz imena xsl:processing-instruction ne sme biti 'xml'"},
+
+    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
+    // and must not be translated.  "NCName" is an XML data-type and must not be
+    // translated.
+    { WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
+      "Vrednost atributa ''ime'' iz xsl:processing-instruction mora biti veljavno NCIme: {0}"},
+
+    // Note to translators:  This message is reported if the stylesheet that is
+    // being processed attempted to construct an XML document with an attribute in a
+    // place other than on an element.  The substitution text specifies the name of
+    // the attribute.
+    { WG_ILLEGAL_ATTRIBUTE_POSITION,
+      "Atributa {0} ne morem dodati za podrejenimi vozli\u0161\u010di ali pred izdelavo elementa.  Atribut bo prezrt."},
+
+    { NO_MODIFICATION_ALLOWED_ERR,
+      "Izveden je poskus spremembe objekta tam, kjer spremembe niso dovoljene."
+    },
+
+    //Check: WHY THERE IS A GAP B/W NUMBERS in the XSLTErrorResources properties file?
+
+  // Other miscellaneous text used inside the code...
+  { "ui_language", "sl"},
+  {  "help_language",  "sl" },
+  {  "language",  "sl" },
+  { "BAD_CODE", "Parameter za createMessage presega meje"},
+  {  "FORMAT_FAILED", "Med klicem messageFormat naletel na izjemo"},
+  {  "version", ">>>>>>> Razli\u010dica Xalan "},
+  {  "version2",  "<<<<<<<"},
+  {  "yes", "da"},
+  { "line", "Vrstica #"},
+  { "column","Stolpec #"},
+  { "xsldone", "XSLProcessor: dokon\u010dano"},
+
+
+  // Note to translators:  The following messages provide usage information
+  // for the Xalan Process command line.  "Process" is the name of a Java class,
+  // and should not be translated.
+  { "xslProc_option", "Ukazna vrstica Xalan-J Mo\u017enosti razreda postopka:"},
+  { "xslProc_option", "Ukazna vrstica Xalan-J Mo\u017enosti razredov postopkov\u003a"},
+  { "xslProc_invalid_xsltc_option", "Mo\u017enost {0} v na\u010dinu XSLTC ni podprta."},
+  { "xslProc_invalid_xalan_option", "Mo\u017enost {0} se lahko uporablja samo z -XSLTC."},
+  { "xslProc_no_input", "Napaka: ni dolo\u010dene slogovne datoteke ali vhodnega xml. Po\u017eenite ta ukaz, za katerega ni na voljo napotkov za uporabo."},
+  { "xslProc_common_options", "-Splo\u0161ne mo\u017enosti-"},
+  { "xslProc_xalan_options", "-Mo\u017enosti za Xalan-"},
+  { "xslProc_xsltc_options", "-Mo\u017enosti za XSLTC-"},
+  { "xslProc_return_to_continue", "(za nadaljevanje pritisnite <return>)"},
+
+   // Note to translators: The option name and the parameter name do not need to
+   // be translated. Only translate the messages in parentheses.  Note also that
+   // leading whitespace in the messages is used to indent the usage information
+   // for each option in the English messages.
+   // Do not translate the keywords: XSLTC, SAX, DOM and DTM.
+  { "optionXSLTC", "   [-XSLTC (za preoblikovanje uporabite XSLTC)]"},
+  { "optionIN", "   [-IN vhodniXMLURL]"},
+  { "optionXSL", "   [-XSL XSLPreoblikovanjeURL]"},
+  { "optionOUT",  "   [-OUT ImeIzhodneDatoteke]"},
+  { "optionLXCIN", "   [-LXCIN ImeVhodneDatotekePrevedeneSlogovneDatoteke]"},
+  { "optionLXCOUT", "   [-LXCOUT ImeIzhodneDatotekePrevedeneSlogovneDatoteke]"},
+  { "optionPARSER", "   [-PARSER popolnoma ustrezno ime razreda zveze raz\u010dlenjevalnika]"},
+  {  "optionE", "   [-E (Ne raz\u0161irjajte sklicev entitet)]"},
+  {  "optionV",  "   [-E (Ne raz\u0161irjajte sklicev entitet)]"},
+  {  "optionQC", "   [-QC (Tiha opozorila o sporih vzorcev)]"},
+  {  "optionQ", "   [-Q  (Tihi na\u010din)]"},
+  {  "optionLF", "   [-LF (Uporabite pomike samo na izhodu {privzeto je CR/LF})]"},
+  {  "optionCR", "   [-CR (Uporabite prehode v novo vrstico samo na izhodu {privzeto je CR/LF})]"},
+  { "optionESCAPE", "   [-ESCAPE (Znaki za izogib {privzeto je <>&\"\'\\r\\n}]"},
+  { "optionINDENT", "   [-INDENT (Koliko presledkov zamika {privzeto je 0})]"},
+  { "optionTT", "   [-TT (Sledite predlogam glede na njihov poziv.)]"},
+  { "optionTG", "   [-TG (Sledite vsakemu dogodku rodu.)]"},
+  { "optionTS", "   [-TS (Sledite vsakemu dogodku izbire.)]"},
+  {  "optionTTC", "   [-TTC (Sledite podrejenim predloge kot se obdelujejo.)]"},
+  { "optionTCLASS", "   [-TCLASS (Razred TraceListener za kon\u010dnice sledi.)]"},
+  { "optionVALIDATE", "   [-VALIDATE (Nastavi v primeru preverjanja veljavnosti.  Privzeta vrednost za preverjanje veljavnosti je izklopljeno.)]"},
+  { "optionEDUMP", "   [-EDUMP {izbirno ime datoteke} (V primeru napake naredi izvoz skladov.)]"},
+  {  "optionXML", "   [-XML (Uporabite oblikovalnik XML in dodajte glavo XML.)]"},
+  {  "optionTEXT", "   [-TEXT (Uporabite preprost oblikovalnik besedila.)]"},
+  {  "optionHTML", "   [-HTML (Uporabite oblikovalnik za HTML.)]"},
+  {  "optionPARAM", "   [-PARAM izraz imena (nastavite parameter slogovne datoteke)]"},
+  {  "noParsermsg1", "Postopek XSL ni uspel."},
+  {  "noParsermsg2", "** Nisem na\u0161el raz\u010dlenjevalnika **"},
+  { "noParsermsg3",  "Preverite pot razreda."},
+  { "noParsermsg4", "\u010ce nimate IBM raz\u010dlenjevalnika za Javo, ga lahko prenesete iz"},
+  { "noParsermsg5", "IBM AlphaWorks: http://www.alphaworks.ibm.com/formula/xml"},
+  { "optionURIRESOLVER", "   [-URIRESOLVER polno ime razreda (URIResolver za razre\u0161evanje URL-jev)]"},
+  { "optionENTITYRESOLVER",  "   [-ENTITYRESOLVER polno ime razreda (EntityResolver za razre\u0161evanje entitet)]"},
+  { "optionCONTENTHANDLER",  "   [-CONTENTHANDLER polno ime razreda (ContentHandler za serializacijo izhoda)]"},
+  {  "optionLINENUMBERS",  "   [-L za izvorni dokument uporabite \u0161tevilke vrstic]"},
+  { "optionSECUREPROCESSING", "   [-SECURE (nastavite funkcijo varne obdelave na True.)]"},
+
+    // Following are the new options added in XSLTErrorResources.properties files after Jdk 1.4 (Xalan 2.2-D11)
+
+
+  {  "optionMEDIA",  "   [-MEDIA TipMedija (z atributom medija poi\u0161\u010dite slogovno datoteko, ki se nana\u0161a na dokument.)]"},
+  {  "optionFLAVOR",  "   [-FLAVOR ImePosebnosti (Za preoblikovanje izrecno uporabljajte s2s=SAX ali d2d=DOM.)] "}, // Added by sboag/scurcuru; experimental
+  { "optionDIAG", "   [-DIAG (Natisnite skupni \u010das trajanja pretvorbe v milisekundah.)]"},
+  { "optionINCREMENTAL",  "   [-INCREMENTAL (zahtevajte gradnjo prirastnega DTM tako, da nastavite http://xml.apache.org/xalan/features/incremental na resni\u010dno.)]"},
+  {  "optionNOOPTIMIMIZE",  "   [-NOOPTIMIMIZE (prepre\u010dite obdelavo optimiziranja slogovne datoteke, tako da nastavite http://xml.apache.org/xalan/features/optimize na false.)]"},
+  { "optionRL",  "   [-RL mejaRekurzije (zahtevajte numeri\u010dno mejo globine rekurzije slogovne datoteke.)]"},
+  {   "optionXO",  "   [-XO [imeTransleta] (dodelite ime ustvarjenemu transletu)]"},
+  {  "optionXD", "   [-XD ciljnaMapa (navedite ciljno mapo za translet)]"},
+  {  "optionXJ",  "   [-XJ datotekaJar (zdru\u017ei razrede transleta v datoteko jar z imenom <jarfile>)]"},
+  {   "optionXP",  "   [-XP paket (navede predpono imena paketa vsem ustvarjenim razredom transletov)]"},
+
+  //AddITIONAL  STRINGS that need L10n
+  // Note to translators:  The following message describes usage of a particular
+  // command-line option that is used to enable the "template inlining"
+  // optimization.  The optimization involves making a copy of the code
+  // generated for a template in another template that refers to it.
+  { "optionXN",  "   [-XN (omogo\u010da vstavljanje predlog)]" },
+  { "optionXX",  "   [-XX (vklopi izhod za dodatna sporo\u010dila za iskanje napak)]"},
+  { "optionXT" , "   [-XT (\u010de je mogo\u010de, uporabite translet za pretvorbo)]"},
+  { "diagTiming"," --------- Pretvorba {0} prek {1} je trajala {2} ms" },
+  { "recursionTooDeep","Predloga pregloboko vgnezdena. Gnezdenje = {0}, predloga {1} {2}" },
+  { "nameIs", "ime je" },
+  { "matchPatternIs", "primerjalni vzorec je" }
+
+  };
+  }
+  // ================= INFRASTRUCTURE ======================
+
+  /** String for use when a bad error code was encountered.    */
+  public static final String BAD_CODE = "BAD_CODE";
+
+  /** String for use when formatting of the error string failed.   */
+  public static final String FORMAT_FAILED = "FORMAT_FAILED";
+
+  /** General error string.   */
+  public static final String ERROR_STRING = "#error";
+
+  /** String to prepend to error messages.  */
+  public static final String ERROR_HEADER = "Napaka: ";
+
+  /** String to prepend to warning messages.    */
+  public static final String WARNING_HEADER = "Opozorilo: ";
+
+  /** String to specify the XSLT module.  */
+  public static final String XSL_HEADER = "XSLT ";
+
+  /** String to specify the XML parser module.  */
+  public static final String XML_HEADER = "XML ";
+
+  /** I don't think this is used any more.
+   * @deprecated  */
+  public static final String QUERY_HEADER = "VZOREC ";
+
+
+  /**
+   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
+   *   of ResourceBundle.getBundle().
+   *
+   *   @param className the name of the class that implements the resource bundle.
+   *   @return the ResourceBundle
+   *   @throws MissingResourceException
+   */
+  public static final XSLTErrorResources loadResourceBundle(String className)
+          throws MissingResourceException
+  {
+
+    Locale locale = Locale.getDefault();
+    String suffix = getResourceSuffix(locale);
+
+    try
+    {
+
+      // first try with the given locale
+      return (XSLTErrorResources) ResourceBundle.getBundle(className
+              + suffix, locale);
+    }
+    catch (MissingResourceException e)
+    {
+      try  // try to fall back to en_US if we can't load
+      {
+
+        // Since we can't find the localized property file,
+        // fall back to en_US.
+        return (XSLTErrorResources) ResourceBundle.getBundle(className,
+                new Locale("sl", "US"));
+      }
+      catch (MissingResourceException e2)
+      {
+
+        // Now we are really in trouble.
+        // very bad, definitely very bad...not going to get very far
+        throw new MissingResourceException(
+          "Could not load any resource bundles.", className, "");
+      }
+    }
+  }
+
+  /**
+   * Return the resource file suffic for the indicated locale
+   * For most locales, this will be based the language code.  However
+   * for Chinese, we do distinguish between Taiwan and PRC
+   *
+   * @param locale the locale
+   * @return an String suffix which canbe appended to a resource name
+   */
+  private static final String getResourceSuffix(Locale locale)
+  {
+
+    String suffix = "_" + locale.getLanguage();
+    String country = locale.getCountry();
+
+    if (country.equals("TW"))
+      suffix += "_" + country;
+
+    return suffix;
+  }
+
+
+}
diff --git a/src/org/apache/xalan/res/XSLTErrorResources_zh.java b/src/org/apache/xalan/res/XSLTErrorResources_zh.java
old mode 100755
new mode 100644
index 14cff58..0d2c80b
--- a/src/org/apache/xalan/res/XSLTErrorResources_zh.java
+++ b/src/org/apache/xalan/res/XSLTErrorResources_zh.java
@@ -1,1530 +1,1530 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: XSLTErrorResources_zh.java 338081 2004-12-15 17:35:58Z jycli $
- */
-package org.apache.xalan.res;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Set up error messages.
- * We build a two dimensional array of message keys and
- * message strings. In order to add a new message here,
- * you need to first add a String constant. And
- *  you need to enter key , value pair as part of contents
- * Array. You also need to update MAX_CODE for error strings
- * and MAX_WARNING for warnings ( Needed for only information
- * purpose )
- */
-public class XSLTErrorResources_zh extends ListResourceBundle
-{
-
-/*
- * This file contains error and warning messages related to Xalan Error
- * Handling.
- *
- *  General notes to translators:
- *
- *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
- *     components.
- *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *     XSLTC is an acronym for XSLT Compiler.
- *
- *  2) A stylesheet is a description of how to transform an input XML document
- *     into a resultant XML document (or HTML document or text).  The
- *     stylesheet itself is described in the form of an XML document.
- *
- *  3) A template is a component of a stylesheet that is used to match a
- *     particular portion of an input document and specifies the form of the
- *     corresponding portion of the output document.
- *
- *  4) An element is a mark-up tag in an XML document; an attribute is a
- *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *     "elem" is an element name, "attr" and "attr2" are attribute names with
- *     the values "val" and "val2", respectively.
- *
- *  5) A namespace declaration is a special attribute that is used to associate
- *     a prefix with a URI (the namespace).  The meanings of element names and
- *     attribute names that use that prefix are defined with respect to that
- *     namespace.
- *
- *  6) "Translet" is an invented term that describes the class file that
- *     results from compiling an XML stylesheet into a Java class.
- *
- *  7) XPath is a specification that describes a notation for identifying
- *     nodes in a tree-structured representation of an XML document.  An
- *     instance of that notation is referred to as an XPath expression.
- *
- */
-
-  /** Maximum error messages, this is needed to keep track of the number of messages.    */
-  public static final int MAX_CODE = 201;
-
-  /** Maximum warnings, this is needed to keep track of the number of warnings.          */
-  public static final int MAX_WARNING = 29;
-
-  /** Maximum misc strings.   */
-  public static final int MAX_OTHERS = 55;
-
-  /** Maximum total warnings and error messages.          */
-  public static final int MAX_MESSAGES = MAX_CODE + MAX_WARNING + 1;
-
-
-  /*
-   * Static variables
-   */
-  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX =
-        "ER_INVALID_SET_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX";
-
-  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT =
-        "ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT";
-
-  public static final String ER_NO_CURLYBRACE = "ER_NO_CURLYBRACE";
-  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
-  public static final String ER_ILLEGAL_ATTRIBUTE = "ER_ILLEGAL_ATTRIBUTE";
-  public static final String ER_NULL_SOURCENODE_APPLYIMPORTS = "ER_NULL_SOURCENODE_APPLYIMPORTS";
-  public static final String ER_CANNOT_ADD = "ER_CANNOT_ADD";
-  public static final String ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES="ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES";
-  public static final String ER_NO_NAME_ATTRIB = "ER_NO_NAME_ATTRIB";
-  public static final String ER_TEMPLATE_NOT_FOUND = "ER_TEMPLATE_NOT_FOUND";
-  public static final String ER_CANT_RESOLVE_NAME_AVT = "ER_CANT_RESOLVE_NAME_AVT";
-  public static final String ER_REQUIRES_ATTRIB = "ER_REQUIRES_ATTRIB";
-  public static final String ER_MUST_HAVE_TEST_ATTRIB = "ER_MUST_HAVE_TEST_ATTRIB";
-  public static final String ER_BAD_VAL_ON_LEVEL_ATTRIB =
-         "ER_BAD_VAL_ON_LEVEL_ATTRIB";
-  public static final String ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
-         "ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
-  public static final String ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
-         "ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
-  public static final String ER_NEED_MATCH_ATTRIB = "ER_NEED_MATCH_ATTRIB";
-  public static final String ER_NEED_NAME_OR_MATCH_ATTRIB =
-         "ER_NEED_NAME_OR_MATCH_ATTRIB";
-  public static final String ER_CANT_RESOLVE_NSPREFIX =
-         "ER_CANT_RESOLVE_NSPREFIX";
-  public static final String ER_ILLEGAL_VALUE = "ER_ILLEGAL_VALUE";
-  public static final String ER_NO_OWNERDOC = "ER_NO_OWNERDOC";
-  public static final String ER_ELEMTEMPLATEELEM_ERR ="ER_ELEMTEMPLATEELEM_ERR";
-  public static final String ER_NULL_CHILD = "ER_NULL_CHILD";
-  public static final String ER_NEED_SELECT_ATTRIB = "ER_NEED_SELECT_ATTRIB";
-  public static final String ER_NEED_TEST_ATTRIB = "ER_NEED_TEST_ATTRIB";
-  public static final String ER_NEED_NAME_ATTRIB = "ER_NEED_NAME_ATTRIB";
-  public static final String ER_NO_CONTEXT_OWNERDOC = "ER_NO_CONTEXT_OWNERDOC";
-  public static final String ER_COULD_NOT_CREATE_XML_PROC_LIAISON =
-         "ER_COULD_NOT_CREATE_XML_PROC_LIAISON";
-  public static final String ER_PROCESS_NOT_SUCCESSFUL =
-         "ER_PROCESS_NOT_SUCCESSFUL";
-  public static final String ER_NOT_SUCCESSFUL = "ER_NOT_SUCCESSFUL";
-  public static final String ER_ENCODING_NOT_SUPPORTED =
-         "ER_ENCODING_NOT_SUPPORTED";
-  public static final String ER_COULD_NOT_CREATE_TRACELISTENER =
-         "ER_COULD_NOT_CREATE_TRACELISTENER";
-  public static final String ER_KEY_REQUIRES_NAME_ATTRIB =
-         "ER_KEY_REQUIRES_NAME_ATTRIB";
-  public static final String ER_KEY_REQUIRES_MATCH_ATTRIB =
-         "ER_KEY_REQUIRES_MATCH_ATTRIB";
-  public static final String ER_KEY_REQUIRES_USE_ATTRIB =
-         "ER_KEY_REQUIRES_USE_ATTRIB";
-  public static final String ER_REQUIRES_ELEMENTS_ATTRIB =
-         "ER_REQUIRES_ELEMENTS_ATTRIB";
-  public static final String ER_MISSING_PREFIX_ATTRIB =
-         "ER_MISSING_PREFIX_ATTRIB";
-  public static final String ER_BAD_STYLESHEET_URL = "ER_BAD_STYLESHEET_URL";
-  public static final String ER_FILE_NOT_FOUND = "ER_FILE_NOT_FOUND";
-  public static final String ER_IOEXCEPTION = "ER_IOEXCEPTION";
-  public static final String ER_NO_HREF_ATTRIB = "ER_NO_HREF_ATTRIB";
-  public static final String ER_STYLESHEET_INCLUDES_ITSELF =
-         "ER_STYLESHEET_INCLUDES_ITSELF";
-  public static final String ER_PROCESSINCLUDE_ERROR ="ER_PROCESSINCLUDE_ERROR";
-  public static final String ER_MISSING_LANG_ATTRIB = "ER_MISSING_LANG_ATTRIB";
-  public static final String ER_MISSING_CONTAINER_ELEMENT_COMPONENT =
-         "ER_MISSING_CONTAINER_ELEMENT_COMPONENT";
-  public static final String ER_CAN_ONLY_OUTPUT_TO_ELEMENT =
-         "ER_CAN_ONLY_OUTPUT_TO_ELEMENT";
-  public static final String ER_PROCESS_ERROR = "ER_PROCESS_ERROR";
-  public static final String ER_UNIMPLNODE_ERROR = "ER_UNIMPLNODE_ERROR";
-  public static final String ER_NO_SELECT_EXPRESSION ="ER_NO_SELECT_EXPRESSION";
-  public static final String ER_CANNOT_SERIALIZE_XSLPROCESSOR =
-         "ER_CANNOT_SERIALIZE_XSLPROCESSOR";
-  public static final String ER_NO_INPUT_STYLESHEET = "ER_NO_INPUT_STYLESHEET";
-  public static final String ER_FAILED_PROCESS_STYLESHEET =
-         "ER_FAILED_PROCESS_STYLESHEET";
-  public static final String ER_COULDNT_PARSE_DOC = "ER_COULDNT_PARSE_DOC";
-  public static final String ER_COULDNT_FIND_FRAGMENT =
-         "ER_COULDNT_FIND_FRAGMENT";
-  public static final String ER_NODE_NOT_ELEMENT = "ER_NODE_NOT_ELEMENT";
-  public static final String ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB =
-         "ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB";
-  public static final String ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB =
-         "ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB";
-  public static final String ER_NO_CLONE_OF_DOCUMENT_FRAG =
-         "ER_NO_CLONE_OF_DOCUMENT_FRAG";
-  public static final String ER_CANT_CREATE_ITEM = "ER_CANT_CREATE_ITEM";
-  public static final String ER_XMLSPACE_ILLEGAL_VALUE =
-         "ER_XMLSPACE_ILLEGAL_VALUE";
-  public static final String ER_NO_XSLKEY_DECLARATION =
-         "ER_NO_XSLKEY_DECLARATION";
-  public static final String ER_CANT_CREATE_URL = "ER_CANT_CREATE_URL";
-  public static final String ER_XSLFUNCTIONS_UNSUPPORTED =
-         "ER_XSLFUNCTIONS_UNSUPPORTED";
-  public static final String ER_PROCESSOR_ERROR = "ER_PROCESSOR_ERROR";
-  public static final String ER_NOT_ALLOWED_INSIDE_STYLESHEET =
-         "ER_NOT_ALLOWED_INSIDE_STYLESHEET";
-  public static final String ER_RESULTNS_NOT_SUPPORTED =
-         "ER_RESULTNS_NOT_SUPPORTED";
-  public static final String ER_DEFAULTSPACE_NOT_SUPPORTED =
-         "ER_DEFAULTSPACE_NOT_SUPPORTED";
-  public static final String ER_INDENTRESULT_NOT_SUPPORTED =
-         "ER_INDENTRESULT_NOT_SUPPORTED";
-  public static final String ER_ILLEGAL_ATTRIB = "ER_ILLEGAL_ATTRIB";
-  public static final String ER_UNKNOWN_XSL_ELEM = "ER_UNKNOWN_XSL_ELEM";
-  public static final String ER_BAD_XSLSORT_USE = "ER_BAD_XSLSORT_USE";
-  public static final String ER_MISPLACED_XSLWHEN = "ER_MISPLACED_XSLWHEN";
-  public static final String ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE =
-         "ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE";
-  public static final String ER_MISPLACED_XSLOTHERWISE =
-         "ER_MISPLACED_XSLOTHERWISE";
-  public static final String ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE =
-         "ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE";
-  public static final String ER_NOT_ALLOWED_INSIDE_TEMPLATE =
-         "ER_NOT_ALLOWED_INSIDE_TEMPLATE";
-  public static final String ER_UNKNOWN_EXT_NS_PREFIX =
-         "ER_UNKNOWN_EXT_NS_PREFIX";
-  public static final String ER_IMPORTS_AS_FIRST_ELEM =
-         "ER_IMPORTS_AS_FIRST_ELEM";
-  public static final String ER_IMPORTING_ITSELF = "ER_IMPORTING_ITSELF";
-  public static final String ER_XMLSPACE_ILLEGAL_VAL ="ER_XMLSPACE_ILLEGAL_VAL";
-  public static final String ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL =
-         "ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL";
-  public static final String ER_SAX_EXCEPTION = "ER_SAX_EXCEPTION";
-  public static final String ER_XSLT_ERROR = "ER_XSLT_ERROR";
-  public static final String ER_CURRENCY_SIGN_ILLEGAL=
-         "ER_CURRENCY_SIGN_ILLEGAL";
-  public static final String ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM =
-         "ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM";
-  public static final String ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER =
-         "ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER";
-  public static final String ER_REDIRECT_COULDNT_GET_FILENAME =
-         "ER_REDIRECT_COULDNT_GET_FILENAME";
-  public static final String ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT =
-         "ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT";
-  public static final String ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX =
-         "ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX";
-  public static final String ER_MISSING_NS_URI = "ER_MISSING_NS_URI";
-  public static final String ER_MISSING_ARG_FOR_OPTION =
-         "ER_MISSING_ARG_FOR_OPTION";
-  public static final String ER_INVALID_OPTION = "ER_INVALID_OPTION";
-  public static final String ER_MALFORMED_FORMAT_STRING =
-         "ER_MALFORMED_FORMAT_STRING";
-  public static final String ER_STYLESHEET_REQUIRES_VERSION_ATTRIB =
-         "ER_STYLESHEET_REQUIRES_VERSION_ATTRIB";
-  public static final String ER_ILLEGAL_ATTRIBUTE_VALUE =
-         "ER_ILLEGAL_ATTRIBUTE_VALUE";
-  public static final String ER_CHOOSE_REQUIRES_WHEN ="ER_CHOOSE_REQUIRES_WHEN";
-  public static final String ER_NO_APPLY_IMPORT_IN_FOR_EACH =
-         "ER_NO_APPLY_IMPORT_IN_FOR_EACH";
-  public static final String ER_CANT_USE_DTM_FOR_OUTPUT =
-         "ER_CANT_USE_DTM_FOR_OUTPUT";
-  public static final String ER_CANT_USE_DTM_FOR_INPUT =
-         "ER_CANT_USE_DTM_FOR_INPUT";
-  public static final String ER_CALL_TO_EXT_FAILED = "ER_CALL_TO_EXT_FAILED";
-  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
-  public static final String ER_INVALID_UTF16_SURROGATE =
-         "ER_INVALID_UTF16_SURROGATE";
-  public static final String ER_XSLATTRSET_USED_ITSELF =
-         "ER_XSLATTRSET_USED_ITSELF";
-  public static final String ER_CANNOT_MIX_XERCESDOM ="ER_CANNOT_MIX_XERCESDOM";
-  public static final String ER_TOO_MANY_LISTENERS = "ER_TOO_MANY_LISTENERS";
-  public static final String ER_IN_ELEMTEMPLATEELEM_READOBJECT =
-         "ER_IN_ELEMTEMPLATEELEM_READOBJECT";
-  public static final String ER_DUPLICATE_NAMED_TEMPLATE =
-         "ER_DUPLICATE_NAMED_TEMPLATE";
-  public static final String ER_INVALID_KEY_CALL = "ER_INVALID_KEY_CALL";
-  public static final String ER_REFERENCING_ITSELF = "ER_REFERENCING_ITSELF";
-  public static final String ER_ILLEGAL_DOMSOURCE_INPUT =
-         "ER_ILLEGAL_DOMSOURCE_INPUT";
-  public static final String ER_CLASS_NOT_FOUND_FOR_OPTION =
-         "ER_CLASS_NOT_FOUND_FOR_OPTION";
-  public static final String ER_REQUIRED_ELEM_NOT_FOUND =
-         "ER_REQUIRED_ELEM_NOT_FOUND";
-  public static final String ER_INPUT_CANNOT_BE_NULL ="ER_INPUT_CANNOT_BE_NULL";
-  public static final String ER_URI_CANNOT_BE_NULL = "ER_URI_CANNOT_BE_NULL";
-  public static final String ER_FILE_CANNOT_BE_NULL = "ER_FILE_CANNOT_BE_NULL";
-  public static final String ER_SOURCE_CANNOT_BE_NULL =
-         "ER_SOURCE_CANNOT_BE_NULL";
-  public static final String ER_CANNOT_INIT_BSFMGR = "ER_CANNOT_INIT_BSFMGR";
-  public static final String ER_CANNOT_CMPL_EXTENSN = "ER_CANNOT_CMPL_EXTENSN";
-  public static final String ER_CANNOT_CREATE_EXTENSN =
-         "ER_CANNOT_CREATE_EXTENSN";
-  public static final String ER_INSTANCE_MTHD_CALL_REQUIRES =
-         "ER_INSTANCE_MTHD_CALL_REQUIRES";
-  public static final String ER_INVALID_ELEMENT_NAME ="ER_INVALID_ELEMENT_NAME";
-  public static final String ER_ELEMENT_NAME_METHOD_STATIC =
-         "ER_ELEMENT_NAME_METHOD_STATIC";
-  public static final String ER_EXTENSION_FUNC_UNKNOWN =
-         "ER_EXTENSION_FUNC_UNKNOWN";
-  public static final String ER_MORE_MATCH_CONSTRUCTOR =
-         "ER_MORE_MATCH_CONSTRUCTOR";
-  public static final String ER_MORE_MATCH_METHOD = "ER_MORE_MATCH_METHOD";
-  public static final String ER_MORE_MATCH_ELEMENT = "ER_MORE_MATCH_ELEMENT";
-  public static final String ER_INVALID_CONTEXT_PASSED =
-         "ER_INVALID_CONTEXT_PASSED";
-  public static final String ER_POOL_EXISTS = "ER_POOL_EXISTS";
-  public static final String ER_NO_DRIVER_NAME = "ER_NO_DRIVER_NAME";
-  public static final String ER_NO_URL = "ER_NO_URL";
-  public static final String ER_POOL_SIZE_LESSTHAN_ONE =
-         "ER_POOL_SIZE_LESSTHAN_ONE";
-  public static final String ER_INVALID_DRIVER = "ER_INVALID_DRIVER";
-  public static final String ER_NO_STYLESHEETROOT = "ER_NO_STYLESHEETROOT";
-  public static final String ER_ILLEGAL_XMLSPACE_VALUE =
-         "ER_ILLEGAL_XMLSPACE_VALUE";
-  public static final String ER_PROCESSFROMNODE_FAILED =
-         "ER_PROCESSFROMNODE_FAILED";
-  public static final String ER_RESOURCE_COULD_NOT_LOAD =
-         "ER_RESOURCE_COULD_NOT_LOAD";
-  public static final String ER_BUFFER_SIZE_LESSTHAN_ZERO =
-         "ER_BUFFER_SIZE_LESSTHAN_ZERO";
-  public static final String ER_UNKNOWN_ERROR_CALLING_EXTENSION =
-         "ER_UNKNOWN_ERROR_CALLING_EXTENSION";
-  public static final String ER_NO_NAMESPACE_DECL = "ER_NO_NAMESPACE_DECL";
-  public static final String ER_ELEM_CONTENT_NOT_ALLOWED =
-         "ER_ELEM_CONTENT_NOT_ALLOWED";
-  public static final String ER_STYLESHEET_DIRECTED_TERMINATION =
-         "ER_STYLESHEET_DIRECTED_TERMINATION";
-  public static final String ER_ONE_OR_TWO = "ER_ONE_OR_TWO";
-  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
-  public static final String ER_COULD_NOT_LOAD_RESOURCE =
-         "ER_COULD_NOT_LOAD_RESOURCE";
-  public static final String ER_CANNOT_INIT_DEFAULT_TEMPLATES =
-         "ER_CANNOT_INIT_DEFAULT_TEMPLATES";
-  public static final String ER_RESULT_NULL = "ER_RESULT_NULL";
-  public static final String ER_RESULT_COULD_NOT_BE_SET =
-         "ER_RESULT_COULD_NOT_BE_SET";
-  public static final String ER_NO_OUTPUT_SPECIFIED = "ER_NO_OUTPUT_SPECIFIED";
-  public static final String ER_CANNOT_TRANSFORM_TO_RESULT_TYPE =
-         "ER_CANNOT_TRANSFORM_TO_RESULT_TYPE";
-  public static final String ER_CANNOT_TRANSFORM_SOURCE_TYPE =
-         "ER_CANNOT_TRANSFORM_SOURCE_TYPE";
-  public static final String ER_NULL_CONTENT_HANDLER ="ER_NULL_CONTENT_HANDLER";
-  public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
-  public static final String ER_CANNOT_CALL_PARSE = "ER_CANNOT_CALL_PARSE";
-  public static final String ER_NO_PARENT_FOR_FILTER ="ER_NO_PARENT_FOR_FILTER";
-  public static final String ER_NO_STYLESHEET_IN_MEDIA =
-         "ER_NO_STYLESHEET_IN_MEDIA";
-  public static final String ER_NO_STYLESHEET_PI = "ER_NO_STYLESHEET_PI";
-  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
-  public static final String ER_PROPERTY_VALUE_BOOLEAN =
-         "ER_PROPERTY_VALUE_BOOLEAN";
-  public static final String ER_COULD_NOT_FIND_EXTERN_SCRIPT =
-         "ER_COULD_NOT_FIND_EXTERN_SCRIPT";
-  public static final String ER_RESOURCE_COULD_NOT_FIND =
-         "ER_RESOURCE_COULD_NOT_FIND";
-  public static final String ER_OUTPUT_PROPERTY_NOT_RECOGNIZED =
-         "ER_OUTPUT_PROPERTY_NOT_RECOGNIZED";
-  public static final String ER_FAILED_CREATING_ELEMLITRSLT =
-         "ER_FAILED_CREATING_ELEMLITRSLT";
-  public static final String ER_VALUE_SHOULD_BE_NUMBER =
-         "ER_VALUE_SHOULD_BE_NUMBER";
-  public static final String ER_VALUE_SHOULD_EQUAL = "ER_VALUE_SHOULD_EQUAL";
-  public static final String ER_FAILED_CALLING_METHOD =
-         "ER_FAILED_CALLING_METHOD";
-  public static final String ER_FAILED_CREATING_ELEMTMPL =
-         "ER_FAILED_CREATING_ELEMTMPL";
-  public static final String ER_CHARS_NOT_ALLOWED = "ER_CHARS_NOT_ALLOWED";
-  public static final String ER_ATTR_NOT_ALLOWED = "ER_ATTR_NOT_ALLOWED";
-  public static final String ER_BAD_VALUE = "ER_BAD_VALUE";
-  public static final String ER_ATTRIB_VALUE_NOT_FOUND =
-         "ER_ATTRIB_VALUE_NOT_FOUND";
-  public static final String ER_ATTRIB_VALUE_NOT_RECOGNIZED =
-         "ER_ATTRIB_VALUE_NOT_RECOGNIZED";
-  public static final String ER_NULL_URI_NAMESPACE = "ER_NULL_URI_NAMESPACE";
-  public static final String ER_NUMBER_TOO_BIG = "ER_NUMBER_TOO_BIG";
-  public static final String  ER_CANNOT_FIND_SAX1_DRIVER =
-         "ER_CANNOT_FIND_SAX1_DRIVER";
-  public static final String  ER_SAX1_DRIVER_NOT_LOADED =
-         "ER_SAX1_DRIVER_NOT_LOADED";
-  public static final String  ER_SAX1_DRIVER_NOT_INSTANTIATED =
-         "ER_SAX1_DRIVER_NOT_INSTANTIATED" ;
-  public static final String ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER =
-         "ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER";
-  public static final String  ER_PARSER_PROPERTY_NOT_SPECIFIED =
-         "ER_PARSER_PROPERTY_NOT_SPECIFIED";
-  public static final String  ER_PARSER_ARG_CANNOT_BE_NULL =
-         "ER_PARSER_ARG_CANNOT_BE_NULL" ;
-  public static final String  ER_FEATURE = "ER_FEATURE";
-  public static final String ER_PROPERTY = "ER_PROPERTY" ;
-  public static final String ER_NULL_ENTITY_RESOLVER ="ER_NULL_ENTITY_RESOLVER";
-  public static final String  ER_NULL_DTD_HANDLER = "ER_NULL_DTD_HANDLER" ;
-  public static final String ER_NO_DRIVER_NAME_SPECIFIED =
-         "ER_NO_DRIVER_NAME_SPECIFIED";
-  public static final String ER_NO_URL_SPECIFIED = "ER_NO_URL_SPECIFIED";
-  public static final String ER_POOLSIZE_LESS_THAN_ONE =
-         "ER_POOLSIZE_LESS_THAN_ONE";
-  public static final String ER_INVALID_DRIVER_NAME = "ER_INVALID_DRIVER_NAME";
-  public static final String ER_ERRORLISTENER = "ER_ERRORLISTENER";
-  public static final String ER_ASSERT_NO_TEMPLATE_PARENT =
-         "ER_ASSERT_NO_TEMPLATE_PARENT";
-  public static final String ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR =
-         "ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR";
-  public static final String ER_NOT_ALLOWED_IN_POSITION =
-         "ER_NOT_ALLOWED_IN_POSITION";
-  public static final String ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION =
-         "ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION";
-  public static final String ER_NAMESPACE_CONTEXT_NULL_NAMESPACE =
-         "ER_NAMESPACE_CONTEXT_NULL_NAMESPACE";
-  public static final String ER_NAMESPACE_CONTEXT_NULL_PREFIX =
-         "ER_NAMESPACE_CONTEXT_NULL_PREFIX";
-  public static final String ER_XPATH_RESOLVER_NULL_QNAME =
-         "ER_XPATH_RESOLVER_NULL_QNAME";
-  public static final String ER_XPATH_RESOLVER_NEGATIVE_ARITY =
-         "ER_XPATH_RESOLVER_NEGATIVE_ARITY";
-  public static final String INVALID_TCHAR = "INVALID_TCHAR";
-  public static final String INVALID_QNAME = "INVALID_QNAME";
-  public static final String INVALID_ENUM = "INVALID_ENUM";
-  public static final String INVALID_NMTOKEN = "INVALID_NMTOKEN";
-  public static final String INVALID_NCNAME = "INVALID_NCNAME";
-  public static final String INVALID_BOOLEAN = "INVALID_BOOLEAN";
-  public static final String INVALID_NUMBER = "INVALID_NUMBER";
-  public static final String ER_ARG_LITERAL = "ER_ARG_LITERAL";
-  public static final String ER_DUPLICATE_GLOBAL_VAR ="ER_DUPLICATE_GLOBAL_VAR";
-  public static final String ER_DUPLICATE_VAR = "ER_DUPLICATE_VAR";
-  public static final String ER_TEMPLATE_NAME_MATCH = "ER_TEMPLATE_NAME_MATCH";
-  public static final String ER_INVALID_PREFIX = "ER_INVALID_PREFIX";
-  public static final String ER_NO_ATTRIB_SET = "ER_NO_ATTRIB_SET";
-  public static final String ER_FUNCTION_NOT_FOUND =
-         "ER_FUNCTION_NOT_FOUND";
-  public static final String ER_CANT_HAVE_CONTENT_AND_SELECT =
-     "ER_CANT_HAVE_CONTENT_AND_SELECT";
-  public static final String ER_INVALID_SET_PARAM_VALUE = "ER_INVALID_SET_PARAM_VALUE";
-  public static final String ER_SET_FEATURE_NULL_NAME =
-        "ER_SET_FEATURE_NULL_NAME";
-  public static final String ER_GET_FEATURE_NULL_NAME =
-        "ER_GET_FEATURE_NULL_NAME";
-  public static final String ER_UNSUPPORTED_FEATURE =
-        "ER_UNSUPPORTED_FEATURE";
-  public static final String ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING =
-        "ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING";
-
-  public static final String WG_FOUND_CURLYBRACE = "WG_FOUND_CURLYBRACE";
-  public static final String WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR =
-         "WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR";
-  public static final String WG_EXPR_ATTRIB_CHANGED_TO_SELECT =
-         "WG_EXPR_ATTRIB_CHANGED_TO_SELECT";
-  public static final String WG_NO_LOCALE_IN_FORMATNUMBER =
-         "WG_NO_LOCALE_IN_FORMATNUMBER";
-  public static final String WG_LOCALE_NOT_FOUND = "WG_LOCALE_NOT_FOUND";
-  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
-  public static final String WG_CANNOT_LOAD_REQUESTED_DOC =
-         "WG_CANNOT_LOAD_REQUESTED_DOC";
-  public static final String WG_CANNOT_FIND_COLLATOR ="WG_CANNOT_FIND_COLLATOR";
-  public static final String WG_FUNCTIONS_SHOULD_USE_URL =
-         "WG_FUNCTIONS_SHOULD_USE_URL";
-  public static final String WG_ENCODING_NOT_SUPPORTED_USING_UTF8 =
-         "WG_ENCODING_NOT_SUPPORTED_USING_UTF8";
-  public static final String WG_ENCODING_NOT_SUPPORTED_USING_JAVA =
-         "WG_ENCODING_NOT_SUPPORTED_USING_JAVA";
-  public static final String WG_SPECIFICITY_CONFLICTS =
-         "WG_SPECIFICITY_CONFLICTS";
-  public static final String WG_PARSING_AND_PREPARING =
-         "WG_PARSING_AND_PREPARING";
-  public static final String WG_ATTR_TEMPLATE = "WG_ATTR_TEMPLATE";
-  public static final String WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE = "WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESP";
-  public static final String WG_ATTRIB_NOT_HANDLED = "WG_ATTRIB_NOT_HANDLED";
-  public static final String WG_NO_DECIMALFORMAT_DECLARATION =
-         "WG_NO_DECIMALFORMAT_DECLARATION";
-  public static final String WG_OLD_XSLT_NS = "WG_OLD_XSLT_NS";
-  public static final String WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED =
-         "WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED";
-  public static final String WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE =
-         "WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE";
-  public static final String WG_ILLEGAL_ATTRIBUTE = "WG_ILLEGAL_ATTRIBUTE";
-  public static final String WG_COULD_NOT_RESOLVE_PREFIX =
-         "WG_COULD_NOT_RESOLVE_PREFIX";
-  public static final String WG_STYLESHEET_REQUIRES_VERSION_ATTRIB =
-         "WG_STYLESHEET_REQUIRES_VERSION_ATTRIB";
-  public static final String WG_ILLEGAL_ATTRIBUTE_NAME =
-         "WG_ILLEGAL_ATTRIBUTE_NAME";
-  public static final String WG_ILLEGAL_ATTRIBUTE_VALUE =
-         "WG_ILLEGAL_ATTRIBUTE_VALUE";
-  public static final String WG_EMPTY_SECOND_ARG = "WG_EMPTY_SECOND_ARG";
-  public static final String WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
-         "WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
-  public static final String WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
-         "WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
-  public static final String WG_ILLEGAL_ATTRIBUTE_POSITION =
-         "WG_ILLEGAL_ATTRIBUTE_POSITION";
-  public static final String NO_MODIFICATION_ALLOWED_ERR =
-         "NO_MODIFICATION_ALLOWED_ERR";
-
-  /*
-   * Now fill in the message text.
-   * Then fill in the message text for that message code in the
-   * array. Use the new error code as the index into the array.
-   */
-
-  // Error messages...
-
-  /** Get the lookup table for error messages.
-   *
-   * @return The message lookup table.
-   */
-  public Object[][] getContents()
-  {
-    return new Object[][] {
-
-  /** Error message ID that has a null message, but takes in a single object.    */
-  {"ER0000" , "{0}" },
-
-
-    { ER_NO_CURLYBRACE,
-      "\u9519\u8bef\uff1a\u8868\u8fbe\u5f0f\u4e2d\u4e0d\u80fd\u6709\u201c{\u201d"},
-
-    { ER_ILLEGAL_ATTRIBUTE ,
-     "{0} \u6709\u4e00\u4e2a\u975e\u6cd5\u5c5e\u6027\uff1a{1}"},
-
-  {ER_NULL_SOURCENODE_APPLYIMPORTS ,
-      "sourceNode \u5728 xsl:apply-imports \u4e2d\u4e3a\u7a7a\uff01"},
-
-  {ER_CANNOT_ADD,
-      "\u65e0\u6cd5\u5c06\u201c{0}\u201d\u6dfb\u52a0\u5230\u201c{1}\u201d"},
-
-    { ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES,
-      "sourceNode \u5728 handleApplyTemplatesInstruction \u4e2d\u4e3a\u7a7a\uff01"},
-
-    { ER_NO_NAME_ATTRIB,
-     "\u201c{0}\u201d\u5fc5\u987b\u6709 name \u5c5e\u6027\u3002"},
-
-    {ER_TEMPLATE_NOT_FOUND,
-     "\u627e\u4e0d\u5230\u4ee5\u4e0b\u540d\u79f0\u7684\u6a21\u677f\uff1a{0}"},
-
-    {ER_CANT_RESOLVE_NAME_AVT,
-      "\u65e0\u6cd5\u89e3\u6790 xsl:call-template \u4e2d\u7684\u540d\u79f0 AVT\u3002"},
-
-    {ER_REQUIRES_ATTRIB,
-     "\u201c{0}\u201d\u9700\u8981\u5c5e\u6027\uff1a{1}"},
-
-    { ER_MUST_HAVE_TEST_ATTRIB,
-      "\u201c{0}\u201d\u5fc5\u987b\u6709\u201ctest\u201d\u5c5e\u6027\u3002"},
-
-    {ER_BAD_VAL_ON_LEVEL_ATTRIB,
-      "\u7ea7\u522b\u5c5e\u6027\u4e0a\u51fa\u73b0\u9519\u8bef\u503c\uff1a{0}"},
-
-    {ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
-      "processing-instruction \u540d\u79f0\u4e0d\u80fd\u662f\u201cxml\u201d"},
-
-    { ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
-      "processing-instruction \u540d\u79f0\u5fc5\u987b\u662f\u6709\u6548\u7684 NCName\uff1a{0}"},
-
-    { ER_NEED_MATCH_ATTRIB,
-      "\u201c{0}\u201d\u5982\u679c\u6709\u67d0\u79cd\u65b9\u5f0f\uff0c\u5c31\u5fc5\u987b\u6709 match \u5c5e\u6027\u3002"},
-
-    { ER_NEED_NAME_OR_MATCH_ATTRIB,
-      "\u201c{0}\u201d\u9700\u8981 name \u5c5e\u6027\u6216 match \u5c5e\u6027\u3002"},
-
-    {ER_CANT_RESOLVE_NSPREFIX,
-      "\u65e0\u6cd5\u89e3\u6790\u540d\u79f0\u7a7a\u95f4\u524d\u7f00\uff1a{0}"},
-
-    { ER_ILLEGAL_VALUE,
-     "xml:space \u6709\u975e\u6cd5\u7684\u503c\uff1a{0}"},
-
-    { ER_NO_OWNERDOC,
-      "\u5b50\u8282\u70b9\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
-
-    { ER_ELEMTEMPLATEELEM_ERR,
-     "ElemTemplateElement \u9519\u8bef\uff1a{0}"},
-
-    { ER_NULL_CHILD,
-     "\u6b63\u5728\u5c1d\u8bd5\u6dfb\u52a0\u7a7a\u7684\u5b50\u4ee3\uff01"},
-
-    { ER_NEED_SELECT_ATTRIB,
-     "{0} \u9700\u8981 select \u5c5e\u6027\u3002"},
-
-    { ER_NEED_TEST_ATTRIB ,
-      "xsl:when \u5fc5\u987b\u6709\u201ctest\u201d\u5c5e\u6027\u3002"},
-
-    { ER_NEED_NAME_ATTRIB,
-      "xsl:with-param \u5fc5\u987b\u6709\u201cname\u201d\u5c5e\u6027\u3002"},
-
-    { ER_NO_CONTEXT_OWNERDOC,
-      "\u4e0a\u4e0b\u6587\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
-
-    {ER_COULD_NOT_CREATE_XML_PROC_LIAISON,
-      "\u65e0\u6cd5\u521b\u5efa XML TransformerFactory \u8054\u7cfb\uff1a{0}"},
-
-    {ER_PROCESS_NOT_SUCCESSFUL,
-      "Xalan: Process \u4e0d\u6210\u529f\u3002"},
-
-    { ER_NOT_SUCCESSFUL,
-     "Xalan: \u4e0d\u6210\u529f\u3002"},
-
-    { ER_ENCODING_NOT_SUPPORTED,
-     "\u4e0d\u652f\u6301\u7f16\u7801\uff1a{0}"},
-
-    {ER_COULD_NOT_CREATE_TRACELISTENER,
-      "\u65e0\u6cd5\u521b\u5efa TraceListener\uff1a{0}"},
-
-    {ER_KEY_REQUIRES_NAME_ATTRIB,
-      "xsl:key \u9700\u8981\u201cname\u201d\u5c5e\u6027\uff01"},
-
-    { ER_KEY_REQUIRES_MATCH_ATTRIB,
-      "xsl:key \u9700\u8981\u201cmatch\u201d\u5c5e\u6027\uff01"},
-
-    { ER_KEY_REQUIRES_USE_ATTRIB,
-      "xsl:key \u9700\u8981\u201cuse\u201d\u5c5e\u6027\uff01"},
-
-    { ER_REQUIRES_ELEMENTS_ATTRIB,
-      "(StylesheetHandler) {0} \u9700\u8981\u201celements\u201d\u5c5e\u6027\uff01"},
-
-    { ER_MISSING_PREFIX_ATTRIB,
-      "(StylesheetHandler) {0} \u5c5e\u6027\u201cprefix\u201d\u4e22\u5931"},
-
-    { ER_BAD_STYLESHEET_URL,
-     "\u6837\u5f0f\u8868 URL \u9519\u8bef\uff1a{0}"},
-
-    { ER_FILE_NOT_FOUND,
-     "\u627e\u4e0d\u5230\u6837\u5f0f\u8868\u6587\u4ef6\uff1a{0}"},
-
-    { ER_IOEXCEPTION,
-      "\u6837\u5f0f\u8868\u6587\u4ef6\u53d1\u751f IO \u5f02\u5e38\uff1a{0}"},
-
-    { ER_NO_HREF_ATTRIB,
-      "\uff08StylesheetHandler\uff09\u65e0\u6cd5\u4e3a {0} \u627e\u5230 href \u5c5e\u6027"},
-
-    { ER_STYLESHEET_INCLUDES_ITSELF,
-      "\uff08StylesheetHandler\uff09{0} \u6b63\u5728\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5305\u542b\u5b83\u81ea\u8eab\uff01"},
-
-    { ER_PROCESSINCLUDE_ERROR,
-      "StylesheetHandler.processInclude \u9519\u8bef\uff0c{0}"},
-
-    { ER_MISSING_LANG_ATTRIB,
-      "(StylesheetHandler) {0} \u5c5e\u6027\u201clang\u201d\u4e22\u5931"},
-
-    { ER_MISSING_CONTAINER_ELEMENT_COMPONENT,
-      "\uff08StylesheetHandler\uff09\u662f\u5426\u9519\u653e\u4e86 {0} \u5143\u7d20\uff1f\uff1f\u7f3a\u5c11\u5bb9\u5668\u5143\u7d20\u201ccomponent\u201d"},
-
-    { ER_CAN_ONLY_OUTPUT_TO_ELEMENT,
-      "\u53ea\u80fd\u8f93\u51fa\u5230 Element\u3001DocumentFragment\u3001Document \u6216 PrintWriter\u3002"},
-
-    { ER_PROCESS_ERROR,
-     "StylesheetRoot.process \u9519\u8bef"},
-
-    { ER_UNIMPLNODE_ERROR,
-     "UnImplNode \u9519\u8bef\uff1a{0}"},
-
-    { ER_NO_SELECT_EXPRESSION,
-      "\u9519\u8bef\uff01\u627e\u4e0d\u5230 xpath \u9009\u62e9\u8868\u8fbe\u5f0f\uff08-select\uff09\u3002"},
-
-    { ER_CANNOT_SERIALIZE_XSLPROCESSOR,
-      "\u65e0\u6cd5\u5e8f\u5217\u5316 XSLProcessor\uff01"},
-
-    { ER_NO_INPUT_STYLESHEET,
-      "\u6ca1\u6709\u6307\u5b9a\u6837\u5f0f\u8868\u8f93\u5165\uff01"},
-
-    { ER_FAILED_PROCESS_STYLESHEET,
-      "\u65e0\u6cd5\u5904\u7406\u6837\u5f0f\u8868\uff01"},
-
-    { ER_COULDNT_PARSE_DOC,
-     "\u65e0\u6cd5\u89e3\u6790 {0} \u6587\u6863\uff01"},
-
-    { ER_COULDNT_FIND_FRAGMENT,
-     "\u627e\u4e0d\u5230\u7247\u6bb5\uff1a{0}"},
-
-    { ER_NODE_NOT_ELEMENT,
-      "\u7247\u6bb5\u6807\u8bc6\u6307\u5411\u7684\u8282\u70b9\u4e0d\u662f\u5143\u7d20\uff1a{0}"},
-
-    { ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB,
-      "for-each \u5fc5\u987b\u6709 match \u6216 name \u5c5e\u6027"},
-
-    { ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB,
-      "templates \u5fc5\u987b\u6709 match \u6216 name \u5c5e\u6027"},
-
-    { ER_NO_CLONE_OF_DOCUMENT_FRAG,
-      "\u65e0\u6587\u6863\u7247\u6bb5\u7684\u514b\u9686\uff01"},
-
-    { ER_CANT_CREATE_ITEM,
-      "\u65e0\u6cd5\u5728\u7ed3\u679c\u6811\u4e2d\u521b\u5efa\u9879\uff1a{0}"},
-
-    { ER_XMLSPACE_ILLEGAL_VALUE,
-      "\u6e90 XML \u4e2d\u7684 xml:space \u6709\u975e\u6cd5\u503c\uff1a{0}"},
-
-    { ER_NO_XSLKEY_DECLARATION,
-      "{0} \u6ca1\u6709 xsl:key \u58f0\u660e\uff01"},
-
-    { ER_CANT_CREATE_URL,
-     "\u9519\u8bef\uff01\u65e0\u6cd5\u4e3a {0} \u521b\u5efa URL"},
-
-    { ER_XSLFUNCTIONS_UNSUPPORTED,
-     "\u4e0d\u652f\u6301 xsl:functions"},
-
-    { ER_PROCESSOR_ERROR,
-     "XSLT TransformerFactory \u9519\u8bef"},
-
-    { ER_NOT_ALLOWED_INSIDE_STYLESHEET,
-      "\uff08StylesheetHandler\uff09\u6837\u5f0f\u8868\u5185\u4e0d\u5141\u8bb8 {0}\uff01"},
-
-    { ER_RESULTNS_NOT_SUPPORTED,
-      "\u4e0d\u518d\u652f\u6301 result-ns\uff01\u8bf7\u6539\u4e3a\u4f7f\u7528 xsl:output\u3002"},
-
-    { ER_DEFAULTSPACE_NOT_SUPPORTED,
-      "\u4e0d\u518d\u652f\u6301 default-space\uff01\u8bf7\u6539\u4e3a\u4f7f\u7528 xsl:strip-space \u6216 xsl:preserve-space\u3002"},
-
-    { ER_INDENTRESULT_NOT_SUPPORTED,
-      "\u4e0d\u518d\u652f\u6301 indent-result\uff01\u8bf7\u6539\u4e3a\u4f7f\u7528 xsl:output\u3002"},
-
-    { ER_ILLEGAL_ATTRIB,
-      "\uff08StylesheetHandler\uff09{0} \u6709\u975e\u6cd5\u5c5e\u6027\uff1a{1}"},
-
-    { ER_UNKNOWN_XSL_ELEM,
-     "\u672a\u77e5 XSL \u5143\u7d20\uff1a{0}"},
-
-    { ER_BAD_XSLSORT_USE,
-      "\uff08StylesheetHandler\uff09xsl:sort \u53ea\u80fd\u4e0e xsl:apply-templates \u6216 xsl:for-each \u4e00\u8d77\u4f7f\u7528\u3002"},
-
-    { ER_MISPLACED_XSLWHEN,
-      "\uff08StylesheetHandler\uff09\u9519\u653e\u4e86 xsl:when\uff01"},
-
-    { ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE,
-      "\uff08StylesheetHandler\uff09xsl:choose \u4e0d\u662f xsl:when \u7684\u7236\u4ee3\uff01"},
-
-    { ER_MISPLACED_XSLOTHERWISE,
-      "\uff08StylesheetHandler\uff09\u9519\u653e\u4e86 xsl:otherwise\uff01"},
-
-    { ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE,
-      "\uff08StylesheetHandler\uff09xsl:choose \u4e0d\u662f xsl:otherwise \u7684\u7236\u4ee3\uff01"},
-
-    { ER_NOT_ALLOWED_INSIDE_TEMPLATE,
-      "\uff08StylesheetHandler\uff09\u6a21\u677f\u5185\u4e0d\u5141\u8bb8\u51fa\u73b0 {0}\uff01"},
-
-    { ER_UNKNOWN_EXT_NS_PREFIX,
-      "\uff08StylesheetHandler\uff09{0} \u6269\u5c55\u540d\u79f0\u7a7a\u95f4\u524d\u7f00 {1} \u672a\u77e5"},
-
-    { ER_IMPORTS_AS_FIRST_ELEM,
-      "\uff08StylesheetHandler\uff09\u5bfc\u5165\u53ea\u80fd\u4f5c\u4e3a\u6837\u5f0f\u8868\u4e2d\u6700\u524d\u9762\u7684\u5143\u7d20\u53d1\u751f\uff01"},
-
-    { ER_IMPORTING_ITSELF,
-      "\uff08StylesheetHandler\uff09{0} \u6b63\u5728\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5bfc\u5165\u5b83\u81ea\u8eab\uff01"},
-
-    { ER_XMLSPACE_ILLEGAL_VAL,
-      "\uff08StylesheetHandler\uff09xml:space \u6709\u975e\u6cd5\u503c\uff1a{0}"},
-
-    { ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL,
-      "processStylesheet \u4e0d\u6210\u529f\uff01"},
-
-    { ER_SAX_EXCEPTION,
-     "SAX \u5f02\u5e38"},
-
-//  add this message to fix bug 21478
-    { ER_FUNCTION_NOT_SUPPORTED,
-     "\u51fd\u6570\u4e0d\u53d7\u652f\u6301\uff01"},
-
-
-    { ER_XSLT_ERROR,
-     "XSLT \u9519\u8bef"},
-
-    { ER_CURRENCY_SIGN_ILLEGAL,
-      "\u683c\u5f0f\u6a21\u5f0f\u5b57\u7b26\u4e32\u4e2d\u4e0d\u5141\u8bb8\u5b58\u5728\u8d27\u5e01\u7b26\u53f7"},
-
-    { ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM,
-      "\u6837\u5f0f\u8868 DOM \u4e2d\u4e0d\u652f\u6301\u6587\u6863\u51fd\u6570\uff01"},
-
-    { ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER,
-      "\u65e0\u6cd5\u89e3\u6790\u975e\u524d\u7f00\u89e3\u6790\u5668\u7684\u524d\u7f00\uff01"},
-
-    { ER_REDIRECT_COULDNT_GET_FILENAME,
-      "\u91cd\u5b9a\u5411\u6269\u5c55\uff1a\u65e0\u6cd5\u83b7\u53d6\u6587\u4ef6\u540d \uff0d file \u6216 select \u5c5e\u6027\u5fc5\u987b\u8fd4\u56de\u6709\u6548\u5b57\u7b26\u4e32\u3002"},
-
-    { ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT,
-      "\u65e0\u6cd5\u5728\u91cd\u5b9a\u5411\u6269\u5c55\u4e2d\u6784\u5efa FormatterListener\uff01"},
-
-    { ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX,
-      "exclude-result-prefixes \u4e2d\u7684\u524d\u7f00\u65e0\u6548\uff1a{0}"},
-
-    { ER_MISSING_NS_URI,
-      "\u6307\u5b9a\u7684\u524d\u7f00\u7f3a\u5c11\u540d\u79f0\u7a7a\u95f4 URI"},
-
-    { ER_MISSING_ARG_FOR_OPTION,
-      "\u9009\u9879 {0} \u7f3a\u5c11\u81ea\u53d8\u91cf"},
-
-    { ER_INVALID_OPTION,
-     "\u9009\u9879 {0} \u65e0\u6548"},
-
-    { ER_MALFORMED_FORMAT_STRING,
-     "\u683c\u5f0f\u5b57\u7b26\u4e32 {0} \u7684\u683c\u5f0f\u9519\u8bef"},
-
-    { ER_STYLESHEET_REQUIRES_VERSION_ATTRIB,
-      "xsl:stylesheet \u9700\u8981\u201cversion\u201d\u5c5e\u6027\uff01"},
-
-    { ER_ILLEGAL_ATTRIBUTE_VALUE,
-      "\u5c5e\u6027\uff1a{0} \u6709\u975e\u6cd5\u7684\u503c\uff1a{1}"},
-
-    { ER_CHOOSE_REQUIRES_WHEN,
-     "xsl:choose \u9700\u8981 xsl:when"},
-
-    { ER_NO_APPLY_IMPORT_IN_FOR_EACH,
-      "xsl:for-each \u4e2d\u4e0d\u5141\u8bb8\u6709 xsl:apply-imports"},
-
-    { ER_CANT_USE_DTM_FOR_OUTPUT,
-      "\u65e0\u6cd5\u5c06 DTMLiaison \u7528\u4e8e\u8f93\u51fa DOM \u8282\u70b9... \u6539\u4e3a\u4f20\u9012 org.apache.xpath.DOM2Helper\uff01"},
-
-    { ER_CANT_USE_DTM_FOR_INPUT,
-      "\u65e0\u6cd5\u5c06 DTMLiaison \u7528\u4e8e\u8f93\u5165 DOM \u8282\u70b9... \u6539\u4e3a\u4f20\u9012 org.apache.xpath.DOM2Helper\uff01"},
-
-    { ER_CALL_TO_EXT_FAILED,
-      "\u8c03\u7528\u6269\u5c55\u5143\u7d20\u5931\u8d25\uff1a{0}"},
-
-    { ER_PREFIX_MUST_RESOLVE,
-      "\u524d\u7f00\u5fc5\u987b\u89e3\u6790\u4e3a\u540d\u79f0\u7a7a\u95f4\uff1a{0}"},
-
-    { ER_INVALID_UTF16_SURROGATE,
-      "\u68c0\u6d4b\u5230\u65e0\u6548\u7684 UTF-16 \u8d85\u5927\u5b57\u7b26\u96c6\uff1a{0}\uff1f"},
-
-    { ER_XSLATTRSET_USED_ITSELF,
-      "xsl:attribute-set {0} \u4f7f\u7528\u4e86\u81ea\u8eab\uff0c\u8fd9\u5c06\u5bfc\u81f4\u65e0\u9650\u5faa\u73af\u3002"},
-
-    { ER_CANNOT_MIX_XERCESDOM,
-      "\u65e0\u6cd5\u5c06\u975e Xerces-DOM \u8f93\u5165\u4e0e Xerces-DOM \u8f93\u51fa\u6df7\u5408\uff01"},
-
-    { ER_TOO_MANY_LISTENERS,
-      "addTraceListenersToStylesheet \u2015 TooManyListenersException"},
-
-    { ER_IN_ELEMTEMPLATEELEM_READOBJECT,
-      "\u5728 ElemTemplateElement.readObject \u4e2d\uff1a{0}"},
-
-    { ER_DUPLICATE_NAMED_TEMPLATE,
-      "\u627e\u5230\u591a\u4e2a\u540d\u4e3a {0} \u7684\u6a21\u677f"},
-
-    { ER_INVALID_KEY_CALL,
-      "\u65e0\u6548\u7684\u51fd\u6570\u8c03\u7528\uff1a\u4e0d\u5141\u8bb8\u9012\u5f52 key() \u8c03\u7528"},
-
-    { ER_REFERENCING_ITSELF,
-      "\u53d8\u91cf {0} \u6b63\u5728\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5f15\u7528\u5b83\u81ea\u8eab\uff01"},
-
-    { ER_ILLEGAL_DOMSOURCE_INPUT,
-      "\u8f93\u5165\u8282\u70b9\u5bf9\u4e8e newTemplates \u7684 DOMSource \u4e0d\u80fd\u4e3a\u7a7a\uff01"},
-
-    { ER_CLASS_NOT_FOUND_FOR_OPTION,
-        "\u627e\u4e0d\u5230\u9009\u9879 {0} \u7684\u7c7b\u6587\u4ef6"},
-
-    { ER_REQUIRED_ELEM_NOT_FOUND,
-        "\u627e\u4e0d\u5230\u5fc5\u9700\u7684\u5143\u7d20\uff1a{0}"},
-
-    { ER_INPUT_CANNOT_BE_NULL,
-        "InputStream \u4e0d\u80fd\u4e3a\u7a7a"},
-
-    { ER_URI_CANNOT_BE_NULL,
-        "URI \u4e0d\u80fd\u4e3a\u7a7a"},
-
-    { ER_FILE_CANNOT_BE_NULL,
-        "File \u4e0d\u80fd\u4e3a\u7a7a"},
-
-    { ER_SOURCE_CANNOT_BE_NULL,
-                "InputSource \u4e0d\u80fd\u4e3a\u7a7a"},
-
-    { ER_CANNOT_INIT_BSFMGR,
-                "\u65e0\u6cd5\u521d\u59cb\u5316 BSF \u7ba1\u7406\u5668"},
-
-    { ER_CANNOT_CMPL_EXTENSN,
-                "\u65e0\u6cd5\u7f16\u8bd1\u6269\u5c55"},
-
-    { ER_CANNOT_CREATE_EXTENSN,
-      "\u7531\u4e8e {1}\uff0c\u65e0\u6cd5\u521b\u5efa\u6269\u5c55 {0}"},
-
-    { ER_INSTANCE_MTHD_CALL_REQUIRES,
-      "\u5bf9\u65b9\u6cd5 {0} \u7684\u5b9e\u4f8b\u65b9\u6cd5\u8c03\u7528\u8981\u6c42\u4ee5\u5bf9\u8c61\u5b9e\u4f8b\u4f5c\u4e3a\u7b2c\u4e00\u53c2\u6570"},
-
-    { ER_INVALID_ELEMENT_NAME,
-      "\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u5143\u7d20\u540d\u79f0 {0}"},
-
-    { ER_ELEMENT_NAME_METHOD_STATIC,
-      "\u5143\u7d20\u540d\u79f0\u65b9\u6cd5\u5fc5\u987b\u662f static {0}"},
-
-    { ER_EXTENSION_FUNC_UNKNOWN,
-             "\u6269\u5c55\u51fd\u6570 {0} : {1} \u672a\u77e5"},
-
-    { ER_MORE_MATCH_CONSTRUCTOR,
-             "\u5bf9\u4e8e {0}\uff0c\u6784\u9020\u51fd\u6570\u6709\u591a\u4e2a\u6700\u4f73\u5339\u914d"},
-
-    { ER_MORE_MATCH_METHOD,
-             "\u65b9\u6cd5 {0} \u6709\u591a\u4e2a\u6700\u4f73\u5339\u914d"},
-
-    { ER_MORE_MATCH_ELEMENT,
-             "element \u65b9\u6cd5 {0} \u6709\u591a\u4e2a\u6700\u4f73\u5339\u914d"},
-
-    { ER_INVALID_CONTEXT_PASSED,
-             "\u8bc4\u4f30 {0} \u65f6\u4f20\u9012\u4e86\u65e0\u6548\u7684\u4e0a\u4e0b\u6587"},
-
-    { ER_POOL_EXISTS,
-             "\u6c60\u5df2\u7ecf\u5b58\u5728"},
-
-    { ER_NO_DRIVER_NAME,
-             "\u672a\u6307\u5b9a\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0"},
-
-    { ER_NO_URL,
-             "\u672a\u6307\u5b9a URL"},
-
-    { ER_POOL_SIZE_LESSTHAN_ONE,
-             "\u6c60\u5927\u5c0f\u5c0f\u4e8e 1\uff01"},
-
-    { ER_INVALID_DRIVER,
-             "\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0\uff01"},
-
-    { ER_NO_STYLESHEETROOT,
-             "\u627e\u4e0d\u5230\u6837\u5f0f\u8868\u6839\u76ee\u5f55\uff01"},
-
-    { ER_ILLEGAL_XMLSPACE_VALUE,
-         "xml:space \u7684\u503c\u975e\u6cd5"},
-
-    { ER_PROCESSFROMNODE_FAILED,
-         "processFromNode \u5931\u8d25"},
-
-    { ER_RESOURCE_COULD_NOT_LOAD,
-        "\u8d44\u6e90 [ {0} ] \u65e0\u6cd5\u88c5\u5165\uff1a{1} \n {2} \t {3}"},
-
-    { ER_BUFFER_SIZE_LESSTHAN_ZERO,
-        "\u7f13\u51b2\u533a\u5927\u5c0f <=0"},
-
-    { ER_UNKNOWN_ERROR_CALLING_EXTENSION,
-        "\u8c03\u7528\u6269\u5c55\u65f6\u53d1\u751f\u672a\u77e5\u9519\u8bef"},
-
-    { ER_NO_NAMESPACE_DECL,
-        "\u524d\u7f00 {0} \u6ca1\u6709\u76f8\u5e94\u7684\u540d\u79f0\u7a7a\u95f4\u58f0\u660e"},
-
-    { ER_ELEM_CONTENT_NOT_ALLOWED,
-        "lang=javaclass {0} \u4e0d\u5141\u8bb8\u51fa\u73b0\u5143\u7d20\u5185\u5bb9"},
-
-    { ER_STYLESHEET_DIRECTED_TERMINATION,
-        "\u6837\u5f0f\u8868\u5b9a\u5411\u7684\u7ec8\u6b62"},
-
-    { ER_ONE_OR_TWO,
-        "1 \u6216 2"},
-
-    { ER_TWO_OR_THREE,
-        "2 \u6216 3"},
-
-    { ER_COULD_NOT_LOAD_RESOURCE,
-        "\u65e0\u6cd5\u88c5\u5165 {0}\uff08\u68c0\u67e5 CLASSPATH\uff09\uff0c\u73b0\u5728\u53ea\u4f7f\u7528\u7f3a\u7701\u503c"},
-
-    { ER_CANNOT_INIT_DEFAULT_TEMPLATES,
-        "\u65e0\u6cd5\u521d\u59cb\u5316\u7f3a\u7701\u6a21\u677f"},
-
-    { ER_RESULT_NULL,
-        "\u7ed3\u679c\u4e0d\u5e94\u4e3a\u7a7a"},
-
-    { ER_RESULT_COULD_NOT_BE_SET,
-        "\u65e0\u6cd5\u8bbe\u7f6e\u7ed3\u679c"},
-
-    { ER_NO_OUTPUT_SPECIFIED,
-        "\u672a\u6307\u5b9a\u8f93\u51fa"},
-
-    { ER_CANNOT_TRANSFORM_TO_RESULT_TYPE,
-        "\u65e0\u6cd5\u8f6c\u6362\u6210\u7c7b\u578b\u4e3a {0} \u7684\u7ed3\u679c"},
-
-    { ER_CANNOT_TRANSFORM_SOURCE_TYPE,
-        "\u65e0\u6cd5\u8f6c\u6362\u7c7b\u578b\u4e3a {0} \u7684\u6e90"},
-
-    { ER_NULL_CONTENT_HANDLER,
-        "\u5185\u5bb9\u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
-
-    { ER_NULL_ERROR_HANDLER,
-        "\u9519\u8bef\u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
-
-    { ER_CANNOT_CALL_PARSE,
-        "\u5982\u679c\u6ca1\u6709\u8bbe\u7f6e ContentHandler\uff0c\u5219\u65e0\u6cd5\u8c03\u7528\u89e3\u6790"},
-
-    { ER_NO_PARENT_FOR_FILTER,
-        "\u8fc7\u6ee4\u5668\u65e0\u7236\u4ee3"},
-
-    { ER_NO_STYLESHEET_IN_MEDIA,
-         "\u5728 {0} \u4e2d\u627e\u4e0d\u5230\u6837\u5f0f\u8868\uff0c\u4ecb\u8d28 = {1}"},
-
-    { ER_NO_STYLESHEET_PI,
-         "\u5728 {0} \u4e2d\u627e\u4e0d\u5230 xml-stylesheet PI"},
-
-    { ER_NOT_SUPPORTED,
-       "\u4e0d\u652f\u6301\uff1a{0}"},
-
-    { ER_PROPERTY_VALUE_BOOLEAN,
-       "\u7279\u6027 {0} \u7684\u503c\u5e94\u5f53\u662f\u5e03\u5c14\u5b9e\u4f8b"},
-
-    { ER_COULD_NOT_FIND_EXTERN_SCRIPT,
-         "\u627e\u4e0d\u5230 {0} \u4e0a\u7684\u5916\u90e8\u811a\u672c"},
-
-    { ER_RESOURCE_COULD_NOT_FIND,
-        "\u627e\u4e0d\u5230\u8d44\u6e90 [ {0} ]\u3002\n {1}"},
-
-    { ER_OUTPUT_PROPERTY_NOT_RECOGNIZED,
-        "\u672a\u8bc6\u522b\u51fa\u8f93\u51fa\u5c5e\u6027\uff1a{0}"},
-
-    { ER_FAILED_CREATING_ELEMLITRSLT,
-        "\u521b\u5efa ElemLiteralResult \u5b9e\u4f8b\u5931\u8d25"},
-
-  //Earlier (JDK 1.4 XALAN 2.2-D11) at key code '204' the key name was ER_PRIORITY_NOT_PARSABLE
-  // In latest Xalan code base key name is  ER_VALUE_SHOULD_BE_NUMBER. This should also be taken care
-  //in locale specific files like XSLTErrorResources_de.java, XSLTErrorResources_fr.java etc.
-  //NOTE: Not only the key name but message has also been changed.
-
-    { ER_VALUE_SHOULD_BE_NUMBER,
-        "{0} \u7684\u503c\u5e94\u5f53\u5305\u542b\u53ef\u8fdb\u884c\u89e3\u6790\u7684\u6570\u5b57"},
-
-    { ER_VALUE_SHOULD_EQUAL,
-        "{0} \u7684\u503c\u5e94\u5f53\u7b49\u4e8e yes \u6216 no"},
-
-    { ER_FAILED_CALLING_METHOD,
-        "\u8c03\u7528 {0} \u65b9\u6cd5\u5931\u8d25"},
-
-    { ER_FAILED_CREATING_ELEMTMPL,
-        "\u521b\u5efa ElemTemplateElement \u5b9e\u4f8b\u5931\u8d25"},
-
-    { ER_CHARS_NOT_ALLOWED,
-        "\u6b64\u65f6\u6587\u6863\u4e2d\u4e0d\u5141\u8bb8\u6709\u5b57\u7b26"},
-
-    { ER_ATTR_NOT_ALLOWED,
-        "{1} \u5143\u7d20\u4e0a\u4e0d\u5141\u8bb8\u4f7f\u7528\u201c{0}\u201d\u5c5e\u6027\uff01"},
-
-    { ER_BAD_VALUE,
-     "{0} \u9519\u8bef\u503c {1}"},
-
-    { ER_ATTRIB_VALUE_NOT_FOUND,
-     "\u627e\u4e0d\u5230 {0} \u5c5e\u6027\u503c"},
-
-    { ER_ATTRIB_VALUE_NOT_RECOGNIZED,
-     "\u672a\u8bc6\u522b\u51fa {0} \u5c5e\u6027\u503c"},
-
-    { ER_NULL_URI_NAMESPACE,
-     "\u6b63\u5728\u8bd5\u56fe\u4ee5\u7a7a\u7684 URI \u751f\u6210\u540d\u79f0\u7a7a\u95f4\u524d\u7f00"},
-
-  //New ERROR keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
-
-    { ER_NUMBER_TOO_BIG,
-     "\u6b63\u5728\u8bd5\u56fe\u683c\u5f0f\u5316\u5927\u4e8e\u6700\u5927\u957f\u6574\u6570\u7684\u6570\u5b57"},
-
-    { ER_CANNOT_FIND_SAX1_DRIVER,
-     "\u627e\u4e0d\u5230 SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0}"},
-
-    { ER_SAX1_DRIVER_NOT_LOADED,
-     "\u627e\u5230\u4e86 SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0}\uff0c\u4f46\u65e0\u6cd5\u88c5\u5165\u5b83"},
-
-    { ER_SAX1_DRIVER_NOT_INSTANTIATED,
-     "\u88c5\u5165\u4e86 SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0}\uff0c\u4f46\u65e0\u6cd5\u5c06\u5b83\u5b9e\u4f8b\u5316"},
-
-    { ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER,
-     "SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0} \u4e0d\u5b9e\u73b0 org.xml.sax.Parser"},
-
-    { ER_PARSER_PROPERTY_NOT_SPECIFIED,
-     "\u6ca1\u6709\u6307\u5b9a\u7cfb\u7edf\u5c5e\u6027 org.xml.sax.parser"},
-
-    { ER_PARSER_ARG_CANNOT_BE_NULL,
-     "\u89e3\u6790\u5668\u53c2\u6570\u4e0d\u5f97\u4e3a\u7a7a"},
-
-    { ER_FEATURE,
-     "\u7279\u5f81\uff1a{0}"},
-
-    { ER_PROPERTY,
-     "\u5c5e\u6027\uff1a{0}"},
-
-    { ER_NULL_ENTITY_RESOLVER,
-     "\u5b9e\u4f53\u89e3\u6790\u5668\u4e3a\u7a7a"},
-
-    { ER_NULL_DTD_HANDLER,
-     "DTD \u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
-
-    { ER_NO_DRIVER_NAME_SPECIFIED,
-     "\u672a\u6307\u5b9a\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0\uff01"},
-
-    { ER_NO_URL_SPECIFIED,
-     "\u672a\u6307\u5b9a URL\uff01"},
-
-    { ER_POOLSIZE_LESS_THAN_ONE,
-     "\u6c60\u5927\u5c0f\u5c0f\u4e8e 1\uff01"},
-
-    { ER_INVALID_DRIVER_NAME,
-     "\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0\uff01"},
-
-    { ER_ERRORLISTENER,
-     "ErrorListener"},
-
-
-// Note to translators:  The following message should not normally be displayed
-//   to users.  It describes a situation in which the processor has detected
-//   an internal consistency problem in itself, and it provides this message
-//   for the developer to help diagnose the problem.  The name
-//   'ElemTemplateElement' is the name of a class, and should not be
-//   translated.
-    { ER_ASSERT_NO_TEMPLATE_PARENT,
-     "\u7a0b\u5e8f\u5458\u7684\u9519\u8bef\uff01\u8868\u8fbe\u5f0f\u6ca1\u6709 ElemTemplateElement \u7236\u4ee3\uff01"},
-
-
-// Note to translators:  The following message should not normally be displayed
-//   to users.  It describes a situation in which the processor has detected
-//   an internal consistency problem in itself, and it provides this message
-//   for the developer to help diagnose the problem.  The substitution text
-//   provides further information in order to diagnose the problem.  The name
-//   'RedundentExprEliminator' is the name of a class, and should not be
-//   translated.
-    { ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR,
-     "\u7a0b\u5e8f\u5458\u5728 RedundentExprEliminator \u4e2d\u7684\u65ad\u8a00\uff1a{0}"},
-
-    { ER_NOT_ALLOWED_IN_POSITION,
-     "\u6837\u5f0f\u8868\u7684\u6b64\u4f4d\u7f6e\u4e2d\u4e0d\u5141\u8bb8\u6709 {0}\uff01"},
-
-    { ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION,
-     "\u6837\u5f0f\u8868\u7684\u6b64\u4f4d\u7f6e\u4e2d\u4e0d\u5141\u8bb8\u6709\u975e\u7a7a\u683c\u7684\u6587\u672c\uff01"},
-
-  // This code is shared with warning codes.
-  // SystemId Unknown
-    { INVALID_TCHAR,
-     "\u7528\u4e8e CHAR \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5\u3002\u7c7b\u578b CHAR \u7684\u5c5e\u6027\u5fc5\u987b\u53ea\u6709 1 \u4e2a\u5b57\u7b26\uff01"},
-
-    // Note to translators:  The following message is used if the value of
-    // an attribute in a stylesheet is invalid.  "QNAME" is the XML data-type of
-    // the attribute, and should not be translated.  The substitution text {1} is
-    // the attribute value and {0} is the attribute name.
-    //The following codes are shared with the warning codes...
-    { INVALID_QNAME,
-     "\u7528\u4e8e QNAME \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
-
-    // Note to translators:  The following message is used if the value of
-    // an attribute in a stylesheet is invalid.  "ENUM" is the XML data-type of
-    // the attribute, and should not be translated.  The substitution text {1} is
-    // the attribute value, {0} is the attribute name, and {2} is a list of valid
-    // values.
-    { INVALID_ENUM,
-     "\u7528\u4e8e ENUM \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5\u3002\u6709\u6548\u7684\u503c\u662f\uff1a{2}\u3002"},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "NMTOKEN" is the XML data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-    { INVALID_NMTOKEN,
-     "\u7528\u4e8e NMTOKEN \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "NCNAME" is the XML data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-    { INVALID_NCNAME,
-     "\u7528\u4e8e NCNAME \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "boolean" is the XSLT data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-    { INVALID_BOOLEAN,
-     "\u7528\u4e8e boolean \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
-
-// Note to translators:  The following message is used if the value of
-// an attribute in a stylesheet is invalid.  "number" is the XSLT data-type
-// of the attribute, and should not be translated.  The substitution text {1} is
-// the attribute value and {0} is the attribute name.
-     { INVALID_NUMBER,
-     "\u7528\u4e8e number \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
-
-
-  // End of shared codes...
-
-// Note to translators:  A "match pattern" is a special form of XPath expression
-// that is used for matching patterns.  The substitution text is the name of
-// a function.  The message indicates that when this function is referenced in
-// a match pattern, its argument must be a string literal (or constant.)
-// ER_ARG_LITERAL - new error message for bugzilla //5202
-    { ER_ARG_LITERAL,
-     "\u5339\u914d\u6a21\u5f0f\u4e2d {0} \u7684\u81ea\u53d8\u91cf\u5fc5\u987b\u662f\u6587\u5b57\u3002"},
-
-// Note to translators:  The following message indicates that two definitions of
-// a variable.  A "global variable" is a variable that is accessible everywher
-// in the stylesheet.
-// ER_DUPLICATE_GLOBAL_VAR - new error message for bugzilla #790
-    { ER_DUPLICATE_GLOBAL_VAR,
-     "\u5168\u5c40\u53d8\u91cf\u7684\u58f0\u660e\u91cd\u590d\u3002"},
-
-
-// Note to translators:  The following message indicates that two definitions of
-// a variable were encountered.
-// ER_DUPLICATE_VAR - new error message for bugzilla #790
-    { ER_DUPLICATE_VAR,
-     "\u53d8\u91cf\u58f0\u660e\u91cd\u590d\u3002"},
-
-    // Note to translators:  "xsl:template, "name" and "match" are XSLT keywords
-    // which must not be translated.
-    // ER_TEMPLATE_NAME_MATCH - new error message for bugzilla #789
-    { ER_TEMPLATE_NAME_MATCH,
-     "xsl:template \u5fc5\u987b\u6709\u4e00\u4e2a name \u6216 match \u5c5e\u6027\uff08\u6216\u4e24\u8005\u517c\u6709\uff09"},
-
-    // Note to translators:  "exclude-result-prefixes" is an XSLT keyword which
-    // should not be translated.  The message indicates that a namespace prefix
-    // encountered as part of the value of the exclude-result-prefixes attribute
-    // was in error.
-    // ER_INVALID_PREFIX - new error message for bugzilla #788
-    { ER_INVALID_PREFIX,
-     "exclude-result-prefixes \u4e2d\u7684\u524d\u7f00\u65e0\u6548\uff1a{0}"},
-
-    // Note to translators:  An "attribute set" is a set of attributes that can
-    // be added to an element in the output document as a group.  The message
-    // indicates that there was a reference to an attribute set named {0} that
-    // was never defined.
-    // ER_NO_ATTRIB_SET - new error message for bugzilla #782
-    { ER_NO_ATTRIB_SET,
-     "\u540d\u4e3a {0} \u7684\u5c5e\u6027\u96c6\u4e0d\u5b58\u5728"},
-
-    // Note to translators:  This message indicates that there was a reference
-    // to a function named {0} for which no function definition could be found.
-    { ER_FUNCTION_NOT_FOUND,
-     "\u540d\u4e3a {0} \u7684\u51fd\u6570\u4e0d\u5b58\u5728"},
-
-    // Note to translators:  This message indicates that the XSLT instruction
-    // that is named by the substitution text {0} must not contain other XSLT
-    // instructions (content) or a "select" attribute.  The word "select" is
-    // an XSLT keyword in this case and must not be translated.
-    { ER_CANT_HAVE_CONTENT_AND_SELECT,
-     "{0} \u5143\u7d20\u4e0d\u5f97\u540c\u65f6\u5177\u6709\u5185\u5bb9\u548c select \u5c5e\u6027\u3002"},
-
-    // Note to translators:  This message indicates that the value argument
-    // of setParameter must be a valid Java Object.
-    { ER_INVALID_SET_PARAM_VALUE,
-     "\u53c2\u6570 {0} \u7684\u503c\u5fc5\u987b\u4e3a\u6709\u6548\u7684 Java \u5bf9\u8c61"},
-
-        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT,
-         "xsl:namespace-alias \u5143\u7d20\u7684 result-prefix \u5c5e\u6027\u542b\u6709\u201c#default\u201d\u503c\uff0c\u4f46\u5728\u8be5\u5143\u7d20\u7684\u4f5c\u7528\u57df\u4e2d\u6ca1\u6709\u7f3a\u7701\u540d\u79f0\u7a7a\u95f4\u7684\u58f0\u660e\u3002"},
-
-        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX,
-         "xsl:namespace-alias \u5143\u7d20\u7684 result-prefix \u5c5e\u6027\u542b\u6709\u201c{0}\u201d\u503c\uff0c\u4f46\u662f\u5728\u8be5\u5143\u7d20\u7684\u4f5c\u7528\u57df\u4e2d\u6ca1\u6709\u524d\u7f00\u201c{0}\u201d\u7684\u540d\u79f0\u7a7a\u95f4\u58f0\u660e\u3002"},
-
-    { ER_SET_FEATURE_NULL_NAME,
-      "\u5728 TransformerFactory.setFeature(String name, boolean value) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
-
-    { ER_GET_FEATURE_NULL_NAME,
-      "\u5728 TransformerFactory.getFeature(String name) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
-
-    { ER_UNSUPPORTED_FEATURE,
-      "\u65e0\u6cd5\u5bf9\u6b64 TransformerFactory \u8bbe\u7f6e\u7279\u5f81\u201c{0}\u201d\u3002"},
-
-    { ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING,
-        "\u5f53\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u6269\u5c55\u5143\u7d20\u201c{0}\u201d\u3002"},
-
-        { ER_NAMESPACE_CONTEXT_NULL_NAMESPACE,
-          "\u65e0\u6cd5\u4e3a\u7a7a\u540d\u79f0\u7a7a\u95f4 uri \u83b7\u53d6\u524d\u7f00\u3002"},
-
-        { ER_NAMESPACE_CONTEXT_NULL_PREFIX,
-          "\u65e0\u6cd5\u4e3a\u7a7a\u524d\u7f00\u83b7\u53d6\u540d\u79f0\u7a7a\u95f4 uri\u3002"},
-
-        { ER_XPATH_RESOLVER_NULL_QNAME,
-          "\u51fd\u6570\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
-
-        { ER_XPATH_RESOLVER_NEGATIVE_ARITY,
-          "\u6570\u91cf\u4e0d\u80fd\u4e3a\u8d1f\u3002"},
-
-  // Warnings...
-
-    { WG_FOUND_CURLYBRACE,
-      "\u627e\u5230\u201c}\u201d\uff0c\u4f46\u6ca1\u6709\u6253\u5f00\u5c5e\u6027\u6a21\u677f\uff01"},
-
-    { WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR,
-      "\u8b66\u544a\uff1acount \u5c5e\u6027\u4e0e xsl:number \u4e2d\u7684\u4e0a\u7ea7\u4e0d\u5339\u914d\uff01\u76ee\u6807 = {0}"},
-
-    { WG_EXPR_ATTRIB_CHANGED_TO_SELECT,
-      "\u65e7\u8bed\u6cd5\uff1a\u201cexpr\u201d\u5c5e\u6027\u7684\u540d\u79f0\u5df2\u7ecf\u66f4\u6539\u4e3a\u201cselect\u201d\u3002"},
-
-    { WG_NO_LOCALE_IN_FORMATNUMBER,
-      "Xalan \u5728 format-number \u51fd\u6570\u4e2d\u5c1a\u672a\u5904\u7406\u8bed\u8a00\u73af\u5883\u540d\u3002"},
-
-    { WG_LOCALE_NOT_FOUND,
-      "\u8b66\u544a\uff1a\u627e\u4e0d\u5230 xml:lang={0} \u7684\u8bed\u8a00\u73af\u5883"},
-
-    { WG_CANNOT_MAKE_URL_FROM,
-      "\u65e0\u6cd5\u4ece {0} \u751f\u6210 URL"},
-
-    { WG_CANNOT_LOAD_REQUESTED_DOC,
-      "\u65e0\u6cd5\u88c5\u5165\u8bf7\u6c42\u7684\u6587\u6863\uff1a{0}"},
-
-    { WG_CANNOT_FIND_COLLATOR,
-      "\u627e\u4e0d\u5230 <sort xml:lang={0} \u7684\u6574\u7406\u5668"},
-
-    { WG_FUNCTIONS_SHOULD_USE_URL,
-      "\u65e7\u8bed\u6cd5\uff1a\u51fd\u6570\u6307\u4ee4\u5e94\u5f53\u4f7f\u7528 {0} \u7684 URL"},
-
-    { WG_ENCODING_NOT_SUPPORTED_USING_UTF8,
-      "\u4e0d\u652f\u6301\u7f16\u7801\uff1a{0}\uff0c\u6b63\u5728\u4f7f\u7528 UTF-8"},
-
-    { WG_ENCODING_NOT_SUPPORTED_USING_JAVA,
-      "\u4e0d\u652f\u6301\u7f16\u7801\uff1a{0}\uff0c\u6b63\u5728\u4f7f\u7528 Java {1}"},
-
-    { WG_SPECIFICITY_CONFLICTS,
-      "\u53d1\u73b0\u7279\u6027\u51b2\u7a81\uff1a\u5c06\u4f7f\u7528\u6837\u5f0f\u8868\u4e2d\u6700\u540e\u627e\u5230\u7684 {0}\u3002"},
-
-    { WG_PARSING_AND_PREPARING,
-      "========= \u89e3\u6790\u548c\u51c6\u5907 {0} =========="},
-
-    { WG_ATTR_TEMPLATE,
-     "\u5c5e\u6027\u6a21\u677f\uff0c{0}"},
-
-    { WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE,
-      "xsl:strip-space \u548c xsl:preserve-space \u4e4b\u95f4\u7684\u5339\u914d\u51b2\u7a81"},
-
-    { WG_ATTRIB_NOT_HANDLED,
-      "Xalan \u5c1a\u672a\u5904\u7406 {0} \u5c5e\u6027\uff01"},
-
-    { WG_NO_DECIMALFORMAT_DECLARATION,
-      "\u627e\u4e0d\u5230\u5341\u8fdb\u5236\u683c\u5f0f\u7684\u58f0\u660e\uff1a{0}"},
-
-    { WG_OLD_XSLT_NS,
-     "XSLT \u540d\u79f0\u7a7a\u95f4\u4e22\u5931\u6216\u4e0d\u6b63\u786e\u3002"},
-
-    { WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED,
-      "\u53ea\u5141\u8bb8\u4e00\u4e2a\u7f3a\u7701\u7684 xsl:decimal-format \u58f0\u660e\u3002"},
-
-    { WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE,
-      "xsl:decimal-format \u540d\u79f0\u5fc5\u987b\u662f\u552f\u4e00\u7684\u3002\u540d\u79f0\u201c{0}\u201d\u6709\u91cd\u590d\u3002"},
-
-    { WG_ILLEGAL_ATTRIBUTE,
-      "{0} \u6709\u4e00\u4e2a\u975e\u6cd5\u5c5e\u6027\uff1a{1}"},
-
-    { WG_COULD_NOT_RESOLVE_PREFIX,
-      "\u65e0\u6cd5\u89e3\u6790\u540d\u79f0\u7a7a\u95f4\u524d\u7f00\uff1a{0}\u3002\u5c06\u5ffd\u7565\u8be5\u8282\u70b9\u3002"},
-
-    { WG_STYLESHEET_REQUIRES_VERSION_ATTRIB,
-      "xsl:stylesheet \u9700\u8981\u201cversion\u201d\u5c5e\u6027\uff01"},
-
-    { WG_ILLEGAL_ATTRIBUTE_NAME,
-      "\u975e\u6cd5\u5c5e\u6027\u540d\u79f0\uff1a{0}"},
-
-    { WG_ILLEGAL_ATTRIBUTE_VALUE,
-      "\u7528\u4e8e\u5c5e\u6027 {0} \u7684\u503c\u975e\u6cd5\uff1a{1}"},
-
-    { WG_EMPTY_SECOND_ARG,
-      "\u4ece\u6587\u6863\u51fd\u6570\u7684\u7b2c\u4e8c\u53c2\u6570\u4ea7\u751f\u7684\u8282\u70b9\u96c6\u662f\u7a7a\u7684\u3002\u8fd4\u56de\u4e00\u4e2a\u7a7a\u8282\u70b9\u96c6\u3002"},
-
-  //Following are the new WARNING keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
-
-    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
-    // and must not be translated.
-    { WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
-      "xsl:processing-instruction \u540d\u79f0\u7684\u201cname\u201d\u5c5e\u6027\u7684\u503c\u4e0d\u5f97\u4e3a\u201cxml\u201d"},
-
-    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
-    // and must not be translated.  "NCName" is an XML data-type and must not be
-    // translated.
-    { WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
-      "xsl:processing-instruction \u7684\u201cname\u201d\u5c5e\u6027\u7684\u503c\u5fc5\u987b\u662f\u6709\u6548\u7684 NCName\uff1a{0}"},
-
-    // Note to translators:  This message is reported if the stylesheet that is
-    // being processed attempted to construct an XML document with an attribute in a
-    // place other than on an element.  The substitution text specifies the name of
-    // the attribute.
-    { WG_ILLEGAL_ATTRIBUTE_POSITION,
-      "\u5728\u751f\u6210\u5b50\u8282\u70b9\u4e4b\u540e\u6216\u5728\u751f\u6210\u5143\u7d20\u4e4b\u524d\u65e0\u6cd5\u6dfb\u52a0\u5c5e\u6027 {0}\u3002\u5c06\u5ffd\u7565\u5c5e\u6027\u3002"},
-
-    { NO_MODIFICATION_ALLOWED_ERR,
-      "\u8bd5\u56fe\u4fee\u6539\u4e0d\u5141\u8bb8\u4fee\u6539\u7684\u5bf9\u8c61\u3002"
-    },
-
-    //Check: WHY THERE IS A GAP B/W NUMBERS in the XSLTErrorResources properties file?
-
-  // Other miscellaneous text used inside the code...
-  { "ui_language", "zh"},
-  {  "help_language",  "zh" },
-  {  "language",  "zh" },
-  { "BAD_CODE", "createMessage \u7684\u53c2\u6570\u8d85\u51fa\u8303\u56f4"},
-  {  "FORMAT_FAILED", "\u5728 messageFormat \u8c03\u7528\u8fc7\u7a0b\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38"},
-  {  "version", ">>>>>>> Xalan \u7248\u672c"},
-  {  "version2",  "<<<<<<<"},
-  {  "yes", "\u662f"},
-  { "line", "\u884c\u53f7"},
-  { "column","\u5217\u53f7"},
-  { "xsldone", "XSLProcessor\uff1a\u5b8c\u6210"},
-
-
-  // Note to translators:  The following messages provide usage information
-  // for the Xalan Process command line.  "Process" is the name of a Java class,
-  // and should not be translated.
-  { "xslProc_option", "Xalan-J \u547d\u4ee4\u884c Process \u7c7b\u9009\u9879\uff1a"},
-  { "xslProc_option", "Xalan-J \u547d\u4ee4\u884c Process \u7c7b\u9009\u9879\uff1a"},
-  { "xslProc_invalid_xsltc_option", "\u5728 XSLTC \u65b9\u5f0f\u4e2d\uff0c\u4e0d\u652f\u6301\u9009\u9879 {0}\u3002"},
-  { "xslProc_invalid_xalan_option", "\u9009\u9879 {0} \u53ea\u80fd\u4e0e -XSLTC \u4e00\u8d77\u4f7f\u7528\u3002"},
-  { "xslProc_no_input", "\u9519\u8bef\uff1a\u6ca1\u6709\u6307\u5b9a\u6837\u5f0f\u8868\u6216\u8f93\u5165 xml\u3002\u4e0d\u5e26\u4efb\u4f55\u9009\u9879\u8fd0\u884c\u6b64\u547d\u4ee4\uff0c\u4ee5\u4e86\u89e3\u4f7f\u7528\u8bf4\u660e\u3002"},
-  { "xslProc_common_options", "\uff0d \u5e38\u7528\u9009\u9879 \uff0d"},
-  { "xslProc_xalan_options", "\u2015 Xalan \u9009\u9879 \u2015"},
-  { "xslProc_xsltc_options", "\u2015 XSLTC \u9009\u9879 \u2015"},
-  { "xslProc_return_to_continue", "\uff08\u8bf7\u6309 <return> \u952e\u7ee7\u7eed\uff09"},
-
-   // Note to translators: The option name and the parameter name do not need to
-   // be translated. Only translate the messages in parentheses.  Note also that
-   // leading whitespace in the messages is used to indent the usage information
-   // for each option in the English messages.
-   // Do not translate the keywords: XSLTC, SAX, DOM and DTM.
-  { "optionXSLTC", "   [-XSLTC \uff08\u4f7f\u7528 XSLTC \u8f6c\u6362\uff09]"},
-  { "optionIN", "   [-IN inputXMLURL]"},
-  { "optionXSL", "[-XSL XSLTransformationURL]"},
-  { "optionOUT",  "[-OUT outputFileName]"},
-  { "optionLXCIN", "[-LXCIN compiledStylesheetFileNameIn]"},
-  { "optionLXCOUT", "[-LXCOUT compiledStylesheetFileNameOutOut]"},
-  { "optionPARSER", "   [-PARSER fully qualified class name of parser liaison]"},
-  {  "optionE", "[-E \uff08\u4e0d\u8981\u5c55\u5f00\u5b9e\u4f53\u5f15\u7528\uff09]"},
-  {  "optionV",  "[-E \uff08\u4e0d\u8981\u5c55\u5f00\u5b9e\u4f53\u5f15\u7528\uff09]"},
-  {  "optionQC", "[-QC \uff08\u9759\u9ed8\u6a21\u5f0f\u51b2\u7a81\u8b66\u544a\uff09]"},
-  {  "optionQ", "[-Q \uff08\u9759\u9ed8\u65b9\u5f0f\uff09]"},
-  {  "optionLF", "[-LF \uff08\u4ec5\u5728\u8f93\u51fa\u65f6\u4f7f\u7528\u6362\u884c {\u7f3a\u7701\u503c\u662f CR/LF}\uff09]"},
-  {  "optionCR", "[-CR \uff08\u4ec5\u5728\u8f93\u51fa\u65f6\u4f7f\u7528\u56de\u8f66\u7b26 {\u7f3a\u7701\u503c\u662f CR/LF}\uff09]"},
-  { "optionESCAPE", "[-ESCAPE \uff08\u8bbe\u7f6e\u8f6c\u4e49\u5b57\u7b26 {\u7f3a\u7701\u503c\u662f <>&\"\'\\r\\n}\uff09]"},
-  { "optionINDENT", "[-INDENT \uff08\u63a7\u5236\u7f29\u8fdb\u591a\u5c11\u7a7a\u683c {\u7f3a\u7701\u503c\u662f 0}\uff09]"},
-  { "optionTT", "[-TT \uff08\u5728\u6a21\u677f\u88ab\u8c03\u7528\u65f6\u8ddf\u8e2a\u6a21\u677f\u3002\uff09]"},
-  { "optionTG", "[-TG \uff08\u8ddf\u8e2a\u6bcf\u4e00\u4e2a\u751f\u6210\u4e8b\u4ef6\u3002\uff09]"},
-  { "optionTS", "[-TS \uff08\u8ddf\u8e2a\u6bcf\u4e00\u4e2a\u9009\u62e9\u4e8b\u4ef6\u3002\uff09]"},
-  {  "optionTTC", "[-TTC \uff08\u5728\u5b50\u6a21\u677f\u88ab\u5904\u7406\u65f6\u5bf9\u5176\u8fdb\u884c\u8ddf\u8e2a\u3002\uff09]"},
-  { "optionTCLASS", "[-TCLASS \uff08\u8ddf\u8e2a\u6269\u5c55\u7684 TraceListener \u7c7b\u3002\uff09]"},
-  { "optionVALIDATE", "[-VALIDATE \uff08\u8bbe\u7f6e\u662f\u5426\u8fdb\u884c\u9a8c\u8bc1\u3002\u7f3a\u7701\u65f6\u9a8c\u8bc1\u662f\u5173\u95ed\u7684\u3002\uff09]"},
-  { "optionEDUMP", "[-EDUMP {\u53ef\u9009\u6587\u4ef6\u540d} \uff08\u53d1\u751f\u9519\u8bef\u65f6\u5806\u6808\u8f6c\u50a8\u3002\uff09]"},
-  {  "optionXML", "[-XML \uff08\u4f7f\u7528 XML \u683c\u5f0f\u5316\u7a0b\u5e8f\u5e76\u6dfb\u52a0 XML \u5934\u3002\uff09]"},
-  {  "optionTEXT", "[-TEXT \uff08\u4f7f\u7528\u7b80\u5355\u6587\u672c\u683c\u5f0f\u5316\u7a0b\u5e8f\u3002\uff09]"},
-  {  "optionHTML", "[-HTML \uff08\u4f7f\u7528 HTML \u683c\u5f0f\u5316\u7a0b\u5e8f\uff09]"},
-  {  "optionPARAM", "[-PARAM name expression \uff08\u8bbe\u7f6e\u6837\u8bc6\u8868\u53c2\u6570\uff09]"},
-  {  "noParsermsg1", "XSL \u5904\u7406\u4e0d\u6210\u529f\u3002"},
-  {  "noParsermsg2", "** \u627e\u4e0d\u5230\u89e3\u6790\u5668 **"},
-  { "noParsermsg3",  "\u8bf7\u68c0\u67e5\u60a8\u7684\u7c7b\u8def\u5f84\u3002"},
-  { "noParsermsg4", "\u5982\u679c\u6ca1\u6709 IBM \u7684 XML Parser for Java\uff0c\u60a8\u53ef\u4ee5\u4ece\u4ee5\u4e0b\u4f4d\u7f6e\u4e0b\u8f7d\u5b83\uff1a"},
-  { "noParsermsg5", "IBM \u7684 AlphaWorks\uff1ahttp://www.alphaworks.ibm.com/formula/xml"},
-  { "optionURIRESOLVER", "[-URIRESOLVER full class name \uff08\u4f7f\u7528 URIResolver \u89e3\u6790 URI\uff09]"},
-  { "optionENTITYRESOLVER",  "[-ENTITYRESOLVER full class name \uff08\u4f7f\u7528 EntityResolver \u89e3\u6790\u5b9e\u4f53\uff09]"},
-  { "optionCONTENTHANDLER",  "[-CONTENTHANDLER full class name \uff08\u4f7f\u7528 ContentHandler \u4e32\u884c\u5316\u8f93\u51fa\uff09]"},
-  {  "optionLINENUMBERS",  "[-L use line numbers for source document]"},
-  { "optionSECUREPROCESSING", "   [-SECURE \uff08\u5c06\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true\u3002\uff09]"},
-
-    // Following are the new options added in XSLTErrorResources.properties files after Jdk 1.4 (Xalan 2.2-D11)
-
-
-  {  "optionMEDIA",  "   [-MEDIA mediaType \uff08\u4f7f\u7528 media \u5c5e\u6027\u67e5\u627e\u4e0e\u6587\u6863\u5173\u8054\u7684\u6837\u5f0f\u8868\u3002\uff09]"},
-  {  "optionFLAVOR",  "   [-FLAVOR flavorName \uff08\u663e\u5f0f\u4f7f\u7528 s2s=SAX \u6216 d2d=DOM \u8fdb\u884c\u8f6c\u6362\u3002\uff09]"}, // Added by sboag/scurcuru; experimental
-  { "optionDIAG", "[-DIAG \uff08\u6253\u5370\u5168\u90e8\u6beb\u79d2\u8f6c\u6362\u6807\u8bb0\u3002\uff09]"},
-  { "optionINCREMENTAL",  "   [-INCREMENTAL \uff08\u901a\u8fc7\u5c06 http://xml.apache.org/xalan/features/incremental \u8bbe\u7f6e\u4e3a true \u8bf7\u6c42\u589e\u91cf DTM \u6784\u9020\u3002\uff09]"},
-  {  "optionNOOPTIMIMIZE",  "   [-NOOPTIMIMIZE \uff08\u901a\u8fc7\u5c06 http://xml.apache.org/xalan/features/optimize \u8bbe\u7f6e\u4e3a false \u8bf7\u6c42\u65e0\u6837\u5f0f\u8868\u7684\u4f18\u5316\u5904\u7406\u3002\uff09]"},
-  { "optionRL",  "   [-RL recursionlimit \uff08\u65ad\u8a00\u6837\u5f0f\u8868\u9012\u5f52\u6df1\u5ea6\u7684\u6570\u5b57\u6781\u9650\u3002\uff09]"},
-  {   "optionXO",  "[-XO [transletName] \uff08\u65ad\u8a00\u751f\u6210\u7684 translet \u7684\u540d\u79f0\uff09]"},
-  {  "optionXD", "[-XD destinationDirectory \uff08\u6307\u5b9a translet \u7684\u76ee\u6807\u76ee\u5f55\uff09]"},
-  {  "optionXJ",  "[-XJ jarfile \uff08\u5c06 translet \u7c7b\u6253\u5305\u6210\u540d\u79f0\u4e3a <jarfile> \u7684 jar \u6587\u4ef6\uff09]"},
-  {   "optionXP",  "[-XP package \uff08\u6307\u51fa\u6240\u6709\u751f\u6210\u7684 translet \u7c7b\u7684\u8f6f\u4ef6\u5305\u540d\u79f0\u524d\u7f00\uff09]"},
-
-  //AddITIONAL  STRINGS that need L10n
-  // Note to translators:  The following message describes usage of a particular
-  // command-line option that is used to enable the "template inlining"
-  // optimization.  The optimization involves making a copy of the code
-  // generated for a template in another template that refers to it.
-  { "optionXN",  "[-XN \uff08\u542f\u7528\u6a21\u677f\u4ee3\u7801\u5d4c\u5165\uff09]" },
-  { "optionXX",  "[-XX \uff08\u6253\u5f00\u9644\u52a0\u8c03\u8bd5\u6d88\u606f\u8f93\u51fa\uff09]"},
-  { "optionXT" , "[-XT \uff08\u53ef\u80fd\u7684\u8bdd\u4f7f\u7528 translet \u8fdb\u884c\u8f6c\u6362\uff09]"},
-  { "diagTiming","--------- {0} \u901a\u8fc7 {1} \u7684\u8f6c\u6362\u8017\u65f6 {2} \u6beb\u79d2" },
-  { "recursionTooDeep","\u6a21\u677f\u5d4c\u5957\u592a\u6df1\u3002\u5d4c\u5957 = {0}\uff0c\u6a21\u677f {1} {2}" },
-  { "nameIs", "\u540d\u79f0\u4e3a" },
-  { "matchPatternIs", "\u5339\u914d\u6a21\u5f0f\u4e3a" }
-
-  };
-  }
-  // ================= INFRASTRUCTURE ======================
-
-  /** String for use when a bad error code was encountered.    */
-  public static final String BAD_CODE = "BAD_CODE";
-
-  /** String for use when formatting of the error string failed.   */
-  public static final String FORMAT_FAILED = "FORMAT_FAILED";
-
-  /** General error string.   */
-  public static final String ERROR_STRING = "#\u9519\u8bef";
-
-  /** String to prepend to error messages.  */
-  public static final String ERROR_HEADER = "\u9519\u8bef\uff1a";
-
-  /** String to prepend to warning messages.    */
-  public static final String WARNING_HEADER = "\u8b66\u544a\uff1a";
-
-  /** String to specify the XSLT module.  */
-  public static final String XSL_HEADER = "XSLT ";
-
-  /** String to specify the XML parser module.  */
-  public static final String XML_HEADER = "XML ";
-
-  /** I don't think this is used any more.
-   * @deprecated  */
-  public static final String QUERY_HEADER = "PATTERN ";
-
-
-  /**
-   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
-   *   of ResourceBundle.getBundle().
-   *
-   *   @param className the name of the class that implements the resource bundle.
-   *   @return the ResourceBundle
-   *   @throws MissingResourceException
-   */
-  public static final XSLTErrorResources loadResourceBundle(String className)
-          throws MissingResourceException
-  {
-
-    Locale locale = Locale.getDefault();
-    String suffix = getResourceSuffix(locale);
-
-    try
-    {
-
-      // first try with the given locale
-      return (XSLTErrorResources) ResourceBundle.getBundle(className
-              + suffix, locale);
-    }
-    catch (MissingResourceException e)
-    {
-      try  // try to fall back to en_US if we can't load
-      {
-
-        // Since we can't find the localized property file,
-        // fall back to en_US.
-        return (XSLTErrorResources) ResourceBundle.getBundle(className,
-                new Locale("zh", "CN"));
-      }
-      catch (MissingResourceException e2)
-      {
-
-        // Now we are really in trouble.
-        // very bad, definitely very bad...not going to get very far
-        throw new MissingResourceException(
-          "Could not load any resource bundles.", className, "");
-      }
-    }
-  }
-
-  /**
-   * Return the resource file suffic for the indicated locale
-   * For most locales, this will be based the language code.  However
-   * for Chinese, we do distinguish between Taiwan and PRC
-   *
-   * @param locale the locale
-   * @return an String suffix which canbe appended to a resource name
-   */
-  private static final String getResourceSuffix(Locale locale)
-  {
-
-    String suffix = "_" + locale.getLanguage();
-    String country = locale.getCountry();
-
-    if (country.equals("TW"))
-      suffix += "_" + country;
-
-    return suffix;
-  }
-
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+package org.apache.xalan.res;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Set up error messages.
+ * We build a two dimensional array of message keys and
+ * message strings. In order to add a new message here,
+ * you need to first add a String constant. And
+ *  you need to enter key , value pair as part of contents
+ * Array. You also need to update MAX_CODE for error strings
+ * and MAX_WARNING for warnings ( Needed for only information
+ * purpose )
+ */
+public class XSLTErrorResources_zh extends ListResourceBundle
+{
+
+/*
+ * This file contains error and warning messages related to Xalan Error
+ * Handling.
+ *
+ *  General notes to translators:
+ *
+ *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
+ *     components.
+ *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *     XSLTC is an acronym for XSLT Compiler.
+ *
+ *  2) A stylesheet is a description of how to transform an input XML document
+ *     into a resultant XML document (or HTML document or text).  The
+ *     stylesheet itself is described in the form of an XML document.
+ *
+ *  3) A template is a component of a stylesheet that is used to match a
+ *     particular portion of an input document and specifies the form of the
+ *     corresponding portion of the output document.
+ *
+ *  4) An element is a mark-up tag in an XML document; an attribute is a
+ *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *     "elem" is an element name, "attr" and "attr2" are attribute names with
+ *     the values "val" and "val2", respectively.
+ *
+ *  5) A namespace declaration is a special attribute that is used to associate
+ *     a prefix with a URI (the namespace).  The meanings of element names and
+ *     attribute names that use that prefix are defined with respect to that
+ *     namespace.
+ *
+ *  6) "Translet" is an invented term that describes the class file that
+ *     results from compiling an XML stylesheet into a Java class.
+ *
+ *  7) XPath is a specification that describes a notation for identifying
+ *     nodes in a tree-structured representation of an XML document.  An
+ *     instance of that notation is referred to as an XPath expression.
+ *
+ */
+
+  /** Maximum error messages, this is needed to keep track of the number of messages.    */
+  public static final int MAX_CODE = 201;
+
+  /** Maximum warnings, this is needed to keep track of the number of warnings.          */
+  public static final int MAX_WARNING = 29;
+
+  /** Maximum misc strings.   */
+  public static final int MAX_OTHERS = 55;
+
+  /** Maximum total warnings and error messages.          */
+  public static final int MAX_MESSAGES = MAX_CODE + MAX_WARNING + 1;
+
+
+  /*
+   * Static variables
+   */
+  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX =
+        "ER_INVALID_SET_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX";
+
+  public static final String ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT =
+        "ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT";
+
+  public static final String ER_NO_CURLYBRACE = "ER_NO_CURLYBRACE";
+  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
+  public static final String ER_ILLEGAL_ATTRIBUTE = "ER_ILLEGAL_ATTRIBUTE";
+  public static final String ER_NULL_SOURCENODE_APPLYIMPORTS = "ER_NULL_SOURCENODE_APPLYIMPORTS";
+  public static final String ER_CANNOT_ADD = "ER_CANNOT_ADD";
+  public static final String ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES="ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES";
+  public static final String ER_NO_NAME_ATTRIB = "ER_NO_NAME_ATTRIB";
+  public static final String ER_TEMPLATE_NOT_FOUND = "ER_TEMPLATE_NOT_FOUND";
+  public static final String ER_CANT_RESOLVE_NAME_AVT = "ER_CANT_RESOLVE_NAME_AVT";
+  public static final String ER_REQUIRES_ATTRIB = "ER_REQUIRES_ATTRIB";
+  public static final String ER_MUST_HAVE_TEST_ATTRIB = "ER_MUST_HAVE_TEST_ATTRIB";
+  public static final String ER_BAD_VAL_ON_LEVEL_ATTRIB =
+         "ER_BAD_VAL_ON_LEVEL_ATTRIB";
+  public static final String ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
+         "ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
+  public static final String ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
+         "ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
+  public static final String ER_NEED_MATCH_ATTRIB = "ER_NEED_MATCH_ATTRIB";
+  public static final String ER_NEED_NAME_OR_MATCH_ATTRIB =
+         "ER_NEED_NAME_OR_MATCH_ATTRIB";
+  public static final String ER_CANT_RESOLVE_NSPREFIX =
+         "ER_CANT_RESOLVE_NSPREFIX";
+  public static final String ER_ILLEGAL_VALUE = "ER_ILLEGAL_VALUE";
+  public static final String ER_NO_OWNERDOC = "ER_NO_OWNERDOC";
+  public static final String ER_ELEMTEMPLATEELEM_ERR ="ER_ELEMTEMPLATEELEM_ERR";
+  public static final String ER_NULL_CHILD = "ER_NULL_CHILD";
+  public static final String ER_NEED_SELECT_ATTRIB = "ER_NEED_SELECT_ATTRIB";
+  public static final String ER_NEED_TEST_ATTRIB = "ER_NEED_TEST_ATTRIB";
+  public static final String ER_NEED_NAME_ATTRIB = "ER_NEED_NAME_ATTRIB";
+  public static final String ER_NO_CONTEXT_OWNERDOC = "ER_NO_CONTEXT_OWNERDOC";
+  public static final String ER_COULD_NOT_CREATE_XML_PROC_LIAISON =
+         "ER_COULD_NOT_CREATE_XML_PROC_LIAISON";
+  public static final String ER_PROCESS_NOT_SUCCESSFUL =
+         "ER_PROCESS_NOT_SUCCESSFUL";
+  public static final String ER_NOT_SUCCESSFUL = "ER_NOT_SUCCESSFUL";
+  public static final String ER_ENCODING_NOT_SUPPORTED =
+         "ER_ENCODING_NOT_SUPPORTED";
+  public static final String ER_COULD_NOT_CREATE_TRACELISTENER =
+         "ER_COULD_NOT_CREATE_TRACELISTENER";
+  public static final String ER_KEY_REQUIRES_NAME_ATTRIB =
+         "ER_KEY_REQUIRES_NAME_ATTRIB";
+  public static final String ER_KEY_REQUIRES_MATCH_ATTRIB =
+         "ER_KEY_REQUIRES_MATCH_ATTRIB";
+  public static final String ER_KEY_REQUIRES_USE_ATTRIB =
+         "ER_KEY_REQUIRES_USE_ATTRIB";
+  public static final String ER_REQUIRES_ELEMENTS_ATTRIB =
+         "ER_REQUIRES_ELEMENTS_ATTRIB";
+  public static final String ER_MISSING_PREFIX_ATTRIB =
+         "ER_MISSING_PREFIX_ATTRIB";
+  public static final String ER_BAD_STYLESHEET_URL = "ER_BAD_STYLESHEET_URL";
+  public static final String ER_FILE_NOT_FOUND = "ER_FILE_NOT_FOUND";
+  public static final String ER_IOEXCEPTION = "ER_IOEXCEPTION";
+  public static final String ER_NO_HREF_ATTRIB = "ER_NO_HREF_ATTRIB";
+  public static final String ER_STYLESHEET_INCLUDES_ITSELF =
+         "ER_STYLESHEET_INCLUDES_ITSELF";
+  public static final String ER_PROCESSINCLUDE_ERROR ="ER_PROCESSINCLUDE_ERROR";
+  public static final String ER_MISSING_LANG_ATTRIB = "ER_MISSING_LANG_ATTRIB";
+  public static final String ER_MISSING_CONTAINER_ELEMENT_COMPONENT =
+         "ER_MISSING_CONTAINER_ELEMENT_COMPONENT";
+  public static final String ER_CAN_ONLY_OUTPUT_TO_ELEMENT =
+         "ER_CAN_ONLY_OUTPUT_TO_ELEMENT";
+  public static final String ER_PROCESS_ERROR = "ER_PROCESS_ERROR";
+  public static final String ER_UNIMPLNODE_ERROR = "ER_UNIMPLNODE_ERROR";
+  public static final String ER_NO_SELECT_EXPRESSION ="ER_NO_SELECT_EXPRESSION";
+  public static final String ER_CANNOT_SERIALIZE_XSLPROCESSOR =
+         "ER_CANNOT_SERIALIZE_XSLPROCESSOR";
+  public static final String ER_NO_INPUT_STYLESHEET = "ER_NO_INPUT_STYLESHEET";
+  public static final String ER_FAILED_PROCESS_STYLESHEET =
+         "ER_FAILED_PROCESS_STYLESHEET";
+  public static final String ER_COULDNT_PARSE_DOC = "ER_COULDNT_PARSE_DOC";
+  public static final String ER_COULDNT_FIND_FRAGMENT =
+         "ER_COULDNT_FIND_FRAGMENT";
+  public static final String ER_NODE_NOT_ELEMENT = "ER_NODE_NOT_ELEMENT";
+  public static final String ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB =
+         "ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB";
+  public static final String ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB =
+         "ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB";
+  public static final String ER_NO_CLONE_OF_DOCUMENT_FRAG =
+         "ER_NO_CLONE_OF_DOCUMENT_FRAG";
+  public static final String ER_CANT_CREATE_ITEM = "ER_CANT_CREATE_ITEM";
+  public static final String ER_XMLSPACE_ILLEGAL_VALUE =
+         "ER_XMLSPACE_ILLEGAL_VALUE";
+  public static final String ER_NO_XSLKEY_DECLARATION =
+         "ER_NO_XSLKEY_DECLARATION";
+  public static final String ER_CANT_CREATE_URL = "ER_CANT_CREATE_URL";
+  public static final String ER_XSLFUNCTIONS_UNSUPPORTED =
+         "ER_XSLFUNCTIONS_UNSUPPORTED";
+  public static final String ER_PROCESSOR_ERROR = "ER_PROCESSOR_ERROR";
+  public static final String ER_NOT_ALLOWED_INSIDE_STYLESHEET =
+         "ER_NOT_ALLOWED_INSIDE_STYLESHEET";
+  public static final String ER_RESULTNS_NOT_SUPPORTED =
+         "ER_RESULTNS_NOT_SUPPORTED";
+  public static final String ER_DEFAULTSPACE_NOT_SUPPORTED =
+         "ER_DEFAULTSPACE_NOT_SUPPORTED";
+  public static final String ER_INDENTRESULT_NOT_SUPPORTED =
+         "ER_INDENTRESULT_NOT_SUPPORTED";
+  public static final String ER_ILLEGAL_ATTRIB = "ER_ILLEGAL_ATTRIB";
+  public static final String ER_UNKNOWN_XSL_ELEM = "ER_UNKNOWN_XSL_ELEM";
+  public static final String ER_BAD_XSLSORT_USE = "ER_BAD_XSLSORT_USE";
+  public static final String ER_MISPLACED_XSLWHEN = "ER_MISPLACED_XSLWHEN";
+  public static final String ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE =
+         "ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE";
+  public static final String ER_MISPLACED_XSLOTHERWISE =
+         "ER_MISPLACED_XSLOTHERWISE";
+  public static final String ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE =
+         "ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE";
+  public static final String ER_NOT_ALLOWED_INSIDE_TEMPLATE =
+         "ER_NOT_ALLOWED_INSIDE_TEMPLATE";
+  public static final String ER_UNKNOWN_EXT_NS_PREFIX =
+         "ER_UNKNOWN_EXT_NS_PREFIX";
+  public static final String ER_IMPORTS_AS_FIRST_ELEM =
+         "ER_IMPORTS_AS_FIRST_ELEM";
+  public static final String ER_IMPORTING_ITSELF = "ER_IMPORTING_ITSELF";
+  public static final String ER_XMLSPACE_ILLEGAL_VAL ="ER_XMLSPACE_ILLEGAL_VAL";
+  public static final String ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL =
+         "ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL";
+  public static final String ER_SAX_EXCEPTION = "ER_SAX_EXCEPTION";
+  public static final String ER_XSLT_ERROR = "ER_XSLT_ERROR";
+  public static final String ER_CURRENCY_SIGN_ILLEGAL=
+         "ER_CURRENCY_SIGN_ILLEGAL";
+  public static final String ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM =
+         "ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM";
+  public static final String ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER =
+         "ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER";
+  public static final String ER_REDIRECT_COULDNT_GET_FILENAME =
+         "ER_REDIRECT_COULDNT_GET_FILENAME";
+  public static final String ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT =
+         "ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT";
+  public static final String ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX =
+         "ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX";
+  public static final String ER_MISSING_NS_URI = "ER_MISSING_NS_URI";
+  public static final String ER_MISSING_ARG_FOR_OPTION =
+         "ER_MISSING_ARG_FOR_OPTION";
+  public static final String ER_INVALID_OPTION = "ER_INVALID_OPTION";
+  public static final String ER_MALFORMED_FORMAT_STRING =
+         "ER_MALFORMED_FORMAT_STRING";
+  public static final String ER_STYLESHEET_REQUIRES_VERSION_ATTRIB =
+         "ER_STYLESHEET_REQUIRES_VERSION_ATTRIB";
+  public static final String ER_ILLEGAL_ATTRIBUTE_VALUE =
+         "ER_ILLEGAL_ATTRIBUTE_VALUE";
+  public static final String ER_CHOOSE_REQUIRES_WHEN ="ER_CHOOSE_REQUIRES_WHEN";
+  public static final String ER_NO_APPLY_IMPORT_IN_FOR_EACH =
+         "ER_NO_APPLY_IMPORT_IN_FOR_EACH";
+  public static final String ER_CANT_USE_DTM_FOR_OUTPUT =
+         "ER_CANT_USE_DTM_FOR_OUTPUT";
+  public static final String ER_CANT_USE_DTM_FOR_INPUT =
+         "ER_CANT_USE_DTM_FOR_INPUT";
+  public static final String ER_CALL_TO_EXT_FAILED = "ER_CALL_TO_EXT_FAILED";
+  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
+  public static final String ER_INVALID_UTF16_SURROGATE =
+         "ER_INVALID_UTF16_SURROGATE";
+  public static final String ER_XSLATTRSET_USED_ITSELF =
+         "ER_XSLATTRSET_USED_ITSELF";
+  public static final String ER_CANNOT_MIX_XERCESDOM ="ER_CANNOT_MIX_XERCESDOM";
+  public static final String ER_TOO_MANY_LISTENERS = "ER_TOO_MANY_LISTENERS";
+  public static final String ER_IN_ELEMTEMPLATEELEM_READOBJECT =
+         "ER_IN_ELEMTEMPLATEELEM_READOBJECT";
+  public static final String ER_DUPLICATE_NAMED_TEMPLATE =
+         "ER_DUPLICATE_NAMED_TEMPLATE";
+  public static final String ER_INVALID_KEY_CALL = "ER_INVALID_KEY_CALL";
+  public static final String ER_REFERENCING_ITSELF = "ER_REFERENCING_ITSELF";
+  public static final String ER_ILLEGAL_DOMSOURCE_INPUT =
+         "ER_ILLEGAL_DOMSOURCE_INPUT";
+  public static final String ER_CLASS_NOT_FOUND_FOR_OPTION =
+         "ER_CLASS_NOT_FOUND_FOR_OPTION";
+  public static final String ER_REQUIRED_ELEM_NOT_FOUND =
+         "ER_REQUIRED_ELEM_NOT_FOUND";
+  public static final String ER_INPUT_CANNOT_BE_NULL ="ER_INPUT_CANNOT_BE_NULL";
+  public static final String ER_URI_CANNOT_BE_NULL = "ER_URI_CANNOT_BE_NULL";
+  public static final String ER_FILE_CANNOT_BE_NULL = "ER_FILE_CANNOT_BE_NULL";
+  public static final String ER_SOURCE_CANNOT_BE_NULL =
+         "ER_SOURCE_CANNOT_BE_NULL";
+  public static final String ER_CANNOT_INIT_BSFMGR = "ER_CANNOT_INIT_BSFMGR";
+  public static final String ER_CANNOT_CMPL_EXTENSN = "ER_CANNOT_CMPL_EXTENSN";
+  public static final String ER_CANNOT_CREATE_EXTENSN =
+         "ER_CANNOT_CREATE_EXTENSN";
+  public static final String ER_INSTANCE_MTHD_CALL_REQUIRES =
+         "ER_INSTANCE_MTHD_CALL_REQUIRES";
+  public static final String ER_INVALID_ELEMENT_NAME ="ER_INVALID_ELEMENT_NAME";
+  public static final String ER_ELEMENT_NAME_METHOD_STATIC =
+         "ER_ELEMENT_NAME_METHOD_STATIC";
+  public static final String ER_EXTENSION_FUNC_UNKNOWN =
+         "ER_EXTENSION_FUNC_UNKNOWN";
+  public static final String ER_MORE_MATCH_CONSTRUCTOR =
+         "ER_MORE_MATCH_CONSTRUCTOR";
+  public static final String ER_MORE_MATCH_METHOD = "ER_MORE_MATCH_METHOD";
+  public static final String ER_MORE_MATCH_ELEMENT = "ER_MORE_MATCH_ELEMENT";
+  public static final String ER_INVALID_CONTEXT_PASSED =
+         "ER_INVALID_CONTEXT_PASSED";
+  public static final String ER_POOL_EXISTS = "ER_POOL_EXISTS";
+  public static final String ER_NO_DRIVER_NAME = "ER_NO_DRIVER_NAME";
+  public static final String ER_NO_URL = "ER_NO_URL";
+  public static final String ER_POOL_SIZE_LESSTHAN_ONE =
+         "ER_POOL_SIZE_LESSTHAN_ONE";
+  public static final String ER_INVALID_DRIVER = "ER_INVALID_DRIVER";
+  public static final String ER_NO_STYLESHEETROOT = "ER_NO_STYLESHEETROOT";
+  public static final String ER_ILLEGAL_XMLSPACE_VALUE =
+         "ER_ILLEGAL_XMLSPACE_VALUE";
+  public static final String ER_PROCESSFROMNODE_FAILED =
+         "ER_PROCESSFROMNODE_FAILED";
+  public static final String ER_RESOURCE_COULD_NOT_LOAD =
+         "ER_RESOURCE_COULD_NOT_LOAD";
+  public static final String ER_BUFFER_SIZE_LESSTHAN_ZERO =
+         "ER_BUFFER_SIZE_LESSTHAN_ZERO";
+  public static final String ER_UNKNOWN_ERROR_CALLING_EXTENSION =
+         "ER_UNKNOWN_ERROR_CALLING_EXTENSION";
+  public static final String ER_NO_NAMESPACE_DECL = "ER_NO_NAMESPACE_DECL";
+  public static final String ER_ELEM_CONTENT_NOT_ALLOWED =
+         "ER_ELEM_CONTENT_NOT_ALLOWED";
+  public static final String ER_STYLESHEET_DIRECTED_TERMINATION =
+         "ER_STYLESHEET_DIRECTED_TERMINATION";
+  public static final String ER_ONE_OR_TWO = "ER_ONE_OR_TWO";
+  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
+  public static final String ER_COULD_NOT_LOAD_RESOURCE =
+         "ER_COULD_NOT_LOAD_RESOURCE";
+  public static final String ER_CANNOT_INIT_DEFAULT_TEMPLATES =
+         "ER_CANNOT_INIT_DEFAULT_TEMPLATES";
+  public static final String ER_RESULT_NULL = "ER_RESULT_NULL";
+  public static final String ER_RESULT_COULD_NOT_BE_SET =
+         "ER_RESULT_COULD_NOT_BE_SET";
+  public static final String ER_NO_OUTPUT_SPECIFIED = "ER_NO_OUTPUT_SPECIFIED";
+  public static final String ER_CANNOT_TRANSFORM_TO_RESULT_TYPE =
+         "ER_CANNOT_TRANSFORM_TO_RESULT_TYPE";
+  public static final String ER_CANNOT_TRANSFORM_SOURCE_TYPE =
+         "ER_CANNOT_TRANSFORM_SOURCE_TYPE";
+  public static final String ER_NULL_CONTENT_HANDLER ="ER_NULL_CONTENT_HANDLER";
+  public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
+  public static final String ER_CANNOT_CALL_PARSE = "ER_CANNOT_CALL_PARSE";
+  public static final String ER_NO_PARENT_FOR_FILTER ="ER_NO_PARENT_FOR_FILTER";
+  public static final String ER_NO_STYLESHEET_IN_MEDIA =
+         "ER_NO_STYLESHEET_IN_MEDIA";
+  public static final String ER_NO_STYLESHEET_PI = "ER_NO_STYLESHEET_PI";
+  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
+  public static final String ER_PROPERTY_VALUE_BOOLEAN =
+         "ER_PROPERTY_VALUE_BOOLEAN";
+  public static final String ER_COULD_NOT_FIND_EXTERN_SCRIPT =
+         "ER_COULD_NOT_FIND_EXTERN_SCRIPT";
+  public static final String ER_RESOURCE_COULD_NOT_FIND =
+         "ER_RESOURCE_COULD_NOT_FIND";
+  public static final String ER_OUTPUT_PROPERTY_NOT_RECOGNIZED =
+         "ER_OUTPUT_PROPERTY_NOT_RECOGNIZED";
+  public static final String ER_FAILED_CREATING_ELEMLITRSLT =
+         "ER_FAILED_CREATING_ELEMLITRSLT";
+  public static final String ER_VALUE_SHOULD_BE_NUMBER =
+         "ER_VALUE_SHOULD_BE_NUMBER";
+  public static final String ER_VALUE_SHOULD_EQUAL = "ER_VALUE_SHOULD_EQUAL";
+  public static final String ER_FAILED_CALLING_METHOD =
+         "ER_FAILED_CALLING_METHOD";
+  public static final String ER_FAILED_CREATING_ELEMTMPL =
+         "ER_FAILED_CREATING_ELEMTMPL";
+  public static final String ER_CHARS_NOT_ALLOWED = "ER_CHARS_NOT_ALLOWED";
+  public static final String ER_ATTR_NOT_ALLOWED = "ER_ATTR_NOT_ALLOWED";
+  public static final String ER_BAD_VALUE = "ER_BAD_VALUE";
+  public static final String ER_ATTRIB_VALUE_NOT_FOUND =
+         "ER_ATTRIB_VALUE_NOT_FOUND";
+  public static final String ER_ATTRIB_VALUE_NOT_RECOGNIZED =
+         "ER_ATTRIB_VALUE_NOT_RECOGNIZED";
+  public static final String ER_NULL_URI_NAMESPACE = "ER_NULL_URI_NAMESPACE";
+  public static final String ER_NUMBER_TOO_BIG = "ER_NUMBER_TOO_BIG";
+  public static final String  ER_CANNOT_FIND_SAX1_DRIVER =
+         "ER_CANNOT_FIND_SAX1_DRIVER";
+  public static final String  ER_SAX1_DRIVER_NOT_LOADED =
+         "ER_SAX1_DRIVER_NOT_LOADED";
+  public static final String  ER_SAX1_DRIVER_NOT_INSTANTIATED =
+         "ER_SAX1_DRIVER_NOT_INSTANTIATED" ;
+  public static final String ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER =
+         "ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER";
+  public static final String  ER_PARSER_PROPERTY_NOT_SPECIFIED =
+         "ER_PARSER_PROPERTY_NOT_SPECIFIED";
+  public static final String  ER_PARSER_ARG_CANNOT_BE_NULL =
+         "ER_PARSER_ARG_CANNOT_BE_NULL" ;
+  public static final String  ER_FEATURE = "ER_FEATURE";
+  public static final String ER_PROPERTY = "ER_PROPERTY" ;
+  public static final String ER_NULL_ENTITY_RESOLVER ="ER_NULL_ENTITY_RESOLVER";
+  public static final String  ER_NULL_DTD_HANDLER = "ER_NULL_DTD_HANDLER" ;
+  public static final String ER_NO_DRIVER_NAME_SPECIFIED =
+         "ER_NO_DRIVER_NAME_SPECIFIED";
+  public static final String ER_NO_URL_SPECIFIED = "ER_NO_URL_SPECIFIED";
+  public static final String ER_POOLSIZE_LESS_THAN_ONE =
+         "ER_POOLSIZE_LESS_THAN_ONE";
+  public static final String ER_INVALID_DRIVER_NAME = "ER_INVALID_DRIVER_NAME";
+  public static final String ER_ERRORLISTENER = "ER_ERRORLISTENER";
+  public static final String ER_ASSERT_NO_TEMPLATE_PARENT =
+         "ER_ASSERT_NO_TEMPLATE_PARENT";
+  public static final String ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR =
+         "ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR";
+  public static final String ER_NOT_ALLOWED_IN_POSITION =
+         "ER_NOT_ALLOWED_IN_POSITION";
+  public static final String ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION =
+         "ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION";
+  public static final String ER_NAMESPACE_CONTEXT_NULL_NAMESPACE =
+         "ER_NAMESPACE_CONTEXT_NULL_NAMESPACE";
+  public static final String ER_NAMESPACE_CONTEXT_NULL_PREFIX =
+         "ER_NAMESPACE_CONTEXT_NULL_PREFIX";
+  public static final String ER_XPATH_RESOLVER_NULL_QNAME =
+         "ER_XPATH_RESOLVER_NULL_QNAME";
+  public static final String ER_XPATH_RESOLVER_NEGATIVE_ARITY =
+         "ER_XPATH_RESOLVER_NEGATIVE_ARITY";
+  public static final String INVALID_TCHAR = "INVALID_TCHAR";
+  public static final String INVALID_QNAME = "INVALID_QNAME";
+  public static final String INVALID_ENUM = "INVALID_ENUM";
+  public static final String INVALID_NMTOKEN = "INVALID_NMTOKEN";
+  public static final String INVALID_NCNAME = "INVALID_NCNAME";
+  public static final String INVALID_BOOLEAN = "INVALID_BOOLEAN";
+  public static final String INVALID_NUMBER = "INVALID_NUMBER";
+  public static final String ER_ARG_LITERAL = "ER_ARG_LITERAL";
+  public static final String ER_DUPLICATE_GLOBAL_VAR ="ER_DUPLICATE_GLOBAL_VAR";
+  public static final String ER_DUPLICATE_VAR = "ER_DUPLICATE_VAR";
+  public static final String ER_TEMPLATE_NAME_MATCH = "ER_TEMPLATE_NAME_MATCH";
+  public static final String ER_INVALID_PREFIX = "ER_INVALID_PREFIX";
+  public static final String ER_NO_ATTRIB_SET = "ER_NO_ATTRIB_SET";
+  public static final String ER_FUNCTION_NOT_FOUND =
+         "ER_FUNCTION_NOT_FOUND";
+  public static final String ER_CANT_HAVE_CONTENT_AND_SELECT =
+     "ER_CANT_HAVE_CONTENT_AND_SELECT";
+  public static final String ER_INVALID_SET_PARAM_VALUE = "ER_INVALID_SET_PARAM_VALUE";
+  public static final String ER_SET_FEATURE_NULL_NAME =
+        "ER_SET_FEATURE_NULL_NAME";
+  public static final String ER_GET_FEATURE_NULL_NAME =
+        "ER_GET_FEATURE_NULL_NAME";
+  public static final String ER_UNSUPPORTED_FEATURE =
+        "ER_UNSUPPORTED_FEATURE";
+  public static final String ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING =
+        "ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING";
+
+  public static final String WG_FOUND_CURLYBRACE = "WG_FOUND_CURLYBRACE";
+  public static final String WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR =
+         "WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR";
+  public static final String WG_EXPR_ATTRIB_CHANGED_TO_SELECT =
+         "WG_EXPR_ATTRIB_CHANGED_TO_SELECT";
+  public static final String WG_NO_LOCALE_IN_FORMATNUMBER =
+         "WG_NO_LOCALE_IN_FORMATNUMBER";
+  public static final String WG_LOCALE_NOT_FOUND = "WG_LOCALE_NOT_FOUND";
+  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
+  public static final String WG_CANNOT_LOAD_REQUESTED_DOC =
+         "WG_CANNOT_LOAD_REQUESTED_DOC";
+  public static final String WG_CANNOT_FIND_COLLATOR ="WG_CANNOT_FIND_COLLATOR";
+  public static final String WG_FUNCTIONS_SHOULD_USE_URL =
+         "WG_FUNCTIONS_SHOULD_USE_URL";
+  public static final String WG_ENCODING_NOT_SUPPORTED_USING_UTF8 =
+         "WG_ENCODING_NOT_SUPPORTED_USING_UTF8";
+  public static final String WG_ENCODING_NOT_SUPPORTED_USING_JAVA =
+         "WG_ENCODING_NOT_SUPPORTED_USING_JAVA";
+  public static final String WG_SPECIFICITY_CONFLICTS =
+         "WG_SPECIFICITY_CONFLICTS";
+  public static final String WG_PARSING_AND_PREPARING =
+         "WG_PARSING_AND_PREPARING";
+  public static final String WG_ATTR_TEMPLATE = "WG_ATTR_TEMPLATE";
+  public static final String WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE = "WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESP";
+  public static final String WG_ATTRIB_NOT_HANDLED = "WG_ATTRIB_NOT_HANDLED";
+  public static final String WG_NO_DECIMALFORMAT_DECLARATION =
+         "WG_NO_DECIMALFORMAT_DECLARATION";
+  public static final String WG_OLD_XSLT_NS = "WG_OLD_XSLT_NS";
+  public static final String WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED =
+         "WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED";
+  public static final String WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE =
+         "WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE";
+  public static final String WG_ILLEGAL_ATTRIBUTE = "WG_ILLEGAL_ATTRIBUTE";
+  public static final String WG_COULD_NOT_RESOLVE_PREFIX =
+         "WG_COULD_NOT_RESOLVE_PREFIX";
+  public static final String WG_STYLESHEET_REQUIRES_VERSION_ATTRIB =
+         "WG_STYLESHEET_REQUIRES_VERSION_ATTRIB";
+  public static final String WG_ILLEGAL_ATTRIBUTE_NAME =
+         "WG_ILLEGAL_ATTRIBUTE_NAME";
+  public static final String WG_ILLEGAL_ATTRIBUTE_VALUE =
+         "WG_ILLEGAL_ATTRIBUTE_VALUE";
+  public static final String WG_EMPTY_SECOND_ARG = "WG_EMPTY_SECOND_ARG";
+  public static final String WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML =
+         "WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML";
+  public static final String WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME =
+         "WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME";
+  public static final String WG_ILLEGAL_ATTRIBUTE_POSITION =
+         "WG_ILLEGAL_ATTRIBUTE_POSITION";
+  public static final String NO_MODIFICATION_ALLOWED_ERR =
+         "NO_MODIFICATION_ALLOWED_ERR";
+
+  /*
+   * Now fill in the message text.
+   * Then fill in the message text for that message code in the
+   * array. Use the new error code as the index into the array.
+   */
+
+  // Error messages...
+
+  /** Get the lookup table for error messages.
+   *
+   * @return The message lookup table.
+   */
+  public Object[][] getContents()
+  {
+    return new Object[][] {
+
+  /** Error message ID that has a null message, but takes in a single object.    */
+  {"ER0000" , "{0}" },
+
+
+    { ER_NO_CURLYBRACE,
+      "\u9519\u8bef\uff1a\u8868\u8fbe\u5f0f\u4e2d\u4e0d\u80fd\u6709\u201c{\u201d"},
+
+    { ER_ILLEGAL_ATTRIBUTE ,
+     "{0} \u6709\u4e00\u4e2a\u975e\u6cd5\u5c5e\u6027\uff1a{1}"},
+
+  {ER_NULL_SOURCENODE_APPLYIMPORTS ,
+      "sourceNode \u5728 xsl:apply-imports \u4e2d\u4e3a\u7a7a\uff01"},
+
+  {ER_CANNOT_ADD,
+      "\u65e0\u6cd5\u5c06\u201c{0}\u201d\u6dfb\u52a0\u5230\u201c{1}\u201d"},
+
+    { ER_NULL_SOURCENODE_HANDLEAPPLYTEMPLATES,
+      "sourceNode \u5728 handleApplyTemplatesInstruction \u4e2d\u4e3a\u7a7a\uff01"},
+
+    { ER_NO_NAME_ATTRIB,
+     "\u201c{0}\u201d\u5fc5\u987b\u6709 name \u5c5e\u6027\u3002"},
+
+    {ER_TEMPLATE_NOT_FOUND,
+     "\u627e\u4e0d\u5230\u4ee5\u4e0b\u540d\u79f0\u7684\u6a21\u677f\uff1a{0}"},
+
+    {ER_CANT_RESOLVE_NAME_AVT,
+      "\u65e0\u6cd5\u89e3\u6790 xsl:call-template \u4e2d\u7684\u540d\u79f0 AVT\u3002"},
+
+    {ER_REQUIRES_ATTRIB,
+     "\u201c{0}\u201d\u9700\u8981\u5c5e\u6027\uff1a{1}"},
+
+    { ER_MUST_HAVE_TEST_ATTRIB,
+      "\u201c{0}\u201d\u5fc5\u987b\u6709\u201ctest\u201d\u5c5e\u6027\u3002"},
+
+    {ER_BAD_VAL_ON_LEVEL_ATTRIB,
+      "\u7ea7\u522b\u5c5e\u6027\u4e0a\u51fa\u73b0\u9519\u8bef\u503c\uff1a{0}"},
+
+    {ER_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
+      "processing-instruction \u540d\u79f0\u4e0d\u80fd\u662f\u201cxml\u201d"},
+
+    { ER_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
+      "processing-instruction \u540d\u79f0\u5fc5\u987b\u662f\u6709\u6548\u7684 NCName\uff1a{0}"},
+
+    { ER_NEED_MATCH_ATTRIB,
+      "\u201c{0}\u201d\u5982\u679c\u6709\u67d0\u79cd\u65b9\u5f0f\uff0c\u5c31\u5fc5\u987b\u6709 match \u5c5e\u6027\u3002"},
+
+    { ER_NEED_NAME_OR_MATCH_ATTRIB,
+      "\u201c{0}\u201d\u9700\u8981 name \u5c5e\u6027\u6216 match \u5c5e\u6027\u3002"},
+
+    {ER_CANT_RESOLVE_NSPREFIX,
+      "\u65e0\u6cd5\u89e3\u6790\u540d\u79f0\u7a7a\u95f4\u524d\u7f00\uff1a{0}"},
+
+    { ER_ILLEGAL_VALUE,
+     "xml:space \u6709\u975e\u6cd5\u7684\u503c\uff1a{0}"},
+
+    { ER_NO_OWNERDOC,
+      "\u5b50\u8282\u70b9\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
+
+    { ER_ELEMTEMPLATEELEM_ERR,
+     "ElemTemplateElement \u9519\u8bef\uff1a{0}"},
+
+    { ER_NULL_CHILD,
+     "\u6b63\u5728\u5c1d\u8bd5\u6dfb\u52a0\u7a7a\u7684\u5b50\u4ee3\uff01"},
+
+    { ER_NEED_SELECT_ATTRIB,
+     "{0} \u9700\u8981 select \u5c5e\u6027\u3002"},
+
+    { ER_NEED_TEST_ATTRIB ,
+      "xsl:when \u5fc5\u987b\u6709\u201ctest\u201d\u5c5e\u6027\u3002"},
+
+    { ER_NEED_NAME_ATTRIB,
+      "xsl:with-param \u5fc5\u987b\u6709\u201cname\u201d\u5c5e\u6027\u3002"},
+
+    { ER_NO_CONTEXT_OWNERDOC,
+      "\u4e0a\u4e0b\u6587\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
+
+    {ER_COULD_NOT_CREATE_XML_PROC_LIAISON,
+      "\u65e0\u6cd5\u521b\u5efa XML TransformerFactory \u8054\u7cfb\uff1a{0}"},
+
+    {ER_PROCESS_NOT_SUCCESSFUL,
+      "Xalan: Process \u4e0d\u6210\u529f\u3002"},
+
+    { ER_NOT_SUCCESSFUL,
+     "Xalan: \u4e0d\u6210\u529f\u3002"},
+
+    { ER_ENCODING_NOT_SUPPORTED,
+     "\u4e0d\u652f\u6301\u7f16\u7801\uff1a{0}"},
+
+    {ER_COULD_NOT_CREATE_TRACELISTENER,
+      "\u65e0\u6cd5\u521b\u5efa TraceListener\uff1a{0}"},
+
+    {ER_KEY_REQUIRES_NAME_ATTRIB,
+      "xsl:key \u9700\u8981\u201cname\u201d\u5c5e\u6027\uff01"},
+
+    { ER_KEY_REQUIRES_MATCH_ATTRIB,
+      "xsl:key \u9700\u8981\u201cmatch\u201d\u5c5e\u6027\uff01"},
+
+    { ER_KEY_REQUIRES_USE_ATTRIB,
+      "xsl:key \u9700\u8981\u201cuse\u201d\u5c5e\u6027\uff01"},
+
+    { ER_REQUIRES_ELEMENTS_ATTRIB,
+      "(StylesheetHandler) {0} \u9700\u8981\u201celements\u201d\u5c5e\u6027\uff01"},
+
+    { ER_MISSING_PREFIX_ATTRIB,
+      "(StylesheetHandler) {0} \u5c5e\u6027\u201cprefix\u201d\u4e22\u5931"},
+
+    { ER_BAD_STYLESHEET_URL,
+     "\u6837\u5f0f\u8868 URL \u9519\u8bef\uff1a{0}"},
+
+    { ER_FILE_NOT_FOUND,
+     "\u627e\u4e0d\u5230\u6837\u5f0f\u8868\u6587\u4ef6\uff1a{0}"},
+
+    { ER_IOEXCEPTION,
+      "\u6837\u5f0f\u8868\u6587\u4ef6\u53d1\u751f IO \u5f02\u5e38\uff1a{0}"},
+
+    { ER_NO_HREF_ATTRIB,
+      "\uff08StylesheetHandler\uff09\u65e0\u6cd5\u4e3a {0} \u627e\u5230 href \u5c5e\u6027"},
+
+    { ER_STYLESHEET_INCLUDES_ITSELF,
+      "\uff08StylesheetHandler\uff09{0} \u6b63\u5728\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5305\u542b\u5b83\u81ea\u8eab\uff01"},
+
+    { ER_PROCESSINCLUDE_ERROR,
+      "StylesheetHandler.processInclude \u9519\u8bef\uff0c{0}"},
+
+    { ER_MISSING_LANG_ATTRIB,
+      "(StylesheetHandler) {0} \u5c5e\u6027\u201clang\u201d\u4e22\u5931"},
+
+    { ER_MISSING_CONTAINER_ELEMENT_COMPONENT,
+      "\uff08StylesheetHandler\uff09\u662f\u5426\u9519\u653e\u4e86 {0} \u5143\u7d20\uff1f\uff1f\u7f3a\u5c11\u5bb9\u5668\u5143\u7d20\u201ccomponent\u201d"},
+
+    { ER_CAN_ONLY_OUTPUT_TO_ELEMENT,
+      "\u53ea\u80fd\u8f93\u51fa\u5230 Element\u3001DocumentFragment\u3001Document \u6216 PrintWriter\u3002"},
+
+    { ER_PROCESS_ERROR,
+     "StylesheetRoot.process \u9519\u8bef"},
+
+    { ER_UNIMPLNODE_ERROR,
+     "UnImplNode \u9519\u8bef\uff1a{0}"},
+
+    { ER_NO_SELECT_EXPRESSION,
+      "\u9519\u8bef\uff01\u627e\u4e0d\u5230 xpath \u9009\u62e9\u8868\u8fbe\u5f0f\uff08-select\uff09\u3002"},
+
+    { ER_CANNOT_SERIALIZE_XSLPROCESSOR,
+      "\u65e0\u6cd5\u5e8f\u5217\u5316 XSLProcessor\uff01"},
+
+    { ER_NO_INPUT_STYLESHEET,
+      "\u6ca1\u6709\u6307\u5b9a\u6837\u5f0f\u8868\u8f93\u5165\uff01"},
+
+    { ER_FAILED_PROCESS_STYLESHEET,
+      "\u65e0\u6cd5\u5904\u7406\u6837\u5f0f\u8868\uff01"},
+
+    { ER_COULDNT_PARSE_DOC,
+     "\u65e0\u6cd5\u89e3\u6790 {0} \u6587\u6863\uff01"},
+
+    { ER_COULDNT_FIND_FRAGMENT,
+     "\u627e\u4e0d\u5230\u7247\u6bb5\uff1a{0}"},
+
+    { ER_NODE_NOT_ELEMENT,
+      "\u7247\u6bb5\u6807\u8bc6\u6307\u5411\u7684\u8282\u70b9\u4e0d\u662f\u5143\u7d20\uff1a{0}"},
+
+    { ER_FOREACH_NEED_MATCH_OR_NAME_ATTRIB,
+      "for-each \u5fc5\u987b\u6709 match \u6216 name \u5c5e\u6027"},
+
+    { ER_TEMPLATES_NEED_MATCH_OR_NAME_ATTRIB,
+      "templates \u5fc5\u987b\u6709 match \u6216 name \u5c5e\u6027"},
+
+    { ER_NO_CLONE_OF_DOCUMENT_FRAG,
+      "\u65e0\u6587\u6863\u7247\u6bb5\u7684\u514b\u9686\uff01"},
+
+    { ER_CANT_CREATE_ITEM,
+      "\u65e0\u6cd5\u5728\u7ed3\u679c\u6811\u4e2d\u521b\u5efa\u9879\uff1a{0}"},
+
+    { ER_XMLSPACE_ILLEGAL_VALUE,
+      "\u6e90 XML \u4e2d\u7684 xml:space \u6709\u975e\u6cd5\u503c\uff1a{0}"},
+
+    { ER_NO_XSLKEY_DECLARATION,
+      "{0} \u6ca1\u6709 xsl:key \u58f0\u660e\uff01"},
+
+    { ER_CANT_CREATE_URL,
+     "\u9519\u8bef\uff01\u65e0\u6cd5\u4e3a {0} \u521b\u5efa URL"},
+
+    { ER_XSLFUNCTIONS_UNSUPPORTED,
+     "\u4e0d\u652f\u6301 xsl:functions"},
+
+    { ER_PROCESSOR_ERROR,
+     "XSLT TransformerFactory \u9519\u8bef"},
+
+    { ER_NOT_ALLOWED_INSIDE_STYLESHEET,
+      "\uff08StylesheetHandler\uff09\u6837\u5f0f\u8868\u5185\u4e0d\u5141\u8bb8 {0}\uff01"},
+
+    { ER_RESULTNS_NOT_SUPPORTED,
+      "\u4e0d\u518d\u652f\u6301 result-ns\uff01\u8bf7\u6539\u4e3a\u4f7f\u7528 xsl:output\u3002"},
+
+    { ER_DEFAULTSPACE_NOT_SUPPORTED,
+      "\u4e0d\u518d\u652f\u6301 default-space\uff01\u8bf7\u6539\u4e3a\u4f7f\u7528 xsl:strip-space \u6216 xsl:preserve-space\u3002"},
+
+    { ER_INDENTRESULT_NOT_SUPPORTED,
+      "\u4e0d\u518d\u652f\u6301 indent-result\uff01\u8bf7\u6539\u4e3a\u4f7f\u7528 xsl:output\u3002"},
+
+    { ER_ILLEGAL_ATTRIB,
+      "\uff08StylesheetHandler\uff09{0} \u6709\u975e\u6cd5\u5c5e\u6027\uff1a{1}"},
+
+    { ER_UNKNOWN_XSL_ELEM,
+     "\u672a\u77e5 XSL \u5143\u7d20\uff1a{0}"},
+
+    { ER_BAD_XSLSORT_USE,
+      "\uff08StylesheetHandler\uff09xsl:sort \u53ea\u80fd\u4e0e xsl:apply-templates \u6216 xsl:for-each \u4e00\u8d77\u4f7f\u7528\u3002"},
+
+    { ER_MISPLACED_XSLWHEN,
+      "\uff08StylesheetHandler\uff09\u9519\u653e\u4e86 xsl:when\uff01"},
+
+    { ER_XSLWHEN_NOT_PARENTED_BY_XSLCHOOSE,
+      "\uff08StylesheetHandler\uff09xsl:choose \u4e0d\u662f xsl:when \u7684\u7236\u4ee3\uff01"},
+
+    { ER_MISPLACED_XSLOTHERWISE,
+      "\uff08StylesheetHandler\uff09\u9519\u653e\u4e86 xsl:otherwise\uff01"},
+
+    { ER_XSLOTHERWISE_NOT_PARENTED_BY_XSLCHOOSE,
+      "\uff08StylesheetHandler\uff09xsl:choose \u4e0d\u662f xsl:otherwise \u7684\u7236\u4ee3\uff01"},
+
+    { ER_NOT_ALLOWED_INSIDE_TEMPLATE,
+      "\uff08StylesheetHandler\uff09\u6a21\u677f\u5185\u4e0d\u5141\u8bb8\u51fa\u73b0 {0}\uff01"},
+
+    { ER_UNKNOWN_EXT_NS_PREFIX,
+      "\uff08StylesheetHandler\uff09{0} \u6269\u5c55\u540d\u79f0\u7a7a\u95f4\u524d\u7f00 {1} \u672a\u77e5"},
+
+    { ER_IMPORTS_AS_FIRST_ELEM,
+      "\uff08StylesheetHandler\uff09\u5bfc\u5165\u53ea\u80fd\u4f5c\u4e3a\u6837\u5f0f\u8868\u4e2d\u6700\u524d\u9762\u7684\u5143\u7d20\u53d1\u751f\uff01"},
+
+    { ER_IMPORTING_ITSELF,
+      "\uff08StylesheetHandler\uff09{0} \u6b63\u5728\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5bfc\u5165\u5b83\u81ea\u8eab\uff01"},
+
+    { ER_XMLSPACE_ILLEGAL_VAL,
+      "\uff08StylesheetHandler\uff09xml:space \u6709\u975e\u6cd5\u503c\uff1a{0}"},
+
+    { ER_PROCESSSTYLESHEET_NOT_SUCCESSFUL,
+      "processStylesheet \u4e0d\u6210\u529f\uff01"},
+
+    { ER_SAX_EXCEPTION,
+     "SAX \u5f02\u5e38"},
+
+//  add this message to fix bug 21478
+    { ER_FUNCTION_NOT_SUPPORTED,
+     "\u51fd\u6570\u4e0d\u53d7\u652f\u6301\uff01"},
+
+
+    { ER_XSLT_ERROR,
+     "XSLT \u9519\u8bef"},
+
+    { ER_CURRENCY_SIGN_ILLEGAL,
+      "\u683c\u5f0f\u6a21\u5f0f\u5b57\u7b26\u4e32\u4e2d\u4e0d\u5141\u8bb8\u5b58\u5728\u8d27\u5e01\u7b26\u53f7"},
+
+    { ER_DOCUMENT_FUNCTION_INVALID_IN_STYLESHEET_DOM,
+      "\u6837\u5f0f\u8868 DOM \u4e2d\u4e0d\u652f\u6301\u6587\u6863\u51fd\u6570\uff01"},
+
+    { ER_CANT_RESOLVE_PREFIX_OF_NON_PREFIX_RESOLVER,
+      "\u65e0\u6cd5\u89e3\u6790\u975e\u524d\u7f00\u89e3\u6790\u5668\u7684\u524d\u7f00\uff01"},
+
+    { ER_REDIRECT_COULDNT_GET_FILENAME,
+      "\u91cd\u5b9a\u5411\u6269\u5c55\uff1a\u65e0\u6cd5\u83b7\u53d6\u6587\u4ef6\u540d \uff0d file \u6216 select \u5c5e\u6027\u5fc5\u987b\u8fd4\u56de\u6709\u6548\u5b57\u7b26\u4e32\u3002"},
+
+    { ER_CANNOT_BUILD_FORMATTERLISTENER_IN_REDIRECT,
+      "\u65e0\u6cd5\u5728\u91cd\u5b9a\u5411\u6269\u5c55\u4e2d\u6784\u5efa FormatterListener\uff01"},
+
+    { ER_INVALID_PREFIX_IN_EXCLUDERESULTPREFIX,
+      "exclude-result-prefixes \u4e2d\u7684\u524d\u7f00\u65e0\u6548\uff1a{0}"},
+
+    { ER_MISSING_NS_URI,
+      "\u6307\u5b9a\u7684\u524d\u7f00\u7f3a\u5c11\u540d\u79f0\u7a7a\u95f4 URI"},
+
+    { ER_MISSING_ARG_FOR_OPTION,
+      "\u9009\u9879 {0} \u7f3a\u5c11\u81ea\u53d8\u91cf"},
+
+    { ER_INVALID_OPTION,
+     "\u9009\u9879 {0} \u65e0\u6548"},
+
+    { ER_MALFORMED_FORMAT_STRING,
+     "\u683c\u5f0f\u5b57\u7b26\u4e32 {0} \u7684\u683c\u5f0f\u9519\u8bef"},
+
+    { ER_STYLESHEET_REQUIRES_VERSION_ATTRIB,
+      "xsl:stylesheet \u9700\u8981\u201cversion\u201d\u5c5e\u6027\uff01"},
+
+    { ER_ILLEGAL_ATTRIBUTE_VALUE,
+      "\u5c5e\u6027\uff1a{0} \u6709\u975e\u6cd5\u7684\u503c\uff1a{1}"},
+
+    { ER_CHOOSE_REQUIRES_WHEN,
+     "xsl:choose \u9700\u8981 xsl:when"},
+
+    { ER_NO_APPLY_IMPORT_IN_FOR_EACH,
+      "xsl:for-each \u4e2d\u4e0d\u5141\u8bb8\u6709 xsl:apply-imports"},
+
+    { ER_CANT_USE_DTM_FOR_OUTPUT,
+      "\u65e0\u6cd5\u5c06 DTMLiaison \u7528\u4e8e\u8f93\u51fa DOM \u8282\u70b9... \u6539\u4e3a\u4f20\u9012 org.apache.xpath.DOM2Helper\uff01"},
+
+    { ER_CANT_USE_DTM_FOR_INPUT,
+      "\u65e0\u6cd5\u5c06 DTMLiaison \u7528\u4e8e\u8f93\u5165 DOM \u8282\u70b9... \u6539\u4e3a\u4f20\u9012 org.apache.xpath.DOM2Helper\uff01"},
+
+    { ER_CALL_TO_EXT_FAILED,
+      "\u8c03\u7528\u6269\u5c55\u5143\u7d20\u5931\u8d25\uff1a{0}"},
+
+    { ER_PREFIX_MUST_RESOLVE,
+      "\u524d\u7f00\u5fc5\u987b\u89e3\u6790\u4e3a\u540d\u79f0\u7a7a\u95f4\uff1a{0}"},
+
+    { ER_INVALID_UTF16_SURROGATE,
+      "\u68c0\u6d4b\u5230\u65e0\u6548\u7684 UTF-16 \u8d85\u5927\u5b57\u7b26\u96c6\uff1a{0}\uff1f"},
+
+    { ER_XSLATTRSET_USED_ITSELF,
+      "xsl:attribute-set {0} \u4f7f\u7528\u4e86\u81ea\u8eab\uff0c\u8fd9\u5c06\u5bfc\u81f4\u65e0\u9650\u5faa\u73af\u3002"},
+
+    { ER_CANNOT_MIX_XERCESDOM,
+      "\u65e0\u6cd5\u5c06\u975e Xerces-DOM \u8f93\u5165\u4e0e Xerces-DOM \u8f93\u51fa\u6df7\u5408\uff01"},
+
+    { ER_TOO_MANY_LISTENERS,
+      "addTraceListenersToStylesheet \u2015 TooManyListenersException"},
+
+    { ER_IN_ELEMTEMPLATEELEM_READOBJECT,
+      "\u5728 ElemTemplateElement.readObject \u4e2d\uff1a{0}"},
+
+    { ER_DUPLICATE_NAMED_TEMPLATE,
+      "\u627e\u5230\u591a\u4e2a\u540d\u4e3a {0} \u7684\u6a21\u677f"},
+
+    { ER_INVALID_KEY_CALL,
+      "\u65e0\u6548\u7684\u51fd\u6570\u8c03\u7528\uff1a\u4e0d\u5141\u8bb8\u9012\u5f52 key() \u8c03\u7528"},
+
+    { ER_REFERENCING_ITSELF,
+      "\u53d8\u91cf {0} \u6b63\u5728\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5f15\u7528\u5b83\u81ea\u8eab\uff01"},
+
+    { ER_ILLEGAL_DOMSOURCE_INPUT,
+      "\u8f93\u5165\u8282\u70b9\u5bf9\u4e8e newTemplates \u7684 DOMSource \u4e0d\u80fd\u4e3a\u7a7a\uff01"},
+
+    { ER_CLASS_NOT_FOUND_FOR_OPTION,
+        "\u627e\u4e0d\u5230\u9009\u9879 {0} \u7684\u7c7b\u6587\u4ef6"},
+
+    { ER_REQUIRED_ELEM_NOT_FOUND,
+        "\u627e\u4e0d\u5230\u5fc5\u9700\u7684\u5143\u7d20\uff1a{0}"},
+
+    { ER_INPUT_CANNOT_BE_NULL,
+        "InputStream \u4e0d\u80fd\u4e3a\u7a7a"},
+
+    { ER_URI_CANNOT_BE_NULL,
+        "URI \u4e0d\u80fd\u4e3a\u7a7a"},
+
+    { ER_FILE_CANNOT_BE_NULL,
+        "File \u4e0d\u80fd\u4e3a\u7a7a"},
+
+    { ER_SOURCE_CANNOT_BE_NULL,
+                "InputSource \u4e0d\u80fd\u4e3a\u7a7a"},
+
+    { ER_CANNOT_INIT_BSFMGR,
+                "\u65e0\u6cd5\u521d\u59cb\u5316 BSF \u7ba1\u7406\u5668"},
+
+    { ER_CANNOT_CMPL_EXTENSN,
+                "\u65e0\u6cd5\u7f16\u8bd1\u6269\u5c55"},
+
+    { ER_CANNOT_CREATE_EXTENSN,
+      "\u7531\u4e8e {1}\uff0c\u65e0\u6cd5\u521b\u5efa\u6269\u5c55 {0}"},
+
+    { ER_INSTANCE_MTHD_CALL_REQUIRES,
+      "\u5bf9\u65b9\u6cd5 {0} \u7684\u5b9e\u4f8b\u65b9\u6cd5\u8c03\u7528\u8981\u6c42\u4ee5\u5bf9\u8c61\u5b9e\u4f8b\u4f5c\u4e3a\u7b2c\u4e00\u53c2\u6570"},
+
+    { ER_INVALID_ELEMENT_NAME,
+      "\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u5143\u7d20\u540d\u79f0 {0}"},
+
+    { ER_ELEMENT_NAME_METHOD_STATIC,
+      "\u5143\u7d20\u540d\u79f0\u65b9\u6cd5\u5fc5\u987b\u662f static {0}"},
+
+    { ER_EXTENSION_FUNC_UNKNOWN,
+             "\u6269\u5c55\u51fd\u6570 {0} : {1} \u672a\u77e5"},
+
+    { ER_MORE_MATCH_CONSTRUCTOR,
+             "\u5bf9\u4e8e {0}\uff0c\u6784\u9020\u51fd\u6570\u6709\u591a\u4e2a\u6700\u4f73\u5339\u914d"},
+
+    { ER_MORE_MATCH_METHOD,
+             "\u65b9\u6cd5 {0} \u6709\u591a\u4e2a\u6700\u4f73\u5339\u914d"},
+
+    { ER_MORE_MATCH_ELEMENT,
+             "element \u65b9\u6cd5 {0} \u6709\u591a\u4e2a\u6700\u4f73\u5339\u914d"},
+
+    { ER_INVALID_CONTEXT_PASSED,
+             "\u8bc4\u4f30 {0} \u65f6\u4f20\u9012\u4e86\u65e0\u6548\u7684\u4e0a\u4e0b\u6587"},
+
+    { ER_POOL_EXISTS,
+             "\u6c60\u5df2\u7ecf\u5b58\u5728"},
+
+    { ER_NO_DRIVER_NAME,
+             "\u672a\u6307\u5b9a\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0"},
+
+    { ER_NO_URL,
+             "\u672a\u6307\u5b9a URL"},
+
+    { ER_POOL_SIZE_LESSTHAN_ONE,
+             "\u6c60\u5927\u5c0f\u5c0f\u4e8e 1\uff01"},
+
+    { ER_INVALID_DRIVER,
+             "\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0\uff01"},
+
+    { ER_NO_STYLESHEETROOT,
+             "\u627e\u4e0d\u5230\u6837\u5f0f\u8868\u6839\u76ee\u5f55\uff01"},
+
+    { ER_ILLEGAL_XMLSPACE_VALUE,
+         "xml:space \u7684\u503c\u975e\u6cd5"},
+
+    { ER_PROCESSFROMNODE_FAILED,
+         "processFromNode \u5931\u8d25"},
+
+    { ER_RESOURCE_COULD_NOT_LOAD,
+        "\u8d44\u6e90 [ {0} ] \u65e0\u6cd5\u88c5\u5165\uff1a{1} \n {2} \t {3}"},
+
+    { ER_BUFFER_SIZE_LESSTHAN_ZERO,
+        "\u7f13\u51b2\u533a\u5927\u5c0f <=0"},
+
+    { ER_UNKNOWN_ERROR_CALLING_EXTENSION,
+        "\u8c03\u7528\u6269\u5c55\u65f6\u53d1\u751f\u672a\u77e5\u9519\u8bef"},
+
+    { ER_NO_NAMESPACE_DECL,
+        "\u524d\u7f00 {0} \u6ca1\u6709\u76f8\u5e94\u7684\u540d\u79f0\u7a7a\u95f4\u58f0\u660e"},
+
+    { ER_ELEM_CONTENT_NOT_ALLOWED,
+        "lang=javaclass {0} \u4e0d\u5141\u8bb8\u51fa\u73b0\u5143\u7d20\u5185\u5bb9"},
+
+    { ER_STYLESHEET_DIRECTED_TERMINATION,
+        "\u6837\u5f0f\u8868\u5b9a\u5411\u7684\u7ec8\u6b62"},
+
+    { ER_ONE_OR_TWO,
+        "1 \u6216 2"},
+
+    { ER_TWO_OR_THREE,
+        "2 \u6216 3"},
+
+    { ER_COULD_NOT_LOAD_RESOURCE,
+        "\u65e0\u6cd5\u88c5\u5165 {0}\uff08\u68c0\u67e5 CLASSPATH\uff09\uff0c\u73b0\u5728\u53ea\u4f7f\u7528\u7f3a\u7701\u503c"},
+
+    { ER_CANNOT_INIT_DEFAULT_TEMPLATES,
+        "\u65e0\u6cd5\u521d\u59cb\u5316\u7f3a\u7701\u6a21\u677f"},
+
+    { ER_RESULT_NULL,
+        "\u7ed3\u679c\u4e0d\u5e94\u4e3a\u7a7a"},
+
+    { ER_RESULT_COULD_NOT_BE_SET,
+        "\u65e0\u6cd5\u8bbe\u7f6e\u7ed3\u679c"},
+
+    { ER_NO_OUTPUT_SPECIFIED,
+        "\u672a\u6307\u5b9a\u8f93\u51fa"},
+
+    { ER_CANNOT_TRANSFORM_TO_RESULT_TYPE,
+        "\u65e0\u6cd5\u8f6c\u6362\u6210\u7c7b\u578b\u4e3a {0} \u7684\u7ed3\u679c"},
+
+    { ER_CANNOT_TRANSFORM_SOURCE_TYPE,
+        "\u65e0\u6cd5\u8f6c\u6362\u7c7b\u578b\u4e3a {0} \u7684\u6e90"},
+
+    { ER_NULL_CONTENT_HANDLER,
+        "\u5185\u5bb9\u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
+
+    { ER_NULL_ERROR_HANDLER,
+        "\u9519\u8bef\u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
+
+    { ER_CANNOT_CALL_PARSE,
+        "\u5982\u679c\u6ca1\u6709\u8bbe\u7f6e ContentHandler\uff0c\u5219\u65e0\u6cd5\u8c03\u7528\u89e3\u6790"},
+
+    { ER_NO_PARENT_FOR_FILTER,
+        "\u8fc7\u6ee4\u5668\u65e0\u7236\u4ee3"},
+
+    { ER_NO_STYLESHEET_IN_MEDIA,
+         "\u5728 {0} \u4e2d\u627e\u4e0d\u5230\u6837\u5f0f\u8868\uff0c\u4ecb\u8d28 = {1}"},
+
+    { ER_NO_STYLESHEET_PI,
+         "\u5728 {0} \u4e2d\u627e\u4e0d\u5230 xml-stylesheet PI"},
+
+    { ER_NOT_SUPPORTED,
+       "\u4e0d\u652f\u6301\uff1a{0}"},
+
+    { ER_PROPERTY_VALUE_BOOLEAN,
+       "\u7279\u6027 {0} \u7684\u503c\u5e94\u5f53\u662f\u5e03\u5c14\u5b9e\u4f8b"},
+
+    { ER_COULD_NOT_FIND_EXTERN_SCRIPT,
+         "\u627e\u4e0d\u5230 {0} \u4e0a\u7684\u5916\u90e8\u811a\u672c"},
+
+    { ER_RESOURCE_COULD_NOT_FIND,
+        "\u627e\u4e0d\u5230\u8d44\u6e90 [ {0} ]\u3002\n {1}"},
+
+    { ER_OUTPUT_PROPERTY_NOT_RECOGNIZED,
+        "\u672a\u8bc6\u522b\u51fa\u8f93\u51fa\u5c5e\u6027\uff1a{0}"},
+
+    { ER_FAILED_CREATING_ELEMLITRSLT,
+        "\u521b\u5efa ElemLiteralResult \u5b9e\u4f8b\u5931\u8d25"},
+
+  //Earlier (JDK 1.4 XALAN 2.2-D11) at key code '204' the key name was ER_PRIORITY_NOT_PARSABLE
+  // In latest Xalan code base key name is  ER_VALUE_SHOULD_BE_NUMBER. This should also be taken care
+  //in locale specific files like XSLTErrorResources_de.java, XSLTErrorResources_fr.java etc.
+  //NOTE: Not only the key name but message has also been changed.
+
+    { ER_VALUE_SHOULD_BE_NUMBER,
+        "{0} \u7684\u503c\u5e94\u5f53\u5305\u542b\u53ef\u8fdb\u884c\u89e3\u6790\u7684\u6570\u5b57"},
+
+    { ER_VALUE_SHOULD_EQUAL,
+        "{0} \u7684\u503c\u5e94\u5f53\u7b49\u4e8e yes \u6216 no"},
+
+    { ER_FAILED_CALLING_METHOD,
+        "\u8c03\u7528 {0} \u65b9\u6cd5\u5931\u8d25"},
+
+    { ER_FAILED_CREATING_ELEMTMPL,
+        "\u521b\u5efa ElemTemplateElement \u5b9e\u4f8b\u5931\u8d25"},
+
+    { ER_CHARS_NOT_ALLOWED,
+        "\u6b64\u65f6\u6587\u6863\u4e2d\u4e0d\u5141\u8bb8\u6709\u5b57\u7b26"},
+
+    { ER_ATTR_NOT_ALLOWED,
+        "{1} \u5143\u7d20\u4e0a\u4e0d\u5141\u8bb8\u4f7f\u7528\u201c{0}\u201d\u5c5e\u6027\uff01"},
+
+    { ER_BAD_VALUE,
+     "{0} \u9519\u8bef\u503c {1}"},
+
+    { ER_ATTRIB_VALUE_NOT_FOUND,
+     "\u627e\u4e0d\u5230 {0} \u5c5e\u6027\u503c"},
+
+    { ER_ATTRIB_VALUE_NOT_RECOGNIZED,
+     "\u672a\u8bc6\u522b\u51fa {0} \u5c5e\u6027\u503c"},
+
+    { ER_NULL_URI_NAMESPACE,
+     "\u6b63\u5728\u8bd5\u56fe\u4ee5\u7a7a\u7684 URI \u751f\u6210\u540d\u79f0\u7a7a\u95f4\u524d\u7f00"},
+
+  //New ERROR keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
+
+    { ER_NUMBER_TOO_BIG,
+     "\u6b63\u5728\u8bd5\u56fe\u683c\u5f0f\u5316\u5927\u4e8e\u6700\u5927\u957f\u6574\u6570\u7684\u6570\u5b57"},
+
+    { ER_CANNOT_FIND_SAX1_DRIVER,
+     "\u627e\u4e0d\u5230 SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0}"},
+
+    { ER_SAX1_DRIVER_NOT_LOADED,
+     "\u627e\u5230\u4e86 SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0}\uff0c\u4f46\u65e0\u6cd5\u88c5\u5165\u5b83"},
+
+    { ER_SAX1_DRIVER_NOT_INSTANTIATED,
+     "\u88c5\u5165\u4e86 SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0}\uff0c\u4f46\u65e0\u6cd5\u5c06\u5b83\u5b9e\u4f8b\u5316"},
+
+    { ER_SAX1_DRIVER_NOT_IMPLEMENT_PARSER,
+     "SAX1 \u9a71\u52a8\u7a0b\u5e8f\u7c7b {0} \u4e0d\u5b9e\u73b0 org.xml.sax.Parser"},
+
+    { ER_PARSER_PROPERTY_NOT_SPECIFIED,
+     "\u6ca1\u6709\u6307\u5b9a\u7cfb\u7edf\u5c5e\u6027 org.xml.sax.parser"},
+
+    { ER_PARSER_ARG_CANNOT_BE_NULL,
+     "\u89e3\u6790\u5668\u53c2\u6570\u4e0d\u5f97\u4e3a\u7a7a"},
+
+    { ER_FEATURE,
+     "\u7279\u5f81\uff1a{0}"},
+
+    { ER_PROPERTY,
+     "\u5c5e\u6027\uff1a{0}"},
+
+    { ER_NULL_ENTITY_RESOLVER,
+     "\u5b9e\u4f53\u89e3\u6790\u5668\u4e3a\u7a7a"},
+
+    { ER_NULL_DTD_HANDLER,
+     "DTD \u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
+
+    { ER_NO_DRIVER_NAME_SPECIFIED,
+     "\u672a\u6307\u5b9a\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0\uff01"},
+
+    { ER_NO_URL_SPECIFIED,
+     "\u672a\u6307\u5b9a URL\uff01"},
+
+    { ER_POOLSIZE_LESS_THAN_ONE,
+     "\u6c60\u5927\u5c0f\u5c0f\u4e8e 1\uff01"},
+
+    { ER_INVALID_DRIVER_NAME,
+     "\u6307\u5b9a\u4e86\u65e0\u6548\u7684\u9a71\u52a8\u7a0b\u5e8f\u540d\u79f0\uff01"},
+
+    { ER_ERRORLISTENER,
+     "ErrorListener"},
+
+
+// Note to translators:  The following message should not normally be displayed
+//   to users.  It describes a situation in which the processor has detected
+//   an internal consistency problem in itself, and it provides this message
+//   for the developer to help diagnose the problem.  The name
+//   'ElemTemplateElement' is the name of a class, and should not be
+//   translated.
+    { ER_ASSERT_NO_TEMPLATE_PARENT,
+     "\u7a0b\u5e8f\u5458\u7684\u9519\u8bef\uff01\u8868\u8fbe\u5f0f\u6ca1\u6709 ElemTemplateElement \u7236\u4ee3\uff01"},
+
+
+// Note to translators:  The following message should not normally be displayed
+//   to users.  It describes a situation in which the processor has detected
+//   an internal consistency problem in itself, and it provides this message
+//   for the developer to help diagnose the problem.  The substitution text
+//   provides further information in order to diagnose the problem.  The name
+//   'RedundentExprEliminator' is the name of a class, and should not be
+//   translated.
+    { ER_ASSERT_REDUNDENT_EXPR_ELIMINATOR,
+     "\u7a0b\u5e8f\u5458\u5728 RedundentExprEliminator \u4e2d\u7684\u65ad\u8a00\uff1a{0}"},
+
+    { ER_NOT_ALLOWED_IN_POSITION,
+     "\u6837\u5f0f\u8868\u7684\u6b64\u4f4d\u7f6e\u4e2d\u4e0d\u5141\u8bb8\u6709 {0}\uff01"},
+
+    { ER_NONWHITESPACE_NOT_ALLOWED_IN_POSITION,
+     "\u6837\u5f0f\u8868\u7684\u6b64\u4f4d\u7f6e\u4e2d\u4e0d\u5141\u8bb8\u6709\u975e\u7a7a\u683c\u7684\u6587\u672c\uff01"},
+
+  // This code is shared with warning codes.
+  // SystemId Unknown
+    { INVALID_TCHAR,
+     "\u7528\u4e8e CHAR \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5\u3002\u7c7b\u578b CHAR \u7684\u5c5e\u6027\u5fc5\u987b\u53ea\u6709 1 \u4e2a\u5b57\u7b26\uff01"},
+
+    // Note to translators:  The following message is used if the value of
+    // an attribute in a stylesheet is invalid.  "QNAME" is the XML data-type of
+    // the attribute, and should not be translated.  The substitution text {1} is
+    // the attribute value and {0} is the attribute name.
+    //The following codes are shared with the warning codes...
+    { INVALID_QNAME,
+     "\u7528\u4e8e QNAME \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
+
+    // Note to translators:  The following message is used if the value of
+    // an attribute in a stylesheet is invalid.  "ENUM" is the XML data-type of
+    // the attribute, and should not be translated.  The substitution text {1} is
+    // the attribute value, {0} is the attribute name, and {2} is a list of valid
+    // values.
+    { INVALID_ENUM,
+     "\u7528\u4e8e ENUM \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5\u3002\u6709\u6548\u7684\u503c\u662f\uff1a{2}\u3002"},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "NMTOKEN" is the XML data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+    { INVALID_NMTOKEN,
+     "\u7528\u4e8e NMTOKEN \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "NCNAME" is the XML data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+    { INVALID_NCNAME,
+     "\u7528\u4e8e NCNAME \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "boolean" is the XSLT data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+    { INVALID_BOOLEAN,
+     "\u7528\u4e8e boolean \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
+
+// Note to translators:  The following message is used if the value of
+// an attribute in a stylesheet is invalid.  "number" is the XSLT data-type
+// of the attribute, and should not be translated.  The substitution text {1} is
+// the attribute value and {0} is the attribute name.
+     { INVALID_NUMBER,
+     "\u7528\u4e8e number \u5c5e\u6027 {0} \u7684\u503c {1} \u975e\u6cd5"},
+
+
+  // End of shared codes...
+
+// Note to translators:  A "match pattern" is a special form of XPath expression
+// that is used for matching patterns.  The substitution text is the name of
+// a function.  The message indicates that when this function is referenced in
+// a match pattern, its argument must be a string literal (or constant.)
+// ER_ARG_LITERAL - new error message for bugzilla //5202
+    { ER_ARG_LITERAL,
+     "\u5339\u914d\u6a21\u5f0f\u4e2d {0} \u7684\u81ea\u53d8\u91cf\u5fc5\u987b\u662f\u6587\u5b57\u3002"},
+
+// Note to translators:  The following message indicates that two definitions of
+// a variable.  A "global variable" is a variable that is accessible everywher
+// in the stylesheet.
+// ER_DUPLICATE_GLOBAL_VAR - new error message for bugzilla #790
+    { ER_DUPLICATE_GLOBAL_VAR,
+     "\u5168\u5c40\u53d8\u91cf\u7684\u58f0\u660e\u91cd\u590d\u3002"},
+
+
+// Note to translators:  The following message indicates that two definitions of
+// a variable were encountered.
+// ER_DUPLICATE_VAR - new error message for bugzilla #790
+    { ER_DUPLICATE_VAR,
+     "\u53d8\u91cf\u58f0\u660e\u91cd\u590d\u3002"},
+
+    // Note to translators:  "xsl:template, "name" and "match" are XSLT keywords
+    // which must not be translated.
+    // ER_TEMPLATE_NAME_MATCH - new error message for bugzilla #789
+    { ER_TEMPLATE_NAME_MATCH,
+     "xsl:template \u5fc5\u987b\u6709\u4e00\u4e2a name \u6216 match \u5c5e\u6027\uff08\u6216\u4e24\u8005\u517c\u6709\uff09"},
+
+    // Note to translators:  "exclude-result-prefixes" is an XSLT keyword which
+    // should not be translated.  The message indicates that a namespace prefix
+    // encountered as part of the value of the exclude-result-prefixes attribute
+    // was in error.
+    // ER_INVALID_PREFIX - new error message for bugzilla #788
+    { ER_INVALID_PREFIX,
+     "exclude-result-prefixes \u4e2d\u7684\u524d\u7f00\u65e0\u6548\uff1a{0}"},
+
+    // Note to translators:  An "attribute set" is a set of attributes that can
+    // be added to an element in the output document as a group.  The message
+    // indicates that there was a reference to an attribute set named {0} that
+    // was never defined.
+    // ER_NO_ATTRIB_SET - new error message for bugzilla #782
+    { ER_NO_ATTRIB_SET,
+     "\u540d\u4e3a {0} \u7684\u5c5e\u6027\u96c6\u4e0d\u5b58\u5728"},
+
+    // Note to translators:  This message indicates that there was a reference
+    // to a function named {0} for which no function definition could be found.
+    { ER_FUNCTION_NOT_FOUND,
+     "\u540d\u4e3a {0} \u7684\u51fd\u6570\u4e0d\u5b58\u5728"},
+
+    // Note to translators:  This message indicates that the XSLT instruction
+    // that is named by the substitution text {0} must not contain other XSLT
+    // instructions (content) or a "select" attribute.  The word "select" is
+    // an XSLT keyword in this case and must not be translated.
+    { ER_CANT_HAVE_CONTENT_AND_SELECT,
+     "{0} \u5143\u7d20\u4e0d\u5f97\u540c\u65f6\u5177\u6709\u5185\u5bb9\u548c select \u5c5e\u6027\u3002"},
+
+    // Note to translators:  This message indicates that the value argument
+    // of setParameter must be a valid Java Object.
+    { ER_INVALID_SET_PARAM_VALUE,
+     "\u53c2\u6570 {0} \u7684\u503c\u5fc5\u987b\u4e3a\u6709\u6548\u7684 Java \u5bf9\u8c61"},
+
+        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT,
+         "xsl:namespace-alias \u5143\u7d20\u7684 result-prefix \u5c5e\u6027\u542b\u6709\u201c#default\u201d\u503c\uff0c\u4f46\u5728\u8be5\u5143\u7d20\u7684\u4f5c\u7528\u57df\u4e2d\u6ca1\u6709\u7f3a\u7701\u540d\u79f0\u7a7a\u95f4\u7684\u58f0\u660e\u3002"},
+
+        { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX,
+         "xsl:namespace-alias \u5143\u7d20\u7684 result-prefix \u5c5e\u6027\u542b\u6709\u201c{0}\u201d\u503c\uff0c\u4f46\u662f\u5728\u8be5\u5143\u7d20\u7684\u4f5c\u7528\u57df\u4e2d\u6ca1\u6709\u524d\u7f00\u201c{0}\u201d\u7684\u540d\u79f0\u7a7a\u95f4\u58f0\u660e\u3002"},
+
+    { ER_SET_FEATURE_NULL_NAME,
+      "\u5728 TransformerFactory.setFeature(String name, boolean value) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
+
+    { ER_GET_FEATURE_NULL_NAME,
+      "\u5728 TransformerFactory.getFeature(String name) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
+
+    { ER_UNSUPPORTED_FEATURE,
+      "\u65e0\u6cd5\u5bf9\u6b64 TransformerFactory \u8bbe\u7f6e\u7279\u5f81\u201c{0}\u201d\u3002"},
+
+    { ER_EXTENSION_ELEMENT_NOT_ALLOWED_IN_SECURE_PROCESSING,
+        "\u5f53\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u6269\u5c55\u5143\u7d20\u201c{0}\u201d\u3002"},
+
+        { ER_NAMESPACE_CONTEXT_NULL_NAMESPACE,
+          "\u65e0\u6cd5\u4e3a\u7a7a\u540d\u79f0\u7a7a\u95f4 uri \u83b7\u53d6\u524d\u7f00\u3002"},
+
+        { ER_NAMESPACE_CONTEXT_NULL_PREFIX,
+          "\u65e0\u6cd5\u4e3a\u7a7a\u524d\u7f00\u83b7\u53d6\u540d\u79f0\u7a7a\u95f4 uri\u3002"},
+
+        { ER_XPATH_RESOLVER_NULL_QNAME,
+          "\u51fd\u6570\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
+
+        { ER_XPATH_RESOLVER_NEGATIVE_ARITY,
+          "\u6570\u91cf\u4e0d\u80fd\u4e3a\u8d1f\u3002"},
+
+  // Warnings...
+
+    { WG_FOUND_CURLYBRACE,
+      "\u627e\u5230\u201c}\u201d\uff0c\u4f46\u6ca1\u6709\u6253\u5f00\u5c5e\u6027\u6a21\u677f\uff01"},
+
+    { WG_COUNT_ATTRIB_MATCHES_NO_ANCESTOR,
+      "\u8b66\u544a\uff1acount \u5c5e\u6027\u4e0e xsl:number \u4e2d\u7684\u4e0a\u7ea7\u4e0d\u5339\u914d\uff01\u76ee\u6807 = {0}"},
+
+    { WG_EXPR_ATTRIB_CHANGED_TO_SELECT,
+      "\u65e7\u8bed\u6cd5\uff1a\u201cexpr\u201d\u5c5e\u6027\u7684\u540d\u79f0\u5df2\u7ecf\u66f4\u6539\u4e3a\u201cselect\u201d\u3002"},
+
+    { WG_NO_LOCALE_IN_FORMATNUMBER,
+      "Xalan \u5728 format-number \u51fd\u6570\u4e2d\u5c1a\u672a\u5904\u7406\u8bed\u8a00\u73af\u5883\u540d\u3002"},
+
+    { WG_LOCALE_NOT_FOUND,
+      "\u8b66\u544a\uff1a\u627e\u4e0d\u5230 xml:lang={0} \u7684\u8bed\u8a00\u73af\u5883"},
+
+    { WG_CANNOT_MAKE_URL_FROM,
+      "\u65e0\u6cd5\u4ece {0} \u751f\u6210 URL"},
+
+    { WG_CANNOT_LOAD_REQUESTED_DOC,
+      "\u65e0\u6cd5\u88c5\u5165\u8bf7\u6c42\u7684\u6587\u6863\uff1a{0}"},
+
+    { WG_CANNOT_FIND_COLLATOR,
+      "\u627e\u4e0d\u5230 <sort xml:lang={0} \u7684\u6574\u7406\u5668"},
+
+    { WG_FUNCTIONS_SHOULD_USE_URL,
+      "\u65e7\u8bed\u6cd5\uff1a\u51fd\u6570\u6307\u4ee4\u5e94\u5f53\u4f7f\u7528 {0} \u7684 URL"},
+
+    { WG_ENCODING_NOT_SUPPORTED_USING_UTF8,
+      "\u4e0d\u652f\u6301\u7f16\u7801\uff1a{0}\uff0c\u6b63\u5728\u4f7f\u7528 UTF-8"},
+
+    { WG_ENCODING_NOT_SUPPORTED_USING_JAVA,
+      "\u4e0d\u652f\u6301\u7f16\u7801\uff1a{0}\uff0c\u6b63\u5728\u4f7f\u7528 Java {1}"},
+
+    { WG_SPECIFICITY_CONFLICTS,
+      "\u53d1\u73b0\u7279\u6027\u51b2\u7a81\uff1a\u5c06\u4f7f\u7528\u6837\u5f0f\u8868\u4e2d\u6700\u540e\u627e\u5230\u7684 {0}\u3002"},
+
+    { WG_PARSING_AND_PREPARING,
+      "========= \u89e3\u6790\u548c\u51c6\u5907 {0} =========="},
+
+    { WG_ATTR_TEMPLATE,
+     "\u5c5e\u6027\u6a21\u677f\uff0c{0}"},
+
+    { WG_CONFLICT_BETWEEN_XSLSTRIPSPACE_AND_XSLPRESERVESPACE,
+      "xsl:strip-space \u548c xsl:preserve-space \u4e4b\u95f4\u7684\u5339\u914d\u51b2\u7a81"},
+
+    { WG_ATTRIB_NOT_HANDLED,
+      "Xalan \u5c1a\u672a\u5904\u7406 {0} \u5c5e\u6027\uff01"},
+
+    { WG_NO_DECIMALFORMAT_DECLARATION,
+      "\u627e\u4e0d\u5230\u5341\u8fdb\u5236\u683c\u5f0f\u7684\u58f0\u660e\uff1a{0}"},
+
+    { WG_OLD_XSLT_NS,
+     "XSLT \u540d\u79f0\u7a7a\u95f4\u4e22\u5931\u6216\u4e0d\u6b63\u786e\u3002"},
+
+    { WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED,
+      "\u53ea\u5141\u8bb8\u4e00\u4e2a\u7f3a\u7701\u7684 xsl:decimal-format \u58f0\u660e\u3002"},
+
+    { WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE,
+      "xsl:decimal-format \u540d\u79f0\u5fc5\u987b\u662f\u552f\u4e00\u7684\u3002\u540d\u79f0\u201c{0}\u201d\u6709\u91cd\u590d\u3002"},
+
+    { WG_ILLEGAL_ATTRIBUTE,
+      "{0} \u6709\u4e00\u4e2a\u975e\u6cd5\u5c5e\u6027\uff1a{1}"},
+
+    { WG_COULD_NOT_RESOLVE_PREFIX,
+      "\u65e0\u6cd5\u89e3\u6790\u540d\u79f0\u7a7a\u95f4\u524d\u7f00\uff1a{0}\u3002\u5c06\u5ffd\u7565\u8be5\u8282\u70b9\u3002"},
+
+    { WG_STYLESHEET_REQUIRES_VERSION_ATTRIB,
+      "xsl:stylesheet \u9700\u8981\u201cversion\u201d\u5c5e\u6027\uff01"},
+
+    { WG_ILLEGAL_ATTRIBUTE_NAME,
+      "\u975e\u6cd5\u5c5e\u6027\u540d\u79f0\uff1a{0}"},
+
+    { WG_ILLEGAL_ATTRIBUTE_VALUE,
+      "\u7528\u4e8e\u5c5e\u6027 {0} \u7684\u503c\u975e\u6cd5\uff1a{1}"},
+
+    { WG_EMPTY_SECOND_ARG,
+      "\u4ece\u6587\u6863\u51fd\u6570\u7684\u7b2c\u4e8c\u53c2\u6570\u4ea7\u751f\u7684\u8282\u70b9\u96c6\u662f\u7a7a\u7684\u3002\u8fd4\u56de\u4e00\u4e2a\u7a7a\u8282\u70b9\u96c6\u3002"},
+
+  //Following are the new WARNING keys added in XALAN code base after Jdk 1.4 (Xalan 2.2-D11)
+
+    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
+    // and must not be translated.
+    { WG_PROCESSINGINSTRUCTION_NAME_CANT_BE_XML,
+      "xsl:processing-instruction \u540d\u79f0\u7684\u201cname\u201d\u5c5e\u6027\u7684\u503c\u4e0d\u5f97\u4e3a\u201cxml\u201d"},
+
+    // Note to translators:  "name" and "xsl:processing-instruction" are keywords
+    // and must not be translated.  "NCName" is an XML data-type and must not be
+    // translated.
+    { WG_PROCESSINGINSTRUCTION_NOTVALID_NCNAME,
+      "xsl:processing-instruction \u7684\u201cname\u201d\u5c5e\u6027\u7684\u503c\u5fc5\u987b\u662f\u6709\u6548\u7684 NCName\uff1a{0}"},
+
+    // Note to translators:  This message is reported if the stylesheet that is
+    // being processed attempted to construct an XML document with an attribute in a
+    // place other than on an element.  The substitution text specifies the name of
+    // the attribute.
+    { WG_ILLEGAL_ATTRIBUTE_POSITION,
+      "\u5728\u751f\u6210\u5b50\u8282\u70b9\u4e4b\u540e\u6216\u5728\u751f\u6210\u5143\u7d20\u4e4b\u524d\u65e0\u6cd5\u6dfb\u52a0\u5c5e\u6027 {0}\u3002\u5c06\u5ffd\u7565\u5c5e\u6027\u3002"},
+
+    { NO_MODIFICATION_ALLOWED_ERR,
+      "\u8bd5\u56fe\u4fee\u6539\u4e0d\u5141\u8bb8\u4fee\u6539\u7684\u5bf9\u8c61\u3002"
+    },
+
+    //Check: WHY THERE IS A GAP B/W NUMBERS in the XSLTErrorResources properties file?
+
+  // Other miscellaneous text used inside the code...
+  { "ui_language", "zh"},
+  {  "help_language",  "zh" },
+  {  "language",  "zh" },
+  { "BAD_CODE", "createMessage \u7684\u53c2\u6570\u8d85\u51fa\u8303\u56f4"},
+  {  "FORMAT_FAILED", "\u5728 messageFormat \u8c03\u7528\u8fc7\u7a0b\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38"},
+  {  "version", ">>>>>>> Xalan \u7248\u672c"},
+  {  "version2",  "<<<<<<<"},
+  {  "yes", "\u662f"},
+  { "line", "\u884c\u53f7"},
+  { "column","\u5217\u53f7"},
+  { "xsldone", "XSLProcessor\uff1a\u5b8c\u6210"},
+
+
+  // Note to translators:  The following messages provide usage information
+  // for the Xalan Process command line.  "Process" is the name of a Java class,
+  // and should not be translated.
+  { "xslProc_option", "Xalan-J \u547d\u4ee4\u884c Process \u7c7b\u9009\u9879\uff1a"},
+  { "xslProc_option", "Xalan-J \u547d\u4ee4\u884c Process \u7c7b\u9009\u9879\uff1a"},
+  { "xslProc_invalid_xsltc_option", "\u5728 XSLTC \u65b9\u5f0f\u4e2d\uff0c\u4e0d\u652f\u6301\u9009\u9879 {0}\u3002"},
+  { "xslProc_invalid_xalan_option", "\u9009\u9879 {0} \u53ea\u80fd\u4e0e -XSLTC \u4e00\u8d77\u4f7f\u7528\u3002"},
+  { "xslProc_no_input", "\u9519\u8bef\uff1a\u6ca1\u6709\u6307\u5b9a\u6837\u5f0f\u8868\u6216\u8f93\u5165 xml\u3002\u4e0d\u5e26\u4efb\u4f55\u9009\u9879\u8fd0\u884c\u6b64\u547d\u4ee4\uff0c\u4ee5\u4e86\u89e3\u4f7f\u7528\u8bf4\u660e\u3002"},
+  { "xslProc_common_options", "\uff0d \u5e38\u7528\u9009\u9879 \uff0d"},
+  { "xslProc_xalan_options", "\u2015 Xalan \u9009\u9879 \u2015"},
+  { "xslProc_xsltc_options", "\u2015 XSLTC \u9009\u9879 \u2015"},
+  { "xslProc_return_to_continue", "\uff08\u8bf7\u6309 <return> \u952e\u7ee7\u7eed\uff09"},
+
+   // Note to translators: The option name and the parameter name do not need to
+   // be translated. Only translate the messages in parentheses.  Note also that
+   // leading whitespace in the messages is used to indent the usage information
+   // for each option in the English messages.
+   // Do not translate the keywords: XSLTC, SAX, DOM and DTM.
+  { "optionXSLTC", "   [-XSLTC \uff08\u4f7f\u7528 XSLTC \u8f6c\u6362\uff09]"},
+  { "optionIN", "   [-IN inputXMLURL]"},
+  { "optionXSL", "[-XSL XSLTransformationURL]"},
+  { "optionOUT",  "[-OUT outputFileName]"},
+  { "optionLXCIN", "[-LXCIN compiledStylesheetFileNameIn]"},
+  { "optionLXCOUT", "[-LXCOUT compiledStylesheetFileNameOutOut]"},
+  { "optionPARSER", "   [-PARSER fully qualified class name of parser liaison]"},
+  {  "optionE", "[-E \uff08\u4e0d\u8981\u5c55\u5f00\u5b9e\u4f53\u5f15\u7528\uff09]"},
+  {  "optionV",  "[-E \uff08\u4e0d\u8981\u5c55\u5f00\u5b9e\u4f53\u5f15\u7528\uff09]"},
+  {  "optionQC", "[-QC \uff08\u9759\u9ed8\u6a21\u5f0f\u51b2\u7a81\u8b66\u544a\uff09]"},
+  {  "optionQ", "[-Q \uff08\u9759\u9ed8\u65b9\u5f0f\uff09]"},
+  {  "optionLF", "[-LF \uff08\u4ec5\u5728\u8f93\u51fa\u65f6\u4f7f\u7528\u6362\u884c {\u7f3a\u7701\u503c\u662f CR/LF}\uff09]"},
+  {  "optionCR", "[-CR \uff08\u4ec5\u5728\u8f93\u51fa\u65f6\u4f7f\u7528\u56de\u8f66\u7b26 {\u7f3a\u7701\u503c\u662f CR/LF}\uff09]"},
+  { "optionESCAPE", "[-ESCAPE \uff08\u8bbe\u7f6e\u8f6c\u4e49\u5b57\u7b26 {\u7f3a\u7701\u503c\u662f <>&\"\'\\r\\n}\uff09]"},
+  { "optionINDENT", "[-INDENT \uff08\u63a7\u5236\u7f29\u8fdb\u591a\u5c11\u7a7a\u683c {\u7f3a\u7701\u503c\u662f 0}\uff09]"},
+  { "optionTT", "[-TT \uff08\u5728\u6a21\u677f\u88ab\u8c03\u7528\u65f6\u8ddf\u8e2a\u6a21\u677f\u3002\uff09]"},
+  { "optionTG", "[-TG \uff08\u8ddf\u8e2a\u6bcf\u4e00\u4e2a\u751f\u6210\u4e8b\u4ef6\u3002\uff09]"},
+  { "optionTS", "[-TS \uff08\u8ddf\u8e2a\u6bcf\u4e00\u4e2a\u9009\u62e9\u4e8b\u4ef6\u3002\uff09]"},
+  {  "optionTTC", "[-TTC \uff08\u5728\u5b50\u6a21\u677f\u88ab\u5904\u7406\u65f6\u5bf9\u5176\u8fdb\u884c\u8ddf\u8e2a\u3002\uff09]"},
+  { "optionTCLASS", "[-TCLASS \uff08\u8ddf\u8e2a\u6269\u5c55\u7684 TraceListener \u7c7b\u3002\uff09]"},
+  { "optionVALIDATE", "[-VALIDATE \uff08\u8bbe\u7f6e\u662f\u5426\u8fdb\u884c\u9a8c\u8bc1\u3002\u7f3a\u7701\u65f6\u9a8c\u8bc1\u662f\u5173\u95ed\u7684\u3002\uff09]"},
+  { "optionEDUMP", "[-EDUMP {\u53ef\u9009\u6587\u4ef6\u540d} \uff08\u53d1\u751f\u9519\u8bef\u65f6\u5806\u6808\u8f6c\u50a8\u3002\uff09]"},
+  {  "optionXML", "[-XML \uff08\u4f7f\u7528 XML \u683c\u5f0f\u5316\u7a0b\u5e8f\u5e76\u6dfb\u52a0 XML \u5934\u3002\uff09]"},
+  {  "optionTEXT", "[-TEXT \uff08\u4f7f\u7528\u7b80\u5355\u6587\u672c\u683c\u5f0f\u5316\u7a0b\u5e8f\u3002\uff09]"},
+  {  "optionHTML", "[-HTML \uff08\u4f7f\u7528 HTML \u683c\u5f0f\u5316\u7a0b\u5e8f\uff09]"},
+  {  "optionPARAM", "[-PARAM name expression \uff08\u8bbe\u7f6e\u6837\u8bc6\u8868\u53c2\u6570\uff09]"},
+  {  "noParsermsg1", "XSL \u5904\u7406\u4e0d\u6210\u529f\u3002"},
+  {  "noParsermsg2", "** \u627e\u4e0d\u5230\u89e3\u6790\u5668 **"},
+  { "noParsermsg3",  "\u8bf7\u68c0\u67e5\u60a8\u7684\u7c7b\u8def\u5f84\u3002"},
+  { "noParsermsg4", "\u5982\u679c\u6ca1\u6709 IBM \u7684 XML Parser for Java\uff0c\u60a8\u53ef\u4ee5\u4ece\u4ee5\u4e0b\u4f4d\u7f6e\u4e0b\u8f7d\u5b83\uff1a"},
+  { "noParsermsg5", "IBM \u7684 AlphaWorks\uff1ahttp://www.alphaworks.ibm.com/formula/xml"},
+  { "optionURIRESOLVER", "[-URIRESOLVER full class name \uff08\u4f7f\u7528 URIResolver \u89e3\u6790 URI\uff09]"},
+  { "optionENTITYRESOLVER",  "[-ENTITYRESOLVER full class name \uff08\u4f7f\u7528 EntityResolver \u89e3\u6790\u5b9e\u4f53\uff09]"},
+  { "optionCONTENTHANDLER",  "[-CONTENTHANDLER full class name \uff08\u4f7f\u7528 ContentHandler \u4e32\u884c\u5316\u8f93\u51fa\uff09]"},
+  {  "optionLINENUMBERS",  "[-L use line numbers for source document]"},
+  { "optionSECUREPROCESSING", "   [-SECURE \uff08\u5c06\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true\u3002\uff09]"},
+
+    // Following are the new options added in XSLTErrorResources.properties files after Jdk 1.4 (Xalan 2.2-D11)
+
+
+  {  "optionMEDIA",  "   [-MEDIA mediaType \uff08\u4f7f\u7528 media \u5c5e\u6027\u67e5\u627e\u4e0e\u6587\u6863\u5173\u8054\u7684\u6837\u5f0f\u8868\u3002\uff09]"},
+  {  "optionFLAVOR",  "   [-FLAVOR flavorName \uff08\u663e\u5f0f\u4f7f\u7528 s2s=SAX \u6216 d2d=DOM \u8fdb\u884c\u8f6c\u6362\u3002\uff09]"}, // Added by sboag/scurcuru; experimental
+  { "optionDIAG", "[-DIAG \uff08\u6253\u5370\u5168\u90e8\u6beb\u79d2\u8f6c\u6362\u6807\u8bb0\u3002\uff09]"},
+  { "optionINCREMENTAL",  "   [-INCREMENTAL \uff08\u901a\u8fc7\u5c06 http://xml.apache.org/xalan/features/incremental \u8bbe\u7f6e\u4e3a true \u8bf7\u6c42\u589e\u91cf DTM \u6784\u9020\u3002\uff09]"},
+  {  "optionNOOPTIMIMIZE",  "   [-NOOPTIMIMIZE \uff08\u901a\u8fc7\u5c06 http://xml.apache.org/xalan/features/optimize \u8bbe\u7f6e\u4e3a false \u8bf7\u6c42\u65e0\u6837\u5f0f\u8868\u7684\u4f18\u5316\u5904\u7406\u3002\uff09]"},
+  { "optionRL",  "   [-RL recursionlimit \uff08\u65ad\u8a00\u6837\u5f0f\u8868\u9012\u5f52\u6df1\u5ea6\u7684\u6570\u5b57\u6781\u9650\u3002\uff09]"},
+  {   "optionXO",  "[-XO [transletName] \uff08\u65ad\u8a00\u751f\u6210\u7684 translet \u7684\u540d\u79f0\uff09]"},
+  {  "optionXD", "[-XD destinationDirectory \uff08\u6307\u5b9a translet \u7684\u76ee\u6807\u76ee\u5f55\uff09]"},
+  {  "optionXJ",  "[-XJ jarfile \uff08\u5c06 translet \u7c7b\u6253\u5305\u6210\u540d\u79f0\u4e3a <jarfile> \u7684 jar \u6587\u4ef6\uff09]"},
+  {   "optionXP",  "[-XP package \uff08\u6307\u51fa\u6240\u6709\u751f\u6210\u7684 translet \u7c7b\u7684\u8f6f\u4ef6\u5305\u540d\u79f0\u524d\u7f00\uff09]"},
+
+  //AddITIONAL  STRINGS that need L10n
+  // Note to translators:  The following message describes usage of a particular
+  // command-line option that is used to enable the "template inlining"
+  // optimization.  The optimization involves making a copy of the code
+  // generated for a template in another template that refers to it.
+  { "optionXN",  "[-XN \uff08\u542f\u7528\u6a21\u677f\u4ee3\u7801\u5d4c\u5165\uff09]" },
+  { "optionXX",  "[-XX \uff08\u6253\u5f00\u9644\u52a0\u8c03\u8bd5\u6d88\u606f\u8f93\u51fa\uff09]"},
+  { "optionXT" , "[-XT \uff08\u53ef\u80fd\u7684\u8bdd\u4f7f\u7528 translet \u8fdb\u884c\u8f6c\u6362\uff09]"},
+  { "diagTiming","--------- {0} \u901a\u8fc7 {1} \u7684\u8f6c\u6362\u8017\u65f6 {2} \u6beb\u79d2" },
+  { "recursionTooDeep","\u6a21\u677f\u5d4c\u5957\u592a\u6df1\u3002\u5d4c\u5957 = {0}\uff0c\u6a21\u677f {1} {2}" },
+  { "nameIs", "\u540d\u79f0\u4e3a" },
+  { "matchPatternIs", "\u5339\u914d\u6a21\u5f0f\u4e3a" }
+
+  };
+  }
+  // ================= INFRASTRUCTURE ======================
+
+  /** String for use when a bad error code was encountered.    */
+  public static final String BAD_CODE = "BAD_CODE";
+
+  /** String for use when formatting of the error string failed.   */
+  public static final String FORMAT_FAILED = "FORMAT_FAILED";
+
+  /** General error string.   */
+  public static final String ERROR_STRING = "#\u9519\u8bef";
+
+  /** String to prepend to error messages.  */
+  public static final String ERROR_HEADER = "\u9519\u8bef\uff1a";
+
+  /** String to prepend to warning messages.    */
+  public static final String WARNING_HEADER = "\u8b66\u544a\uff1a";
+
+  /** String to specify the XSLT module.  */
+  public static final String XSL_HEADER = "XSLT ";
+
+  /** String to specify the XML parser module.  */
+  public static final String XML_HEADER = "XML ";
+
+  /** I don't think this is used any more.
+   * @deprecated  */
+  public static final String QUERY_HEADER = "PATTERN ";
+
+
+  /**
+   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
+   *   of ResourceBundle.getBundle().
+   *
+   *   @param className the name of the class that implements the resource bundle.
+   *   @return the ResourceBundle
+   *   @throws MissingResourceException
+   */
+  public static final XSLTErrorResources loadResourceBundle(String className)
+          throws MissingResourceException
+  {
+
+    Locale locale = Locale.getDefault();
+    String suffix = getResourceSuffix(locale);
+
+    try
+    {
+
+      // first try with the given locale
+      return (XSLTErrorResources) ResourceBundle.getBundle(className
+              + suffix, locale);
+    }
+    catch (MissingResourceException e)
+    {
+      try  // try to fall back to en_US if we can't load
+      {
+
+        // Since we can't find the localized property file,
+        // fall back to en_US.
+        return (XSLTErrorResources) ResourceBundle.getBundle(className,
+                new Locale("zh", "CN"));
+      }
+      catch (MissingResourceException e2)
+      {
+
+        // Now we are really in trouble.
+        // very bad, definitely very bad...not going to get very far
+        throw new MissingResourceException(
+          "Could not load any resource bundles.", className, "");
+      }
+    }
+  }
+
+  /**
+   * Return the resource file suffic for the indicated locale
+   * For most locales, this will be based the language code.  However
+   * for Chinese, we do distinguish between Taiwan and PRC
+   *
+   * @param locale the locale
+   * @return an String suffix which canbe appended to a resource name
+   */
+  private static final String getResourceSuffix(Locale locale)
+  {
+
+    String suffix = "_" + locale.getLanguage();
+    String country = locale.getCountry();
+
+    if (country.equals("TW"))
+      suffix += "_" + country;
+
+    return suffix;
+  }
+
+
+}
diff --git a/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_sl.java b/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_sl.java
old mode 100755
new mode 100644
index 8af157c..0110341
--- a/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_sl.java
+++ b/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_sl.java
@@ -1,913 +1,913 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: ErrorMessages_sl.java,v 1.25 2004/12/15 17:35:40 jycli Exp $
- */
-
-package org.apache.xalan.xsltc.compiler.util;
-
-import java.util.ListResourceBundle;
-
-/**
- * @author Morten Jorgensen
- */
-public class ErrorMessages_sl extends ListResourceBundle {
-
-/*
- * XSLTC compile-time error messages.
- *
- * General notes to translators and definitions:
- *
- *   1) XSLTC is the name of the product.  It is an acronym for "XSLT Compiler".
- *      XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *
- *   2) A stylesheet is a description of how to transform an input XML document
- *      into a resultant XML document (or HTML document or text).  The
- *      stylesheet itself is described in the form of an XML document.
- *
- *   3) A template is a component of a stylesheet that is used to match a
- *      particular portion of an input document and specifies the form of the
- *      corresponding portion of the output document.
- *
- *   4) An axis is a particular "dimension" in a tree representation of an XML
- *      document; the nodes in the tree are divided along different axes.
- *      Traversing the "child" axis, for instance, means that the program
- *      would visit each child of a particular node; traversing the "descendant"
- *      axis means that the program would visit the child nodes of a particular
- *      node, their children, and so on until the leaf nodes of the tree are
- *      reached.
- *
- *   5) An iterator is an object that traverses nodes in a tree along a
- *      particular axis, one at a time.
- *
- *   6) An element is a mark-up tag in an XML document; an attribute is a
- *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *      "elem" is an element name, "attr" and "attr2" are attribute names with
- *      the values "val" and "val2", respectively.
- *
- *   7) A namespace declaration is a special attribute that is used to associate
- *      a prefix with a URI (the namespace).  The meanings of element names and
- *      attribute names that use that prefix are defined with respect to that
- *      namespace.
- *
- *   8) DOM is an acronym for Document Object Model.  It is a tree
- *      representation of an XML document.
- *
- *      SAX is an acronym for the Simple API for XML processing.  It is an API
- *      used inform an XML processor (in this case XSLTC) of the structure and
- *      content of an XML document.
- *
- *      Input to the stylesheet processor can come from an XML parser in the
- *      form of a DOM tree or through the SAX API.
- *
- *   9) DTD is a document type declaration.  It is a way of specifying the
- *      grammar for an XML file, the names and types of elements, attributes,
- *      etc.
- *
- *  10) XPath is a specification that describes a notation for identifying
- *      nodes in a tree-structured representation of an XML document.  An
- *      instance of that notation is referred to as an XPath expression.
- *
- *  11) Translet is an invented term that refers to the class file that contains
- *      the compiled form of a stylesheet.
- */
-
-    // These message should be read from a locale-specific resource bundle
-    /** Get the lookup table for error messages.
-     *
-     * @return The message lookup table.
-     */
-    public Object[][] getContents()
-    {
-      return new Object[][] {
-        {ErrorMsg.MULTIPLE_STYLESHEET_ERR,
-        "V isti datoteki je dolo\u010denih ve\u010d slogovnih datotek."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a
-         * template.  The same name was used on two different templates in the
-         * same stylesheet.
-         */
-        {ErrorMsg.TEMPLATE_REDEF_ERR,
-        "Predloga ''{0}'' je \u017ee dolo\u010dena v tej slogovni datoteki."},
-
-
-        /*
-         * Note to translators:  The substitution text is the name of a
-         * template.  A reference to the template name was encountered, but the
-         * template is undefined.
-         */
-        {ErrorMsg.TEMPLATE_UNDEF_ERR,
-        "Predloga ''{0}'' ni dolo\u010dena v tej slogovni datoteki."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a variable
-         * that was defined more than once.
-         */
-        {ErrorMsg.VARIABLE_REDEF_ERR,
-        "Spremenljivka ''{0}'' je ve\u010dkrat dolo\u010dena znotraj istega obsega."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a variable
-         * or parameter.  A reference to the variable or parameter was found,
-         * but it was never defined.
-         */
-        {ErrorMsg.VARIABLE_UNDEF_ERR,
-        "Spremenljivka ali parameter ''{0}'' je nedolo\u010den."},
-
-        /*
-         * Note to translators:  The word "class" here refers to a Java class.
-         * Processing the stylesheet required a class to be loaded, but it could
-         * not be found.  The substitution text is the name of the class.
-         */
-        {ErrorMsg.CLASS_NOT_FOUND_ERR,
-        "Ni mogo\u010de najti razreda ''{0}''."},
-
-        /*
-         * Note to translators:  The word "method" here refers to a Java method.
-         * Processing the stylesheet required a reference to the method named by
-         * the substitution text, but it could not be found.  "public" is the
-         * Java keyword.
-         */
-        {ErrorMsg.METHOD_NOT_FOUND_ERR,
-        "Zunanje metode ''{0}'' ni mogo\u010de najti (mora biti javna)."},
-
-        /*
-         * Note to translators:  The word "method" here refers to a Java method.
-         * Processing the stylesheet required a reference to the method named by
-         * the substitution text, but no method with the required types of
-         * arguments or return type could be found.
-         */
-        {ErrorMsg.ARGUMENT_CONVERSION_ERR,
-        "Ni mogo\u010de pretvoriti argumenta / tipa vrnitve v klicu metode ''{0}''"},
-
-        /*
-         * Note to translators:  The file or URI named in the substitution text
-         * is missing.
-         */
-        {ErrorMsg.FILE_NOT_FOUND_ERR,
-        "Datoteke ali URI-ja ''{0}'' ni mogo\u010de najti."},
-
-        /*
-         * Note to translators:  This message is displayed when the URI
-         * mentioned in the substitution text is not well-formed syntactically.
-         */
-        {ErrorMsg.INVALID_URI_ERR,
-        "Neveljaven URI ''{0}''."},
-
-        /*
-         * Note to translators:  The file or URI named in the substitution text
-         * exists but could not be opened.
-         */
-        {ErrorMsg.FILE_ACCESS_ERR,
-        "Datoteke ali URI-ja ''{0}'' ni mogo\u010de odpreti."},
-
-        /*
-         * Note to translators: <xsl:stylesheet> and <xsl:transform> are
-         * keywords that should not be translated.
-         */
-        {ErrorMsg.MISSING_ROOT_ERR,
-        "Pri\u010dakovan element <xsl:stylesheet> ali <xsl:transform>."},
-
-        /*
-         * Note to translators:  The stylesheet contained a reference to a
-         * namespace prefix that was undefined.  The value of the substitution
-         * text is the name of the prefix.
-         */
-        {ErrorMsg.NAMESPACE_UNDEF_ERR,
-        "Predpona imenskega prostora ''{0}'' ni dolo\u010dena."},
-
-        /*
-         * Note to translators:  The Java function named in the stylesheet could
-         * not be found.
-         */
-        {ErrorMsg.FUNCTION_RESOLVE_ERR,
-        "Klica funkcije ''{0}'' ni mogo\u010de razre\u0161iti."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a
-         * function.  A literal string here means a constant string value.
-         */
-        {ErrorMsg.NEED_LITERAL_ERR,
-        "Argument za ''{0}'' mora biti dobesedni niz."},
-
-        /*
-         * Note to translators:  This message indicates there was a syntactic
-         * error in the form of an XPath expression.  The substitution text is
-         * the expression.
-         */
-        {ErrorMsg.XPATH_PARSER_ERR,
-        "Napaka pri raz\u010dlenjevanju izraza XPath ''{0}''."},
-
-        /*
-         * Note to translators:  An element in the stylesheet requires a
-         * particular attribute named by the substitution text, but that
-         * attribute was not specified in the stylesheet.
-         */
-        {ErrorMsg.REQUIRED_ATTR_ERR,
-        "Manjka zahtevani atribut ''{0}''."},
-
-        /*
-         * Note to translators:  This message indicates that a character not
-         * permitted in an XPath expression was encountered.  The substitution
-         * text is the offending character.
-         */
-        {ErrorMsg.ILLEGAL_CHAR_ERR,
-        "Neveljavni znak ''{0}'' v izrazu XPath."},
-
-        /*
-         * Note to translators:  A processing instruction is a mark-up item in
-         * an XML document that request some behaviour of an XML processor.  The
-         * form of the name of was invalid in this case, and the substitution
-         * text is the name.
-         */
-        {ErrorMsg.ILLEGAL_PI_ERR,
-        "Neveljavno ime ''{0}'' za navodila za obdelavo."},
-
-        /*
-         * Note to translators:  This message is reported if the stylesheet
-         * being processed attempted to construct an XML document with an
-         * attribute in a place other than on an element.  The substitution text
-         * specifies the name of the attribute.
-         */
-        {ErrorMsg.STRAY_ATTRIBUTE_ERR,
-        "Atribut ''{0}'' zunaj elementa."},
-
-        /*
-         * Note to translators:  An attribute that wasn't recognized was
-         * specified on an element in the stylesheet.  The attribute is named
-         * by the substitution
-         * text.
-         */
-        {ErrorMsg.ILLEGAL_ATTRIBUTE_ERR,
-        "Neveljaven atribut ''{0}''."},
-
-        /*
-         * Note to translators:  "import" and "include" are keywords that should
-         * not be translated.  This messages indicates that the stylesheet
-         * named in the substitution text imported or included itself either
-         * directly or indirectly.
-         */
-        {ErrorMsg.CIRCULAR_INCLUDE_ERR,
-        "Kro\u017eni uvoz/vklju\u010ditev. Slogovna datoteka ''{0}'' je \u017ee nalo\u017eena."},
-
-        /*
-         * Note to translators:  A result-tree fragment is a portion of a
-         * resulting XML document represented as a tree.  "<xsl:sort>" is a
-         * keyword and should not be translated.
-         */
-        {ErrorMsg.RESULT_TREE_SORT_ERR,
-        "Ne morem razvrstiti fragmentov drevesa rezultatov (elementi <xsl:sort> so prezrti). Pri pripravi drevesa rezultatov morate razvrstiti vozli\u0161\u010da."},
-
-        /*
-         * Note to translators:  A name can be given to a particular style to be
-         * used to format decimal values.  The substitution text gives the name
-         * of such a style for which more than one declaration was encountered.
-         */
-        {ErrorMsg.SYMBOLS_REDEF_ERR,
-        "Decimalno oblikovanje ''{0}'' je \u017ee dolo\u010deno."},
-
-        /*
-         * Note to translators:  The stylesheet version named in the
-         * substitution text is not supported.
-         */
-        {ErrorMsg.XSL_VERSION_ERR,
-        "XSL razli\u010dice ''{0}'' XSLTC ne podpira."},
-
-        /*
-         * Note to translators:  The definitions of one or more variables or
-         * parameters depend on one another.
-         */
-        {ErrorMsg.CIRCULAR_VARIABLE_ERR,
-        "Sklic na kro\u017eno spremenljivko/parameter v ''{0}''."},
-
-        /*
-         * Note to translators:  The operator in an expresion with two operands was
-         * not recognized.
-         */
-        {ErrorMsg.ILLEGAL_BINARY_OP_ERR,
-        "Neznan operator za binarni izraz."},
-
-        /*
-         * Note to translators:  This message is produced if a reference to a
-         * function has too many or too few arguments.
-         */
-        {ErrorMsg.ILLEGAL_ARG_ERR,
-        "Neveljavni argument(i) za klic funkcije."},
-
-        /*
-         * Note to translators:  "document()" is the name of function and must
-         * not be translated.  A node-set is a set of the nodes in the tree
-         * representation of an XML document.
-         */
-        {ErrorMsg.DOCUMENT_ARG_ERR,
-        "Drugi argument funkcije document() mora biti skupina vozli\u0161\u010d."},
-
-        /*
-         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
-         * and should not be translated.  This message describes a syntax error
-         * in the stylesheet.
-         */
-        {ErrorMsg.MISSING_WHEN_ERR,
-        "Zahtevan vsaj en element <xsl:when> v <xsl:choose>."},
-
-        /*
-         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
-         * keywords and should not be translated.  This message describes a
-         * syntax error in the stylesheet.
-         */
-        {ErrorMsg.MULTIPLE_OTHERWISE_ERR,
-        "Dovoljen samo en element <xsl:otherwise> v <xsl:choose>."},
-
-        /*
-         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
-         * keywords and should not be translated.  This message describes a
-         * syntax error in the stylesheet.
-         */
-        {ErrorMsg.STRAY_OTHERWISE_ERR,
-        "<xsl:otherwise> lahko uporabljamo samo znotraj <xsl:choose>."},
-
-        /*
-         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
-         * and should not be translated.  This message describes a syntax error
-         * in the stylesheet.
-         */
-        {ErrorMsg.STRAY_WHEN_ERR,
-        "<xsl:when> lahko uporabljamo samo znotraj <xsl:choose>."},
-
-        /*
-         * Note to translators:  "<xsl:when>", "<xsl:otherwise>" and
-         * "<xsl:choose>" are keywords and should not be translated.  This
-         * message describes a syntax error in the stylesheet.
-         */
-        {ErrorMsg.WHEN_ELEMENT_ERR,
-        "V <xsl:choose> sta dovoljena samo elementa <xsl:when> in <xsl:otherwise>."},
-
-        /*
-         * Note to translators:  "<xsl:attribute-set>" and "name" are keywords
-         * that should not be translated.
-         */
-        {ErrorMsg.UNNAMED_ATTRIBSET_ERR,
-        "V <xsl:attribute-set> manjka atribut 'name'."},
-
-        /*
-         * Note to translators:  An element in the stylesheet contained an
-         * element of a type that it was not permitted to contain.
-         */
-        {ErrorMsg.ILLEGAL_CHILD_ERR,
-        "Neveljavni podrejeni element."},
-
-        /*
-         * Note to translators:  The stylesheet tried to create an element with
-         * a name that was not a valid XML name.  The substitution text contains
-         * the name.
-         */
-        {ErrorMsg.ILLEGAL_ELEM_NAME_ERR,
-        "Elementa ''{0}'' ni mogo\u010de poklicati"},
-
-        /*
-         * Note to translators:  The stylesheet tried to create an attribute
-         * with a name that was not a valid XML name.  The substitution text
-         * contains the name.
-         */
-        {ErrorMsg.ILLEGAL_ATTR_NAME_ERR,
-        "Atributa ''{0}'' ni mogo\u010de poklicati"},
-
-        /*
-         * Note to translators:  The children of the outermost element of a
-         * stylesheet are referred to as top-level elements.  No text should
-         * occur within that outermost element unless it is within a top-level
-         * element.  This message indicates that that constraint was violated.
-         * "<xsl:stylesheet>" is a keyword that should not be translated.
-         */
-        {ErrorMsg.ILLEGAL_TEXT_NODE_ERR,
-        "Tekstovni podatki zunaj elementa na najvi\u0161ji ravni <xsl:stylesheet>."},
-
-        /*
-         * Note to translators:  JAXP is an acronym for the Java API for XML
-         * Processing.  This message indicates that the XML parser provided to
-         * XSLTC to process the XML input document had a configuration problem.
-         */
-        {ErrorMsg.SAX_PARSER_CONFIG_ERR,
-        "Raz\u010dlenjevalnik JAXP ni pravilno konfiguriran"},
-
-        /*
-         * Note to translators:  The substitution text names the internal error
-         * encountered.
-         */
-        {ErrorMsg.INTERNAL_ERR,
-        "Nepopravljiva XSLTC-notranja napaka: ''{0}''"},
-
-        /*
-         * Note to translators:  The stylesheet contained an element that was
-         * not recognized as part of the XSL syntax.  The substitution text
-         * gives the element name.
-         */
-        {ErrorMsg.UNSUPPORTED_XSL_ERR,
-        "Nepodprt XSL element ''{0}''."},
-
-        /*
-         * Note to translators:  The stylesheet referred to an extension to the
-         * XSL syntax and indicated that it was defined by XSLTC, but XSTLC does
-         * not recognized the particular extension named.  The substitution text
-         * gives the extension name.
-         */
-        {ErrorMsg.UNSUPPORTED_EXT_ERR,
-        "Neprepoznana pripona XSLTC ''{0}''."},
-
-        /*
-         * Note to translators:  The XML document given to XSLTC as a stylesheet
-         * was not, in fact, a stylesheet.  XSLTC is able to detect that in this
-         * case because the outermost element in the stylesheet has to be
-         * declared with respect to the XSL namespace URI, but no declaration
-         * for that namespace was seen.
-         */
-        {ErrorMsg.MISSING_XSLT_URI_ERR,
-        "Vhodni dokument ni slogovna datoteka (v korenskem elementu ni naveden imenski prostor XSL)."},
-
-        /*
-         * Note to translators:  XSLTC could not find the stylesheet document
-         * with the name specified by the substitution text.
-         */
-        {ErrorMsg.MISSING_XSLT_TARGET_ERR,
-        "Cilja slogovne datoteke ''{0}'' ni mogo\u010de najti."},
-
-        /*
-         * Note to translators:  This message represents an internal error in
-         * condition in XSLTC.  The substitution text is the class name in XSLTC
-         * that is missing some functionality.
-         */
-        {ErrorMsg.NOT_IMPLEMENTED_ERR,
-        "Ni izvedeno: ''{0}''."},
-
-        /*
-         * Note to translators:  The XML document given to XSLTC as a stylesheet
-         * was not, in fact, a stylesheet.
-         */
-        {ErrorMsg.NOT_STYLESHEET_ERR,
-        "Vhodni dokument ne vsebuje slogovne datoteke XSL."},
-
-        /*
-         * Note to translators:  The element named in the substitution text was
-         * encountered in the stylesheet but is not recognized.
-         */
-        {ErrorMsg.ELEMENT_PARSE_ERR,
-        "Elementa ''{0}'' ni mogo\u010de raz\u010dleniti"},
-
-        /*
-         * Note to translators:  "use", "<key>", "node", "node-set", "string"
-         * and "number" are keywords in this context and should not be
-         * translated.  This message indicates that the value of the "use"
-         * attribute was not one of the permitted values.
-         */
-        {ErrorMsg.KEY_USE_ATTR_ERR,
-        "Atribut uporabe za <key> mora biti vozli\u0161\u010de, skupina vozli\u0161\u010d, niz ali \u0161tevilka."},
-
-        /*
-         * Note to translators:  An XML document can specify the version of the
-         * XML specification to which it adheres.  This message indicates that
-         * the version specified for the output document was not valid.
-         */
-        {ErrorMsg.OUTPUT_VERSION_ERR,
-        "Razli\u010dica izhodnega dokumenta XML mora biti 1.0"},
-
-        /*
-         * Note to translators:  The operator in a comparison operation was
-         * not recognized.
-         */
-        {ErrorMsg.ILLEGAL_RELAT_OP_ERR,
-        "Neznan operator za relacijski izraz"},
-
-        /*
-         * Note to translators:  An attribute set defines as a set of XML
-         * attributes that can be added to an element in the output XML document
-         * as a group.  This message is reported if the name specified was not
-         * used to declare an attribute set.  The substitution text is the name
-         * that is in error.
-         */
-        {ErrorMsg.ATTRIBSET_UNDEF_ERR,
-        "Poskus uporabe neobstoje\u010de skupine atributov ''{0}''."},
-
-        /*
-         * Note to translators:  The term "attribute value template" is a term
-         * defined by XSLT which describes the value of an attribute that is
-         * determined by an XPath expression.  The message indicates that the
-         * expression was syntactically incorrect; the substitution text
-         * contains the expression that was in error.
-         */
-        {ErrorMsg.ATTR_VAL_TEMPLATE_ERR,
-        "Predloge vrednosti atributa ''{0}'' ni mogo\u010de raz\u010dleniti."},
-
-        /*
-         * Note to translators:  ???
-         */
-        {ErrorMsg.UNKNOWN_SIG_TYPE_ERR,
-        "V podpisu za razred ''{0}'' je neznan podatkovni tip."},
-
-        /*
-         * Note to translators:  The substitution text refers to data types.
-         * The message is displayed if a value in a particular context needs to
-         * be converted to type {1}, but that's not possible for a value of
-         * type {0}.
-         */
-        {ErrorMsg.DATA_CONVERSION_ERR,
-        "Ni mogo\u010de pretvoriti podatkovnega tipa ''{0}'' v ''{1}''."},
-
-        /*
-         * Note to translators:  "Templates" is a Java class name that should
-         * not be translated.
-         */
-        {ErrorMsg.NO_TRANSLET_CLASS_ERR,
-        "Te Templates ne vsebujejo veljavne definicije razreda translet."},
-
-        /*
-         * Note to translators:  "Templates" is a Java class name that should
-         * not be translated.
-         */
-        {ErrorMsg.NO_MAIN_TRANSLET_ERR,
-        "Te predloge ne vsebujejo razreda z imenom ''{0}''."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a class.
-         */
-        {ErrorMsg.TRANSLET_CLASS_ERR,
-        "Ni mogo\u010de nalo\u017eiti razreda transleta ''{0}''."},
-
-        {ErrorMsg.TRANSLET_OBJECT_ERR,
-        "Razred transleta je nalo\u017een, vendar priprava primerka transleta ni mogo\u010da."},
-
-        /*
-         * Note to translators:  "ErrorListener" is a Java interface name that
-         * should not be translated.  The message indicates that the user tried
-         * to set an ErrorListener object on object of the class named in the
-         * substitution text with "null" Java value.
-         */
-        {ErrorMsg.ERROR_LISTENER_NULL_ERR,
-        "Poskus nastavitve ErrorListener za ''{0}'' na null"},
-
-        /*
-         * Note to translators:  StreamSource, SAXSource and DOMSource are Java
-         * interface names that should not be translated.
-         */
-        {ErrorMsg.JAXP_UNKNOWN_SOURCE_ERR,
-        "XSLTC podpira samo StreamSource, SAXSource in DOMSource"},
-
-        /*
-         * Note to translators:  "Source" is a Java class name that should not
-         * be translated.  The substitution text is the name of Java method.
-         */
-        {ErrorMsg.JAXP_NO_SOURCE_ERR,
-        "Predmet Source, ki je bil podan z ''{0}'', nima vsebine."},
-
-        /*
-         * Note to translators:  The message indicates that XSLTC failed to
-         * compile the stylesheet into a translet (class file).
-         */
-        {ErrorMsg.JAXP_COMPILE_ERR,
-        "Ni mogo\u010de prevesti slogovne datoteke"},
-
-        /*
-         * Note to translators:  "TransformerFactory" is a class name.  In this
-         * context, an attribute is a property or setting of the
-         * TransformerFactory object.  The substitution text is the name of the
-         * unrecognised attribute.  The method used to retrieve the attribute is
-         * "getAttribute", so it's not clear whether it would be best to
-         * translate the term "attribute".
-         */
-        {ErrorMsg.JAXP_INVALID_ATTR_ERR,
-        "TransformerFactory ne prepozna atributa ''{0}''."},
-
-        /*
-         * Note to translators:  "setResult()" and "startDocument()" are Java
-         * method names that should not be translated.
-         */
-        {ErrorMsg.JAXP_SET_RESULT_ERR,
-        "Klic za setResult() mora biti izveden pred klicem startDocument()."},
-
-        /*
-         * Note to translators:  "Transformer" is a Java interface name that
-         * should not be translated.  A Transformer object should contained a
-         * reference to a translet object in order to be used for
-         * transformations; this message is produced if that requirement is not
-         * met.
-         */
-        {ErrorMsg.JAXP_NO_TRANSLET_ERR,
-        "Transformer ne vsebuje enkapsuliranih translet objektov."},
-
-        /*
-         * Note to translators:  The XML document that results from a
-         * transformation needs to be sent to an output handler object; this
-         * message is produced if that requirement is not met.
-         */
-        {ErrorMsg.JAXP_NO_HANDLER_ERR,
-        "Za rezultat transformacije ni izhodne obravnave."},
-
-        /*
-         * Note to translators:  "Result" is a Java interface name in this
-         * context.  The substitution text is a method name.
-         */
-        {ErrorMsg.JAXP_NO_RESULT_ERR,
-        "Rezultat, ki je bil posredovan ''{0}'', je neveljaven."},
-
-        /*
-         * Note to translators:  "Transformer" is a Java interface name.  The
-         * user's program attempted to access an unrecognized property with the
-         * name specified in the substitution text.  The method used to retrieve
-         * the property is "getOutputProperty", so it's not clear whether it
-         * would be best to translate the term "property".
-         */
-        {ErrorMsg.JAXP_UNKNOWN_PROP_ERR,
-        "Poskus dostopa do neveljavne lastnosti (property) Transformer ''{0}''."},
-
-        /*
-         * Note to translators:  SAX2DOM is the name of a Java class that should
-         * not be translated.  This is an adapter in the sense that it takes a
-         * DOM object and converts it to something that uses the SAX API.
-         */
-        {ErrorMsg.SAX2DOM_ADAPTER_ERR,
-        "Ni mogo\u010de ustvariti adapterja SAX2DOM: ''{0}''."},
-
-        /*
-         * Note to translators:  "XSLTCSource.build()" is a Java method name.
-         * "systemId" is an XML term that is short for "system identification".
-         */
-        {ErrorMsg.XSLTC_SOURCE_ERR,
-        "Klic XSLTCSource.build() brez predhodne nastavitve systemId."},
-
-        { ErrorMsg.ER_RESULT_NULL,
-            "Rezultat naj ne bi bil NULL"},
-
-        /*
-         * Note to translators:  This message indicates that the value argument
-         * of setParameter must be a valid Java Object.
-         */
-        {ErrorMsg.JAXP_INVALID_SET_PARAM_VALUE,
-        "Vrednost parametra {0} mora biti veljaven javanski objekt"},
-
-
-        {ErrorMsg.COMPILE_STDIN_ERR,
-        "Mo\u017enost -i mora biti uporabljena skupaj z mo\u017enostjo -o."},
-
-
-        /*
-         * Note to translators:  This message contains usage information for a
-         * means of invoking XSLTC from the command-line.  The message is
-         * formatted for presentation in English.  The strings <output>,
-         * <directory>, etc. indicate user-specified argument values, and can
-         * be translated - the argument <package> refers to a Java package, so
-         * it should be handled in the same way the term is handled for JDK
-         * documentation.
-         */
-        {ErrorMsg.COMPILE_USAGE_STR,
-        "SYNOPSIS\n   java org.apache.xalan.xsltc.cmdline.Compile [-o <izhodna datoteka>]\n      [-d <directory>] [-j  <datoteka jar>] [-p <paket>]\n      [-n] [-x] [-u] [-v] [-h] { <stylesheet> | -i }\n\nOPTIONS\n   -o <izhodna datoteka>    dodeli ime <izhodna datoteka> generiranemu\n                  transletu.  Ime transleta se po privzetih nastavitvah\n                 izpelje iz imena <stylesheet>.  Pri prevajanju\n                  ve\u010d slogovnih datotek je ta mo\u017enost prezrta.\n   -d <directory> dolo\u010di ciljno mapo za translet\n   -j <datoteka jar>   zdru\u017ei razrede translet v datoteko jar\n       pod imenom, dolo\u010denim z <datoteka jar>\n   -p <paket>   dolo\u010di predpono imena paketa vsem generiranim\n               razredom translet.\n   -n             omogo\u010da vrivanje predlog (v povpre\u010dju bolj\u0161e privzeto\n                      obna\u0161anje).\n   -x             vklopi dodatna izhodna sporo\u010dila za iskanje napak\n   -u             prevede argumente <stylesheet> kot URL-je\n   -i             prisili prevajalnik k branju slogovne datoteke iz stdin\n   -v             natisne razli\u010dico prevajalnika\n   -h             natisne ta stavek za uporabo\n"},
-
-        /*
-         * Note to translators:  This message contains usage information for a
-         * means of invoking XSLTC from the command-line.  The message is
-         * formatted for presentation in English.  The strings <jarfile>,
-         * <document>, etc. indicate user-specified argument values, and can
-         * be translated - the argument <class> refers to a Java class, so it
-         * should be handled in the same way the term is handled for JDK
-         * documentation.
-         */
-        {ErrorMsg.TRANSFORM_USAGE_STR,
-        "SYNOPSIS \n   java org.apache.xalan.xsltc.cmdline.Transform [-j <datoteka jar>]\n      [-x] [-n <ponovitve>] {-u <document_url> | <dokument>}\n      <razred> [<param1>=<value1> ...]\n\n   uporablja translet <razred> za pretvorbo dokumenta XML \n   navedenega kot <dokument>. Translet <razred> je ali v\n   uporabnikovem CLASSPATH ali v izbirno navedeni datoteki <datoteka jar>.\nOPTIONS\n   -j <datoteka jar>    dolo\u010di datoteko jar, iz katere bo nalo\u017een translet\n   -x               vklopi dodatna sporo\u010dila za iskanje napak\n   n  <ponovitve> <ponovitve>-krat po\u017eene preoblikovanje in\n                   prika\u017ee informacije profiliranja\n   -u <document_url> dolo\u010di vhodni dokument XML za URL\n"},
-
-
-
-        /*
-         * Note to translators:  "<xsl:sort>", "<xsl:for-each>" and
-         * "<xsl:apply-templates>" are keywords that should not be translated.
-         * The message indicates that an xsl:sort element must be a child of
-         * one of the other kinds of elements mentioned.
-         */
-        {ErrorMsg.STRAY_SORT_ERR,
-        "<xsl:sort> je mogo\u010de uporabljati samo znotraj <xsl:for-each> ali <xsl:apply-templates>."},
-
-        /*
-         * Note to translators:  The message indicates that the encoding
-         * requested for the output document was on that requires support that
-         * is not available from the Java Virtual Machine being used to execute
-         * the program.
-         */
-        {ErrorMsg.UNSUPPORTED_ENCODING,
-        "Ta JVM ne podpira izhodnega kodiranja ''{0}''."},
-
-        /*
-         * Note to translators:  The message indicates that the XPath expression
-         * named in the substitution text was not well formed syntactically.
-         */
-        {ErrorMsg.SYNTAX_ERR,
-        "Napaka v sintaksi v ''{0}''."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a Java
-         * class.  The term "constructor" here is the Java term.  The message is
-         * displayed if XSLTC could not find a constructor for the specified
-         * class.
-         */
-        {ErrorMsg.CONSTRUCTOR_NOT_FOUND,
-        "Ni mogo\u010de najti zunanjega konstruktorja ''{0}''."},
-
-        /*
-         * Note to translators:  "static" is the Java keyword.  The substitution
-         * text is the name of a function.  The first argument of that function
-         * is not of the required type.
-         */
-        {ErrorMsg.NO_JAVA_FUNCT_THIS_REF,
-        "Prvi argument nestati\u010dne (non-static) javanske funkcije ''{0}'' ni veljaven sklic na objekt."},
-
-        /*
-         * Note to translators:  An XPath expression was not of the type
-         * required in a particular context.  The substitution text is the
-         * expression that was in error.
-         */
-        {ErrorMsg.TYPE_CHECK_ERR,
-        "Napaka pri preverjanju tipa izraza ''{0}''."},
-
-        /*
-         * Note to translators:  An XPath expression was not of the type
-         * required in a particular context.  However, the location of the
-         * problematic expression is unknown.
-         */
-        {ErrorMsg.TYPE_CHECK_UNK_LOC_ERR,
-        "Napaka pri preverjanju tipa izraza na neznani lokaciji."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a command-
-         * line option that was not recognized.
-         */
-        {ErrorMsg.ILLEGAL_CMDLINE_OPTION_ERR,
-        "Mo\u017enost ukazne vrstice ''{0}'' ni veljavna."},
-
-        /*
-         * Note to translators:  The substitution text is the name of a command-
-         * line option.
-         */
-        {ErrorMsg.CMDLINE_OPT_MISSING_ARG_ERR,
-        "Mo\u017enosti ukazne vrstice ''{0}'' manjka zahtevani argument."},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text contains two error
-         * messages.  The spacing before the second substitution text indents
-         * it the same amount as the first in English.
-         */
-        {ErrorMsg.WARNING_PLUS_WRAPPED_MSG,
-        "OPOZORILO:  ''{0}''\n       :{1}"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text is an error message.
-         */
-        {ErrorMsg.WARNING_MSG,
-        "OPOZORILO:  ''{0}''"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text contains two error
-         * messages.  The spacing before the second substitution text indents
-         * it the same amount as the first in English.
-         */
-        {ErrorMsg.FATAL_ERR_PLUS_WRAPPED_MSG,
-        "USODNA NAPAKA:  ''{0}''\n           :{1}"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text is an error message.
-         */
-        {ErrorMsg.FATAL_ERR_MSG,
-        "USODNA NAPAKA:  ''{0}''"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text contains two error
-         * messages.  The spacing before the second substitution text indents
-         * it the same amount as the first in English.
-         */
-        {ErrorMsg.ERROR_PLUS_WRAPPED_MSG,
-        "USODNA NAPAKA:  ''{0}''\n     :{1}"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text is an error message.
-         */
-        {ErrorMsg.ERROR_MSG,
-        "NAPAKA:  ''{0}''"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a class.
-         */
-        {ErrorMsg.TRANSFORM_WITH_TRANSLET_STR,
-        "Pretvorba z uporabo transleta ''{0}'' "},
-
-        /*
-         * Note to translators:  The first substitution is the name of a class,
-         * while the second substitution is the name of a jar file.
-         */
-        {ErrorMsg.TRANSFORM_WITH_JAR_STR,
-        "Pretvorba z uporabo transleta ''{0}'' iz datoteke jar ''{1}''"},
-
-        /*
-         * Note to translators:  "TransformerFactory" is the name of a Java
-         * interface and must not be translated.  The substitution text is
-         * the name of the class that could not be instantiated.
-         */
-        {ErrorMsg.COULD_NOT_CREATE_TRANS_FACT,
-        "Ni mogo\u010de ustvariti primerka razreda TransformerFactory ''{0}''."},
-
-        /*
-         * Note to translators:  This message is produced when the user
-         * specified a name for the translet class that contains characters
-         * that are not permitted in a Java class name.  The substitution
-         * text "{0}" specifies the name the user requested, while "{1}"
-         * specifies the name the processor used instead.
-         */
-        {ErrorMsg.TRANSLET_NAME_JAVA_CONFLICT,
-         "Imena ''{0}'' ni bilo mogo\u010de uporabiti kot ime razreda translet, saj vsebuje znake, ki v imenu javanskega razreda niso dovoljeni.  Uporabljeno je bilo ime ''{1}''."},
-
-        /*
-         * Note to translators:  The following message is used as a header.
-         * All the error messages are collected together and displayed beneath
-         * this message.
-         */
-        {ErrorMsg.COMPILER_ERROR_KEY,
-        "Napake prevajalnika:"},
-
-        /*
-         * Note to translators:  The following message is used as a header.
-         * All the warning messages are collected together and displayed
-         * beneath this message.
-         */
-        {ErrorMsg.COMPILER_WARNING_KEY,
-        "Opozorila prevajalnika:"},
-
-        /*
-         * Note to translators:  The following message is used as a header.
-         * All the error messages that are produced when the stylesheet is
-         * applied to an input document are collected together and displayed
-         * beneath this message.  A 'translet' is the compiled form of a
-         * stylesheet (see above).
-         */
-        {ErrorMsg.RUNTIME_ERROR_KEY,
-        "Napake transleta:"},
-
-        /*
-         * Note to translators:  An attribute whose value is constrained to
-         * be a "QName" or a list of "QNames" had a value that was incorrect.
-         * 'QName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {ErrorMsg.INVALID_QNAME_ERR,
-        "Atribut, katerega vrednost mora biti vrednost QName ali s presledki lo\u010den seznam vrednosti Qname, je imel vrednost ''{0}''"},
-
-        /*
-         * Note to translators:  An attribute whose value is required to
-         * be an "NCName".
-         * 'NCName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {ErrorMsg.INVALID_NCNAME_ERR,
-        "Atribut, katerega vrednost mora biti NCName, je imel vrednost ''{0}''"},
-
-        /*
-         * Note to translators:  An attribute with an incorrect value was
-         * encountered.  The permitted value is one of the literal values
-         * "xml", "html" or "text"; it is also permitted to have the form of
-         * a QName that is not also an NCName.  The terms "method",
-         * "xsl:output", "xml", "html" and "text" are keywords that must not
-         * be translated.  The term "qname-but-not-ncname" is an XML syntactic
-         * term.  The substitution text contains the actual value of the
-         * attribute.
-         */
-        {ErrorMsg.INVALID_METHOD_IN_OUTPUT,
-        "Atribut metode elementa <xsl:output> je imel vrednost ''{0}''.  Vrednost mora biti ena izmed ''xml'', ''html'', ''text'', ali qname-but-not-ncname (qname, vendar pa ne ncname)"},
-
-        {ErrorMsg.JAXP_GET_FEATURE_NULL_NAME,
-        "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza)."},
-
-        {ErrorMsg.JAXP_SET_FEATURE_NULL_NAME,
-        "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza, boolova vrednost)."},
-
-        {ErrorMsg.JAXP_UNSUPPORTED_FEATURE,
-        "Ni mogo\u010de nastaviti funkcije ''{0}'' v tem TransformerFactory."}
-
-    };
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.compiler.util;
+
+import java.util.ListResourceBundle;
+
+/**
+ * @author Morten Jorgensen
+ */
+public class ErrorMessages_sl extends ListResourceBundle {
+
+/*
+ * XSLTC compile-time error messages.
+ *
+ * General notes to translators and definitions:
+ *
+ *   1) XSLTC is the name of the product.  It is an acronym for "XSLT Compiler".
+ *      XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *
+ *   2) A stylesheet is a description of how to transform an input XML document
+ *      into a resultant XML document (or HTML document or text).  The
+ *      stylesheet itself is described in the form of an XML document.
+ *
+ *   3) A template is a component of a stylesheet that is used to match a
+ *      particular portion of an input document and specifies the form of the
+ *      corresponding portion of the output document.
+ *
+ *   4) An axis is a particular "dimension" in a tree representation of an XML
+ *      document; the nodes in the tree are divided along different axes.
+ *      Traversing the "child" axis, for instance, means that the program
+ *      would visit each child of a particular node; traversing the "descendant"
+ *      axis means that the program would visit the child nodes of a particular
+ *      node, their children, and so on until the leaf nodes of the tree are
+ *      reached.
+ *
+ *   5) An iterator is an object that traverses nodes in a tree along a
+ *      particular axis, one at a time.
+ *
+ *   6) An element is a mark-up tag in an XML document; an attribute is a
+ *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *      "elem" is an element name, "attr" and "attr2" are attribute names with
+ *      the values "val" and "val2", respectively.
+ *
+ *   7) A namespace declaration is a special attribute that is used to associate
+ *      a prefix with a URI (the namespace).  The meanings of element names and
+ *      attribute names that use that prefix are defined with respect to that
+ *      namespace.
+ *
+ *   8) DOM is an acronym for Document Object Model.  It is a tree
+ *      representation of an XML document.
+ *
+ *      SAX is an acronym for the Simple API for XML processing.  It is an API
+ *      used inform an XML processor (in this case XSLTC) of the structure and
+ *      content of an XML document.
+ *
+ *      Input to the stylesheet processor can come from an XML parser in the
+ *      form of a DOM tree or through the SAX API.
+ *
+ *   9) DTD is a document type declaration.  It is a way of specifying the
+ *      grammar for an XML file, the names and types of elements, attributes,
+ *      etc.
+ *
+ *  10) XPath is a specification that describes a notation for identifying
+ *      nodes in a tree-structured representation of an XML document.  An
+ *      instance of that notation is referred to as an XPath expression.
+ *
+ *  11) Translet is an invented term that refers to the class file that contains
+ *      the compiled form of a stylesheet.
+ */
+
+    // These message should be read from a locale-specific resource bundle
+    /** Get the lookup table for error messages.
+     *
+     * @return The message lookup table.
+     */
+    public Object[][] getContents()
+    {
+      return new Object[][] {
+        {ErrorMsg.MULTIPLE_STYLESHEET_ERR,
+        "V isti datoteki je dolo\u010denih ve\u010d slogovnih datotek."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a
+         * template.  The same name was used on two different templates in the
+         * same stylesheet.
+         */
+        {ErrorMsg.TEMPLATE_REDEF_ERR,
+        "Predloga ''{0}'' je \u017ee dolo\u010dena v tej slogovni datoteki."},
+
+
+        /*
+         * Note to translators:  The substitution text is the name of a
+         * template.  A reference to the template name was encountered, but the
+         * template is undefined.
+         */
+        {ErrorMsg.TEMPLATE_UNDEF_ERR,
+        "Predloga ''{0}'' ni dolo\u010dena v tej slogovni datoteki."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a variable
+         * that was defined more than once.
+         */
+        {ErrorMsg.VARIABLE_REDEF_ERR,
+        "Spremenljivka ''{0}'' je ve\u010dkrat dolo\u010dena znotraj istega obsega."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a variable
+         * or parameter.  A reference to the variable or parameter was found,
+         * but it was never defined.
+         */
+        {ErrorMsg.VARIABLE_UNDEF_ERR,
+        "Spremenljivka ali parameter ''{0}'' je nedolo\u010den."},
+
+        /*
+         * Note to translators:  The word "class" here refers to a Java class.
+         * Processing the stylesheet required a class to be loaded, but it could
+         * not be found.  The substitution text is the name of the class.
+         */
+        {ErrorMsg.CLASS_NOT_FOUND_ERR,
+        "Ni mogo\u010de najti razreda ''{0}''."},
+
+        /*
+         * Note to translators:  The word "method" here refers to a Java method.
+         * Processing the stylesheet required a reference to the method named by
+         * the substitution text, but it could not be found.  "public" is the
+         * Java keyword.
+         */
+        {ErrorMsg.METHOD_NOT_FOUND_ERR,
+        "Zunanje metode ''{0}'' ni mogo\u010de najti (mora biti javna)."},
+
+        /*
+         * Note to translators:  The word "method" here refers to a Java method.
+         * Processing the stylesheet required a reference to the method named by
+         * the substitution text, but no method with the required types of
+         * arguments or return type could be found.
+         */
+        {ErrorMsg.ARGUMENT_CONVERSION_ERR,
+        "Ni mogo\u010de pretvoriti argumenta / tipa vrnitve v klicu metode ''{0}''"},
+
+        /*
+         * Note to translators:  The file or URI named in the substitution text
+         * is missing.
+         */
+        {ErrorMsg.FILE_NOT_FOUND_ERR,
+        "Datoteke ali URI-ja ''{0}'' ni mogo\u010de najti."},
+
+        /*
+         * Note to translators:  This message is displayed when the URI
+         * mentioned in the substitution text is not well-formed syntactically.
+         */
+        {ErrorMsg.INVALID_URI_ERR,
+        "Neveljaven URI ''{0}''."},
+
+        /*
+         * Note to translators:  The file or URI named in the substitution text
+         * exists but could not be opened.
+         */
+        {ErrorMsg.FILE_ACCESS_ERR,
+        "Datoteke ali URI-ja ''{0}'' ni mogo\u010de odpreti."},
+
+        /*
+         * Note to translators: <xsl:stylesheet> and <xsl:transform> are
+         * keywords that should not be translated.
+         */
+        {ErrorMsg.MISSING_ROOT_ERR,
+        "Pri\u010dakovan element <xsl:stylesheet> ali <xsl:transform>."},
+
+        /*
+         * Note to translators:  The stylesheet contained a reference to a
+         * namespace prefix that was undefined.  The value of the substitution
+         * text is the name of the prefix.
+         */
+        {ErrorMsg.NAMESPACE_UNDEF_ERR,
+        "Predpona imenskega prostora ''{0}'' ni dolo\u010dena."},
+
+        /*
+         * Note to translators:  The Java function named in the stylesheet could
+         * not be found.
+         */
+        {ErrorMsg.FUNCTION_RESOLVE_ERR,
+        "Klica funkcije ''{0}'' ni mogo\u010de razre\u0161iti."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a
+         * function.  A literal string here means a constant string value.
+         */
+        {ErrorMsg.NEED_LITERAL_ERR,
+        "Argument za ''{0}'' mora biti dobesedni niz."},
+
+        /*
+         * Note to translators:  This message indicates there was a syntactic
+         * error in the form of an XPath expression.  The substitution text is
+         * the expression.
+         */
+        {ErrorMsg.XPATH_PARSER_ERR,
+        "Napaka pri raz\u010dlenjevanju izraza XPath ''{0}''."},
+
+        /*
+         * Note to translators:  An element in the stylesheet requires a
+         * particular attribute named by the substitution text, but that
+         * attribute was not specified in the stylesheet.
+         */
+        {ErrorMsg.REQUIRED_ATTR_ERR,
+        "Manjka zahtevani atribut ''{0}''."},
+
+        /*
+         * Note to translators:  This message indicates that a character not
+         * permitted in an XPath expression was encountered.  The substitution
+         * text is the offending character.
+         */
+        {ErrorMsg.ILLEGAL_CHAR_ERR,
+        "Neveljavni znak ''{0}'' v izrazu XPath."},
+
+        /*
+         * Note to translators:  A processing instruction is a mark-up item in
+         * an XML document that request some behaviour of an XML processor.  The
+         * form of the name of was invalid in this case, and the substitution
+         * text is the name.
+         */
+        {ErrorMsg.ILLEGAL_PI_ERR,
+        "Neveljavno ime ''{0}'' za navodila za obdelavo."},
+
+        /*
+         * Note to translators:  This message is reported if the stylesheet
+         * being processed attempted to construct an XML document with an
+         * attribute in a place other than on an element.  The substitution text
+         * specifies the name of the attribute.
+         */
+        {ErrorMsg.STRAY_ATTRIBUTE_ERR,
+        "Atribut ''{0}'' zunaj elementa."},
+
+        /*
+         * Note to translators:  An attribute that wasn't recognized was
+         * specified on an element in the stylesheet.  The attribute is named
+         * by the substitution
+         * text.
+         */
+        {ErrorMsg.ILLEGAL_ATTRIBUTE_ERR,
+        "Neveljaven atribut ''{0}''."},
+
+        /*
+         * Note to translators:  "import" and "include" are keywords that should
+         * not be translated.  This messages indicates that the stylesheet
+         * named in the substitution text imported or included itself either
+         * directly or indirectly.
+         */
+        {ErrorMsg.CIRCULAR_INCLUDE_ERR,
+        "Kro\u017eni uvoz/vklju\u010ditev. Slogovna datoteka ''{0}'' je \u017ee nalo\u017eena."},
+
+        /*
+         * Note to translators:  A result-tree fragment is a portion of a
+         * resulting XML document represented as a tree.  "<xsl:sort>" is a
+         * keyword and should not be translated.
+         */
+        {ErrorMsg.RESULT_TREE_SORT_ERR,
+        "Ne morem razvrstiti fragmentov drevesa rezultatov (elementi <xsl:sort> so prezrti). Pri pripravi drevesa rezultatov morate razvrstiti vozli\u0161\u010da."},
+
+        /*
+         * Note to translators:  A name can be given to a particular style to be
+         * used to format decimal values.  The substitution text gives the name
+         * of such a style for which more than one declaration was encountered.
+         */
+        {ErrorMsg.SYMBOLS_REDEF_ERR,
+        "Decimalno oblikovanje ''{0}'' je \u017ee dolo\u010deno."},
+
+        /*
+         * Note to translators:  The stylesheet version named in the
+         * substitution text is not supported.
+         */
+        {ErrorMsg.XSL_VERSION_ERR,
+        "XSL razli\u010dice ''{0}'' XSLTC ne podpira."},
+
+        /*
+         * Note to translators:  The definitions of one or more variables or
+         * parameters depend on one another.
+         */
+        {ErrorMsg.CIRCULAR_VARIABLE_ERR,
+        "Sklic na kro\u017eno spremenljivko/parameter v ''{0}''."},
+
+        /*
+         * Note to translators:  The operator in an expresion with two operands was
+         * not recognized.
+         */
+        {ErrorMsg.ILLEGAL_BINARY_OP_ERR,
+        "Neznan operator za binarni izraz."},
+
+        /*
+         * Note to translators:  This message is produced if a reference to a
+         * function has too many or too few arguments.
+         */
+        {ErrorMsg.ILLEGAL_ARG_ERR,
+        "Neveljavni argument(i) za klic funkcije."},
+
+        /*
+         * Note to translators:  "document()" is the name of function and must
+         * not be translated.  A node-set is a set of the nodes in the tree
+         * representation of an XML document.
+         */
+        {ErrorMsg.DOCUMENT_ARG_ERR,
+        "Drugi argument funkcije document() mora biti skupina vozli\u0161\u010d."},
+
+        /*
+         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
+         * and should not be translated.  This message describes a syntax error
+         * in the stylesheet.
+         */
+        {ErrorMsg.MISSING_WHEN_ERR,
+        "Zahtevan vsaj en element <xsl:when> v <xsl:choose>."},
+
+        /*
+         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
+         * keywords and should not be translated.  This message describes a
+         * syntax error in the stylesheet.
+         */
+        {ErrorMsg.MULTIPLE_OTHERWISE_ERR,
+        "Dovoljen samo en element <xsl:otherwise> v <xsl:choose>."},
+
+        /*
+         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
+         * keywords and should not be translated.  This message describes a
+         * syntax error in the stylesheet.
+         */
+        {ErrorMsg.STRAY_OTHERWISE_ERR,
+        "<xsl:otherwise> lahko uporabljamo samo znotraj <xsl:choose>."},
+
+        /*
+         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
+         * and should not be translated.  This message describes a syntax error
+         * in the stylesheet.
+         */
+        {ErrorMsg.STRAY_WHEN_ERR,
+        "<xsl:when> lahko uporabljamo samo znotraj <xsl:choose>."},
+
+        /*
+         * Note to translators:  "<xsl:when>", "<xsl:otherwise>" and
+         * "<xsl:choose>" are keywords and should not be translated.  This
+         * message describes a syntax error in the stylesheet.
+         */
+        {ErrorMsg.WHEN_ELEMENT_ERR,
+        "V <xsl:choose> sta dovoljena samo elementa <xsl:when> in <xsl:otherwise>."},
+
+        /*
+         * Note to translators:  "<xsl:attribute-set>" and "name" are keywords
+         * that should not be translated.
+         */
+        {ErrorMsg.UNNAMED_ATTRIBSET_ERR,
+        "V <xsl:attribute-set> manjka atribut 'name'."},
+
+        /*
+         * Note to translators:  An element in the stylesheet contained an
+         * element of a type that it was not permitted to contain.
+         */
+        {ErrorMsg.ILLEGAL_CHILD_ERR,
+        "Neveljavni podrejeni element."},
+
+        /*
+         * Note to translators:  The stylesheet tried to create an element with
+         * a name that was not a valid XML name.  The substitution text contains
+         * the name.
+         */
+        {ErrorMsg.ILLEGAL_ELEM_NAME_ERR,
+        "Elementa ''{0}'' ni mogo\u010de poklicati"},
+
+        /*
+         * Note to translators:  The stylesheet tried to create an attribute
+         * with a name that was not a valid XML name.  The substitution text
+         * contains the name.
+         */
+        {ErrorMsg.ILLEGAL_ATTR_NAME_ERR,
+        "Atributa ''{0}'' ni mogo\u010de poklicati"},
+
+        /*
+         * Note to translators:  The children of the outermost element of a
+         * stylesheet are referred to as top-level elements.  No text should
+         * occur within that outermost element unless it is within a top-level
+         * element.  This message indicates that that constraint was violated.
+         * "<xsl:stylesheet>" is a keyword that should not be translated.
+         */
+        {ErrorMsg.ILLEGAL_TEXT_NODE_ERR,
+        "Tekstovni podatki zunaj elementa na najvi\u0161ji ravni <xsl:stylesheet>."},
+
+        /*
+         * Note to translators:  JAXP is an acronym for the Java API for XML
+         * Processing.  This message indicates that the XML parser provided to
+         * XSLTC to process the XML input document had a configuration problem.
+         */
+        {ErrorMsg.SAX_PARSER_CONFIG_ERR,
+        "Raz\u010dlenjevalnik JAXP ni pravilno konfiguriran"},
+
+        /*
+         * Note to translators:  The substitution text names the internal error
+         * encountered.
+         */
+        {ErrorMsg.INTERNAL_ERR,
+        "Nepopravljiva XSLTC-notranja napaka: ''{0}''"},
+
+        /*
+         * Note to translators:  The stylesheet contained an element that was
+         * not recognized as part of the XSL syntax.  The substitution text
+         * gives the element name.
+         */
+        {ErrorMsg.UNSUPPORTED_XSL_ERR,
+        "Nepodprt XSL element ''{0}''."},
+
+        /*
+         * Note to translators:  The stylesheet referred to an extension to the
+         * XSL syntax and indicated that it was defined by XSLTC, but XSTLC does
+         * not recognized the particular extension named.  The substitution text
+         * gives the extension name.
+         */
+        {ErrorMsg.UNSUPPORTED_EXT_ERR,
+        "Neprepoznana pripona XSLTC ''{0}''."},
+
+        /*
+         * Note to translators:  The XML document given to XSLTC as a stylesheet
+         * was not, in fact, a stylesheet.  XSLTC is able to detect that in this
+         * case because the outermost element in the stylesheet has to be
+         * declared with respect to the XSL namespace URI, but no declaration
+         * for that namespace was seen.
+         */
+        {ErrorMsg.MISSING_XSLT_URI_ERR,
+        "Vhodni dokument ni slogovna datoteka (v korenskem elementu ni naveden imenski prostor XSL)."},
+
+        /*
+         * Note to translators:  XSLTC could not find the stylesheet document
+         * with the name specified by the substitution text.
+         */
+        {ErrorMsg.MISSING_XSLT_TARGET_ERR,
+        "Cilja slogovne datoteke ''{0}'' ni mogo\u010de najti."},
+
+        /*
+         * Note to translators:  This message represents an internal error in
+         * condition in XSLTC.  The substitution text is the class name in XSLTC
+         * that is missing some functionality.
+         */
+        {ErrorMsg.NOT_IMPLEMENTED_ERR,
+        "Ni izvedeno: ''{0}''."},
+
+        /*
+         * Note to translators:  The XML document given to XSLTC as a stylesheet
+         * was not, in fact, a stylesheet.
+         */
+        {ErrorMsg.NOT_STYLESHEET_ERR,
+        "Vhodni dokument ne vsebuje slogovne datoteke XSL."},
+
+        /*
+         * Note to translators:  The element named in the substitution text was
+         * encountered in the stylesheet but is not recognized.
+         */
+        {ErrorMsg.ELEMENT_PARSE_ERR,
+        "Elementa ''{0}'' ni mogo\u010de raz\u010dleniti"},
+
+        /*
+         * Note to translators:  "use", "<key>", "node", "node-set", "string"
+         * and "number" are keywords in this context and should not be
+         * translated.  This message indicates that the value of the "use"
+         * attribute was not one of the permitted values.
+         */
+        {ErrorMsg.KEY_USE_ATTR_ERR,
+        "Atribut uporabe za <key> mora biti vozli\u0161\u010de, skupina vozli\u0161\u010d, niz ali \u0161tevilka."},
+
+        /*
+         * Note to translators:  An XML document can specify the version of the
+         * XML specification to which it adheres.  This message indicates that
+         * the version specified for the output document was not valid.
+         */
+        {ErrorMsg.OUTPUT_VERSION_ERR,
+        "Razli\u010dica izhodnega dokumenta XML mora biti 1.0"},
+
+        /*
+         * Note to translators:  The operator in a comparison operation was
+         * not recognized.
+         */
+        {ErrorMsg.ILLEGAL_RELAT_OP_ERR,
+        "Neznan operator za relacijski izraz"},
+
+        /*
+         * Note to translators:  An attribute set defines as a set of XML
+         * attributes that can be added to an element in the output XML document
+         * as a group.  This message is reported if the name specified was not
+         * used to declare an attribute set.  The substitution text is the name
+         * that is in error.
+         */
+        {ErrorMsg.ATTRIBSET_UNDEF_ERR,
+        "Poskus uporabe neobstoje\u010de skupine atributov ''{0}''."},
+
+        /*
+         * Note to translators:  The term "attribute value template" is a term
+         * defined by XSLT which describes the value of an attribute that is
+         * determined by an XPath expression.  The message indicates that the
+         * expression was syntactically incorrect; the substitution text
+         * contains the expression that was in error.
+         */
+        {ErrorMsg.ATTR_VAL_TEMPLATE_ERR,
+        "Predloge vrednosti atributa ''{0}'' ni mogo\u010de raz\u010dleniti."},
+
+        /*
+         * Note to translators:  ???
+         */
+        {ErrorMsg.UNKNOWN_SIG_TYPE_ERR,
+        "V podpisu za razred ''{0}'' je neznan podatkovni tip."},
+
+        /*
+         * Note to translators:  The substitution text refers to data types.
+         * The message is displayed if a value in a particular context needs to
+         * be converted to type {1}, but that's not possible for a value of
+         * type {0}.
+         */
+        {ErrorMsg.DATA_CONVERSION_ERR,
+        "Ni mogo\u010de pretvoriti podatkovnega tipa ''{0}'' v ''{1}''."},
+
+        /*
+         * Note to translators:  "Templates" is a Java class name that should
+         * not be translated.
+         */
+        {ErrorMsg.NO_TRANSLET_CLASS_ERR,
+        "Te Templates ne vsebujejo veljavne definicije razreda translet."},
+
+        /*
+         * Note to translators:  "Templates" is a Java class name that should
+         * not be translated.
+         */
+        {ErrorMsg.NO_MAIN_TRANSLET_ERR,
+        "Te predloge ne vsebujejo razreda z imenom ''{0}''."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a class.
+         */
+        {ErrorMsg.TRANSLET_CLASS_ERR,
+        "Ni mogo\u010de nalo\u017eiti razreda transleta ''{0}''."},
+
+        {ErrorMsg.TRANSLET_OBJECT_ERR,
+        "Razred transleta je nalo\u017een, vendar priprava primerka transleta ni mogo\u010da."},
+
+        /*
+         * Note to translators:  "ErrorListener" is a Java interface name that
+         * should not be translated.  The message indicates that the user tried
+         * to set an ErrorListener object on object of the class named in the
+         * substitution text with "null" Java value.
+         */
+        {ErrorMsg.ERROR_LISTENER_NULL_ERR,
+        "Poskus nastavitve ErrorListener za ''{0}'' na null"},
+
+        /*
+         * Note to translators:  StreamSource, SAXSource and DOMSource are Java
+         * interface names that should not be translated.
+         */
+        {ErrorMsg.JAXP_UNKNOWN_SOURCE_ERR,
+        "XSLTC podpira samo StreamSource, SAXSource in DOMSource"},
+
+        /*
+         * Note to translators:  "Source" is a Java class name that should not
+         * be translated.  The substitution text is the name of Java method.
+         */
+        {ErrorMsg.JAXP_NO_SOURCE_ERR,
+        "Predmet Source, ki je bil podan z ''{0}'', nima vsebine."},
+
+        /*
+         * Note to translators:  The message indicates that XSLTC failed to
+         * compile the stylesheet into a translet (class file).
+         */
+        {ErrorMsg.JAXP_COMPILE_ERR,
+        "Ni mogo\u010de prevesti slogovne datoteke"},
+
+        /*
+         * Note to translators:  "TransformerFactory" is a class name.  In this
+         * context, an attribute is a property or setting of the
+         * TransformerFactory object.  The substitution text is the name of the
+         * unrecognised attribute.  The method used to retrieve the attribute is
+         * "getAttribute", so it's not clear whether it would be best to
+         * translate the term "attribute".
+         */
+        {ErrorMsg.JAXP_INVALID_ATTR_ERR,
+        "TransformerFactory ne prepozna atributa ''{0}''."},
+
+        /*
+         * Note to translators:  "setResult()" and "startDocument()" are Java
+         * method names that should not be translated.
+         */
+        {ErrorMsg.JAXP_SET_RESULT_ERR,
+        "Klic za setResult() mora biti izveden pred klicem startDocument()."},
+
+        /*
+         * Note to translators:  "Transformer" is a Java interface name that
+         * should not be translated.  A Transformer object should contained a
+         * reference to a translet object in order to be used for
+         * transformations; this message is produced if that requirement is not
+         * met.
+         */
+        {ErrorMsg.JAXP_NO_TRANSLET_ERR,
+        "Transformer ne vsebuje enkapsuliranih translet objektov."},
+
+        /*
+         * Note to translators:  The XML document that results from a
+         * transformation needs to be sent to an output handler object; this
+         * message is produced if that requirement is not met.
+         */
+        {ErrorMsg.JAXP_NO_HANDLER_ERR,
+        "Za rezultat transformacije ni izhodne obravnave."},
+
+        /*
+         * Note to translators:  "Result" is a Java interface name in this
+         * context.  The substitution text is a method name.
+         */
+        {ErrorMsg.JAXP_NO_RESULT_ERR,
+        "Rezultat, ki je bil posredovan ''{0}'', je neveljaven."},
+
+        /*
+         * Note to translators:  "Transformer" is a Java interface name.  The
+         * user's program attempted to access an unrecognized property with the
+         * name specified in the substitution text.  The method used to retrieve
+         * the property is "getOutputProperty", so it's not clear whether it
+         * would be best to translate the term "property".
+         */
+        {ErrorMsg.JAXP_UNKNOWN_PROP_ERR,
+        "Poskus dostopa do neveljavne lastnosti (property) Transformer ''{0}''."},
+
+        /*
+         * Note to translators:  SAX2DOM is the name of a Java class that should
+         * not be translated.  This is an adapter in the sense that it takes a
+         * DOM object and converts it to something that uses the SAX API.
+         */
+        {ErrorMsg.SAX2DOM_ADAPTER_ERR,
+        "Ni mogo\u010de ustvariti adapterja SAX2DOM: ''{0}''."},
+
+        /*
+         * Note to translators:  "XSLTCSource.build()" is a Java method name.
+         * "systemId" is an XML term that is short for "system identification".
+         */
+        {ErrorMsg.XSLTC_SOURCE_ERR,
+        "Klic XSLTCSource.build() brez predhodne nastavitve systemId."},
+
+        { ErrorMsg.ER_RESULT_NULL,
+            "Rezultat naj ne bi bil NULL"},
+
+        /*
+         * Note to translators:  This message indicates that the value argument
+         * of setParameter must be a valid Java Object.
+         */
+        {ErrorMsg.JAXP_INVALID_SET_PARAM_VALUE,
+        "Vrednost parametra {0} mora biti veljaven javanski objekt"},
+
+
+        {ErrorMsg.COMPILE_STDIN_ERR,
+        "Mo\u017enost -i mora biti uporabljena skupaj z mo\u017enostjo -o."},
+
+
+        /*
+         * Note to translators:  This message contains usage information for a
+         * means of invoking XSLTC from the command-line.  The message is
+         * formatted for presentation in English.  The strings <output>,
+         * <directory>, etc. indicate user-specified argument values, and can
+         * be translated - the argument <package> refers to a Java package, so
+         * it should be handled in the same way the term is handled for JDK
+         * documentation.
+         */
+        {ErrorMsg.COMPILE_USAGE_STR,
+        "SYNOPSIS\n   java org.apache.xalan.xsltc.cmdline.Compile [-o <izhodna datoteka>]\n      [-d <directory>] [-j  <datoteka jar>] [-p <paket>]\n      [-n] [-x] [-u] [-v] [-h] { <stylesheet> | -i }\n\nOPTIONS\n   -o <izhodna datoteka>    dodeli ime <izhodna datoteka> generiranemu\n                  transletu.  Ime transleta se po privzetih nastavitvah\n                 izpelje iz imena <stylesheet>.  Pri prevajanju\n                  ve\u010d slogovnih datotek je ta mo\u017enost prezrta.\n   -d <directory> dolo\u010di ciljno mapo za translet\n   -j <datoteka jar>   zdru\u017ei razrede translet v datoteko jar\n       pod imenom, dolo\u010denim z <datoteka jar>\n   -p <paket>   dolo\u010di predpono imena paketa vsem generiranim\n               razredom translet.\n   -n             omogo\u010da vrivanje predlog (v povpre\u010dju bolj\u0161e privzeto\n                      obna\u0161anje).\n   -x             vklopi dodatna izhodna sporo\u010dila za iskanje napak\n   -u             prevede argumente <stylesheet> kot URL-je\n   -i             prisili prevajalnik k branju slogovne datoteke iz stdin\n   -v             natisne razli\u010dico prevajalnika\n   -h             natisne ta stavek za uporabo\n"},
+
+        /*
+         * Note to translators:  This message contains usage information for a
+         * means of invoking XSLTC from the command-line.  The message is
+         * formatted for presentation in English.  The strings <jarfile>,
+         * <document>, etc. indicate user-specified argument values, and can
+         * be translated - the argument <class> refers to a Java class, so it
+         * should be handled in the same way the term is handled for JDK
+         * documentation.
+         */
+        {ErrorMsg.TRANSFORM_USAGE_STR,
+        "SYNOPSIS \n   java org.apache.xalan.xsltc.cmdline.Transform [-j <datoteka jar>]\n      [-x] [-n <ponovitve>] {-u <document_url> | <dokument>}\n      <razred> [<param1>=<value1> ...]\n\n   uporablja translet <razred> za pretvorbo dokumenta XML \n   navedenega kot <dokument>. Translet <razred> je ali v\n   uporabnikovem CLASSPATH ali v izbirno navedeni datoteki <datoteka jar>.\nOPTIONS\n   -j <datoteka jar>    dolo\u010di datoteko jar, iz katere bo nalo\u017een translet\n   -x               vklopi dodatna sporo\u010dila za iskanje napak\n   n  <ponovitve> <ponovitve>-krat po\u017eene preoblikovanje in\n                   prika\u017ee informacije profiliranja\n   -u <document_url> dolo\u010di vhodni dokument XML za URL\n"},
+
+
+
+        /*
+         * Note to translators:  "<xsl:sort>", "<xsl:for-each>" and
+         * "<xsl:apply-templates>" are keywords that should not be translated.
+         * The message indicates that an xsl:sort element must be a child of
+         * one of the other kinds of elements mentioned.
+         */
+        {ErrorMsg.STRAY_SORT_ERR,
+        "<xsl:sort> je mogo\u010de uporabljati samo znotraj <xsl:for-each> ali <xsl:apply-templates>."},
+
+        /*
+         * Note to translators:  The message indicates that the encoding
+         * requested for the output document was on that requires support that
+         * is not available from the Java Virtual Machine being used to execute
+         * the program.
+         */
+        {ErrorMsg.UNSUPPORTED_ENCODING,
+        "Ta JVM ne podpira izhodnega kodiranja ''{0}''."},
+
+        /*
+         * Note to translators:  The message indicates that the XPath expression
+         * named in the substitution text was not well formed syntactically.
+         */
+        {ErrorMsg.SYNTAX_ERR,
+        "Napaka v sintaksi v ''{0}''."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a Java
+         * class.  The term "constructor" here is the Java term.  The message is
+         * displayed if XSLTC could not find a constructor for the specified
+         * class.
+         */
+        {ErrorMsg.CONSTRUCTOR_NOT_FOUND,
+        "Ni mogo\u010de najti zunanjega konstruktorja ''{0}''."},
+
+        /*
+         * Note to translators:  "static" is the Java keyword.  The substitution
+         * text is the name of a function.  The first argument of that function
+         * is not of the required type.
+         */
+        {ErrorMsg.NO_JAVA_FUNCT_THIS_REF,
+        "Prvi argument nestati\u010dne (non-static) javanske funkcije ''{0}'' ni veljaven sklic na objekt."},
+
+        /*
+         * Note to translators:  An XPath expression was not of the type
+         * required in a particular context.  The substitution text is the
+         * expression that was in error.
+         */
+        {ErrorMsg.TYPE_CHECK_ERR,
+        "Napaka pri preverjanju tipa izraza ''{0}''."},
+
+        /*
+         * Note to translators:  An XPath expression was not of the type
+         * required in a particular context.  However, the location of the
+         * problematic expression is unknown.
+         */
+        {ErrorMsg.TYPE_CHECK_UNK_LOC_ERR,
+        "Napaka pri preverjanju tipa izraza na neznani lokaciji."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a command-
+         * line option that was not recognized.
+         */
+        {ErrorMsg.ILLEGAL_CMDLINE_OPTION_ERR,
+        "Mo\u017enost ukazne vrstice ''{0}'' ni veljavna."},
+
+        /*
+         * Note to translators:  The substitution text is the name of a command-
+         * line option.
+         */
+        {ErrorMsg.CMDLINE_OPT_MISSING_ARG_ERR,
+        "Mo\u017enosti ukazne vrstice ''{0}'' manjka zahtevani argument."},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text contains two error
+         * messages.  The spacing before the second substitution text indents
+         * it the same amount as the first in English.
+         */
+        {ErrorMsg.WARNING_PLUS_WRAPPED_MSG,
+        "OPOZORILO:  ''{0}''\n       :{1}"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text is an error message.
+         */
+        {ErrorMsg.WARNING_MSG,
+        "OPOZORILO:  ''{0}''"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text contains two error
+         * messages.  The spacing before the second substitution text indents
+         * it the same amount as the first in English.
+         */
+        {ErrorMsg.FATAL_ERR_PLUS_WRAPPED_MSG,
+        "USODNA NAPAKA:  ''{0}''\n           :{1}"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text is an error message.
+         */
+        {ErrorMsg.FATAL_ERR_MSG,
+        "USODNA NAPAKA:  ''{0}''"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text contains two error
+         * messages.  The spacing before the second substitution text indents
+         * it the same amount as the first in English.
+         */
+        {ErrorMsg.ERROR_PLUS_WRAPPED_MSG,
+        "USODNA NAPAKA:  ''{0}''\n     :{1}"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text is an error message.
+         */
+        {ErrorMsg.ERROR_MSG,
+        "NAPAKA:  ''{0}''"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a class.
+         */
+        {ErrorMsg.TRANSFORM_WITH_TRANSLET_STR,
+        "Pretvorba z uporabo transleta ''{0}'' "},
+
+        /*
+         * Note to translators:  The first substitution is the name of a class,
+         * while the second substitution is the name of a jar file.
+         */
+        {ErrorMsg.TRANSFORM_WITH_JAR_STR,
+        "Pretvorba z uporabo transleta ''{0}'' iz datoteke jar ''{1}''"},
+
+        /*
+         * Note to translators:  "TransformerFactory" is the name of a Java
+         * interface and must not be translated.  The substitution text is
+         * the name of the class that could not be instantiated.
+         */
+        {ErrorMsg.COULD_NOT_CREATE_TRANS_FACT,
+        "Ni mogo\u010de ustvariti primerka razreda TransformerFactory ''{0}''."},
+
+        /*
+         * Note to translators:  This message is produced when the user
+         * specified a name for the translet class that contains characters
+         * that are not permitted in a Java class name.  The substitution
+         * text "{0}" specifies the name the user requested, while "{1}"
+         * specifies the name the processor used instead.
+         */
+        {ErrorMsg.TRANSLET_NAME_JAVA_CONFLICT,
+         "Imena ''{0}'' ni bilo mogo\u010de uporabiti kot ime razreda translet, saj vsebuje znake, ki v imenu javanskega razreda niso dovoljeni.  Uporabljeno je bilo ime ''{1}''."},
+
+        /*
+         * Note to translators:  The following message is used as a header.
+         * All the error messages are collected together and displayed beneath
+         * this message.
+         */
+        {ErrorMsg.COMPILER_ERROR_KEY,
+        "Napake prevajalnika:"},
+
+        /*
+         * Note to translators:  The following message is used as a header.
+         * All the warning messages are collected together and displayed
+         * beneath this message.
+         */
+        {ErrorMsg.COMPILER_WARNING_KEY,
+        "Opozorila prevajalnika:"},
+
+        /*
+         * Note to translators:  The following message is used as a header.
+         * All the error messages that are produced when the stylesheet is
+         * applied to an input document are collected together and displayed
+         * beneath this message.  A 'translet' is the compiled form of a
+         * stylesheet (see above).
+         */
+        {ErrorMsg.RUNTIME_ERROR_KEY,
+        "Napake transleta:"},
+
+        /*
+         * Note to translators:  An attribute whose value is constrained to
+         * be a "QName" or a list of "QNames" had a value that was incorrect.
+         * 'QName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {ErrorMsg.INVALID_QNAME_ERR,
+        "Atribut, katerega vrednost mora biti vrednost QName ali s presledki lo\u010den seznam vrednosti Qname, je imel vrednost ''{0}''"},
+
+        /*
+         * Note to translators:  An attribute whose value is required to
+         * be an "NCName".
+         * 'NCName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {ErrorMsg.INVALID_NCNAME_ERR,
+        "Atribut, katerega vrednost mora biti NCName, je imel vrednost ''{0}''"},
+
+        /*
+         * Note to translators:  An attribute with an incorrect value was
+         * encountered.  The permitted value is one of the literal values
+         * "xml", "html" or "text"; it is also permitted to have the form of
+         * a QName that is not also an NCName.  The terms "method",
+         * "xsl:output", "xml", "html" and "text" are keywords that must not
+         * be translated.  The term "qname-but-not-ncname" is an XML syntactic
+         * term.  The substitution text contains the actual value of the
+         * attribute.
+         */
+        {ErrorMsg.INVALID_METHOD_IN_OUTPUT,
+        "Atribut metode elementa <xsl:output> je imel vrednost ''{0}''.  Vrednost mora biti ena izmed ''xml'', ''html'', ''text'', ali qname-but-not-ncname (qname, vendar pa ne ncname)"},
+
+        {ErrorMsg.JAXP_GET_FEATURE_NULL_NAME,
+        "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza)."},
+
+        {ErrorMsg.JAXP_SET_FEATURE_NULL_NAME,
+        "Ime funkcije ne sme biti null v TransformerFactory.getFeature(Ime niza, boolova vrednost)."},
+
+        {ErrorMsg.JAXP_UNSUPPORTED_FEATURE,
+        "Ni mogo\u010de nastaviti funkcije ''{0}'' v tem TransformerFactory."}
+
+    };
+    }
+
+}
diff --git a/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_zh.java b/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_zh.java
old mode 100755
new mode 100644
index 915ce85..4ab0506
--- a/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_zh.java
+++ b/src/org/apache/xalan/xsltc/compiler/util/ErrorMessages_zh.java
@@ -1,913 +1,913 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: ErrorMessages_zh.java 338081 2004-12-15 17:35:58Z jycli $
- */
-
-package org.apache.xalan.xsltc.compiler.util;
-
-import java.util.ListResourceBundle;
-
-/**
- * @author Morten Jorgensen
- */
-public class ErrorMessages_zh extends ListResourceBundle {
-
-/*
- * XSLTC compile-time error messages.
- *
- * General notes to translators and definitions:
- *
- *   1) XSLTC is the name of the product.  It is an acronym for "XSLT Compiler".
- *      XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *
- *   2) A stylesheet is a description of how to transform an input XML document
- *      into a resultant XML document (or HTML document or text).  The
- *      stylesheet itself is described in the form of an XML document.
- *
- *   3) A template is a component of a stylesheet that is used to match a
- *      particular portion of an input document and specifies the form of the
- *      corresponding portion of the output document.
- *
- *   4) An axis is a particular "dimension" in a tree representation of an XML
- *      document; the nodes in the tree are divided along different axes.
- *      Traversing the "child" axis, for instance, means that the program
- *      would visit each child of a particular node; traversing the "descendant"
- *      axis means that the program would visit the child nodes of a particular
- *      node, their children, and so on until the leaf nodes of the tree are
- *      reached.
- *
- *   5) An iterator is an object that traverses nodes in a tree along a
- *      particular axis, one at a time.
- *
- *   6) An element is a mark-up tag in an XML document; an attribute is a
- *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *      "elem" is an element name, "attr" and "attr2" are attribute names with
- *      the values "val" and "val2", respectively.
- *
- *   7) A namespace declaration is a special attribute that is used to associate
- *      a prefix with a URI (the namespace).  The meanings of element names and
- *      attribute names that use that prefix are defined with respect to that
- *      namespace.
- *
- *   8) DOM is an acronym for Document Object Model.  It is a tree
- *      representation of an XML document.
- *
- *      SAX is an acronym for the Simple API for XML processing.  It is an API
- *      used inform an XML processor (in this case XSLTC) of the structure and
- *      content of an XML document.
- *
- *      Input to the stylesheet processor can come from an XML parser in the
- *      form of a DOM tree or through the SAX API.
- *
- *   9) DTD is a document type declaration.  It is a way of specifying the
- *      grammar for an XML file, the names and types of elements, attributes,
- *      etc.
- *
- *  10) XPath is a specification that describes a notation for identifying
- *      nodes in a tree-structured representation of an XML document.  An
- *      instance of that notation is referred to as an XPath expression.
- *
- *  11) Translet is an invented term that refers to the class file that contains
- *      the compiled form of a stylesheet.
- */
-
-    // These message should be read from a locale-specific resource bundle
-    /** Get the lookup table for error messages.
-     *
-     * @return The message lookup table.
-     */
-    public Object[][] getContents()
-    {
-      return new Object[][] {
-        {ErrorMsg.MULTIPLE_STYLESHEET_ERR,
-        "\u540c\u4e00\u6587\u4ef6\u4e2d\u5b9a\u4e49\u4e86\u591a\u4e2a\u6837\u5f0f\u8868\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a
-         * template.  The same name was used on two different templates in the
-         * same stylesheet.
-         */
-        {ErrorMsg.TEMPLATE_REDEF_ERR,
-        "\u6b64\u6837\u5f0f\u8868\u4e2d\u5df2\u7ecf\u5b9a\u4e49\u4e86\u6a21\u677f\u201c{0}\u201d\u3002"},
-
-
-        /*
-         * Note to translators:  The substitution text is the name of a
-         * template.  A reference to the template name was encountered, but the
-         * template is undefined.
-         */
-        {ErrorMsg.TEMPLATE_UNDEF_ERR,
-        "\u6b64\u6837\u5f0f\u8868\u4e2d\u672a\u5b9a\u4e49\u6a21\u677f\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a variable
-         * that was defined more than once.
-         */
-        {ErrorMsg.VARIABLE_REDEF_ERR,
-        "\u540c\u4e00\u4f5c\u7528\u57df\u4e2d\u591a\u6b21\u5b9a\u4e49\u4e86\u53d8\u91cf\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a variable
-         * or parameter.  A reference to the variable or parameter was found,
-         * but it was never defined.
-         */
-        {ErrorMsg.VARIABLE_UNDEF_ERR,
-        "\u672a\u5b9a\u4e49\u53d8\u91cf\u6216\u53c2\u6570\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The word "class" here refers to a Java class.
-         * Processing the stylesheet required a class to be loaded, but it could
-         * not be found.  The substitution text is the name of the class.
-         */
-        {ErrorMsg.CLASS_NOT_FOUND_ERR,
-        "\u627e\u4e0d\u5230\u7c7b\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The word "method" here refers to a Java method.
-         * Processing the stylesheet required a reference to the method named by
-         * the substitution text, but it could not be found.  "public" is the
-         * Java keyword.
-         */
-        {ErrorMsg.METHOD_NOT_FOUND_ERR,
-        "\u627e\u4e0d\u5230\u5916\u90e8\u65b9\u6cd5\u201c{0}\u201d\uff08\u5fc5\u987b\u662f public\uff09\u3002"},
-
-        /*
-         * Note to translators:  The word "method" here refers to a Java method.
-         * Processing the stylesheet required a reference to the method named by
-         * the substitution text, but no method with the required types of
-         * arguments or return type could be found.
-         */
-        {ErrorMsg.ARGUMENT_CONVERSION_ERR,
-        "\u65e0\u6cd5\u5c06\u8c03\u7528\u4e2d\u7684\u53c2\u6570\uff0f\u8fd4\u56de\u7c7b\u578b\u8f6c\u6362\u4e3a\u65b9\u6cd5\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  The file or URI named in the substitution text
-         * is missing.
-         */
-        {ErrorMsg.FILE_NOT_FOUND_ERR,
-        "\u627e\u4e0d\u5230\u6587\u4ef6\u6216 URI\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  This message is displayed when the URI
-         * mentioned in the substitution text is not well-formed syntactically.
-         */
-        {ErrorMsg.INVALID_URI_ERR,
-        "URI\u201c{0}\u201d\u65e0\u6548\u3002"},
-
-        /*
-         * Note to translators:  The file or URI named in the substitution text
-         * exists but could not be opened.
-         */
-        {ErrorMsg.FILE_ACCESS_ERR,
-        "\u65e0\u6cd5\u6253\u5f00\u6587\u4ef6\u6216 URI\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators: <xsl:stylesheet> and <xsl:transform> are
-         * keywords that should not be translated.
-         */
-        {ErrorMsg.MISSING_ROOT_ERR,
-        "\u9884\u671f\u5b58\u5728 <xsl:stylesheet> \u6216 <xsl:transform> \u5143\u7d20\u3002"},
-
-        /*
-         * Note to translators:  The stylesheet contained a reference to a
-         * namespace prefix that was undefined.  The value of the substitution
-         * text is the name of the prefix.
-         */
-        {ErrorMsg.NAMESPACE_UNDEF_ERR,
-        "\u672a\u58f0\u660e\u540d\u79f0\u7a7a\u95f4\u524d\u7f00\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The Java function named in the stylesheet could
-         * not be found.
-         */
-        {ErrorMsg.FUNCTION_RESOLVE_ERR,
-        "\u65e0\u6cd5\u89e3\u6790\u5bf9\u51fd\u6570\u201c{0}\u201d\u7684\u8c03\u7528\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a
-         * function.  A literal string here means a constant string value.
-         */
-        {ErrorMsg.NEED_LITERAL_ERR,
-        "\u201c{0}\u201d\u7684\u81ea\u53d8\u91cf\u5fc5\u987b\u662f\u6587\u5b57\u4e32\u3002"},
-
-        /*
-         * Note to translators:  This message indicates there was a syntactic
-         * error in the form of an XPath expression.  The substitution text is
-         * the expression.
-         */
-        {ErrorMsg.XPATH_PARSER_ERR,
-        "\u89e3\u6790 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u65f6\u51fa\u9519\u3002"},
-
-        /*
-         * Note to translators:  An element in the stylesheet requires a
-         * particular attribute named by the substitution text, but that
-         * attribute was not specified in the stylesheet.
-         */
-        {ErrorMsg.REQUIRED_ATTR_ERR,
-        "\u7f3a\u5c11\u5fc5\u9700\u7684\u5c5e\u6027\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  This message indicates that a character not
-         * permitted in an XPath expression was encountered.  The substitution
-         * text is the offending character.
-         */
-        {ErrorMsg.ILLEGAL_CHAR_ERR,
-        "XPath \u8868\u8fbe\u5f0f\u4e2d\u7684\u5b57\u7b26\u201c{0}\u201d\u975e\u6cd5\u3002"},
-
-        /*
-         * Note to translators:  A processing instruction is a mark-up item in
-         * an XML document that request some behaviour of an XML processor.  The
-         * form of the name of was invalid in this case, and the substitution
-         * text is the name.
-         */
-        {ErrorMsg.ILLEGAL_PI_ERR,
-        "\u5904\u7406\u6307\u4ee4\u7684\u540d\u79f0\u201c{0}\u201d\u975e\u6cd5\u3002"},
-
-        /*
-         * Note to translators:  This message is reported if the stylesheet
-         * being processed attempted to construct an XML document with an
-         * attribute in a place other than on an element.  The substitution text
-         * specifies the name of the attribute.
-         */
-        {ErrorMsg.STRAY_ATTRIBUTE_ERR,
-        "\u5c5e\u6027\u201c{0}\u201d\u5728\u5143\u7d20\u5916\u3002"},
-
-        /*
-         * Note to translators:  An attribute that wasn't recognized was
-         * specified on an element in the stylesheet.  The attribute is named
-         * by the substitution
-         * text.
-         */
-        {ErrorMsg.ILLEGAL_ATTRIBUTE_ERR,
-        "\u5c5e\u6027\u201c{0}\u201d\u975e\u6cd5\u3002"},
-
-        /*
-         * Note to translators:  "import" and "include" are keywords that should
-         * not be translated.  This messages indicates that the stylesheet
-         * named in the substitution text imported or included itself either
-         * directly or indirectly.
-         */
-        {ErrorMsg.CIRCULAR_INCLUDE_ERR,
-        "\u5faa\u73af import\uff0finclude\u3002\u5df2\u88c5\u5165\u6837\u5f0f\u8868\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  A result-tree fragment is a portion of a
-         * resulting XML document represented as a tree.  "<xsl:sort>" is a
-         * keyword and should not be translated.
-         */
-        {ErrorMsg.RESULT_TREE_SORT_ERR,
-        "\u65e0\u6cd5\u5bf9\u7ed3\u679c\u6811\u7247\u6bb5\u6392\u5e8f\uff08<xsl:sort> \u5143\u7d20\u88ab\u5ffd\u7565\uff09\u3002\u5fc5\u987b\u5728\u521b\u5efa\u7ed3\u679c\u6811\u65f6\u5bf9\u8282\u70b9\u8fdb\u884c\u6392\u5e8f\u3002"},
-
-        /*
-         * Note to translators:  A name can be given to a particular style to be
-         * used to format decimal values.  The substitution text gives the name
-         * of such a style for which more than one declaration was encountered.
-         */
-        {ErrorMsg.SYMBOLS_REDEF_ERR,
-        "\u5df2\u7ecf\u5b9a\u4e49\u4e86\u5341\u8fdb\u5236\u683c\u5f0f\u7f16\u6392\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The stylesheet version named in the
-         * substitution text is not supported.
-         */
-        {ErrorMsg.XSL_VERSION_ERR,
-        "XSLTC \u4e0d\u652f\u6301 XSL V{0}\u3002"},
-
-        /*
-         * Note to translators:  The definitions of one or more variables or
-         * parameters depend on one another.
-         */
-        {ErrorMsg.CIRCULAR_VARIABLE_ERR,
-        "\u201c{0}\u201d\u4e2d\u7684\u5faa\u73af\u53d8\u91cf\uff0f\u53c2\u6570\u5f15\u7528\u3002"},
-
-        /*
-         * Note to translators:  The operator in an expresion with two operands was
-         * not recognized.
-         */
-        {ErrorMsg.ILLEGAL_BINARY_OP_ERR,
-        "\u4e8c\u8fdb\u5236\u8868\u8fbe\u5f0f\u7684\u8fd0\u7b97\u7b26\u672a\u77e5\u3002"},
-
-        /*
-         * Note to translators:  This message is produced if a reference to a
-         * function has too many or too few arguments.
-         */
-        {ErrorMsg.ILLEGAL_ARG_ERR,
-        "\u51fd\u6570\u8c03\u7528\u7684\u53c2\u6570\u975e\u6cd5\u3002"},
-
-        /*
-         * Note to translators:  "document()" is the name of function and must
-         * not be translated.  A node-set is a set of the nodes in the tree
-         * representation of an XML document.
-         */
-        {ErrorMsg.DOCUMENT_ARG_ERR,
-        "\u51fd\u6570 document() \u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570\u5fc5\u987b\u662f\u8282\u70b9\u96c6\u3002"},
-
-        /*
-         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
-         * and should not be translated.  This message describes a syntax error
-         * in the stylesheet.
-         */
-        {ErrorMsg.MISSING_WHEN_ERR,
-        "<xsl:choose> \u4e2d\u81f3\u5c11\u8981\u6709\u4e00\u4e2a <xsl:when> \u5143\u7d20\u3002"},
-
-        /*
-         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
-         * keywords and should not be translated.  This message describes a
-         * syntax error in the stylesheet.
-         */
-        {ErrorMsg.MULTIPLE_OTHERWISE_ERR,
-        "<xsl:choose> \u4e2d\u53ea\u5141\u8bb8\u6709\u4e00\u4e2a <xsl:otherwise> \u5143\u7d20\u3002"},
-
-        /*
-         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
-         * keywords and should not be translated.  This message describes a
-         * syntax error in the stylesheet.
-         */
-        {ErrorMsg.STRAY_OTHERWISE_ERR,
-        "<xsl:otherwise> \u53ea\u80fd\u5728 <xsl:choose> \u4e2d\u4f7f\u7528\u3002"},
-
-        /*
-         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
-         * and should not be translated.  This message describes a syntax error
-         * in the stylesheet.
-         */
-        {ErrorMsg.STRAY_WHEN_ERR,
-        "<xsl:when> \u53ea\u80fd\u5728 <xsl:choose> \u4e2d\u4f7f\u7528\u3002"},
-
-        /*
-         * Note to translators:  "<xsl:when>", "<xsl:otherwise>" and
-         * "<xsl:choose>" are keywords and should not be translated.  This
-         * message describes a syntax error in the stylesheet.
-         */
-        {ErrorMsg.WHEN_ELEMENT_ERR,
-        "<xsl:choose> \u4e2d\u53ea\u5141\u8bb8\u4f7f\u7528 <xsl:when> \u548c <xsl:otherwise>\u3002"},
-
-        /*
-         * Note to translators:  "<xsl:attribute-set>" and "name" are keywords
-         * that should not be translated.
-         */
-        {ErrorMsg.UNNAMED_ATTRIBSET_ERR,
-        "<xsl:attribute-set> \u7f3a\u5c11\u201cname\u201d\u5c5e\u6027\u3002"},
-
-        /*
-         * Note to translators:  An element in the stylesheet contained an
-         * element of a type that it was not permitted to contain.
-         */
-        {ErrorMsg.ILLEGAL_CHILD_ERR,
-        "\u5b50\u5143\u7d20\u975e\u6cd5\u3002"},
-
-        /*
-         * Note to translators:  The stylesheet tried to create an element with
-         * a name that was not a valid XML name.  The substitution text contains
-         * the name.
-         */
-        {ErrorMsg.ILLEGAL_ELEM_NAME_ERR,
-        "\u4e0d\u80fd\u8c03\u7528\u5143\u7d20\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  The stylesheet tried to create an attribute
-         * with a name that was not a valid XML name.  The substitution text
-         * contains the name.
-         */
-        {ErrorMsg.ILLEGAL_ATTR_NAME_ERR,
-        "\u4e0d\u80fd\u8c03\u7528\u5c5e\u6027\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  The children of the outermost element of a
-         * stylesheet are referred to as top-level elements.  No text should
-         * occur within that outermost element unless it is within a top-level
-         * element.  This message indicates that that constraint was violated.
-         * "<xsl:stylesheet>" is a keyword that should not be translated.
-         */
-        {ErrorMsg.ILLEGAL_TEXT_NODE_ERR,
-        "\u6587\u672c\u6570\u636e\u5728\u9876\u7ea7 <xsl:stylesheet> \u5143\u7d20\u5916\u3002"},
-
-        /*
-         * Note to translators:  JAXP is an acronym for the Java API for XML
-         * Processing.  This message indicates that the XML parser provided to
-         * XSLTC to process the XML input document had a configuration problem.
-         */
-        {ErrorMsg.SAX_PARSER_CONFIG_ERR,
-        "JAXP \u89e3\u6790\u5668\u6ca1\u6709\u6b63\u786e\u914d\u7f6e"},
-
-        /*
-         * Note to translators:  The substitution text names the internal error
-         * encountered.
-         */
-        {ErrorMsg.INTERNAL_ERR,
-        "\u4e0d\u53ef\u6062\u590d\u7684 XSLTC \u5185\u90e8\u9519\u8bef\uff1a\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  The stylesheet contained an element that was
-         * not recognized as part of the XSL syntax.  The substitution text
-         * gives the element name.
-         */
-        {ErrorMsg.UNSUPPORTED_XSL_ERR,
-        "\u4e0d\u53d7\u652f\u6301\u7684 XSL \u5143\u7d20\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The stylesheet referred to an extension to the
-         * XSL syntax and indicated that it was defined by XSLTC, but XSTLC does
-         * not recognized the particular extension named.  The substitution text
-         * gives the extension name.
-         */
-        {ErrorMsg.UNSUPPORTED_EXT_ERR,
-        "\u672a\u88ab\u8bc6\u522b\u7684 XSLTC \u6269\u5c55\u540d\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The XML document given to XSLTC as a stylesheet
-         * was not, in fact, a stylesheet.  XSLTC is able to detect that in this
-         * case because the outermost element in the stylesheet has to be
-         * declared with respect to the XSL namespace URI, but no declaration
-         * for that namespace was seen.
-         */
-        {ErrorMsg.MISSING_XSLT_URI_ERR,
-        "\u8f93\u5165\u6587\u6863\u4e0d\u662f\u6837\u5f0f\u8868\uff08XSL \u540d\u79f0\u7a7a\u95f4\u6ca1\u6709\u5728\u6839\u5143\u7d20\u4e2d\u58f0\u660e\uff09\u3002"},
-
-        /*
-         * Note to translators:  XSLTC could not find the stylesheet document
-         * with the name specified by the substitution text.
-         */
-        {ErrorMsg.MISSING_XSLT_TARGET_ERR,
-        "\u627e\u4e0d\u5230\u6837\u5f0f\u8868\u76ee\u6807\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  This message represents an internal error in
-         * condition in XSLTC.  The substitution text is the class name in XSLTC
-         * that is missing some functionality.
-         */
-        {ErrorMsg.NOT_IMPLEMENTED_ERR,
-        "\u6ca1\u6709\u5b9e\u73b0\uff1a\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The XML document given to XSLTC as a stylesheet
-         * was not, in fact, a stylesheet.
-         */
-        {ErrorMsg.NOT_STYLESHEET_ERR,
-        "\u8f93\u5165\u6587\u6863\u4e0d\u5305\u542b XSL \u6837\u5f0f\u8868\u3002"},
-
-        /*
-         * Note to translators:  The element named in the substitution text was
-         * encountered in the stylesheet but is not recognized.
-         */
-        {ErrorMsg.ELEMENT_PARSE_ERR,
-        "\u65e0\u6cd5\u89e3\u6790\u5143\u7d20\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  "use", "<key>", "node", "node-set", "string"
-         * and "number" are keywords in this context and should not be
-         * translated.  This message indicates that the value of the "use"
-         * attribute was not one of the permitted values.
-         */
-        {ErrorMsg.KEY_USE_ATTR_ERR,
-        "<key> \u7684 use \u5c5e\u6027\u5fc5\u987b\u662f node\u3001node-set\u3001string \u6216 number\u3002"},
-
-        /*
-         * Note to translators:  An XML document can specify the version of the
-         * XML specification to which it adheres.  This message indicates that
-         * the version specified for the output document was not valid.
-         */
-        {ErrorMsg.OUTPUT_VERSION_ERR,
-        "\u8f93\u51fa XML \u6587\u6863\u7684\u7248\u672c\u5e94\u5f53\u662f 1.0"},
-
-        /*
-         * Note to translators:  The operator in a comparison operation was
-         * not recognized.
-         */
-        {ErrorMsg.ILLEGAL_RELAT_OP_ERR,
-        "\u5173\u7cfb\u8868\u8fbe\u5f0f\u7684\u8fd0\u7b97\u7b26\u672a\u77e5"},
-
-        /*
-         * Note to translators:  An attribute set defines as a set of XML
-         * attributes that can be added to an element in the output XML document
-         * as a group.  This message is reported if the name specified was not
-         * used to declare an attribute set.  The substitution text is the name
-         * that is in error.
-         */
-        {ErrorMsg.ATTRIBSET_UNDEF_ERR,
-        "\u8bd5\u56fe\u4f7f\u7528\u4e0d\u5b58\u5728\u7684\u5c5e\u6027\u96c6\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The term "attribute value template" is a term
-         * defined by XSLT which describes the value of an attribute that is
-         * determined by an XPath expression.  The message indicates that the
-         * expression was syntactically incorrect; the substitution text
-         * contains the expression that was in error.
-         */
-        {ErrorMsg.ATTR_VAL_TEMPLATE_ERR,
-        "\u65e0\u6cd5\u89e3\u6790\u5c5e\u6027\u503c\u6a21\u677f\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  ???
-         */
-        {ErrorMsg.UNKNOWN_SIG_TYPE_ERR,
-        "\u7c7b\u201c{0}\u201d\u7684\u7279\u5f81\u7b26\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u672a\u77e5\u3002"},
-
-        /*
-         * Note to translators:  The substitution text refers to data types.
-         * The message is displayed if a value in a particular context needs to
-         * be converted to type {1}, but that's not possible for a value of
-         * type {0}.
-         */
-        {ErrorMsg.DATA_CONVERSION_ERR,
-        "\u65e0\u6cd5\u5c06\u6570\u636e\u7c7b\u578b\u201c{0}\u201d\u8f6c\u6362\u6210\u201c{1}\u201d\u3002"},
-
-        /*
-         * Note to translators:  "Templates" is a Java class name that should
-         * not be translated.
-         */
-        {ErrorMsg.NO_TRANSLET_CLASS_ERR,
-        "\u6b64 Templates \u4e0d\u5305\u542b\u6709\u6548\u7684 translet \u7c7b\u5b9a\u4e49\u3002"},
-
-        /*
-         * Note to translators:  "Templates" is a Java class name that should
-         * not be translated.
-         */
-        {ErrorMsg.NO_MAIN_TRANSLET_ERR,
-        "\u6b64 Templates \u4e0d\u5305\u542b\u540d\u4e3a\u201c{0}\u201d\u7684\u7c7b\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a class.
-         */
-        {ErrorMsg.TRANSLET_CLASS_ERR,
-        "\u65e0\u6cd5\u88c5\u5165 translet \u7c7b\u201c{0}\u201d\u3002"},
-
-        {ErrorMsg.TRANSLET_OBJECT_ERR,
-        "Translet \u7c7b\u5df2\u88c5\u5165\uff0c\u4f46\u65e0\u6cd5\u521b\u5efa translet \u5b9e\u4f8b\u3002"},
-
-        /*
-         * Note to translators:  "ErrorListener" is a Java interface name that
-         * should not be translated.  The message indicates that the user tried
-         * to set an ErrorListener object on object of the class named in the
-         * substitution text with "null" Java value.
-         */
-        {ErrorMsg.ERROR_LISTENER_NULL_ERR,
-        "\u8bd5\u56fe\u5c06\u201c{0}\u201d\u7684 ErrorListener \u8bbe\u7f6e\u4e3a\u7a7a"},
-
-        /*
-         * Note to translators:  StreamSource, SAXSource and DOMSource are Java
-         * interface names that should not be translated.
-         */
-        {ErrorMsg.JAXP_UNKNOWN_SOURCE_ERR,
-        "XSLTC \u53ea\u652f\u6301 StreamSource\u3001SAXSource \u548c DOMSource"},
-
-        /*
-         * Note to translators:  "Source" is a Java class name that should not
-         * be translated.  The substitution text is the name of Java method.
-         */
-        {ErrorMsg.JAXP_NO_SOURCE_ERR,
-        "\u4f20\u9012\u7ed9\u201c{0}\u201d\u7684\u6e90\u5bf9\u8c61\u6ca1\u6709\u5185\u5bb9\u3002"},
-
-        /*
-         * Note to translators:  The message indicates that XSLTC failed to
-         * compile the stylesheet into a translet (class file).
-         */
-        {ErrorMsg.JAXP_COMPILE_ERR,
-        "\u65e0\u6cd5\u7f16\u8bd1\u6837\u5f0f\u8868"},
-
-        /*
-         * Note to translators:  "TransformerFactory" is a class name.  In this
-         * context, an attribute is a property or setting of the
-         * TransformerFactory object.  The substitution text is the name of the
-         * unrecognised attribute.  The method used to retrieve the attribute is
-         * "getAttribute", so it's not clear whether it would be best to
-         * translate the term "attribute".
-         */
-        {ErrorMsg.JAXP_INVALID_ATTR_ERR,
-        "TransformerFactory \u65e0\u6cd5\u8bc6\u522b\u5c5e\u6027\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  "setResult()" and "startDocument()" are Java
-         * method names that should not be translated.
-         */
-        {ErrorMsg.JAXP_SET_RESULT_ERR,
-        "setResult() \u5fc5\u987b\u5728 startDocument() \u4e4b\u524d\u8c03\u7528\u3002"},
-
-        /*
-         * Note to translators:  "Transformer" is a Java interface name that
-         * should not be translated.  A Transformer object should contained a
-         * reference to a translet object in order to be used for
-         * transformations; this message is produced if that requirement is not
-         * met.
-         */
-        {ErrorMsg.JAXP_NO_TRANSLET_ERR,
-        "Transformer \u6ca1\u6709\u5c01\u88c5\u7684 translet \u5bf9\u8c61\u3002"},
-
-        /*
-         * Note to translators:  The XML document that results from a
-         * transformation needs to be sent to an output handler object; this
-         * message is produced if that requirement is not met.
-         */
-        {ErrorMsg.JAXP_NO_HANDLER_ERR,
-        "\u6ca1\u6709\u4e3a\u8f6c\u6362\u7ed3\u679c\u5b9a\u4e49\u8f93\u51fa\u5904\u7406\u5668\u3002"},
-
-        /*
-         * Note to translators:  "Result" is a Java interface name in this
-         * context.  The substitution text is a method name.
-         */
-        {ErrorMsg.JAXP_NO_RESULT_ERR,
-        "\u4f20\u9012\u7ed9\u201c{0}\u201d\u7684 Result \u5bf9\u8c61\u65e0\u6548\u3002"},
-
-        /*
-         * Note to translators:  "Transformer" is a Java interface name.  The
-         * user's program attempted to access an unrecognized property with the
-         * name specified in the substitution text.  The method used to retrieve
-         * the property is "getOutputProperty", so it's not clear whether it
-         * would be best to translate the term "property".
-         */
-        {ErrorMsg.JAXP_UNKNOWN_PROP_ERR,
-        "\u8bd5\u56fe\u8bbf\u95ee\u65e0\u6548\u7684 Transformer \u5c5e\u6027\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  SAX2DOM is the name of a Java class that should
-         * not be translated.  This is an adapter in the sense that it takes a
-         * DOM object and converts it to something that uses the SAX API.
-         */
-        {ErrorMsg.SAX2DOM_ADAPTER_ERR,
-        "\u65e0\u6cd5\u521b\u5efa SAX2DOM \u9002\u914d\u5668\uff1a\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  "XSLTCSource.build()" is a Java method name.
-         * "systemId" is an XML term that is short for "system identification".
-         */
-        {ErrorMsg.XSLTC_SOURCE_ERR,
-        "\u6ca1\u6709\u8bbe\u7f6e systemId \u5c31\u8c03\u7528\u4e86 XSLTCSource.build()\u3002"},
-
-        { ErrorMsg.ER_RESULT_NULL,
-            "\u7ed3\u679c\u4e0d\u5e94\u4e3a\u7a7a"},
-
-        /*
-         * Note to translators:  This message indicates that the value argument
-         * of setParameter must be a valid Java Object.
-         */
-        {ErrorMsg.JAXP_INVALID_SET_PARAM_VALUE,
-        "\u53c2\u6570 {0} \u7684\u503c\u5fc5\u987b\u4e3a\u6709\u6548\u7684 Java \u5bf9\u8c61"},
-
-
-        {ErrorMsg.COMPILE_STDIN_ERR,
-        "-i \u9009\u9879\u5fc5\u987b\u4e0e -o \u9009\u9879\u4e00\u8d77\u4f7f\u7528\u3002"},
-
-
-        /*
-         * Note to translators:  This message contains usage information for a
-         * means of invoking XSLTC from the command-line.  The message is
-         * formatted for presentation in English.  The strings <output>,
-         * <directory>, etc. indicate user-specified argument values, and can
-         * be translated - the argument <package> refers to a Java package, so
-         * it should be handled in the same way the term is handled for JDK
-         * documentation.
-         */
-        {ErrorMsg.COMPILE_USAGE_STR,
-        "SYNOPSIS\n   java org.apache.xalan.xsltc.cmdline.Compile [-o <output>]\n      [-d <directory>] [-j <jarfile>] [-p <package>]\n      [-n] [-x] [-u] [-v] [-h] { <stylesheet> | -i }\n\nOPTIONS\n   -o <output>    \u5c06\u540d\u79f0 <output> \u6307\u5b9a\u7ed9\u751f\u6210\u7684\n                  translet\u3002\u7f3a\u7701\u60c5\u51b5\u4e0b\uff0ctranslet \u540d\u79f0\n                  \u6d3e\u751f\u81ea <stylesheet> \u540d\u79f0\u3002\n                  \u5982\u679c\u7f16\u8bd1\u591a\u4e2a\u6837\u5f0f\u8868\uff0c\u5219\u5ffd\u7565\u6b64\u9009\u9879\u3002\n-d <directory> \u6307\u5b9a translet \u7684\u76ee\u6807\u76ee\u5f55\n   -j <jarfile>   \u5c06 translet \u7c7b\u6253\u5305\u6210\u547d\u540d\u4e3a <jarfile>\n                  \u7684 jar \u6587\u4ef6\n   -p <package>   \u4e3a\u6240\u6709\u751f\u6210\u7684 translet \u7c7b\n                  \u6307\u5b9a\u8f6f\u4ef6\u5305\u540d\u79f0\u7684\u524d\u7f00\u3002\n   -n             \u542f\u7528\u6a21\u677f\u5728\u7ebf\uff08\u5e73\u5747\u7f3a\u7701\n                  \u884c\u4e3a\u66f4\u4f73\uff09\u3002\n   -x             \u6253\u5f00\u989d\u5916\u8c03\u8bd5\u6d88\u606f\u8f93\u51fa\n   -u             \u5c06 <stylesheet> \u81ea\u53d8\u91cf\u89e3\u91ca\u4e3a URL\n   -i             \u5f3a\u5236\u7f16\u8bd1\u5668\u4ece stdin \u8bfb\u5165\u6837\u5f0f\u8868\n   -v             \u6253\u5370\u7f16\u8bd1\u5668\u7684\u7248\u672c\n   -h             \u6253\u5370\u6b64\u7528\u6cd5\u8bed\u53e5\n"},
-
-        /*
-         * Note to translators:  This message contains usage information for a
-         * means of invoking XSLTC from the command-line.  The message is
-         * formatted for presentation in English.  The strings <jarfile>,
-         * <document>, etc. indicate user-specified argument values, and can
-         * be translated - the argument <class> refers to a Java class, so it
-         * should be handled in the same way the term is handled for JDK
-         * documentation.
-         */
-        {ErrorMsg.TRANSFORM_USAGE_STR,
-        "SYNOPSIS \n   java org.apache.xalan.xsltc.cmdline.Transform [-j <jarfile>]\n      [-x] [-n <iterations>] {-u <document_url> | <document>}\n      <class> [<param1>=<value1> ...]\n\n   \u4f7f\u7528 translet <class> \u6765\u8f6c\u6362\u6307\u5b9a\u4e3a <document>\n   \u7684 XML \u6587\u6863\u3002translet <class> \u8981\u4e48\u5728\n   \u7528\u6237\u7684 CLASSPATH \u4e2d\uff0c\u8981\u4e48\u5728\u4efb\u610f\u6307\u5b9a\u7684 <jarfile> \u4e2d\u3002\nOPTIONS\n   -j <jarfile>    \u6307\u5b9a\u88c5\u5165 translet \u7684 jarfile\n   -x              \u6253\u5f00\u989d\u5916\u8c03\u8bd5\u6d88\u606f\u8f93\u51fa\n   -n <iterations> \u8fd0\u884c\u8f6c\u6362\u8fc7\u7a0b <iterations> \u6570\u6b21\u5e76\n                   \u663e\u793a\u6982\u8981\u5206\u6790\u4fe1\u606f\n   -u <document_url> \u5c06 XML \u8f93\u5165\u6307\u5b9a\u4e3a URL\n"},
-
-
-
-        /*
-         * Note to translators:  "<xsl:sort>", "<xsl:for-each>" and
-         * "<xsl:apply-templates>" are keywords that should not be translated.
-         * The message indicates that an xsl:sort element must be a child of
-         * one of the other kinds of elements mentioned.
-         */
-        {ErrorMsg.STRAY_SORT_ERR,
-        "<xsl:sort> \u53ea\u80fd\u5728 <xsl:for-each> \u6216 <xsl:apply-templates> \u4e2d\u4f7f\u7528\u3002"},
-
-        /*
-         * Note to translators:  The message indicates that the encoding
-         * requested for the output document was on that requires support that
-         * is not available from the Java Virtual Machine being used to execute
-         * the program.
-         */
-        {ErrorMsg.UNSUPPORTED_ENCODING,
-        "\u6b64 JVM \u4e2d\u4e0d\u652f\u6301\u8f93\u51fa\u7f16\u7801\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The message indicates that the XPath expression
-         * named in the substitution text was not well formed syntactically.
-         */
-        {ErrorMsg.SYNTAX_ERR,
-        "\u201c{0}\u201d\u4e2d\u51fa\u73b0\u8bed\u6cd5\u9519\u8bef\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a Java
-         * class.  The term "constructor" here is the Java term.  The message is
-         * displayed if XSLTC could not find a constructor for the specified
-         * class.
-         */
-        {ErrorMsg.CONSTRUCTOR_NOT_FOUND,
-        "\u627e\u4e0d\u5230\u5916\u90e8\u6784\u9020\u51fd\u6570\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  "static" is the Java keyword.  The substitution
-         * text is the name of a function.  The first argument of that function
-         * is not of the required type.
-         */
-        {ErrorMsg.NO_JAVA_FUNCT_THIS_REF,
-        "\u975e static Java \u51fd\u6570\u201c{0}\u201d\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u4e0d\u662f\u6709\u6548\u7684\u5bf9\u8c61\u5f15\u7528\u3002"},
-
-        /*
-         * Note to translators:  An XPath expression was not of the type
-         * required in a particular context.  The substitution text is the
-         * expression that was in error.
-         */
-        {ErrorMsg.TYPE_CHECK_ERR,
-        "\u68c0\u67e5\u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684\u7c7b\u578b\u65f6\u51fa\u9519\u3002"},
-
-        /*
-         * Note to translators:  An XPath expression was not of the type
-         * required in a particular context.  However, the location of the
-         * problematic expression is unknown.
-         */
-        {ErrorMsg.TYPE_CHECK_UNK_LOC_ERR,
-        "\u68c0\u67e5\u672a\u77e5\u4f4d\u7f6e\u7684\u8868\u8fbe\u5f0f\u7c7b\u578b\u65f6\u51fa\u9519\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a command-
-         * line option that was not recognized.
-         */
-        {ErrorMsg.ILLEGAL_CMDLINE_OPTION_ERR,
-        "\u547d\u4ee4\u884c\u9009\u9879\u201c{0}\u201d\u65e0\u6548\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a command-
-         * line option.
-         */
-        {ErrorMsg.CMDLINE_OPT_MISSING_ARG_ERR,
-        "\u547d\u4ee4\u884c\u9009\u9879\u201c{0}\u201d\u7f3a\u5c11\u5fc5\u9700\u7684\u81ea\u53d8\u91cf\u3002"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text contains two error
-         * messages.  The spacing before the second substitution text indents
-         * it the same amount as the first in English.
-         */
-        {ErrorMsg.WARNING_PLUS_WRAPPED_MSG,
-        "\u8b66\u544a\uff1a\u201c{0}\u201d\n    \uff1a{1}"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text is an error message.
-         */
-        {ErrorMsg.WARNING_MSG,
-        "\u8b66\u544a\uff1a\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text contains two error
-         * messages.  The spacing before the second substitution text indents
-         * it the same amount as the first in English.
-         */
-        {ErrorMsg.FATAL_ERR_PLUS_WRAPPED_MSG,
-        "\u81f4\u547d\u9519\u8bef\uff1a\u201c{0}\u201d\n        \uff1a{1}"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text is an error message.
-         */
-        {ErrorMsg.FATAL_ERR_MSG,
-        "\u81f4\u547d\u9519\u8bef\uff1a\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text contains two error
-         * messages.  The spacing before the second substitution text indents
-         * it the same amount as the first in English.
-         */
-        {ErrorMsg.ERROR_PLUS_WRAPPED_MSG,
-        "\u9519\u8bef\uff1a{0}\u201c\n    \uff1a{1}"},
-
-        /*
-         * Note to translators:  This message is used to indicate the severity
-         * of another message.  The substitution text is an error message.
-         */
-        {ErrorMsg.ERROR_MSG,
-        "\u9519\u8bef\uff1a\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  The substitution text is the name of a class.
-         */
-        {ErrorMsg.TRANSFORM_WITH_TRANSLET_STR,
-        "\u4f7f\u7528 translet\u201c{0}\u201d\u8f6c\u6362"},
-
-        /*
-         * Note to translators:  The first substitution is the name of a class,
-         * while the second substitution is the name of a jar file.
-         */
-        {ErrorMsg.TRANSFORM_WITH_JAR_STR,
-        "\u4f7f\u7528 translet\u201c{0}\u201d\u4ece jar \u6587\u4ef6\u201c{1}\u201d\u8f6c\u6362"},
-
-        /*
-         * Note to translators:  "TransformerFactory" is the name of a Java
-         * interface and must not be translated.  The substitution text is
-         * the name of the class that could not be instantiated.
-         */
-        {ErrorMsg.COULD_NOT_CREATE_TRANS_FACT,
-        "\u65e0\u6cd5\u521b\u5efa TransformerFactory \u7c7b\u201c{0}\u201d\u7684\u5b9e\u4f8b\u3002"},
-
-        /*
-         * Note to translators:  This message is produced when the user
-         * specified a name for the translet class that contains characters
-         * that are not permitted in a Java class name.  The substitution
-         * text "{0}" specifies the name the user requested, while "{1}"
-         * specifies the name the processor used instead.
-         */
-        {ErrorMsg.TRANSLET_NAME_JAVA_CONFLICT,
-         "\u7531\u4e8e\u540d\u79f0\u201c{0}\u201d\u5305\u542b Java \u7c7b\u540d\u79f0\u4e2d\u4e0d\u5141\u8bb8\u4f7f\u7528\u7684\u5b57\u7b26\uff0c\u56e0\u6b64\u4e0d\u80fd\u5c06\u5b83\u7528\u4f5c translet \u7c7b\u7684\u540d\u79f0\u3002\u4f7f\u7528\u540d\u79f0\u201c{1}\u201d\u6765\u4ee3\u66ff\u3002"},
-
-        /*
-         * Note to translators:  The following message is used as a header.
-         * All the error messages are collected together and displayed beneath
-         * this message.
-         */
-        {ErrorMsg.COMPILER_ERROR_KEY,
-        "\u7f16\u8bd1\u5668\u9519\u8bef\uff1a"},
-
-        /*
-         * Note to translators:  The following message is used as a header.
-         * All the warning messages are collected together and displayed
-         * beneath this message.
-         */
-        {ErrorMsg.COMPILER_WARNING_KEY,
-        "\u7f16\u8bd1\u5668\u8b66\u544a\uff1a"},
-
-        /*
-         * Note to translators:  The following message is used as a header.
-         * All the error messages that are produced when the stylesheet is
-         * applied to an input document are collected together and displayed
-         * beneath this message.  A 'translet' is the compiled form of a
-         * stylesheet (see above).
-         */
-        {ErrorMsg.RUNTIME_ERROR_KEY,
-        "Translet \u9519\u8bef\uff1a"},
-
-        /*
-         * Note to translators:  An attribute whose value is constrained to
-         * be a "QName" or a list of "QNames" had a value that was incorrect.
-         * 'QName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {ErrorMsg.INVALID_QNAME_ERR,
-        "\u503c\u5fc5\u987b\u4e3a QName \u6216\u4e3a\u7528\u7a7a\u683c\u5206\u5f00\u7684 QName \u5217\u8868\u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  An attribute whose value is required to
-         * be an "NCName".
-         * 'NCName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {ErrorMsg.INVALID_NCNAME_ERR,
-        "\u503c\u5fc5\u987b\u4e3a NCName \u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  An attribute with an incorrect value was
-         * encountered.  The permitted value is one of the literal values
-         * "xml", "html" or "text"; it is also permitted to have the form of
-         * a QName that is not also an NCName.  The terms "method",
-         * "xsl:output", "xml", "html" and "text" are keywords that must not
-         * be translated.  The term "qname-but-not-ncname" is an XML syntactic
-         * term.  The substitution text contains the actual value of the
-         * attribute.
-         */
-        {ErrorMsg.INVALID_METHOD_IN_OUTPUT,
-        "<xsl:output> \u5143\u7d20\u7684 method \u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d\u3002\u6b64\u503c\u5fc5\u987b\u4e3a\u201cxml\u201d\u3001\u201chtml\u201d\u3001\u201ctext\u201d \u6216 qname-but-not-ncname \u4e2d\u7684\u4e00\u4e2a"},
-
-        {ErrorMsg.JAXP_GET_FEATURE_NULL_NAME,
-        "\u5728 TransformerFactory.getFeature(String name) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
-
-        {ErrorMsg.JAXP_SET_FEATURE_NULL_NAME,
-        "\u5728 TransformerFactory.setFeature(String name, boolean value) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
-
-        {ErrorMsg.JAXP_UNSUPPORTED_FEATURE,
-        "\u65e0\u6cd5\u5bf9\u6b64 TransformerFactory \u8bbe\u7f6e\u7279\u5f81\u201c{0}\u201d\u3002"}
-
-    };
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.compiler.util;
+
+import java.util.ListResourceBundle;
+
+/**
+ * @author Morten Jorgensen
+ */
+public class ErrorMessages_zh extends ListResourceBundle {
+
+/*
+ * XSLTC compile-time error messages.
+ *
+ * General notes to translators and definitions:
+ *
+ *   1) XSLTC is the name of the product.  It is an acronym for "XSLT Compiler".
+ *      XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *
+ *   2) A stylesheet is a description of how to transform an input XML document
+ *      into a resultant XML document (or HTML document or text).  The
+ *      stylesheet itself is described in the form of an XML document.
+ *
+ *   3) A template is a component of a stylesheet that is used to match a
+ *      particular portion of an input document and specifies the form of the
+ *      corresponding portion of the output document.
+ *
+ *   4) An axis is a particular "dimension" in a tree representation of an XML
+ *      document; the nodes in the tree are divided along different axes.
+ *      Traversing the "child" axis, for instance, means that the program
+ *      would visit each child of a particular node; traversing the "descendant"
+ *      axis means that the program would visit the child nodes of a particular
+ *      node, their children, and so on until the leaf nodes of the tree are
+ *      reached.
+ *
+ *   5) An iterator is an object that traverses nodes in a tree along a
+ *      particular axis, one at a time.
+ *
+ *   6) An element is a mark-up tag in an XML document; an attribute is a
+ *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *      "elem" is an element name, "attr" and "attr2" are attribute names with
+ *      the values "val" and "val2", respectively.
+ *
+ *   7) A namespace declaration is a special attribute that is used to associate
+ *      a prefix with a URI (the namespace).  The meanings of element names and
+ *      attribute names that use that prefix are defined with respect to that
+ *      namespace.
+ *
+ *   8) DOM is an acronym for Document Object Model.  It is a tree
+ *      representation of an XML document.
+ *
+ *      SAX is an acronym for the Simple API for XML processing.  It is an API
+ *      used inform an XML processor (in this case XSLTC) of the structure and
+ *      content of an XML document.
+ *
+ *      Input to the stylesheet processor can come from an XML parser in the
+ *      form of a DOM tree or through the SAX API.
+ *
+ *   9) DTD is a document type declaration.  It is a way of specifying the
+ *      grammar for an XML file, the names and types of elements, attributes,
+ *      etc.
+ *
+ *  10) XPath is a specification that describes a notation for identifying
+ *      nodes in a tree-structured representation of an XML document.  An
+ *      instance of that notation is referred to as an XPath expression.
+ *
+ *  11) Translet is an invented term that refers to the class file that contains
+ *      the compiled form of a stylesheet.
+ */
+
+    // These message should be read from a locale-specific resource bundle
+    /** Get the lookup table for error messages.
+     *
+     * @return The message lookup table.
+     */
+    public Object[][] getContents()
+    {
+      return new Object[][] {
+        {ErrorMsg.MULTIPLE_STYLESHEET_ERR,
+        "\u540c\u4e00\u6587\u4ef6\u4e2d\u5b9a\u4e49\u4e86\u591a\u4e2a\u6837\u5f0f\u8868\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a
+         * template.  The same name was used on two different templates in the
+         * same stylesheet.
+         */
+        {ErrorMsg.TEMPLATE_REDEF_ERR,
+        "\u6b64\u6837\u5f0f\u8868\u4e2d\u5df2\u7ecf\u5b9a\u4e49\u4e86\u6a21\u677f\u201c{0}\u201d\u3002"},
+
+
+        /*
+         * Note to translators:  The substitution text is the name of a
+         * template.  A reference to the template name was encountered, but the
+         * template is undefined.
+         */
+        {ErrorMsg.TEMPLATE_UNDEF_ERR,
+        "\u6b64\u6837\u5f0f\u8868\u4e2d\u672a\u5b9a\u4e49\u6a21\u677f\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a variable
+         * that was defined more than once.
+         */
+        {ErrorMsg.VARIABLE_REDEF_ERR,
+        "\u540c\u4e00\u4f5c\u7528\u57df\u4e2d\u591a\u6b21\u5b9a\u4e49\u4e86\u53d8\u91cf\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a variable
+         * or parameter.  A reference to the variable or parameter was found,
+         * but it was never defined.
+         */
+        {ErrorMsg.VARIABLE_UNDEF_ERR,
+        "\u672a\u5b9a\u4e49\u53d8\u91cf\u6216\u53c2\u6570\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The word "class" here refers to a Java class.
+         * Processing the stylesheet required a class to be loaded, but it could
+         * not be found.  The substitution text is the name of the class.
+         */
+        {ErrorMsg.CLASS_NOT_FOUND_ERR,
+        "\u627e\u4e0d\u5230\u7c7b\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The word "method" here refers to a Java method.
+         * Processing the stylesheet required a reference to the method named by
+         * the substitution text, but it could not be found.  "public" is the
+         * Java keyword.
+         */
+        {ErrorMsg.METHOD_NOT_FOUND_ERR,
+        "\u627e\u4e0d\u5230\u5916\u90e8\u65b9\u6cd5\u201c{0}\u201d\uff08\u5fc5\u987b\u662f public\uff09\u3002"},
+
+        /*
+         * Note to translators:  The word "method" here refers to a Java method.
+         * Processing the stylesheet required a reference to the method named by
+         * the substitution text, but no method with the required types of
+         * arguments or return type could be found.
+         */
+        {ErrorMsg.ARGUMENT_CONVERSION_ERR,
+        "\u65e0\u6cd5\u5c06\u8c03\u7528\u4e2d\u7684\u53c2\u6570\uff0f\u8fd4\u56de\u7c7b\u578b\u8f6c\u6362\u4e3a\u65b9\u6cd5\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  The file or URI named in the substitution text
+         * is missing.
+         */
+        {ErrorMsg.FILE_NOT_FOUND_ERR,
+        "\u627e\u4e0d\u5230\u6587\u4ef6\u6216 URI\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  This message is displayed when the URI
+         * mentioned in the substitution text is not well-formed syntactically.
+         */
+        {ErrorMsg.INVALID_URI_ERR,
+        "URI\u201c{0}\u201d\u65e0\u6548\u3002"},
+
+        /*
+         * Note to translators:  The file or URI named in the substitution text
+         * exists but could not be opened.
+         */
+        {ErrorMsg.FILE_ACCESS_ERR,
+        "\u65e0\u6cd5\u6253\u5f00\u6587\u4ef6\u6216 URI\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators: <xsl:stylesheet> and <xsl:transform> are
+         * keywords that should not be translated.
+         */
+        {ErrorMsg.MISSING_ROOT_ERR,
+        "\u9884\u671f\u5b58\u5728 <xsl:stylesheet> \u6216 <xsl:transform> \u5143\u7d20\u3002"},
+
+        /*
+         * Note to translators:  The stylesheet contained a reference to a
+         * namespace prefix that was undefined.  The value of the substitution
+         * text is the name of the prefix.
+         */
+        {ErrorMsg.NAMESPACE_UNDEF_ERR,
+        "\u672a\u58f0\u660e\u540d\u79f0\u7a7a\u95f4\u524d\u7f00\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The Java function named in the stylesheet could
+         * not be found.
+         */
+        {ErrorMsg.FUNCTION_RESOLVE_ERR,
+        "\u65e0\u6cd5\u89e3\u6790\u5bf9\u51fd\u6570\u201c{0}\u201d\u7684\u8c03\u7528\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a
+         * function.  A literal string here means a constant string value.
+         */
+        {ErrorMsg.NEED_LITERAL_ERR,
+        "\u201c{0}\u201d\u7684\u81ea\u53d8\u91cf\u5fc5\u987b\u662f\u6587\u5b57\u4e32\u3002"},
+
+        /*
+         * Note to translators:  This message indicates there was a syntactic
+         * error in the form of an XPath expression.  The substitution text is
+         * the expression.
+         */
+        {ErrorMsg.XPATH_PARSER_ERR,
+        "\u89e3\u6790 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u65f6\u51fa\u9519\u3002"},
+
+        /*
+         * Note to translators:  An element in the stylesheet requires a
+         * particular attribute named by the substitution text, but that
+         * attribute was not specified in the stylesheet.
+         */
+        {ErrorMsg.REQUIRED_ATTR_ERR,
+        "\u7f3a\u5c11\u5fc5\u9700\u7684\u5c5e\u6027\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  This message indicates that a character not
+         * permitted in an XPath expression was encountered.  The substitution
+         * text is the offending character.
+         */
+        {ErrorMsg.ILLEGAL_CHAR_ERR,
+        "XPath \u8868\u8fbe\u5f0f\u4e2d\u7684\u5b57\u7b26\u201c{0}\u201d\u975e\u6cd5\u3002"},
+
+        /*
+         * Note to translators:  A processing instruction is a mark-up item in
+         * an XML document that request some behaviour of an XML processor.  The
+         * form of the name of was invalid in this case, and the substitution
+         * text is the name.
+         */
+        {ErrorMsg.ILLEGAL_PI_ERR,
+        "\u5904\u7406\u6307\u4ee4\u7684\u540d\u79f0\u201c{0}\u201d\u975e\u6cd5\u3002"},
+
+        /*
+         * Note to translators:  This message is reported if the stylesheet
+         * being processed attempted to construct an XML document with an
+         * attribute in a place other than on an element.  The substitution text
+         * specifies the name of the attribute.
+         */
+        {ErrorMsg.STRAY_ATTRIBUTE_ERR,
+        "\u5c5e\u6027\u201c{0}\u201d\u5728\u5143\u7d20\u5916\u3002"},
+
+        /*
+         * Note to translators:  An attribute that wasn't recognized was
+         * specified on an element in the stylesheet.  The attribute is named
+         * by the substitution
+         * text.
+         */
+        {ErrorMsg.ILLEGAL_ATTRIBUTE_ERR,
+        "\u5c5e\u6027\u201c{0}\u201d\u975e\u6cd5\u3002"},
+
+        /*
+         * Note to translators:  "import" and "include" are keywords that should
+         * not be translated.  This messages indicates that the stylesheet
+         * named in the substitution text imported or included itself either
+         * directly or indirectly.
+         */
+        {ErrorMsg.CIRCULAR_INCLUDE_ERR,
+        "\u5faa\u73af import\uff0finclude\u3002\u5df2\u88c5\u5165\u6837\u5f0f\u8868\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  A result-tree fragment is a portion of a
+         * resulting XML document represented as a tree.  "<xsl:sort>" is a
+         * keyword and should not be translated.
+         */
+        {ErrorMsg.RESULT_TREE_SORT_ERR,
+        "\u65e0\u6cd5\u5bf9\u7ed3\u679c\u6811\u7247\u6bb5\u6392\u5e8f\uff08<xsl:sort> \u5143\u7d20\u88ab\u5ffd\u7565\uff09\u3002\u5fc5\u987b\u5728\u521b\u5efa\u7ed3\u679c\u6811\u65f6\u5bf9\u8282\u70b9\u8fdb\u884c\u6392\u5e8f\u3002"},
+
+        /*
+         * Note to translators:  A name can be given to a particular style to be
+         * used to format decimal values.  The substitution text gives the name
+         * of such a style for which more than one declaration was encountered.
+         */
+        {ErrorMsg.SYMBOLS_REDEF_ERR,
+        "\u5df2\u7ecf\u5b9a\u4e49\u4e86\u5341\u8fdb\u5236\u683c\u5f0f\u7f16\u6392\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The stylesheet version named in the
+         * substitution text is not supported.
+         */
+        {ErrorMsg.XSL_VERSION_ERR,
+        "XSLTC \u4e0d\u652f\u6301 XSL V{0}\u3002"},
+
+        /*
+         * Note to translators:  The definitions of one or more variables or
+         * parameters depend on one another.
+         */
+        {ErrorMsg.CIRCULAR_VARIABLE_ERR,
+        "\u201c{0}\u201d\u4e2d\u7684\u5faa\u73af\u53d8\u91cf\uff0f\u53c2\u6570\u5f15\u7528\u3002"},
+
+        /*
+         * Note to translators:  The operator in an expresion with two operands was
+         * not recognized.
+         */
+        {ErrorMsg.ILLEGAL_BINARY_OP_ERR,
+        "\u4e8c\u8fdb\u5236\u8868\u8fbe\u5f0f\u7684\u8fd0\u7b97\u7b26\u672a\u77e5\u3002"},
+
+        /*
+         * Note to translators:  This message is produced if a reference to a
+         * function has too many or too few arguments.
+         */
+        {ErrorMsg.ILLEGAL_ARG_ERR,
+        "\u51fd\u6570\u8c03\u7528\u7684\u53c2\u6570\u975e\u6cd5\u3002"},
+
+        /*
+         * Note to translators:  "document()" is the name of function and must
+         * not be translated.  A node-set is a set of the nodes in the tree
+         * representation of an XML document.
+         */
+        {ErrorMsg.DOCUMENT_ARG_ERR,
+        "\u51fd\u6570 document() \u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570\u5fc5\u987b\u662f\u8282\u70b9\u96c6\u3002"},
+
+        /*
+         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
+         * and should not be translated.  This message describes a syntax error
+         * in the stylesheet.
+         */
+        {ErrorMsg.MISSING_WHEN_ERR,
+        "<xsl:choose> \u4e2d\u81f3\u5c11\u8981\u6709\u4e00\u4e2a <xsl:when> \u5143\u7d20\u3002"},
+
+        /*
+         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
+         * keywords and should not be translated.  This message describes a
+         * syntax error in the stylesheet.
+         */
+        {ErrorMsg.MULTIPLE_OTHERWISE_ERR,
+        "<xsl:choose> \u4e2d\u53ea\u5141\u8bb8\u6709\u4e00\u4e2a <xsl:otherwise> \u5143\u7d20\u3002"},
+
+        /*
+         * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
+         * keywords and should not be translated.  This message describes a
+         * syntax error in the stylesheet.
+         */
+        {ErrorMsg.STRAY_OTHERWISE_ERR,
+        "<xsl:otherwise> \u53ea\u80fd\u5728 <xsl:choose> \u4e2d\u4f7f\u7528\u3002"},
+
+        /*
+         * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
+         * and should not be translated.  This message describes a syntax error
+         * in the stylesheet.
+         */
+        {ErrorMsg.STRAY_WHEN_ERR,
+        "<xsl:when> \u53ea\u80fd\u5728 <xsl:choose> \u4e2d\u4f7f\u7528\u3002"},
+
+        /*
+         * Note to translators:  "<xsl:when>", "<xsl:otherwise>" and
+         * "<xsl:choose>" are keywords and should not be translated.  This
+         * message describes a syntax error in the stylesheet.
+         */
+        {ErrorMsg.WHEN_ELEMENT_ERR,
+        "<xsl:choose> \u4e2d\u53ea\u5141\u8bb8\u4f7f\u7528 <xsl:when> \u548c <xsl:otherwise>\u3002"},
+
+        /*
+         * Note to translators:  "<xsl:attribute-set>" and "name" are keywords
+         * that should not be translated.
+         */
+        {ErrorMsg.UNNAMED_ATTRIBSET_ERR,
+        "<xsl:attribute-set> \u7f3a\u5c11\u201cname\u201d\u5c5e\u6027\u3002"},
+
+        /*
+         * Note to translators:  An element in the stylesheet contained an
+         * element of a type that it was not permitted to contain.
+         */
+        {ErrorMsg.ILLEGAL_CHILD_ERR,
+        "\u5b50\u5143\u7d20\u975e\u6cd5\u3002"},
+
+        /*
+         * Note to translators:  The stylesheet tried to create an element with
+         * a name that was not a valid XML name.  The substitution text contains
+         * the name.
+         */
+        {ErrorMsg.ILLEGAL_ELEM_NAME_ERR,
+        "\u4e0d\u80fd\u8c03\u7528\u5143\u7d20\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  The stylesheet tried to create an attribute
+         * with a name that was not a valid XML name.  The substitution text
+         * contains the name.
+         */
+        {ErrorMsg.ILLEGAL_ATTR_NAME_ERR,
+        "\u4e0d\u80fd\u8c03\u7528\u5c5e\u6027\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  The children of the outermost element of a
+         * stylesheet are referred to as top-level elements.  No text should
+         * occur within that outermost element unless it is within a top-level
+         * element.  This message indicates that that constraint was violated.
+         * "<xsl:stylesheet>" is a keyword that should not be translated.
+         */
+        {ErrorMsg.ILLEGAL_TEXT_NODE_ERR,
+        "\u6587\u672c\u6570\u636e\u5728\u9876\u7ea7 <xsl:stylesheet> \u5143\u7d20\u5916\u3002"},
+
+        /*
+         * Note to translators:  JAXP is an acronym for the Java API for XML
+         * Processing.  This message indicates that the XML parser provided to
+         * XSLTC to process the XML input document had a configuration problem.
+         */
+        {ErrorMsg.SAX_PARSER_CONFIG_ERR,
+        "JAXP \u89e3\u6790\u5668\u6ca1\u6709\u6b63\u786e\u914d\u7f6e"},
+
+        /*
+         * Note to translators:  The substitution text names the internal error
+         * encountered.
+         */
+        {ErrorMsg.INTERNAL_ERR,
+        "\u4e0d\u53ef\u6062\u590d\u7684 XSLTC \u5185\u90e8\u9519\u8bef\uff1a\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  The stylesheet contained an element that was
+         * not recognized as part of the XSL syntax.  The substitution text
+         * gives the element name.
+         */
+        {ErrorMsg.UNSUPPORTED_XSL_ERR,
+        "\u4e0d\u53d7\u652f\u6301\u7684 XSL \u5143\u7d20\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The stylesheet referred to an extension to the
+         * XSL syntax and indicated that it was defined by XSLTC, but XSTLC does
+         * not recognized the particular extension named.  The substitution text
+         * gives the extension name.
+         */
+        {ErrorMsg.UNSUPPORTED_EXT_ERR,
+        "\u672a\u88ab\u8bc6\u522b\u7684 XSLTC \u6269\u5c55\u540d\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The XML document given to XSLTC as a stylesheet
+         * was not, in fact, a stylesheet.  XSLTC is able to detect that in this
+         * case because the outermost element in the stylesheet has to be
+         * declared with respect to the XSL namespace URI, but no declaration
+         * for that namespace was seen.
+         */
+        {ErrorMsg.MISSING_XSLT_URI_ERR,
+        "\u8f93\u5165\u6587\u6863\u4e0d\u662f\u6837\u5f0f\u8868\uff08XSL \u540d\u79f0\u7a7a\u95f4\u6ca1\u6709\u5728\u6839\u5143\u7d20\u4e2d\u58f0\u660e\uff09\u3002"},
+
+        /*
+         * Note to translators:  XSLTC could not find the stylesheet document
+         * with the name specified by the substitution text.
+         */
+        {ErrorMsg.MISSING_XSLT_TARGET_ERR,
+        "\u627e\u4e0d\u5230\u6837\u5f0f\u8868\u76ee\u6807\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  This message represents an internal error in
+         * condition in XSLTC.  The substitution text is the class name in XSLTC
+         * that is missing some functionality.
+         */
+        {ErrorMsg.NOT_IMPLEMENTED_ERR,
+        "\u6ca1\u6709\u5b9e\u73b0\uff1a\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The XML document given to XSLTC as a stylesheet
+         * was not, in fact, a stylesheet.
+         */
+        {ErrorMsg.NOT_STYLESHEET_ERR,
+        "\u8f93\u5165\u6587\u6863\u4e0d\u5305\u542b XSL \u6837\u5f0f\u8868\u3002"},
+
+        /*
+         * Note to translators:  The element named in the substitution text was
+         * encountered in the stylesheet but is not recognized.
+         */
+        {ErrorMsg.ELEMENT_PARSE_ERR,
+        "\u65e0\u6cd5\u89e3\u6790\u5143\u7d20\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  "use", "<key>", "node", "node-set", "string"
+         * and "number" are keywords in this context and should not be
+         * translated.  This message indicates that the value of the "use"
+         * attribute was not one of the permitted values.
+         */
+        {ErrorMsg.KEY_USE_ATTR_ERR,
+        "<key> \u7684 use \u5c5e\u6027\u5fc5\u987b\u662f node\u3001node-set\u3001string \u6216 number\u3002"},
+
+        /*
+         * Note to translators:  An XML document can specify the version of the
+         * XML specification to which it adheres.  This message indicates that
+         * the version specified for the output document was not valid.
+         */
+        {ErrorMsg.OUTPUT_VERSION_ERR,
+        "\u8f93\u51fa XML \u6587\u6863\u7684\u7248\u672c\u5e94\u5f53\u662f 1.0"},
+
+        /*
+         * Note to translators:  The operator in a comparison operation was
+         * not recognized.
+         */
+        {ErrorMsg.ILLEGAL_RELAT_OP_ERR,
+        "\u5173\u7cfb\u8868\u8fbe\u5f0f\u7684\u8fd0\u7b97\u7b26\u672a\u77e5"},
+
+        /*
+         * Note to translators:  An attribute set defines as a set of XML
+         * attributes that can be added to an element in the output XML document
+         * as a group.  This message is reported if the name specified was not
+         * used to declare an attribute set.  The substitution text is the name
+         * that is in error.
+         */
+        {ErrorMsg.ATTRIBSET_UNDEF_ERR,
+        "\u8bd5\u56fe\u4f7f\u7528\u4e0d\u5b58\u5728\u7684\u5c5e\u6027\u96c6\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The term "attribute value template" is a term
+         * defined by XSLT which describes the value of an attribute that is
+         * determined by an XPath expression.  The message indicates that the
+         * expression was syntactically incorrect; the substitution text
+         * contains the expression that was in error.
+         */
+        {ErrorMsg.ATTR_VAL_TEMPLATE_ERR,
+        "\u65e0\u6cd5\u89e3\u6790\u5c5e\u6027\u503c\u6a21\u677f\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  ???
+         */
+        {ErrorMsg.UNKNOWN_SIG_TYPE_ERR,
+        "\u7c7b\u201c{0}\u201d\u7684\u7279\u5f81\u7b26\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u672a\u77e5\u3002"},
+
+        /*
+         * Note to translators:  The substitution text refers to data types.
+         * The message is displayed if a value in a particular context needs to
+         * be converted to type {1}, but that's not possible for a value of
+         * type {0}.
+         */
+        {ErrorMsg.DATA_CONVERSION_ERR,
+        "\u65e0\u6cd5\u5c06\u6570\u636e\u7c7b\u578b\u201c{0}\u201d\u8f6c\u6362\u6210\u201c{1}\u201d\u3002"},
+
+        /*
+         * Note to translators:  "Templates" is a Java class name that should
+         * not be translated.
+         */
+        {ErrorMsg.NO_TRANSLET_CLASS_ERR,
+        "\u6b64 Templates \u4e0d\u5305\u542b\u6709\u6548\u7684 translet \u7c7b\u5b9a\u4e49\u3002"},
+
+        /*
+         * Note to translators:  "Templates" is a Java class name that should
+         * not be translated.
+         */
+        {ErrorMsg.NO_MAIN_TRANSLET_ERR,
+        "\u6b64 Templates \u4e0d\u5305\u542b\u540d\u4e3a\u201c{0}\u201d\u7684\u7c7b\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a class.
+         */
+        {ErrorMsg.TRANSLET_CLASS_ERR,
+        "\u65e0\u6cd5\u88c5\u5165 translet \u7c7b\u201c{0}\u201d\u3002"},
+
+        {ErrorMsg.TRANSLET_OBJECT_ERR,
+        "Translet \u7c7b\u5df2\u88c5\u5165\uff0c\u4f46\u65e0\u6cd5\u521b\u5efa translet \u5b9e\u4f8b\u3002"},
+
+        /*
+         * Note to translators:  "ErrorListener" is a Java interface name that
+         * should not be translated.  The message indicates that the user tried
+         * to set an ErrorListener object on object of the class named in the
+         * substitution text with "null" Java value.
+         */
+        {ErrorMsg.ERROR_LISTENER_NULL_ERR,
+        "\u8bd5\u56fe\u5c06\u201c{0}\u201d\u7684 ErrorListener \u8bbe\u7f6e\u4e3a\u7a7a"},
+
+        /*
+         * Note to translators:  StreamSource, SAXSource and DOMSource are Java
+         * interface names that should not be translated.
+         */
+        {ErrorMsg.JAXP_UNKNOWN_SOURCE_ERR,
+        "XSLTC \u53ea\u652f\u6301 StreamSource\u3001SAXSource \u548c DOMSource"},
+
+        /*
+         * Note to translators:  "Source" is a Java class name that should not
+         * be translated.  The substitution text is the name of Java method.
+         */
+        {ErrorMsg.JAXP_NO_SOURCE_ERR,
+        "\u4f20\u9012\u7ed9\u201c{0}\u201d\u7684\u6e90\u5bf9\u8c61\u6ca1\u6709\u5185\u5bb9\u3002"},
+
+        /*
+         * Note to translators:  The message indicates that XSLTC failed to
+         * compile the stylesheet into a translet (class file).
+         */
+        {ErrorMsg.JAXP_COMPILE_ERR,
+        "\u65e0\u6cd5\u7f16\u8bd1\u6837\u5f0f\u8868"},
+
+        /*
+         * Note to translators:  "TransformerFactory" is a class name.  In this
+         * context, an attribute is a property or setting of the
+         * TransformerFactory object.  The substitution text is the name of the
+         * unrecognised attribute.  The method used to retrieve the attribute is
+         * "getAttribute", so it's not clear whether it would be best to
+         * translate the term "attribute".
+         */
+        {ErrorMsg.JAXP_INVALID_ATTR_ERR,
+        "TransformerFactory \u65e0\u6cd5\u8bc6\u522b\u5c5e\u6027\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  "setResult()" and "startDocument()" are Java
+         * method names that should not be translated.
+         */
+        {ErrorMsg.JAXP_SET_RESULT_ERR,
+        "setResult() \u5fc5\u987b\u5728 startDocument() \u4e4b\u524d\u8c03\u7528\u3002"},
+
+        /*
+         * Note to translators:  "Transformer" is a Java interface name that
+         * should not be translated.  A Transformer object should contained a
+         * reference to a translet object in order to be used for
+         * transformations; this message is produced if that requirement is not
+         * met.
+         */
+        {ErrorMsg.JAXP_NO_TRANSLET_ERR,
+        "Transformer \u6ca1\u6709\u5c01\u88c5\u7684 translet \u5bf9\u8c61\u3002"},
+
+        /*
+         * Note to translators:  The XML document that results from a
+         * transformation needs to be sent to an output handler object; this
+         * message is produced if that requirement is not met.
+         */
+        {ErrorMsg.JAXP_NO_HANDLER_ERR,
+        "\u6ca1\u6709\u4e3a\u8f6c\u6362\u7ed3\u679c\u5b9a\u4e49\u8f93\u51fa\u5904\u7406\u5668\u3002"},
+
+        /*
+         * Note to translators:  "Result" is a Java interface name in this
+         * context.  The substitution text is a method name.
+         */
+        {ErrorMsg.JAXP_NO_RESULT_ERR,
+        "\u4f20\u9012\u7ed9\u201c{0}\u201d\u7684 Result \u5bf9\u8c61\u65e0\u6548\u3002"},
+
+        /*
+         * Note to translators:  "Transformer" is a Java interface name.  The
+         * user's program attempted to access an unrecognized property with the
+         * name specified in the substitution text.  The method used to retrieve
+         * the property is "getOutputProperty", so it's not clear whether it
+         * would be best to translate the term "property".
+         */
+        {ErrorMsg.JAXP_UNKNOWN_PROP_ERR,
+        "\u8bd5\u56fe\u8bbf\u95ee\u65e0\u6548\u7684 Transformer \u5c5e\u6027\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  SAX2DOM is the name of a Java class that should
+         * not be translated.  This is an adapter in the sense that it takes a
+         * DOM object and converts it to something that uses the SAX API.
+         */
+        {ErrorMsg.SAX2DOM_ADAPTER_ERR,
+        "\u65e0\u6cd5\u521b\u5efa SAX2DOM \u9002\u914d\u5668\uff1a\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  "XSLTCSource.build()" is a Java method name.
+         * "systemId" is an XML term that is short for "system identification".
+         */
+        {ErrorMsg.XSLTC_SOURCE_ERR,
+        "\u6ca1\u6709\u8bbe\u7f6e systemId \u5c31\u8c03\u7528\u4e86 XSLTCSource.build()\u3002"},
+
+        { ErrorMsg.ER_RESULT_NULL,
+            "\u7ed3\u679c\u4e0d\u5e94\u4e3a\u7a7a"},
+
+        /*
+         * Note to translators:  This message indicates that the value argument
+         * of setParameter must be a valid Java Object.
+         */
+        {ErrorMsg.JAXP_INVALID_SET_PARAM_VALUE,
+        "\u53c2\u6570 {0} \u7684\u503c\u5fc5\u987b\u4e3a\u6709\u6548\u7684 Java \u5bf9\u8c61"},
+
+
+        {ErrorMsg.COMPILE_STDIN_ERR,
+        "-i \u9009\u9879\u5fc5\u987b\u4e0e -o \u9009\u9879\u4e00\u8d77\u4f7f\u7528\u3002"},
+
+
+        /*
+         * Note to translators:  This message contains usage information for a
+         * means of invoking XSLTC from the command-line.  The message is
+         * formatted for presentation in English.  The strings <output>,
+         * <directory>, etc. indicate user-specified argument values, and can
+         * be translated - the argument <package> refers to a Java package, so
+         * it should be handled in the same way the term is handled for JDK
+         * documentation.
+         */
+        {ErrorMsg.COMPILE_USAGE_STR,
+        "SYNOPSIS\n   java org.apache.xalan.xsltc.cmdline.Compile [-o <output>]\n      [-d <directory>] [-j <jarfile>] [-p <package>]\n      [-n] [-x] [-u] [-v] [-h] { <stylesheet> | -i }\n\nOPTIONS\n   -o <output>    \u5c06\u540d\u79f0 <output> \u6307\u5b9a\u7ed9\u751f\u6210\u7684\n                  translet\u3002\u7f3a\u7701\u60c5\u51b5\u4e0b\uff0ctranslet \u540d\u79f0\n                  \u6d3e\u751f\u81ea <stylesheet> \u540d\u79f0\u3002\n                  \u5982\u679c\u7f16\u8bd1\u591a\u4e2a\u6837\u5f0f\u8868\uff0c\u5219\u5ffd\u7565\u6b64\u9009\u9879\u3002\n-d <directory> \u6307\u5b9a translet \u7684\u76ee\u6807\u76ee\u5f55\n   -j <jarfile>   \u5c06 translet \u7c7b\u6253\u5305\u6210\u547d\u540d\u4e3a <jarfile>\n                  \u7684 jar \u6587\u4ef6\n   -p <package>   \u4e3a\u6240\u6709\u751f\u6210\u7684 translet \u7c7b\n                  \u6307\u5b9a\u8f6f\u4ef6\u5305\u540d\u79f0\u7684\u524d\u7f00\u3002\n   -n             \u542f\u7528\u6a21\u677f\u5728\u7ebf\uff08\u5e73\u5747\u7f3a\u7701\n                  \u884c\u4e3a\u66f4\u4f73\uff09\u3002\n   -x             \u6253\u5f00\u989d\u5916\u8c03\u8bd5\u6d88\u606f\u8f93\u51fa\n   -u             \u5c06 <stylesheet> \u81ea\u53d8\u91cf\u89e3\u91ca\u4e3a URL\n   -i             \u5f3a\u5236\u7f16\u8bd1\u5668\u4ece stdin \u8bfb\u5165\u6837\u5f0f\u8868\n   -v             \u6253\u5370\u7f16\u8bd1\u5668\u7684\u7248\u672c\n   -h             \u6253\u5370\u6b64\u7528\u6cd5\u8bed\u53e5\n"},
+
+        /*
+         * Note to translators:  This message contains usage information for a
+         * means of invoking XSLTC from the command-line.  The message is
+         * formatted for presentation in English.  The strings <jarfile>,
+         * <document>, etc. indicate user-specified argument values, and can
+         * be translated - the argument <class> refers to a Java class, so it
+         * should be handled in the same way the term is handled for JDK
+         * documentation.
+         */
+        {ErrorMsg.TRANSFORM_USAGE_STR,
+        "SYNOPSIS \n   java org.apache.xalan.xsltc.cmdline.Transform [-j <jarfile>]\n      [-x] [-n <iterations>] {-u <document_url> | <document>}\n      <class> [<param1>=<value1> ...]\n\n   \u4f7f\u7528 translet <class> \u6765\u8f6c\u6362\u6307\u5b9a\u4e3a <document>\n   \u7684 XML \u6587\u6863\u3002translet <class> \u8981\u4e48\u5728\n   \u7528\u6237\u7684 CLASSPATH \u4e2d\uff0c\u8981\u4e48\u5728\u4efb\u610f\u6307\u5b9a\u7684 <jarfile> \u4e2d\u3002\nOPTIONS\n   -j <jarfile>    \u6307\u5b9a\u88c5\u5165 translet \u7684 jarfile\n   -x              \u6253\u5f00\u989d\u5916\u8c03\u8bd5\u6d88\u606f\u8f93\u51fa\n   -n <iterations> \u8fd0\u884c\u8f6c\u6362\u8fc7\u7a0b <iterations> \u6570\u6b21\u5e76\n                   \u663e\u793a\u6982\u8981\u5206\u6790\u4fe1\u606f\n   -u <document_url> \u5c06 XML \u8f93\u5165\u6307\u5b9a\u4e3a URL\n"},
+
+
+
+        /*
+         * Note to translators:  "<xsl:sort>", "<xsl:for-each>" and
+         * "<xsl:apply-templates>" are keywords that should not be translated.
+         * The message indicates that an xsl:sort element must be a child of
+         * one of the other kinds of elements mentioned.
+         */
+        {ErrorMsg.STRAY_SORT_ERR,
+        "<xsl:sort> \u53ea\u80fd\u5728 <xsl:for-each> \u6216 <xsl:apply-templates> \u4e2d\u4f7f\u7528\u3002"},
+
+        /*
+         * Note to translators:  The message indicates that the encoding
+         * requested for the output document was on that requires support that
+         * is not available from the Java Virtual Machine being used to execute
+         * the program.
+         */
+        {ErrorMsg.UNSUPPORTED_ENCODING,
+        "\u6b64 JVM \u4e2d\u4e0d\u652f\u6301\u8f93\u51fa\u7f16\u7801\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The message indicates that the XPath expression
+         * named in the substitution text was not well formed syntactically.
+         */
+        {ErrorMsg.SYNTAX_ERR,
+        "\u201c{0}\u201d\u4e2d\u51fa\u73b0\u8bed\u6cd5\u9519\u8bef\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a Java
+         * class.  The term "constructor" here is the Java term.  The message is
+         * displayed if XSLTC could not find a constructor for the specified
+         * class.
+         */
+        {ErrorMsg.CONSTRUCTOR_NOT_FOUND,
+        "\u627e\u4e0d\u5230\u5916\u90e8\u6784\u9020\u51fd\u6570\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  "static" is the Java keyword.  The substitution
+         * text is the name of a function.  The first argument of that function
+         * is not of the required type.
+         */
+        {ErrorMsg.NO_JAVA_FUNCT_THIS_REF,
+        "\u975e static Java \u51fd\u6570\u201c{0}\u201d\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u4e0d\u662f\u6709\u6548\u7684\u5bf9\u8c61\u5f15\u7528\u3002"},
+
+        /*
+         * Note to translators:  An XPath expression was not of the type
+         * required in a particular context.  The substitution text is the
+         * expression that was in error.
+         */
+        {ErrorMsg.TYPE_CHECK_ERR,
+        "\u68c0\u67e5\u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684\u7c7b\u578b\u65f6\u51fa\u9519\u3002"},
+
+        /*
+         * Note to translators:  An XPath expression was not of the type
+         * required in a particular context.  However, the location of the
+         * problematic expression is unknown.
+         */
+        {ErrorMsg.TYPE_CHECK_UNK_LOC_ERR,
+        "\u68c0\u67e5\u672a\u77e5\u4f4d\u7f6e\u7684\u8868\u8fbe\u5f0f\u7c7b\u578b\u65f6\u51fa\u9519\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a command-
+         * line option that was not recognized.
+         */
+        {ErrorMsg.ILLEGAL_CMDLINE_OPTION_ERR,
+        "\u547d\u4ee4\u884c\u9009\u9879\u201c{0}\u201d\u65e0\u6548\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a command-
+         * line option.
+         */
+        {ErrorMsg.CMDLINE_OPT_MISSING_ARG_ERR,
+        "\u547d\u4ee4\u884c\u9009\u9879\u201c{0}\u201d\u7f3a\u5c11\u5fc5\u9700\u7684\u81ea\u53d8\u91cf\u3002"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text contains two error
+         * messages.  The spacing before the second substitution text indents
+         * it the same amount as the first in English.
+         */
+        {ErrorMsg.WARNING_PLUS_WRAPPED_MSG,
+        "\u8b66\u544a\uff1a\u201c{0}\u201d\n    \uff1a{1}"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text is an error message.
+         */
+        {ErrorMsg.WARNING_MSG,
+        "\u8b66\u544a\uff1a\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text contains two error
+         * messages.  The spacing before the second substitution text indents
+         * it the same amount as the first in English.
+         */
+        {ErrorMsg.FATAL_ERR_PLUS_WRAPPED_MSG,
+        "\u81f4\u547d\u9519\u8bef\uff1a\u201c{0}\u201d\n        \uff1a{1}"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text is an error message.
+         */
+        {ErrorMsg.FATAL_ERR_MSG,
+        "\u81f4\u547d\u9519\u8bef\uff1a\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text contains two error
+         * messages.  The spacing before the second substitution text indents
+         * it the same amount as the first in English.
+         */
+        {ErrorMsg.ERROR_PLUS_WRAPPED_MSG,
+        "\u9519\u8bef\uff1a{0}\u201c\n    \uff1a{1}"},
+
+        /*
+         * Note to translators:  This message is used to indicate the severity
+         * of another message.  The substitution text is an error message.
+         */
+        {ErrorMsg.ERROR_MSG,
+        "\u9519\u8bef\uff1a\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  The substitution text is the name of a class.
+         */
+        {ErrorMsg.TRANSFORM_WITH_TRANSLET_STR,
+        "\u4f7f\u7528 translet\u201c{0}\u201d\u8f6c\u6362"},
+
+        /*
+         * Note to translators:  The first substitution is the name of a class,
+         * while the second substitution is the name of a jar file.
+         */
+        {ErrorMsg.TRANSFORM_WITH_JAR_STR,
+        "\u4f7f\u7528 translet\u201c{0}\u201d\u4ece jar \u6587\u4ef6\u201c{1}\u201d\u8f6c\u6362"},
+
+        /*
+         * Note to translators:  "TransformerFactory" is the name of a Java
+         * interface and must not be translated.  The substitution text is
+         * the name of the class that could not be instantiated.
+         */
+        {ErrorMsg.COULD_NOT_CREATE_TRANS_FACT,
+        "\u65e0\u6cd5\u521b\u5efa TransformerFactory \u7c7b\u201c{0}\u201d\u7684\u5b9e\u4f8b\u3002"},
+
+        /*
+         * Note to translators:  This message is produced when the user
+         * specified a name for the translet class that contains characters
+         * that are not permitted in a Java class name.  The substitution
+         * text "{0}" specifies the name the user requested, while "{1}"
+         * specifies the name the processor used instead.
+         */
+        {ErrorMsg.TRANSLET_NAME_JAVA_CONFLICT,
+         "\u7531\u4e8e\u540d\u79f0\u201c{0}\u201d\u5305\u542b Java \u7c7b\u540d\u79f0\u4e2d\u4e0d\u5141\u8bb8\u4f7f\u7528\u7684\u5b57\u7b26\uff0c\u56e0\u6b64\u4e0d\u80fd\u5c06\u5b83\u7528\u4f5c translet \u7c7b\u7684\u540d\u79f0\u3002\u4f7f\u7528\u540d\u79f0\u201c{1}\u201d\u6765\u4ee3\u66ff\u3002"},
+
+        /*
+         * Note to translators:  The following message is used as a header.
+         * All the error messages are collected together and displayed beneath
+         * this message.
+         */
+        {ErrorMsg.COMPILER_ERROR_KEY,
+        "\u7f16\u8bd1\u5668\u9519\u8bef\uff1a"},
+
+        /*
+         * Note to translators:  The following message is used as a header.
+         * All the warning messages are collected together and displayed
+         * beneath this message.
+         */
+        {ErrorMsg.COMPILER_WARNING_KEY,
+        "\u7f16\u8bd1\u5668\u8b66\u544a\uff1a"},
+
+        /*
+         * Note to translators:  The following message is used as a header.
+         * All the error messages that are produced when the stylesheet is
+         * applied to an input document are collected together and displayed
+         * beneath this message.  A 'translet' is the compiled form of a
+         * stylesheet (see above).
+         */
+        {ErrorMsg.RUNTIME_ERROR_KEY,
+        "Translet \u9519\u8bef\uff1a"},
+
+        /*
+         * Note to translators:  An attribute whose value is constrained to
+         * be a "QName" or a list of "QNames" had a value that was incorrect.
+         * 'QName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {ErrorMsg.INVALID_QNAME_ERR,
+        "\u503c\u5fc5\u987b\u4e3a QName \u6216\u4e3a\u7528\u7a7a\u683c\u5206\u5f00\u7684 QName \u5217\u8868\u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  An attribute whose value is required to
+         * be an "NCName".
+         * 'NCName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {ErrorMsg.INVALID_NCNAME_ERR,
+        "\u503c\u5fc5\u987b\u4e3a NCName \u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  An attribute with an incorrect value was
+         * encountered.  The permitted value is one of the literal values
+         * "xml", "html" or "text"; it is also permitted to have the form of
+         * a QName that is not also an NCName.  The terms "method",
+         * "xsl:output", "xml", "html" and "text" are keywords that must not
+         * be translated.  The term "qname-but-not-ncname" is an XML syntactic
+         * term.  The substitution text contains the actual value of the
+         * attribute.
+         */
+        {ErrorMsg.INVALID_METHOD_IN_OUTPUT,
+        "<xsl:output> \u5143\u7d20\u7684 method \u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d\u3002\u6b64\u503c\u5fc5\u987b\u4e3a\u201cxml\u201d\u3001\u201chtml\u201d\u3001\u201ctext\u201d \u6216 qname-but-not-ncname \u4e2d\u7684\u4e00\u4e2a"},
+
+        {ErrorMsg.JAXP_GET_FEATURE_NULL_NAME,
+        "\u5728 TransformerFactory.getFeature(String name) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
+
+        {ErrorMsg.JAXP_SET_FEATURE_NULL_NAME,
+        "\u5728 TransformerFactory.setFeature(String name, boolean value) \u4e2d\u7279\u5f81\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002"},
+
+        {ErrorMsg.JAXP_UNSUPPORTED_FEATURE,
+        "\u65e0\u6cd5\u5bf9\u6b64 TransformerFactory \u8bbe\u7f6e\u7279\u5f81\u201c{0}\u201d\u3002"}
+
+    };
+    }
+
+}
diff --git a/src/org/apache/xalan/xsltc/compiler/util/InternalError.java b/src/org/apache/xalan/xsltc/compiler/util/InternalError.java
index 1544fc9..efe1c36 100644
--- a/src/org/apache/xalan/xsltc/compiler/util/InternalError.java
+++ b/src/org/apache/xalan/xsltc/compiler/util/InternalError.java
@@ -1,36 +1,36 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id$
- */
-
-package org.apache.xalan.xsltc.compiler.util;
-
-/**
- * Marks a class of errors in which XSLTC has reached some incorrect internal
- * state from which it cannot recover.
- */
-public class InternalError extends Error {
-    /**
-     * Construct an <code>InternalError</code> with the specified error message.
-     * @param msg the error message
-     */
-    public InternalError(String msg) {
-        super(msg);
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.compiler.util;
+
+/**
+ * Marks a class of errors in which XSLTC has reached some incorrect internal
+ * state from which it cannot recover.
+ */
+public class InternalError extends Error {
+    /**
+     * Construct an <code>InternalError</code> with the specified error message.
+     * @param msg the error message
+     */
+    public InternalError(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/org/apache/xalan/xsltc/compiler/util/MarkerInstruction.java b/src/org/apache/xalan/xsltc/compiler/util/MarkerInstruction.java
index 82dd09f..9a46641 100644
--- a/src/org/apache/xalan/xsltc/compiler/util/MarkerInstruction.java
+++ b/src/org/apache/xalan/xsltc/compiler/util/MarkerInstruction.java
@@ -1,97 +1,97 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id$
- */
-
-package org.apache.xalan.xsltc.compiler.util;
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.apache.bcel.Constants;
-import org.apache.bcel.generic.ConstantPoolGen;
-import org.apache.bcel.generic.Instruction;
-import org.apache.bcel.generic.Visitor;
-
-/**
- * A special abstract dummy subclass of
- * {@link org.apache.bcel.generic.Instruction} used to mark locations of
- * interest in an {@link org.apache.bcel.generic.InstructionList}.  It and
- * its subclasses are only used as placeholders, and do not contribute to the
- * actual byte code instruction stream.
- */
-abstract class MarkerInstruction extends Instruction {
-    /**
-     * Zero-argument constructor.  Sets the opcode to an invalid value and 
-     * sets the length to zero, as it will not be written as part of the
-     * generated byte code.
-     */
-    public MarkerInstruction() {
-        super(Constants.UNDEFINED, (short) 0);
-    }
-
-    /**
-     * {@link org.apache.bcel.generic.Visitor}s will know nothing about this
-     * kind of {@link org.apche.bcel.generic.Instruction}, so this method does
-     * nothing.
-     */
-    public void accept(Visitor v) {
-    }
-
-    /**
-     * The number of JVM stack entries consumed by the instruction.
-     * This instruction is just a place holder, so it does not consume any
-     * stack entries.
-     * @param cpg The {@link org.apache.bcel.generic.ConstantPoolGen} for the
-     * current {@link org.apache.bcel.generic.ClassGen}
-     * @return <code>0</code> always 
-     */
-    final public int consumeStack(ConstantPoolGen cpg) {
-        return 0;
-    }
-    /**
-     * The number of JVM stack entries produced by the instruction.
-     * This instruction is just a place holder, so it does not produce any
-     * stack entries.
-     * @param cpg The {@link org.apache.bcel.generic.ConstantPoolGen} for the
-     * current {@link org.apache.bcel.generic.ClassGen}
-     * @return <code>0</code> always 
-     */
-    final public int produceStack(ConstantPoolGen cpg) {
-        return 0;
-    }
-
-    /**
-     * Produce a copy of the instruction.  By default a
-     * {@link MarkerInstruction} has no parameters, so the base implementation
-     * of {@link #copy()} returns the instruction itself.
-     * @return The instruction itself.
-     */
-    public Instruction copy() {
-        return this;
-    }
-    /**
-     * Dump instruction as byte code to stream out.  A {@link MarkerInstruction}
-     * has no effect on the generated byte code so it is never emitted to the
-     * output stream.
-     * @param out Output stream
-     */
-    final public void dump(DataOutputStream out) throws IOException {
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.compiler.util;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.apache.bcel.Constants;
+import org.apache.bcel.generic.ConstantPoolGen;
+import org.apache.bcel.generic.Instruction;
+import org.apache.bcel.generic.Visitor;
+
+/**
+ * A special abstract dummy subclass of
+ * {@link org.apache.bcel.generic.Instruction} used to mark locations of
+ * interest in an {@link org.apache.bcel.generic.InstructionList}.  It and
+ * its subclasses are only used as placeholders, and do not contribute to the
+ * actual byte code instruction stream.
+ */
+abstract class MarkerInstruction extends Instruction {
+    /**
+     * Zero-argument constructor.  Sets the opcode to an invalid value and 
+     * sets the length to zero, as it will not be written as part of the
+     * generated byte code.
+     */
+    public MarkerInstruction() {
+        super(Constants.UNDEFINED, (short) 0);
+    }
+
+    /**
+     * {@link org.apache.bcel.generic.Visitor}s will know nothing about this
+     * kind of {@link org.apche.bcel.generic.Instruction}, so this method does
+     * nothing.
+     */
+    public void accept(Visitor v) {
+    }
+
+    /**
+     * The number of JVM stack entries consumed by the instruction.
+     * This instruction is just a place holder, so it does not consume any
+     * stack entries.
+     * @param cpg The {@link org.apache.bcel.generic.ConstantPoolGen} for the
+     * current {@link org.apache.bcel.generic.ClassGen}
+     * @return <code>0</code> always 
+     */
+    final public int consumeStack(ConstantPoolGen cpg) {
+        return 0;
+    }
+    /**
+     * The number of JVM stack entries produced by the instruction.
+     * This instruction is just a place holder, so it does not produce any
+     * stack entries.
+     * @param cpg The {@link org.apache.bcel.generic.ConstantPoolGen} for the
+     * current {@link org.apache.bcel.generic.ClassGen}
+     * @return <code>0</code> always 
+     */
+    final public int produceStack(ConstantPoolGen cpg) {
+        return 0;
+    }
+
+    /**
+     * Produce a copy of the instruction.  By default a
+     * {@link MarkerInstruction} has no parameters, so the base implementation
+     * of {@link #copy()} returns the instruction itself.
+     * @return The instruction itself.
+     */
+    public Instruction copy() {
+        return this;
+    }
+    /**
+     * Dump instruction as byte code to stream out.  A {@link MarkerInstruction}
+     * has no effect on the generated byte code so it is never emitted to the
+     * output stream.
+     * @param out Output stream
+     */
+    final public void dump(DataOutputStream out) throws IOException {
+    }
+}
diff --git a/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkEnd.java b/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkEnd.java
index 6dc023c..f9e7734 100644
--- a/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkEnd.java
+++ b/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkEnd.java
@@ -1,70 +1,70 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id$
- */
-
-package org.apache.xalan.xsltc.compiler.util;
-
-import org.apache.bcel.generic.Instruction;
-
-/**
- * <p>Marks the end of a region of byte code that can be copied into a new
- * method.  See the {@link OutlineableChunkStart} pseudo-instruction for
- * details.</p>
- */
-class OutlineableChunkEnd extends MarkerInstruction {
-    /**
-     * A constant instance of {@link OutlineableChunkEnd}.  As it has no fields,
-     * there should be no need to create an instance of this class. 
-     */
-    public static final Instruction OUTLINEABLECHUNKEND =
-                                                new OutlineableChunkEnd();
-
-    /**
-     * Private default constructor.  As it has no fields,
-     * there should be no need to create an instance of this class.  See
-     * {@link OutlineableChunkEnd#OUTLINEABLECHUNKEND}.
-     */
-    private OutlineableChunkEnd() {
-    }
-
-    /**
-     * Get the name of this instruction.  Used for debugging.
-     * @return the instruction name
-     */
-    public String getName() {
-        return OutlineableChunkEnd.class.getName();
-    }
-
-    /**
-     * Get the name of this instruction.  Used for debugging.
-     * @return the instruction name
-     */
-    public String toString() {
-        return getName();
-    }
-
-    /**
-     * Get the name of this instruction.  Used for debugging.
-     * @return the instruction name
-     */
-    public String toString(boolean verbose) {
-        return getName();
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.compiler.util;
+
+import org.apache.bcel.generic.Instruction;
+
+/**
+ * <p>Marks the end of a region of byte code that can be copied into a new
+ * method.  See the {@link OutlineableChunkStart} pseudo-instruction for
+ * details.</p>
+ */
+class OutlineableChunkEnd extends MarkerInstruction {
+    /**
+     * A constant instance of {@link OutlineableChunkEnd}.  As it has no fields,
+     * there should be no need to create an instance of this class. 
+     */
+    public static final Instruction OUTLINEABLECHUNKEND =
+                                                new OutlineableChunkEnd();
+
+    /**
+     * Private default constructor.  As it has no fields,
+     * there should be no need to create an instance of this class.  See
+     * {@link OutlineableChunkEnd#OUTLINEABLECHUNKEND}.
+     */
+    private OutlineableChunkEnd() {
+    }
+
+    /**
+     * Get the name of this instruction.  Used for debugging.
+     * @return the instruction name
+     */
+    public String getName() {
+        return OutlineableChunkEnd.class.getName();
+    }
+
+    /**
+     * Get the name of this instruction.  Used for debugging.
+     * @return the instruction name
+     */
+    public String toString() {
+        return getName();
+    }
+
+    /**
+     * Get the name of this instruction.  Used for debugging.
+     * @return the instruction name
+     */
+    public String toString(boolean verbose) {
+        return getName();
+    }
+}
diff --git a/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkStart.java b/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkStart.java
index 01bab2e..7121d6c 100644
--- a/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkStart.java
+++ b/src/org/apache/xalan/xsltc/compiler/util/OutlineableChunkStart.java
@@ -1,79 +1,79 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id$
- */
-
-package org.apache.xalan.xsltc.compiler.util;
-
-import org.apache.bcel.generic.Instruction;
-
-/**
- * <p>This pseudo-instruction marks the beginning of a region of byte code that
- * can be copied into a new method, termed an "outlineable" chunk.  The size of
- * the Java stack must be the same at the start of the region as it is at the
- * end of the region, any value on the stack at the start of the region must not
- * be consumed by an instruction in the region of code, the region must not
- * contain a return instruction, no branch instruction in the region is
- * permitted to have a target that is outside the region, and no branch
- * instruction outside the region is permitted to have a target that is inside
- * the region.</p>
- * <p>The end of the region is marked by an {@link OutlineableChunkEnd}
- * pseudo-instruction.</p>
- * <p>Such a region of code may contain other outlineable regions.</p>
- */
-class OutlineableChunkStart extends MarkerInstruction {
-    /**
-     * A constant instance of {@link OutlineableChunkStart}.  As it has no fields,
-     * there should be no need to create an instance of this class. 
-     */
-    public static final Instruction OUTLINEABLECHUNKSTART =
-                                                new OutlineableChunkStart();
-
-    /**
-     * Private default constructor.  As it has no fields,
-     * there should be no need to create an instance of this class.  See
-     * {@link OutlineableChunkStart#OUTLINEABLECHUNKSTART}.
-     */
-    private OutlineableChunkStart() {
-    }
-
-    /**
-     * Get the name of this instruction.  Used for debugging.
-     * @return the instruction name
-     */
-    public String getName() {
-        return OutlineableChunkStart.class.getName();
-    }
-
-    /**
-     * Get the name of this instruction.  Used for debugging.
-     * @return the instruction name
-     */
-    public String toString() {
-        return getName();
-    }
-
-    /**
-     * Get the name of this instruction.  Used for debugging.
-     * @return the instruction name
-     */
-    public String toString(boolean verbose) {
-        return getName();
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.compiler.util;
+
+import org.apache.bcel.generic.Instruction;
+
+/**
+ * <p>This pseudo-instruction marks the beginning of a region of byte code that
+ * can be copied into a new method, termed an "outlineable" chunk.  The size of
+ * the Java stack must be the same at the start of the region as it is at the
+ * end of the region, any value on the stack at the start of the region must not
+ * be consumed by an instruction in the region of code, the region must not
+ * contain a return instruction, no branch instruction in the region is
+ * permitted to have a target that is outside the region, and no branch
+ * instruction outside the region is permitted to have a target that is inside
+ * the region.</p>
+ * <p>The end of the region is marked by an {@link OutlineableChunkEnd}
+ * pseudo-instruction.</p>
+ * <p>Such a region of code may contain other outlineable regions.</p>
+ */
+class OutlineableChunkStart extends MarkerInstruction {
+    /**
+     * A constant instance of {@link OutlineableChunkStart}.  As it has no fields,
+     * there should be no need to create an instance of this class. 
+     */
+    public static final Instruction OUTLINEABLECHUNKSTART =
+                                                new OutlineableChunkStart();
+
+    /**
+     * Private default constructor.  As it has no fields,
+     * there should be no need to create an instance of this class.  See
+     * {@link OutlineableChunkStart#OUTLINEABLECHUNKSTART}.
+     */
+    private OutlineableChunkStart() {
+    }
+
+    /**
+     * Get the name of this instruction.  Used for debugging.
+     * @return the instruction name
+     */
+    public String getName() {
+        return OutlineableChunkStart.class.getName();
+    }
+
+    /**
+     * Get the name of this instruction.  Used for debugging.
+     * @return the instruction name
+     */
+    public String toString() {
+        return getName();
+    }
+
+    /**
+     * Get the name of this instruction.  Used for debugging.
+     * @return the instruction name
+     */
+    public String toString(boolean verbose) {
+        return getName();
+    }
+}
diff --git a/src/org/apache/xalan/xsltc/dom/MultiValuedNodeHeapIterator.java b/src/org/apache/xalan/xsltc/dom/MultiValuedNodeHeapIterator.java
index 6206dd7..8d2de77 100644
--- a/src/org/apache/xalan/xsltc/dom/MultiValuedNodeHeapIterator.java
+++ b/src/org/apache/xalan/xsltc/dom/MultiValuedNodeHeapIterator.java
@@ -1,294 +1,294 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: UnionIterator.java 337874 2004-02-16 23:06:53Z minchau $
- */
-
-package org.apache.xalan.xsltc.dom;
-
-import org.apache.xalan.xsltc.DOM;
-import org.apache.xalan.xsltc.runtime.BasisLibrary;
-import org.apache.xml.dtm.DTMAxisIterator;
-import org.apache.xml.dtm.ref.DTMAxisIteratorBase;
-
-/**
- * <p><code>MultiValuedNodeHeapIterator</code> takes a set of multi-valued
- * heap nodes and produces a merged NodeSet in document order with duplicates
- * removed.</p>
- * <p>Each multi-valued heap node (which might be a
- * {@link org.apache.xml.dtm.DTMAxisIterator}, but that's  not necessary)
- * generates DTM node handles in document order.  The class
- * maintains the multi-valued heap nodes in a heap, not surprisingly, sorted by
- * the next DTM node handle available form the heap node.</p>
- * <p>After a DTM node is pulled from the heap node that's at the top of the
- * heap, the heap node is advanced to the next DTM node handle it makes
- * available, and the heap nature of the heap is restored to ensure the next
- * DTM node handle pulled is next in document order overall.
- *
- * @author Jacek Ambroziak
- * @author Santiago Pericas-Geertsen
- */
-public abstract class MultiValuedNodeHeapIterator extends DTMAxisIteratorBase {
-    /** wrapper for NodeIterators to support iterator
-	comparison on the value of their next() method
-    */
-
-    /**
-     * An abstract representation of a set of nodes that will be retrieved in
-     * document order.
-     */
-    public abstract class HeapNode implements Cloneable {
-	protected int _node, _markedNode;
-	protected boolean _isStartSet = false;
-		
-        /**
-         * Advance to the next node represented by this {@link HeapNode}
-         *
-         * @return the next DTM node.
-         */
-	public abstract int step();
-
-
-        /**
-         * Creates a deep copy of this {@link HeapNode}.  The clone is not
-         * reset from the current position of the original.
-         *
-         * @return the cloned heap node
-         */
-	public HeapNode cloneHeapNode() {
-            HeapNode clone;
-
-            try {
-                clone = (HeapNode) super.clone();
-            } catch (CloneNotSupportedException e) {
-                BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR,
-                                          e.toString());
-                return null;
-            }
-
-	    clone._node = _node;
-	    clone._markedNode = _node;
-
-	    return clone;
-	}
-
-        /**
-         * Remembers the current node for the next call to {@link #gotoMark()}.
-         */
-	public void setMark() {
-	    _markedNode = _node;
-	}
-
-        /**
-         * Restores the current node remembered by {@link #setMark()}.
-         */
-	public void gotoMark() {
-	    _node = _markedNode;
-	}
-
-        /**
-         * Performs a comparison of the two heap nodes
-         *
-         * @param heapNode the heap node against which to compare
-         * @return <code>true</code> if and only if the current node for this
-         *         heap node is before the current node of the argument heap
-         *         node in document order.
-         */
-        public abstract boolean isLessThan(HeapNode heapNode);
-
-        /**
-         * Sets context with respect to which this heap node is evaluated.
-         *
-         * @param node The new context node
-         * @return a {@link HeapNode} which may or may not be the same as
-         *         this <code>HeapNode</code>.
-         */
-        public abstract HeapNode setStartNode(int node);
-
-        /**
-         * Reset the heap node back to its beginning.
-         *
-         * @return a {@link HeapNode} which may or may not be the same as
-         *         this <code>HeapNode</code>.
-         */
-        public abstract HeapNode reset();
-    } // end of HeapNode
-
-    private static final int InitSize = 8;
-  
-    private int        _heapSize = 0;
-    private int        _size = InitSize;
-    private HeapNode[] _heap = new HeapNode[InitSize];
-    private int        _free = 0;
-  
-    // Last node returned by this MultiValuedNodeHeapIterator to the caller of
-    // next; used to prune duplicates
-    private int _returnedLast;
-
-    // cached returned last for use in gotoMark
-    private int _cachedReturnedLast = END;
-
-    // cached heap size for use in gotoMark
-    private int _cachedHeapSize;
-
-
-    public DTMAxisIterator cloneIterator() {
-	_isRestartable = false;
-	final HeapNode[] heapCopy = new HeapNode[_heap.length];
-	try {
-	    MultiValuedNodeHeapIterator clone =
-                    (MultiValuedNodeHeapIterator)super.clone();
-
-            for (int i = 0; i < _free; i++) {
-                heapCopy[i] = _heap[i].cloneHeapNode();
-            }
-	    clone.setRestartable(false);
-	    clone._heap = heapCopy;
-	    return clone.reset();
-	} 
-	catch (CloneNotSupportedException e) {
-	    BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR,
-				      e.toString());
-	    return null;
-	}
-    }
-    
-    protected void addHeapNode(HeapNode node) {
-	if (_free == _size) {
-	    HeapNode[] newArray = new HeapNode[_size *= 2];
-	    System.arraycopy(_heap, 0, newArray, 0, _free);
-	    _heap = newArray;
-	}
-	_heapSize++;
-	_heap[_free++] = node;
-    }
-  
-    public int next() {
-	while (_heapSize > 0) {
-	    final int smallest = _heap[0]._node;
-	    if (smallest == END) { // iterator _heap[0] is done
-		if (_heapSize > 1) {
-		    // Swap first and last (iterator must be restartable)
-		    final HeapNode temp = _heap[0];
-		    _heap[0] = _heap[--_heapSize];
-		    _heap[_heapSize] = temp;
-		}
-		else {
-		    return END;
-		}
-	    }
-	    else if (smallest == _returnedLast) {	// duplicate
-		_heap[0].step(); // value consumed
-	    }
-	    else {
-		_heap[0].step(); // value consumed
-		heapify(0);
-		return returnNode(_returnedLast = smallest);
-	    }
-	    // fallthrough if not returned above
-	    heapify(0);
-	}
-	return END;
-    }
-  
-    public DTMAxisIterator setStartNode(int node) {
-	if (_isRestartable) {
-	    _startNode = node;
-	    for (int i = 0; i < _free; i++) {
-         	if(!_heap[i]._isStartSet){
-        	   _heap[i].setStartNode(node);
-        	   _heap[i].step();	// to get the first node
-        	   _heap[i]._isStartSet = true;
-        	}
-	    }
-	    // build heap
-	    for (int i = (_heapSize = _free)/2; i >= 0; i--) {
-		heapify(i);
-	    }
-	    _returnedLast = END;
-	    return resetPosition();
-	}
-	return this;
-    }
-
-    protected void init() {
-        for (int i =0; i < _free; i++) {
-            _heap[i] = null;
-        }
-
-        _heapSize = 0;
-        _free = 0;
-    }
-
-    /* Build a heap in document order. put the smallest node on the top. 
-     * "smallest node" means the node before other nodes in document order
-     */
-    private void heapify(int i) {
-	for (int r, l, smallest;;) {
-	    r = (i + 1) << 1; l = r - 1;
-	    smallest = l < _heapSize 
-		&& _heap[l].isLessThan(_heap[i]) ? l : i;
-	    if (r < _heapSize && _heap[r].isLessThan(_heap[smallest])) {
-		smallest = r;
-	    }
-	    if (smallest != i) {
-		final HeapNode temp = _heap[smallest];
-		_heap[smallest] = _heap[i];
-		_heap[i] = temp;
-		i = smallest;
-	    } else {
-		break;
-            }
-	}
-    }
-
-    public void setMark() {
-	for (int i = 0; i < _free; i++) {
-	    _heap[i].setMark();
-	}
-	_cachedReturnedLast = _returnedLast;    
-	_cachedHeapSize = _heapSize;
-    }
-
-    public void gotoMark() {
-	for (int i = 0; i < _free; i++) {
-	    _heap[i].gotoMark();
-	}
-	// rebuild heap after call last() function. fix for bug 20913
-	for (int i = (_heapSize = _cachedHeapSize)/2; i >= 0; i--) {
-	    heapify(i);
-	}
-        _returnedLast = _cachedReturnedLast;    
-    }
-
-    public DTMAxisIterator reset() {
-	for (int i = 0; i < _free; i++) {
-	    _heap[i].reset();
-	    _heap[i].step();
-	}
-
-	// build heap
-	for (int i = (_heapSize = _free)/2; i >= 0; i--) {
-	    heapify(i);
-	}
-
-	_returnedLast = END;
-	return resetPosition();
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.dom;
+
+import org.apache.xalan.xsltc.DOM;
+import org.apache.xalan.xsltc.runtime.BasisLibrary;
+import org.apache.xml.dtm.DTMAxisIterator;
+import org.apache.xml.dtm.ref.DTMAxisIteratorBase;
+
+/**
+ * <p><code>MultiValuedNodeHeapIterator</code> takes a set of multi-valued
+ * heap nodes and produces a merged NodeSet in document order with duplicates
+ * removed.</p>
+ * <p>Each multi-valued heap node (which might be a
+ * {@link org.apache.xml.dtm.DTMAxisIterator}, but that's  not necessary)
+ * generates DTM node handles in document order.  The class
+ * maintains the multi-valued heap nodes in a heap, not surprisingly, sorted by
+ * the next DTM node handle available form the heap node.</p>
+ * <p>After a DTM node is pulled from the heap node that's at the top of the
+ * heap, the heap node is advanced to the next DTM node handle it makes
+ * available, and the heap nature of the heap is restored to ensure the next
+ * DTM node handle pulled is next in document order overall.
+ *
+ * @author Jacek Ambroziak
+ * @author Santiago Pericas-Geertsen
+ */
+public abstract class MultiValuedNodeHeapIterator extends DTMAxisIteratorBase {
+    /** wrapper for NodeIterators to support iterator
+	comparison on the value of their next() method
+    */
+
+    /**
+     * An abstract representation of a set of nodes that will be retrieved in
+     * document order.
+     */
+    public abstract class HeapNode implements Cloneable {
+	protected int _node, _markedNode;
+	protected boolean _isStartSet = false;
+		
+        /**
+         * Advance to the next node represented by this {@link HeapNode}
+         *
+         * @return the next DTM node.
+         */
+	public abstract int step();
+
+
+        /**
+         * Creates a deep copy of this {@link HeapNode}.  The clone is not
+         * reset from the current position of the original.
+         *
+         * @return the cloned heap node
+         */
+	public HeapNode cloneHeapNode() {
+            HeapNode clone;
+
+            try {
+                clone = (HeapNode) super.clone();
+            } catch (CloneNotSupportedException e) {
+                BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR,
+                                          e.toString());
+                return null;
+            }
+
+	    clone._node = _node;
+	    clone._markedNode = _node;
+
+	    return clone;
+	}
+
+        /**
+         * Remembers the current node for the next call to {@link #gotoMark()}.
+         */
+	public void setMark() {
+	    _markedNode = _node;
+	}
+
+        /**
+         * Restores the current node remembered by {@link #setMark()}.
+         */
+	public void gotoMark() {
+	    _node = _markedNode;
+	}
+
+        /**
+         * Performs a comparison of the two heap nodes
+         *
+         * @param heapNode the heap node against which to compare
+         * @return <code>true</code> if and only if the current node for this
+         *         heap node is before the current node of the argument heap
+         *         node in document order.
+         */
+        public abstract boolean isLessThan(HeapNode heapNode);
+
+        /**
+         * Sets context with respect to which this heap node is evaluated.
+         *
+         * @param node The new context node
+         * @return a {@link HeapNode} which may or may not be the same as
+         *         this <code>HeapNode</code>.
+         */
+        public abstract HeapNode setStartNode(int node);
+
+        /**
+         * Reset the heap node back to its beginning.
+         *
+         * @return a {@link HeapNode} which may or may not be the same as
+         *         this <code>HeapNode</code>.
+         */
+        public abstract HeapNode reset();
+    } // end of HeapNode
+
+    private static final int InitSize = 8;
+  
+    private int        _heapSize = 0;
+    private int        _size = InitSize;
+    private HeapNode[] _heap = new HeapNode[InitSize];
+    private int        _free = 0;
+  
+    // Last node returned by this MultiValuedNodeHeapIterator to the caller of
+    // next; used to prune duplicates
+    private int _returnedLast;
+
+    // cached returned last for use in gotoMark
+    private int _cachedReturnedLast = END;
+
+    // cached heap size for use in gotoMark
+    private int _cachedHeapSize;
+
+
+    public DTMAxisIterator cloneIterator() {
+	_isRestartable = false;
+	final HeapNode[] heapCopy = new HeapNode[_heap.length];
+	try {
+	    MultiValuedNodeHeapIterator clone =
+                    (MultiValuedNodeHeapIterator)super.clone();
+
+            for (int i = 0; i < _free; i++) {
+                heapCopy[i] = _heap[i].cloneHeapNode();
+            }
+	    clone.setRestartable(false);
+	    clone._heap = heapCopy;
+	    return clone.reset();
+	} 
+	catch (CloneNotSupportedException e) {
+	    BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR,
+				      e.toString());
+	    return null;
+	}
+    }
+    
+    protected void addHeapNode(HeapNode node) {
+	if (_free == _size) {
+	    HeapNode[] newArray = new HeapNode[_size *= 2];
+	    System.arraycopy(_heap, 0, newArray, 0, _free);
+	    _heap = newArray;
+	}
+	_heapSize++;
+	_heap[_free++] = node;
+    }
+  
+    public int next() {
+	while (_heapSize > 0) {
+	    final int smallest = _heap[0]._node;
+	    if (smallest == END) { // iterator _heap[0] is done
+		if (_heapSize > 1) {
+		    // Swap first and last (iterator must be restartable)
+		    final HeapNode temp = _heap[0];
+		    _heap[0] = _heap[--_heapSize];
+		    _heap[_heapSize] = temp;
+		}
+		else {
+		    return END;
+		}
+	    }
+	    else if (smallest == _returnedLast) {	// duplicate
+		_heap[0].step(); // value consumed
+	    }
+	    else {
+		_heap[0].step(); // value consumed
+		heapify(0);
+		return returnNode(_returnedLast = smallest);
+	    }
+	    // fallthrough if not returned above
+	    heapify(0);
+	}
+	return END;
+    }
+  
+    public DTMAxisIterator setStartNode(int node) {
+	if (_isRestartable) {
+	    _startNode = node;
+	    for (int i = 0; i < _free; i++) {
+         	if(!_heap[i]._isStartSet){
+        	   _heap[i].setStartNode(node);
+        	   _heap[i].step();	// to get the first node
+        	   _heap[i]._isStartSet = true;
+        	}
+	    }
+	    // build heap
+	    for (int i = (_heapSize = _free)/2; i >= 0; i--) {
+		heapify(i);
+	    }
+	    _returnedLast = END;
+	    return resetPosition();
+	}
+	return this;
+    }
+
+    protected void init() {
+        for (int i =0; i < _free; i++) {
+            _heap[i] = null;
+        }
+
+        _heapSize = 0;
+        _free = 0;
+    }
+
+    /* Build a heap in document order. put the smallest node on the top. 
+     * "smallest node" means the node before other nodes in document order
+     */
+    private void heapify(int i) {
+	for (int r, l, smallest;;) {
+	    r = (i + 1) << 1; l = r - 1;
+	    smallest = l < _heapSize 
+		&& _heap[l].isLessThan(_heap[i]) ? l : i;
+	    if (r < _heapSize && _heap[r].isLessThan(_heap[smallest])) {
+		smallest = r;
+	    }
+	    if (smallest != i) {
+		final HeapNode temp = _heap[smallest];
+		_heap[smallest] = _heap[i];
+		_heap[i] = temp;
+		i = smallest;
+	    } else {
+		break;
+            }
+	}
+    }
+
+    public void setMark() {
+	for (int i = 0; i < _free; i++) {
+	    _heap[i].setMark();
+	}
+	_cachedReturnedLast = _returnedLast;    
+	_cachedHeapSize = _heapSize;
+    }
+
+    public void gotoMark() {
+	for (int i = 0; i < _free; i++) {
+	    _heap[i].gotoMark();
+	}
+	// rebuild heap after call last() function. fix for bug 20913
+	for (int i = (_heapSize = _cachedHeapSize)/2; i >= 0; i--) {
+	    heapify(i);
+	}
+        _returnedLast = _cachedReturnedLast;    
+    }
+
+    public DTMAxisIterator reset() {
+	for (int i = 0; i < _free; i++) {
+	    _heap[i].reset();
+	    _heap[i].step();
+	}
+
+	// build heap
+	for (int i = (_heapSize = _free)/2; i >= 0; i--) {
+	    heapify(i);
+	}
+
+	_returnedLast = END;
+	return resetPosition();
+    }
+
+}
diff --git a/src/org/apache/xalan/xsltc/runtime/ErrorMessages_sl.java b/src/org/apache/xalan/xsltc/runtime/ErrorMessages_sl.java
old mode 100755
new mode 100644
index cc24aa1..d57d65d
--- a/src/org/apache/xalan/xsltc/runtime/ErrorMessages_sl.java
+++ b/src/org/apache/xalan/xsltc/runtime/ErrorMessages_sl.java
@@ -1,285 +1,285 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: ErrorMessages_sl.java,v 1.11 2004/12/15 17:35:45 jycli Exp $
- */
-
-package org.apache.xalan.xsltc.runtime;
-
-import java.util.ListResourceBundle;
-
-/**
- * @author Morten Jorgensen
- */
-public class ErrorMessages_sl extends ListResourceBundle {
-
-/*
- * XSLTC run-time error messages.
- *
- * General notes to translators and definitions:
- *
- *   1) XSLTC is the name of the product.  It is an acronym for XML Stylesheet:
- *      Transformations Compiler
- *
- *   2) A stylesheet is a description of how to transform an input XML document
- *      into a resultant output XML document (or HTML document or text)
- *
- *   3) An axis is a particular "dimension" in a tree representation of an XML
- *      document; the nodes in the tree are divided along different axes.
- *      Traversing the "child" axis, for instance, means that the program
- *      would visit each child of a particular node; traversing the "descendant"
- *      axis means that the program would visit the child nodes of a particular
- *      node, their children, and so on until the leaf nodes of the tree are
- *      reached.
- *
- *   4) An iterator is an object that traverses nodes in a tree along a
- *      particular axis, one at a time.
- *
- *   5) An element is a mark-up tag in an XML document; an attribute is a
- *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *      "elem" is an element name, "attr" and "attr2" are attribute names with
- *      the values "val" and "val2", respectively.
- *
- *   6) A namespace declaration is a special attribute that is used to associate
- *      a prefix with a URI (the namespace).  The meanings of element names and
- *      attribute names that use that prefix are defined with respect to that
- *      namespace.
- *
- *   7) DOM is an acronym for Document Object Model.  It is a tree
- *      representation of an XML document.
- *
- *      SAX is an acronym for the Simple API for XML processing.  It is an API
- *      used inform an XML processor (in this case XSLTC) of the structure and
- *      content of an XML document.
- *
- *      Input to the stylesheet processor can come from an XML parser in the
- *      form of a DOM tree or through the SAX API.
- *
- *   8) DTD is a document type declaration.  It is a way of specifying the
- *      grammar for an XML file, the names and types of elements, attributes,
- *      etc.
- *
- *   9) Translet is an invented term that refers to the class file that contains
- *      the compiled form of a stylesheet.
- */
-
-    // These message should be read from a locale-specific resource bundle
-    /** Get the lookup table for error messages.
-     *
-     * @return The message lookup table.
-     */
-    public Object[][] getContents()
-    {
-      return new Object[][] {
-
-        /*
-         * Note to translators:  the substitution text in the following message
-         * is a class name.  Used for internal errors in the processor.
-         */
-        {BasisLibrary.RUN_TIME_INTERNAL_ERR,
-        "Notranja napaka izvajanja v ''{0}''"},
-
-        /*
-         * Note to translators:  <xsl:copy> is a keyword that should not be
-         * translated.
-         */
-        {BasisLibrary.RUN_TIME_COPY_ERR,
-        "Notranja napaka izvajanja pri izvajanju <xsl:copy>."},
-
-        /*
-         * Note to translators:  The substitution text refers to data types.
-         * The message is displayed if a value in a particular context needs to
-         * be converted to type {1}, but that's not possible for a value of type
-         * {0}.
-         */
-        {BasisLibrary.DATA_CONVERSION_ERR,
-        "Neveljavna pretvorba iz ''{0}'' v ''{1}''."},
-
-        /*
-         * Note to translators:  This message is displayed if the function named
-         * by the substitution text is not a function that is supported.  XSLTC
-         * is the acronym naming the product.
-         */
-        {BasisLibrary.EXTERNAL_FUNC_ERR,
-        "XSLTC ne podpira zunanje funkcije ''{0}''."},
-
-        /*
-         * Note to translators:  This message is displayed if two values are
-         * compared for equality, but the data type of one of the values is
-         * unknown.
-         */
-        {BasisLibrary.EQUALITY_EXPR_ERR,
-        "Neznan tip argumenta v izrazu enakovrednosti."},
-
-        /*
-         * Note to translators:  The substitution text for {0} will be a data
-         * type; the substitution text for {1} will be the name of a function.
-         * This is displayed if an argument of the particular data type is not
-         * permitted for a call to this function.
-         */
-        {BasisLibrary.INVALID_ARGUMENT_ERR,
-        "Neveljavna vrsta argumenta ''{0}'' pri klicu na ''{1}''"},
-
-        /*
-         * Note to translators:  There is way of specifying a format for a
-         * number using a pattern; the processor was unable to format the
-         * particular value using the specified pattern.
-         */
-        {BasisLibrary.FORMAT_NUMBER_ERR,
-        "Pokus nastavitve formata \u0161tevilke ''{0}'' z uporabo vzorca ''{1}''."},
-
-        /*
-         * Note to translators:  The following represents an internal error
-         * situation in XSLTC.  The processor was unable to create a copy of an
-         * iterator.  (See definition of iterator above.)
-         */
-        {BasisLibrary.ITERATOR_CLONE_ERR,
-        "Iteratorja ''{0}'' ni mogo\u010de klonirati."},
-
-        /*
-         * Note to translators:  The following represents an internal error
-         * situation in XSLTC.  The processor attempted to create an iterator
-         * for a particular axis (see definition above) that it does not
-         * support.
-         */
-        {BasisLibrary.AXIS_SUPPORT_ERR,
-        "Iterator za os ''{0}'' ni podprt."},
-
-        /*
-         * Note to translators:  The following represents an internal error
-         * situation in XSLTC.  The processor attempted to create an iterator
-         * for a particular axis (see definition above) that it does not
-         * support.
-         */
-        {BasisLibrary.TYPED_AXIS_SUPPORT_ERR,
-        "Iterator za tipizirano os ''{0}'' ni podprt."},
-
-        /*
-         * Note to translators:  This message is reported if the stylesheet
-         * being processed attempted to construct an XML document with an
-         * attribute in a place other than on an element.  The substitution text
-         * specifies the name of the attribute.
-         */
-        {BasisLibrary.STRAY_ATTRIBUTE_ERR,
-        "Atribut ''{0}'' zunaj elementa."},
-
-        /*
-         * Note to translators:  As with the preceding message, a namespace
-         * declaration has the form of an attribute and is only permitted to
-         * appear on an element.  The substitution text {0} is the namespace
-         * prefix and {1} is the URI that was being used in the erroneous
-         * namespace declaration.
-         */
-        {BasisLibrary.STRAY_NAMESPACE_ERR,
-        "Deklaracija imenskega prostora ''{0}''=''{1}'' je zunaj elementa."},
-
-        /*
-         * Note to translators:  The stylesheet contained a reference to a
-         * namespace prefix that was undefined.  The value of the substitution
-         * text is the name of the prefix.
-         */
-        {BasisLibrary.NAMESPACE_PREFIX_ERR,
-        "Imenski prostor za predpono ''{0}'' ni bil naveden."},
-
-        /*
-         * Note to translators:  The following represents an internal error.
-         * DOMAdapter is a Java class in XSLTC.
-         */
-        {BasisLibrary.DOM_ADAPTER_INIT_ERR,
-        "DOMAdapter ustvarjen z uporabo napa\u010dnega tipa izvornega DOM."},
-
-        /*
-         * Note to translators:  The following message indicates that the XML
-         * parser that is providing input to XSLTC cannot be used because it
-         * does not describe to XSLTC the structure of the input XML document's
-         * DTD.
-         */
-        {BasisLibrary.PARSER_DTD_SUPPORT_ERR,
-        "Uporabljeni raz\u010dlenjevalnik SAX ne obravnava dogodkov deklaracije DTD."},
-
-        /*
-         * Note to translators:  The following message indicates that the XML
-         * parser that is providing input to XSLTC cannot be used because it
-         * does not distinguish between ordinary XML attributes and namespace
-         * declarations.
-         */
-        {BasisLibrary.NAMESPACES_SUPPORT_ERR,
-        "Uporabljeni raz\u010dlenjevalnik SAX ne podpira imenskih prostorov XML."},
-
-        /*
-         * Note to translators:  The substitution text is the URI that was in
-         * error.
-         */
-        {BasisLibrary.CANT_RESOLVE_RELATIVE_URI_ERR,
-        "Ni mogo\u010de razre\u0161iti sklica URI ''{0}''."},
-
-         /*
-         * Note to translators:  The stylesheet contained an element that was
-         * not recognized as part of the XSL syntax.  The substitution text
-         * gives the element name.
-         */
-        {BasisLibrary.UNSUPPORTED_XSL_ERR,
-        "Nepodprt XSL element ''{0}''"},
-
-        /*
-         * Note to translators:  The stylesheet referred to an extension to the
-         * XSL syntax and indicated that it was defined by XSLTC, but XSLTC does
-         * not recognize the particular extension named.  The substitution text
-         * gives the extension name.
-         */
-        {BasisLibrary.UNSUPPORTED_EXT_ERR,
-        "Neprepoznana raz\u0161iritev XSLTC ''{0}''"},
-
-
-        /*
-         * Note to translators:  This error message is produced if the translet
-         * class was compiled using a newer version of XSLTC and deployed for
-         * execution with an older version of XSLTC.  The substitution text is
-         * the name of the translet class.
-         */
-        {BasisLibrary.UNKNOWN_TRANSLET_VERSION_ERR,
-        "Navedeni translet, ''{0}'', je bil ustvarjen z uporabo XSLTC novej\u0161e razli\u010dice, kot je trenutno uporabljana razli\u010dica izvajalnega okolja XSLTC. Slogovno datoteko morate ponovno prevesti ali pa uporabiti novej\u0161o razli\u010dico XSLTC-ja, da bi zagnali ta translet."},
-
-        /*
-         * Note to translators:  An attribute whose effective value is required
-         * to be a "QName" had a value that was incorrect.
-         * 'QName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {BasisLibrary.INVALID_QNAME_ERR,
-        "Atribut, katerega vrednost mora biti QName, je imel vrednost ''{0}''"},
-
-
-        /*
-         * Note to translators:  An attribute whose effective value is required
-         * to be a "NCName" had a value that was incorrect.
-         * 'NCName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {BasisLibrary.INVALID_NCNAME_ERR,
-        "Atribut, katerega vrednost mora biti NCName, je imel vrednost ''{0}''"},
-
-        {BasisLibrary.UNALLOWED_EXTENSION_FUNCTION_ERR,
-        "Uporaba raz\u0161iritvene funkcije ''{0}'' ni dovoljena, ko je funkcija varne obdelave nastavljena na True."},
-
-        {BasisLibrary.UNALLOWED_EXTENSION_ELEMENT_ERR,
-        "Uporaba raz\u0161iritvene elementa ''{0}'' ni dovoljena, ko je funkcija varne obdelave nastavljena na True."},
-    };
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.runtime;
+
+import java.util.ListResourceBundle;
+
+/**
+ * @author Morten Jorgensen
+ */
+public class ErrorMessages_sl extends ListResourceBundle {
+
+/*
+ * XSLTC run-time error messages.
+ *
+ * General notes to translators and definitions:
+ *
+ *   1) XSLTC is the name of the product.  It is an acronym for XML Stylesheet:
+ *      Transformations Compiler
+ *
+ *   2) A stylesheet is a description of how to transform an input XML document
+ *      into a resultant output XML document (or HTML document or text)
+ *
+ *   3) An axis is a particular "dimension" in a tree representation of an XML
+ *      document; the nodes in the tree are divided along different axes.
+ *      Traversing the "child" axis, for instance, means that the program
+ *      would visit each child of a particular node; traversing the "descendant"
+ *      axis means that the program would visit the child nodes of a particular
+ *      node, their children, and so on until the leaf nodes of the tree are
+ *      reached.
+ *
+ *   4) An iterator is an object that traverses nodes in a tree along a
+ *      particular axis, one at a time.
+ *
+ *   5) An element is a mark-up tag in an XML document; an attribute is a
+ *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *      "elem" is an element name, "attr" and "attr2" are attribute names with
+ *      the values "val" and "val2", respectively.
+ *
+ *   6) A namespace declaration is a special attribute that is used to associate
+ *      a prefix with a URI (the namespace).  The meanings of element names and
+ *      attribute names that use that prefix are defined with respect to that
+ *      namespace.
+ *
+ *   7) DOM is an acronym for Document Object Model.  It is a tree
+ *      representation of an XML document.
+ *
+ *      SAX is an acronym for the Simple API for XML processing.  It is an API
+ *      used inform an XML processor (in this case XSLTC) of the structure and
+ *      content of an XML document.
+ *
+ *      Input to the stylesheet processor can come from an XML parser in the
+ *      form of a DOM tree or through the SAX API.
+ *
+ *   8) DTD is a document type declaration.  It is a way of specifying the
+ *      grammar for an XML file, the names and types of elements, attributes,
+ *      etc.
+ *
+ *   9) Translet is an invented term that refers to the class file that contains
+ *      the compiled form of a stylesheet.
+ */
+
+    // These message should be read from a locale-specific resource bundle
+    /** Get the lookup table for error messages.
+     *
+     * @return The message lookup table.
+     */
+    public Object[][] getContents()
+    {
+      return new Object[][] {
+
+        /*
+         * Note to translators:  the substitution text in the following message
+         * is a class name.  Used for internal errors in the processor.
+         */
+        {BasisLibrary.RUN_TIME_INTERNAL_ERR,
+        "Notranja napaka izvajanja v ''{0}''"},
+
+        /*
+         * Note to translators:  <xsl:copy> is a keyword that should not be
+         * translated.
+         */
+        {BasisLibrary.RUN_TIME_COPY_ERR,
+        "Notranja napaka izvajanja pri izvajanju <xsl:copy>."},
+
+        /*
+         * Note to translators:  The substitution text refers to data types.
+         * The message is displayed if a value in a particular context needs to
+         * be converted to type {1}, but that's not possible for a value of type
+         * {0}.
+         */
+        {BasisLibrary.DATA_CONVERSION_ERR,
+        "Neveljavna pretvorba iz ''{0}'' v ''{1}''."},
+
+        /*
+         * Note to translators:  This message is displayed if the function named
+         * by the substitution text is not a function that is supported.  XSLTC
+         * is the acronym naming the product.
+         */
+        {BasisLibrary.EXTERNAL_FUNC_ERR,
+        "XSLTC ne podpira zunanje funkcije ''{0}''."},
+
+        /*
+         * Note to translators:  This message is displayed if two values are
+         * compared for equality, but the data type of one of the values is
+         * unknown.
+         */
+        {BasisLibrary.EQUALITY_EXPR_ERR,
+        "Neznan tip argumenta v izrazu enakovrednosti."},
+
+        /*
+         * Note to translators:  The substitution text for {0} will be a data
+         * type; the substitution text for {1} will be the name of a function.
+         * This is displayed if an argument of the particular data type is not
+         * permitted for a call to this function.
+         */
+        {BasisLibrary.INVALID_ARGUMENT_ERR,
+        "Neveljavna vrsta argumenta ''{0}'' pri klicu na ''{1}''"},
+
+        /*
+         * Note to translators:  There is way of specifying a format for a
+         * number using a pattern; the processor was unable to format the
+         * particular value using the specified pattern.
+         */
+        {BasisLibrary.FORMAT_NUMBER_ERR,
+        "Pokus nastavitve formata \u0161tevilke ''{0}'' z uporabo vzorca ''{1}''."},
+
+        /*
+         * Note to translators:  The following represents an internal error
+         * situation in XSLTC.  The processor was unable to create a copy of an
+         * iterator.  (See definition of iterator above.)
+         */
+        {BasisLibrary.ITERATOR_CLONE_ERR,
+        "Iteratorja ''{0}'' ni mogo\u010de klonirati."},
+
+        /*
+         * Note to translators:  The following represents an internal error
+         * situation in XSLTC.  The processor attempted to create an iterator
+         * for a particular axis (see definition above) that it does not
+         * support.
+         */
+        {BasisLibrary.AXIS_SUPPORT_ERR,
+        "Iterator za os ''{0}'' ni podprt."},
+
+        /*
+         * Note to translators:  The following represents an internal error
+         * situation in XSLTC.  The processor attempted to create an iterator
+         * for a particular axis (see definition above) that it does not
+         * support.
+         */
+        {BasisLibrary.TYPED_AXIS_SUPPORT_ERR,
+        "Iterator za tipizirano os ''{0}'' ni podprt."},
+
+        /*
+         * Note to translators:  This message is reported if the stylesheet
+         * being processed attempted to construct an XML document with an
+         * attribute in a place other than on an element.  The substitution text
+         * specifies the name of the attribute.
+         */
+        {BasisLibrary.STRAY_ATTRIBUTE_ERR,
+        "Atribut ''{0}'' zunaj elementa."},
+
+        /*
+         * Note to translators:  As with the preceding message, a namespace
+         * declaration has the form of an attribute and is only permitted to
+         * appear on an element.  The substitution text {0} is the namespace
+         * prefix and {1} is the URI that was being used in the erroneous
+         * namespace declaration.
+         */
+        {BasisLibrary.STRAY_NAMESPACE_ERR,
+        "Deklaracija imenskega prostora ''{0}''=''{1}'' je zunaj elementa."},
+
+        /*
+         * Note to translators:  The stylesheet contained a reference to a
+         * namespace prefix that was undefined.  The value of the substitution
+         * text is the name of the prefix.
+         */
+        {BasisLibrary.NAMESPACE_PREFIX_ERR,
+        "Imenski prostor za predpono ''{0}'' ni bil naveden."},
+
+        /*
+         * Note to translators:  The following represents an internal error.
+         * DOMAdapter is a Java class in XSLTC.
+         */
+        {BasisLibrary.DOM_ADAPTER_INIT_ERR,
+        "DOMAdapter ustvarjen z uporabo napa\u010dnega tipa izvornega DOM."},
+
+        /*
+         * Note to translators:  The following message indicates that the XML
+         * parser that is providing input to XSLTC cannot be used because it
+         * does not describe to XSLTC the structure of the input XML document's
+         * DTD.
+         */
+        {BasisLibrary.PARSER_DTD_SUPPORT_ERR,
+        "Uporabljeni raz\u010dlenjevalnik SAX ne obravnava dogodkov deklaracije DTD."},
+
+        /*
+         * Note to translators:  The following message indicates that the XML
+         * parser that is providing input to XSLTC cannot be used because it
+         * does not distinguish between ordinary XML attributes and namespace
+         * declarations.
+         */
+        {BasisLibrary.NAMESPACES_SUPPORT_ERR,
+        "Uporabljeni raz\u010dlenjevalnik SAX ne podpira imenskih prostorov XML."},
+
+        /*
+         * Note to translators:  The substitution text is the URI that was in
+         * error.
+         */
+        {BasisLibrary.CANT_RESOLVE_RELATIVE_URI_ERR,
+        "Ni mogo\u010de razre\u0161iti sklica URI ''{0}''."},
+
+         /*
+         * Note to translators:  The stylesheet contained an element that was
+         * not recognized as part of the XSL syntax.  The substitution text
+         * gives the element name.
+         */
+        {BasisLibrary.UNSUPPORTED_XSL_ERR,
+        "Nepodprt XSL element ''{0}''"},
+
+        /*
+         * Note to translators:  The stylesheet referred to an extension to the
+         * XSL syntax and indicated that it was defined by XSLTC, but XSLTC does
+         * not recognize the particular extension named.  The substitution text
+         * gives the extension name.
+         */
+        {BasisLibrary.UNSUPPORTED_EXT_ERR,
+        "Neprepoznana raz\u0161iritev XSLTC ''{0}''"},
+
+
+        /*
+         * Note to translators:  This error message is produced if the translet
+         * class was compiled using a newer version of XSLTC and deployed for
+         * execution with an older version of XSLTC.  The substitution text is
+         * the name of the translet class.
+         */
+        {BasisLibrary.UNKNOWN_TRANSLET_VERSION_ERR,
+        "Navedeni translet, ''{0}'', je bil ustvarjen z uporabo XSLTC novej\u0161e razli\u010dice, kot je trenutno uporabljana razli\u010dica izvajalnega okolja XSLTC. Slogovno datoteko morate ponovno prevesti ali pa uporabiti novej\u0161o razli\u010dico XSLTC-ja, da bi zagnali ta translet."},
+
+        /*
+         * Note to translators:  An attribute whose effective value is required
+         * to be a "QName" had a value that was incorrect.
+         * 'QName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {BasisLibrary.INVALID_QNAME_ERR,
+        "Atribut, katerega vrednost mora biti QName, je imel vrednost ''{0}''"},
+
+
+        /*
+         * Note to translators:  An attribute whose effective value is required
+         * to be a "NCName" had a value that was incorrect.
+         * 'NCName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {BasisLibrary.INVALID_NCNAME_ERR,
+        "Atribut, katerega vrednost mora biti NCName, je imel vrednost ''{0}''"},
+
+        {BasisLibrary.UNALLOWED_EXTENSION_FUNCTION_ERR,
+        "Uporaba raz\u0161iritvene funkcije ''{0}'' ni dovoljena, ko je funkcija varne obdelave nastavljena na True."},
+
+        {BasisLibrary.UNALLOWED_EXTENSION_ELEMENT_ERR,
+        "Uporaba raz\u0161iritvene elementa ''{0}'' ni dovoljena, ko je funkcija varne obdelave nastavljena na True."},
+    };
+    }
+
+}
diff --git a/src/org/apache/xalan/xsltc/runtime/ErrorMessages_zh.java b/src/org/apache/xalan/xsltc/runtime/ErrorMessages_zh.java
old mode 100755
new mode 100644
index d58ff47..9bf2d65
--- a/src/org/apache/xalan/xsltc/runtime/ErrorMessages_zh.java
+++ b/src/org/apache/xalan/xsltc/runtime/ErrorMessages_zh.java
@@ -1,285 +1,285 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: ErrorMessages_zh.java 338081 2004-12-15 17:35:58Z jycli $
- */
-
-package org.apache.xalan.xsltc.runtime;
-
-import java.util.ListResourceBundle;
-
-/**
- * @author Morten Jorgensen
- */
-public class ErrorMessages_zh extends ListResourceBundle {
-
-/*
- * XSLTC run-time error messages.
- *
- * General notes to translators and definitions:
- *
- *   1) XSLTC is the name of the product.  It is an acronym for XML Stylesheet:
- *      Transformations Compiler
- *
- *   2) A stylesheet is a description of how to transform an input XML document
- *      into a resultant output XML document (or HTML document or text)
- *
- *   3) An axis is a particular "dimension" in a tree representation of an XML
- *      document; the nodes in the tree are divided along different axes.
- *      Traversing the "child" axis, for instance, means that the program
- *      would visit each child of a particular node; traversing the "descendant"
- *      axis means that the program would visit the child nodes of a particular
- *      node, their children, and so on until the leaf nodes of the tree are
- *      reached.
- *
- *   4) An iterator is an object that traverses nodes in a tree along a
- *      particular axis, one at a time.
- *
- *   5) An element is a mark-up tag in an XML document; an attribute is a
- *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *      "elem" is an element name, "attr" and "attr2" are attribute names with
- *      the values "val" and "val2", respectively.
- *
- *   6) A namespace declaration is a special attribute that is used to associate
- *      a prefix with a URI (the namespace).  The meanings of element names and
- *      attribute names that use that prefix are defined with respect to that
- *      namespace.
- *
- *   7) DOM is an acronym for Document Object Model.  It is a tree
- *      representation of an XML document.
- *
- *      SAX is an acronym for the Simple API for XML processing.  It is an API
- *      used inform an XML processor (in this case XSLTC) of the structure and
- *      content of an XML document.
- *
- *      Input to the stylesheet processor can come from an XML parser in the
- *      form of a DOM tree or through the SAX API.
- *
- *   8) DTD is a document type declaration.  It is a way of specifying the
- *      grammar for an XML file, the names and types of elements, attributes,
- *      etc.
- *
- *   9) Translet is an invented term that refers to the class file that contains
- *      the compiled form of a stylesheet.
- */
-
-    // These message should be read from a locale-specific resource bundle
-    /** Get the lookup table for error messages.
-     *
-     * @return The message lookup table.
-     */
-    public Object[][] getContents()
-    {
-      return new Object[][] {
-
-        /*
-         * Note to translators:  the substitution text in the following message
-         * is a class name.  Used for internal errors in the processor.
-         */
-        {BasisLibrary.RUN_TIME_INTERNAL_ERR,
-        "\u201c{0}\u201d\u4e2d\u51fa\u73b0\u8fd0\u884c\u65f6\u5185\u90e8\u9519\u8bef"},
-
-        /*
-         * Note to translators:  <xsl:copy> is a keyword that should not be
-         * translated.
-         */
-        {BasisLibrary.RUN_TIME_COPY_ERR,
-        "\u5728\u6267\u884c <xsl:copy> \u65f6\u53d1\u751f\u8fd0\u884c\u65f6\u9519\u8bef\u3002"},
-
-        /*
-         * Note to translators:  The substitution text refers to data types.
-         * The message is displayed if a value in a particular context needs to
-         * be converted to type {1}, but that's not possible for a value of type
-         * {0}.
-         */
-        {BasisLibrary.DATA_CONVERSION_ERR,
-        "\u4ece\u201c{0}\u201d\u5230\u201c{1}\u201d\u7684\u8f6c\u6362\u65e0\u6548\u3002"},
-
-        /*
-         * Note to translators:  This message is displayed if the function named
-         * by the substitution text is not a function that is supported.  XSLTC
-         * is the acronym naming the product.
-         */
-        {BasisLibrary.EXTERNAL_FUNC_ERR,
-        "XSLTC \u4e0d\u652f\u6301\u5916\u90e8\u51fd\u6570\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  This message is displayed if two values are
-         * compared for equality, but the data type of one of the values is
-         * unknown.
-         */
-        {BasisLibrary.EQUALITY_EXPR_ERR,
-        "\u7b49\u5f0f\u8868\u8fbe\u5f0f\u4e2d\u7684\u81ea\u53d8\u91cf\u7c7b\u578b\u672a\u77e5\u3002"},
-
-        /*
-         * Note to translators:  The substitution text for {0} will be a data
-         * type; the substitution text for {1} will be the name of a function.
-         * This is displayed if an argument of the particular data type is not
-         * permitted for a call to this function.
-         */
-        {BasisLibrary.INVALID_ARGUMENT_ERR,
-        "\u8c03\u7528\u201c{1}\u201d\u65f6\u4f7f\u7528\u7684\u53c2\u6570\u7c7b\u578b\u201c{0}\u201d\u65e0\u6548"},
-
-        /*
-         * Note to translators:  There is way of specifying a format for a
-         * number using a pattern; the processor was unable to format the
-         * particular value using the specified pattern.
-         */
-        {BasisLibrary.FORMAT_NUMBER_ERR,
-        "\u8bd5\u56fe\u4f7f\u7528\u6a21\u5f0f\u201c{1}\u201d\u4e3a\u6570\u5b57\u201c{0}\u201d\u7f16\u6392\u683c\u5f0f\u3002"},
-
-        /*
-         * Note to translators:  The following represents an internal error
-         * situation in XSLTC.  The processor was unable to create a copy of an
-         * iterator.  (See definition of iterator above.)
-         */
-        {BasisLibrary.ITERATOR_CLONE_ERR,
-        "\u65e0\u6cd5\u514b\u9686\u8fed\u4ee3\u5668\u201c{0}\u201d\u3002"},
-
-        /*
-         * Note to translators:  The following represents an internal error
-         * situation in XSLTC.  The processor attempted to create an iterator
-         * for a particular axis (see definition above) that it does not
-         * support.
-         */
-        {BasisLibrary.AXIS_SUPPORT_ERR,
-        "\u4e0d\u652f\u6301\u8f74\u201c{0}\u201d\u7684\u8fed\u4ee3\u5668\u3002"},
-
-        /*
-         * Note to translators:  The following represents an internal error
-         * situation in XSLTC.  The processor attempted to create an iterator
-         * for a particular axis (see definition above) that it does not
-         * support.
-         */
-        {BasisLibrary.TYPED_AXIS_SUPPORT_ERR,
-        "\u4e0d\u652f\u6301\u8f93\u5165\u7684\u8f74\u201c{0}\u201d\u7684\u8fed\u4ee3\u5668\u3002"},
-
-        /*
-         * Note to translators:  This message is reported if the stylesheet
-         * being processed attempted to construct an XML document with an
-         * attribute in a place other than on an element.  The substitution text
-         * specifies the name of the attribute.
-         */
-        {BasisLibrary.STRAY_ATTRIBUTE_ERR,
-        "\u5c5e\u6027\u201c{0}\u201d\u5728\u5143\u7d20\u5916\u3002"},
-
-        /*
-         * Note to translators:  As with the preceding message, a namespace
-         * declaration has the form of an attribute and is only permitted to
-         * appear on an element.  The substitution text {0} is the namespace
-         * prefix and {1} is the URI that was being used in the erroneous
-         * namespace declaration.
-         */
-        {BasisLibrary.STRAY_NAMESPACE_ERR,
-        "\u540d\u79f0\u7a7a\u95f4\u58f0\u660e\u201c{0}\u201d=\u201c{1}\u201d\u5728\u5143\u7d20\u5916\u3002"},
-
-        /*
-         * Note to translators:  The stylesheet contained a reference to a
-         * namespace prefix that was undefined.  The value of the substitution
-         * text is the name of the prefix.
-         */
-        {BasisLibrary.NAMESPACE_PREFIX_ERR,
-        "\u5c1a\u672a\u58f0\u660e\u524d\u7f00\u201c{0}\u201d\u7684\u540d\u79f0\u7a7a\u95f4\u3002"},
-
-        /*
-         * Note to translators:  The following represents an internal error.
-         * DOMAdapter is a Java class in XSLTC.
-         */
-        {BasisLibrary.DOM_ADAPTER_INIT_ERR,
-        "\u4f7f\u7528\u9519\u8bef\u7c7b\u578b\u7684\u6e90 DOM \u521b\u5efa\u4e86 DOMAdapter\u3002"},
-
-        /*
-         * Note to translators:  The following message indicates that the XML
-         * parser that is providing input to XSLTC cannot be used because it
-         * does not describe to XSLTC the structure of the input XML document's
-         * DTD.
-         */
-        {BasisLibrary.PARSER_DTD_SUPPORT_ERR,
-        "\u6b63\u5728\u4f7f\u7528\u7684 SAX \u89e3\u6790\u5668\u4e0d\u5904\u7406 DTD \u58f0\u660e\u4e8b\u4ef6\u3002"},
-
-        /*
-         * Note to translators:  The following message indicates that the XML
-         * parser that is providing input to XSLTC cannot be used because it
-         * does not distinguish between ordinary XML attributes and namespace
-         * declarations.
-         */
-        {BasisLibrary.NAMESPACES_SUPPORT_ERR,
-        "\u6b63\u5728\u4f7f\u7528\u7684 SAX \u89e3\u6790\u5668\u4e0d\u652f\u6301 XML \u540d\u79f0\u7a7a\u95f4\u3002"},
-
-        /*
-         * Note to translators:  The substitution text is the URI that was in
-         * error.
-         */
-        {BasisLibrary.CANT_RESOLVE_RELATIVE_URI_ERR,
-        "\u65e0\u6cd5\u89e3\u6790 URI \u5f15\u7528\u201c{0}\u201d\u3002"},
-
-         /*
-         * Note to translators:  The stylesheet contained an element that was
-         * not recognized as part of the XSL syntax.  The substitution text
-         * gives the element name.
-         */
-        {BasisLibrary.UNSUPPORTED_XSL_ERR,
-        "\u4e0d\u53d7\u652f\u6301\u7684 XSL \u5143\u7d20\u201c{0}\u201d"},
-
-        /*
-         * Note to translators:  The stylesheet referred to an extension to the
-         * XSL syntax and indicated that it was defined by XSLTC, but XSLTC does
-         * not recognize the particular extension named.  The substitution text
-         * gives the extension name.
-         */
-        {BasisLibrary.UNSUPPORTED_EXT_ERR,
-        "\u672a\u88ab\u8bc6\u522b\u7684 XSLTC \u6269\u5c55\u540d\u201c{0}\u201d"},
-
-
-        /*
-         * Note to translators:  This error message is produced if the translet
-         * class was compiled using a newer version of XSLTC and deployed for
-         * execution with an older version of XSLTC.  The substitution text is
-         * the name of the translet class.
-         */
-        {BasisLibrary.UNKNOWN_TRANSLET_VERSION_ERR,
-        "\u521b\u5efa\u6307\u5b9a\u7684 translet\u201c{0}\u201d\u65f6\uff0c\u4f7f\u7528\u7684 XSLTC \u7248\u672c\u6bd4\u6b63\u5728\u4f7f\u7528\u7684 XSLTC \u8fd0\u884c\u65f6\u7248\u672c\u66f4\u65b0\u3002\u60a8\u5fc5\u987b\u91cd\u65b0\u7f16\u8bd1\u6837\u5f0f\u8868\u6216\u4f7f\u7528\u66f4\u65b0\u7684 XSLTC \u7248\u672c\u6765\u8fd0\u884c\u6b64 translet\u3002"},
-
-        /*
-         * Note to translators:  An attribute whose effective value is required
-         * to be a "QName" had a value that was incorrect.
-         * 'QName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {BasisLibrary.INVALID_QNAME_ERR,
-        "\u503c\u5fc5\u987b\u4e3a QName \u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
-
-
-        /*
-         * Note to translators:  An attribute whose effective value is required
-         * to be a "NCName" had a value that was incorrect.
-         * 'NCName' is an XML syntactic term that must not be translated.  The
-         * substitution text contains the actual value of the attribute.
-         */
-        {BasisLibrary.INVALID_NCNAME_ERR,
-        "\u503c\u5fc5\u987b\u4e3a NCName \u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
-
-        {BasisLibrary.UNALLOWED_EXTENSION_FUNCTION_ERR,
-        "\u5f53\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u6269\u5c55\u51fd\u6570\u201c{0}\u201d\u3002"},
-
-        {BasisLibrary.UNALLOWED_EXTENSION_ELEMENT_ERR,
-        "\u5f53\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u6269\u5c55\u5143\u7d20\u201c{0}\u201d\u3002"},
-    };
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xalan.xsltc.runtime;
+
+import java.util.ListResourceBundle;
+
+/**
+ * @author Morten Jorgensen
+ */
+public class ErrorMessages_zh extends ListResourceBundle {
+
+/*
+ * XSLTC run-time error messages.
+ *
+ * General notes to translators and definitions:
+ *
+ *   1) XSLTC is the name of the product.  It is an acronym for XML Stylesheet:
+ *      Transformations Compiler
+ *
+ *   2) A stylesheet is a description of how to transform an input XML document
+ *      into a resultant output XML document (or HTML document or text)
+ *
+ *   3) An axis is a particular "dimension" in a tree representation of an XML
+ *      document; the nodes in the tree are divided along different axes.
+ *      Traversing the "child" axis, for instance, means that the program
+ *      would visit each child of a particular node; traversing the "descendant"
+ *      axis means that the program would visit the child nodes of a particular
+ *      node, their children, and so on until the leaf nodes of the tree are
+ *      reached.
+ *
+ *   4) An iterator is an object that traverses nodes in a tree along a
+ *      particular axis, one at a time.
+ *
+ *   5) An element is a mark-up tag in an XML document; an attribute is a
+ *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *      "elem" is an element name, "attr" and "attr2" are attribute names with
+ *      the values "val" and "val2", respectively.
+ *
+ *   6) A namespace declaration is a special attribute that is used to associate
+ *      a prefix with a URI (the namespace).  The meanings of element names and
+ *      attribute names that use that prefix are defined with respect to that
+ *      namespace.
+ *
+ *   7) DOM is an acronym for Document Object Model.  It is a tree
+ *      representation of an XML document.
+ *
+ *      SAX is an acronym for the Simple API for XML processing.  It is an API
+ *      used inform an XML processor (in this case XSLTC) of the structure and
+ *      content of an XML document.
+ *
+ *      Input to the stylesheet processor can come from an XML parser in the
+ *      form of a DOM tree or through the SAX API.
+ *
+ *   8) DTD is a document type declaration.  It is a way of specifying the
+ *      grammar for an XML file, the names and types of elements, attributes,
+ *      etc.
+ *
+ *   9) Translet is an invented term that refers to the class file that contains
+ *      the compiled form of a stylesheet.
+ */
+
+    // These message should be read from a locale-specific resource bundle
+    /** Get the lookup table for error messages.
+     *
+     * @return The message lookup table.
+     */
+    public Object[][] getContents()
+    {
+      return new Object[][] {
+
+        /*
+         * Note to translators:  the substitution text in the following message
+         * is a class name.  Used for internal errors in the processor.
+         */
+        {BasisLibrary.RUN_TIME_INTERNAL_ERR,
+        "\u201c{0}\u201d\u4e2d\u51fa\u73b0\u8fd0\u884c\u65f6\u5185\u90e8\u9519\u8bef"},
+
+        /*
+         * Note to translators:  <xsl:copy> is a keyword that should not be
+         * translated.
+         */
+        {BasisLibrary.RUN_TIME_COPY_ERR,
+        "\u5728\u6267\u884c <xsl:copy> \u65f6\u53d1\u751f\u8fd0\u884c\u65f6\u9519\u8bef\u3002"},
+
+        /*
+         * Note to translators:  The substitution text refers to data types.
+         * The message is displayed if a value in a particular context needs to
+         * be converted to type {1}, but that's not possible for a value of type
+         * {0}.
+         */
+        {BasisLibrary.DATA_CONVERSION_ERR,
+        "\u4ece\u201c{0}\u201d\u5230\u201c{1}\u201d\u7684\u8f6c\u6362\u65e0\u6548\u3002"},
+
+        /*
+         * Note to translators:  This message is displayed if the function named
+         * by the substitution text is not a function that is supported.  XSLTC
+         * is the acronym naming the product.
+         */
+        {BasisLibrary.EXTERNAL_FUNC_ERR,
+        "XSLTC \u4e0d\u652f\u6301\u5916\u90e8\u51fd\u6570\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  This message is displayed if two values are
+         * compared for equality, but the data type of one of the values is
+         * unknown.
+         */
+        {BasisLibrary.EQUALITY_EXPR_ERR,
+        "\u7b49\u5f0f\u8868\u8fbe\u5f0f\u4e2d\u7684\u81ea\u53d8\u91cf\u7c7b\u578b\u672a\u77e5\u3002"},
+
+        /*
+         * Note to translators:  The substitution text for {0} will be a data
+         * type; the substitution text for {1} will be the name of a function.
+         * This is displayed if an argument of the particular data type is not
+         * permitted for a call to this function.
+         */
+        {BasisLibrary.INVALID_ARGUMENT_ERR,
+        "\u8c03\u7528\u201c{1}\u201d\u65f6\u4f7f\u7528\u7684\u53c2\u6570\u7c7b\u578b\u201c{0}\u201d\u65e0\u6548"},
+
+        /*
+         * Note to translators:  There is way of specifying a format for a
+         * number using a pattern; the processor was unable to format the
+         * particular value using the specified pattern.
+         */
+        {BasisLibrary.FORMAT_NUMBER_ERR,
+        "\u8bd5\u56fe\u4f7f\u7528\u6a21\u5f0f\u201c{1}\u201d\u4e3a\u6570\u5b57\u201c{0}\u201d\u7f16\u6392\u683c\u5f0f\u3002"},
+
+        /*
+         * Note to translators:  The following represents an internal error
+         * situation in XSLTC.  The processor was unable to create a copy of an
+         * iterator.  (See definition of iterator above.)
+         */
+        {BasisLibrary.ITERATOR_CLONE_ERR,
+        "\u65e0\u6cd5\u514b\u9686\u8fed\u4ee3\u5668\u201c{0}\u201d\u3002"},
+
+        /*
+         * Note to translators:  The following represents an internal error
+         * situation in XSLTC.  The processor attempted to create an iterator
+         * for a particular axis (see definition above) that it does not
+         * support.
+         */
+        {BasisLibrary.AXIS_SUPPORT_ERR,
+        "\u4e0d\u652f\u6301\u8f74\u201c{0}\u201d\u7684\u8fed\u4ee3\u5668\u3002"},
+
+        /*
+         * Note to translators:  The following represents an internal error
+         * situation in XSLTC.  The processor attempted to create an iterator
+         * for a particular axis (see definition above) that it does not
+         * support.
+         */
+        {BasisLibrary.TYPED_AXIS_SUPPORT_ERR,
+        "\u4e0d\u652f\u6301\u8f93\u5165\u7684\u8f74\u201c{0}\u201d\u7684\u8fed\u4ee3\u5668\u3002"},
+
+        /*
+         * Note to translators:  This message is reported if the stylesheet
+         * being processed attempted to construct an XML document with an
+         * attribute in a place other than on an element.  The substitution text
+         * specifies the name of the attribute.
+         */
+        {BasisLibrary.STRAY_ATTRIBUTE_ERR,
+        "\u5c5e\u6027\u201c{0}\u201d\u5728\u5143\u7d20\u5916\u3002"},
+
+        /*
+         * Note to translators:  As with the preceding message, a namespace
+         * declaration has the form of an attribute and is only permitted to
+         * appear on an element.  The substitution text {0} is the namespace
+         * prefix and {1} is the URI that was being used in the erroneous
+         * namespace declaration.
+         */
+        {BasisLibrary.STRAY_NAMESPACE_ERR,
+        "\u540d\u79f0\u7a7a\u95f4\u58f0\u660e\u201c{0}\u201d=\u201c{1}\u201d\u5728\u5143\u7d20\u5916\u3002"},
+
+        /*
+         * Note to translators:  The stylesheet contained a reference to a
+         * namespace prefix that was undefined.  The value of the substitution
+         * text is the name of the prefix.
+         */
+        {BasisLibrary.NAMESPACE_PREFIX_ERR,
+        "\u5c1a\u672a\u58f0\u660e\u524d\u7f00\u201c{0}\u201d\u7684\u540d\u79f0\u7a7a\u95f4\u3002"},
+
+        /*
+         * Note to translators:  The following represents an internal error.
+         * DOMAdapter is a Java class in XSLTC.
+         */
+        {BasisLibrary.DOM_ADAPTER_INIT_ERR,
+        "\u4f7f\u7528\u9519\u8bef\u7c7b\u578b\u7684\u6e90 DOM \u521b\u5efa\u4e86 DOMAdapter\u3002"},
+
+        /*
+         * Note to translators:  The following message indicates that the XML
+         * parser that is providing input to XSLTC cannot be used because it
+         * does not describe to XSLTC the structure of the input XML document's
+         * DTD.
+         */
+        {BasisLibrary.PARSER_DTD_SUPPORT_ERR,
+        "\u6b63\u5728\u4f7f\u7528\u7684 SAX \u89e3\u6790\u5668\u4e0d\u5904\u7406 DTD \u58f0\u660e\u4e8b\u4ef6\u3002"},
+
+        /*
+         * Note to translators:  The following message indicates that the XML
+         * parser that is providing input to XSLTC cannot be used because it
+         * does not distinguish between ordinary XML attributes and namespace
+         * declarations.
+         */
+        {BasisLibrary.NAMESPACES_SUPPORT_ERR,
+        "\u6b63\u5728\u4f7f\u7528\u7684 SAX \u89e3\u6790\u5668\u4e0d\u652f\u6301 XML \u540d\u79f0\u7a7a\u95f4\u3002"},
+
+        /*
+         * Note to translators:  The substitution text is the URI that was in
+         * error.
+         */
+        {BasisLibrary.CANT_RESOLVE_RELATIVE_URI_ERR,
+        "\u65e0\u6cd5\u89e3\u6790 URI \u5f15\u7528\u201c{0}\u201d\u3002"},
+
+         /*
+         * Note to translators:  The stylesheet contained an element that was
+         * not recognized as part of the XSL syntax.  The substitution text
+         * gives the element name.
+         */
+        {BasisLibrary.UNSUPPORTED_XSL_ERR,
+        "\u4e0d\u53d7\u652f\u6301\u7684 XSL \u5143\u7d20\u201c{0}\u201d"},
+
+        /*
+         * Note to translators:  The stylesheet referred to an extension to the
+         * XSL syntax and indicated that it was defined by XSLTC, but XSLTC does
+         * not recognize the particular extension named.  The substitution text
+         * gives the extension name.
+         */
+        {BasisLibrary.UNSUPPORTED_EXT_ERR,
+        "\u672a\u88ab\u8bc6\u522b\u7684 XSLTC \u6269\u5c55\u540d\u201c{0}\u201d"},
+
+
+        /*
+         * Note to translators:  This error message is produced if the translet
+         * class was compiled using a newer version of XSLTC and deployed for
+         * execution with an older version of XSLTC.  The substitution text is
+         * the name of the translet class.
+         */
+        {BasisLibrary.UNKNOWN_TRANSLET_VERSION_ERR,
+        "\u521b\u5efa\u6307\u5b9a\u7684 translet\u201c{0}\u201d\u65f6\uff0c\u4f7f\u7528\u7684 XSLTC \u7248\u672c\u6bd4\u6b63\u5728\u4f7f\u7528\u7684 XSLTC \u8fd0\u884c\u65f6\u7248\u672c\u66f4\u65b0\u3002\u60a8\u5fc5\u987b\u91cd\u65b0\u7f16\u8bd1\u6837\u5f0f\u8868\u6216\u4f7f\u7528\u66f4\u65b0\u7684 XSLTC \u7248\u672c\u6765\u8fd0\u884c\u6b64 translet\u3002"},
+
+        /*
+         * Note to translators:  An attribute whose effective value is required
+         * to be a "QName" had a value that was incorrect.
+         * 'QName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {BasisLibrary.INVALID_QNAME_ERR,
+        "\u503c\u5fc5\u987b\u4e3a QName \u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
+
+
+        /*
+         * Note to translators:  An attribute whose effective value is required
+         * to be a "NCName" had a value that was incorrect.
+         * 'NCName' is an XML syntactic term that must not be translated.  The
+         * substitution text contains the actual value of the attribute.
+         */
+        {BasisLibrary.INVALID_NCNAME_ERR,
+        "\u503c\u5fc5\u987b\u4e3a NCName \u7684\u5c5e\u6027\u5177\u6709\u503c\u201c{0}\u201d"},
+
+        {BasisLibrary.UNALLOWED_EXTENSION_FUNCTION_ERR,
+        "\u5f53\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u6269\u5c55\u51fd\u6570\u201c{0}\u201d\u3002"},
+
+        {BasisLibrary.UNALLOWED_EXTENSION_ELEMENT_ERR,
+        "\u5f53\u5b89\u5168\u5904\u7406\u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u4e0d\u5141\u8bb8\u4f7f\u7528\u6269\u5c55\u5143\u7d20\u201c{0}\u201d\u3002"},
+    };
+    }
+
+}
diff --git a/src/org/apache/xalan/xsltc/runtime/InternalRuntimeError.java b/src/org/apache/xalan/xsltc/runtime/InternalRuntimeError.java
old mode 100755
new mode 100644
diff --git a/src/org/apache/xml/res/XMLErrorResources_sl.java b/src/org/apache/xml/res/XMLErrorResources_sl.java
old mode 100755
new mode 100644
index c79e716..fb1ba12
--- a/src/org/apache/xml/res/XMLErrorResources_sl.java
+++ b/src/org/apache/xml/res/XMLErrorResources_sl.java
@@ -1,431 +1,431 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: XMLErrorResources_sl.java,v 1.9 2004/12/16 19:29:01 minchau Exp $
- */
-
-package org.apache.xml.res;
-
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Set up error messages.
- * We build a two dimensional array of message keys and
- * message strings. In order to add a new message here,
- * you need to first add a String constant. And you need
- * to enter key, value pair as part of the contents
- * array. You also need to update MAX_CODE for error strings
- * and MAX_WARNING for warnings ( Needed for only information
- * purpose )
- */
-public class XMLErrorResources_sl extends ListResourceBundle
-{
-
-/*
- * This file contains error and warning messages related to Xalan Error
- * Handling.
- *
- *  General notes to translators:
- *
- *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
- *     components.
- *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *     XSLTC is an acronym for XSLT Compiler.
- *
- *  2) A stylesheet is a description of how to transform an input XML document
- *     into a resultant XML document (or HTML document or text).  The
- *     stylesheet itself is described in the form of an XML document.
- *
- *  3) A template is a component of a stylesheet that is used to match a
- *     particular portion of an input document and specifies the form of the
- *     corresponding portion of the output document.
- *
- *  4) An element is a mark-up tag in an XML document; an attribute is a
- *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *     "elem" is an element name, "attr" and "attr2" are attribute names with
- *     the values "val" and "val2", respectively.
- *
- *  5) A namespace declaration is a special attribute that is used to associate
- *     a prefix with a URI (the namespace).  The meanings of element names and
- *     attribute names that use that prefix are defined with respect to that
- *     namespace.
- *
- *  6) "Translet" is an invented term that describes the class file that
- *     results from compiling an XML stylesheet into a Java class.
- *
- *  7) XPath is a specification that describes a notation for identifying
- *     nodes in a tree-structured representation of an XML document.  An
- *     instance of that notation is referred to as an XPath expression.
- *
- */
-
-  /*
-   * Message keys
-   */
-  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
-  public static final String ER_CANNOT_OVERWRITE_CAUSE = "ER_CANNOT_OVERWRITE_CAUSE";
-  public static final String ER_NO_DEFAULT_IMPL = "ER_NO_DEFAULT_IMPL";
-  public static final String ER_CHUNKEDINTARRAY_NOT_SUPPORTED = "ER_CHUNKEDINTARRAY_NOT_SUPPORTED";
-  public static final String ER_OFFSET_BIGGER_THAN_SLOT = "ER_OFFSET_BIGGER_THAN_SLOT";
-  public static final String ER_COROUTINE_NOT_AVAIL = "ER_COROUTINE_NOT_AVAIL";
-  public static final String ER_COROUTINE_CO_EXIT = "ER_COROUTINE_CO_EXIT";
-  public static final String ER_COJOINROUTINESET_FAILED = "ER_COJOINROUTINESET_FAILED";
-  public static final String ER_COROUTINE_PARAM = "ER_COROUTINE_PARAM";
-  public static final String ER_PARSER_DOTERMINATE_ANSWERS = "ER_PARSER_DOTERMINATE_ANSWERS";
-  public static final String ER_NO_PARSE_CALL_WHILE_PARSING = "ER_NO_PARSE_CALL_WHILE_PARSING";
-  public static final String ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED";
-  public static final String ER_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_ITERATOR_AXIS_NOT_IMPLEMENTED";
-  public static final String ER_ITERATOR_CLONE_NOT_SUPPORTED = "ER_ITERATOR_CLONE_NOT_SUPPORTED";
-  public static final String ER_UNKNOWN_AXIS_TYPE = "ER_UNKNOWN_AXIS_TYPE";
-  public static final String ER_AXIS_NOT_SUPPORTED = "ER_AXIS_NOT_SUPPORTED";
-  public static final String ER_NO_DTMIDS_AVAIL = "ER_NO_DTMIDS_AVAIL";
-  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
-  public static final String ER_NODE_NON_NULL = "ER_NODE_NON_NULL";
-  public static final String ER_COULD_NOT_RESOLVE_NODE = "ER_COULD_NOT_RESOLVE_NODE";
-  public static final String ER_STARTPARSE_WHILE_PARSING = "ER_STARTPARSE_WHILE_PARSING";
-  public static final String ER_STARTPARSE_NEEDS_SAXPARSER = "ER_STARTPARSE_NEEDS_SAXPARSER";
-  public static final String ER_COULD_NOT_INIT_PARSER = "ER_COULD_NOT_INIT_PARSER";
-  public static final String ER_EXCEPTION_CREATING_POOL = "ER_EXCEPTION_CREATING_POOL";
-  public static final String ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE = "ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE";
-  public static final String ER_SCHEME_REQUIRED = "ER_SCHEME_REQUIRED";
-  public static final String ER_NO_SCHEME_IN_URI = "ER_NO_SCHEME_IN_URI";
-  public static final String ER_NO_SCHEME_INURI = "ER_NO_SCHEME_INURI";
-  public static final String ER_PATH_INVALID_CHAR = "ER_PATH_INVALID_CHAR";
-  public static final String ER_SCHEME_FROM_NULL_STRING = "ER_SCHEME_FROM_NULL_STRING";
-  public static final String ER_SCHEME_NOT_CONFORMANT = "ER_SCHEME_NOT_CONFORMANT";
-  public static final String ER_HOST_ADDRESS_NOT_WELLFORMED = "ER_HOST_ADDRESS_NOT_WELLFORMED";
-  public static final String ER_PORT_WHEN_HOST_NULL = "ER_PORT_WHEN_HOST_NULL";
-  public static final String ER_INVALID_PORT = "ER_INVALID_PORT";
-  public static final String ER_FRAG_FOR_GENERIC_URI ="ER_FRAG_FOR_GENERIC_URI";
-  public static final String ER_FRAG_WHEN_PATH_NULL = "ER_FRAG_WHEN_PATH_NULL";
-  public static final String ER_FRAG_INVALID_CHAR = "ER_FRAG_INVALID_CHAR";
-  public static final String ER_PARSER_IN_USE = "ER_PARSER_IN_USE";
-  public static final String ER_CANNOT_CHANGE_WHILE_PARSING = "ER_CANNOT_CHANGE_WHILE_PARSING";
-  public static final String ER_SELF_CAUSATION_NOT_PERMITTED = "ER_SELF_CAUSATION_NOT_PERMITTED";
-  public static final String ER_NO_USERINFO_IF_NO_HOST = "ER_NO_USERINFO_IF_NO_HOST";
-  public static final String ER_NO_PORT_IF_NO_HOST = "ER_NO_PORT_IF_NO_HOST";
-  public static final String ER_NO_QUERY_STRING_IN_PATH = "ER_NO_QUERY_STRING_IN_PATH";
-  public static final String ER_NO_FRAGMENT_STRING_IN_PATH = "ER_NO_FRAGMENT_STRING_IN_PATH";
-  public static final String ER_CANNOT_INIT_URI_EMPTY_PARMS = "ER_CANNOT_INIT_URI_EMPTY_PARMS";
-  public static final String ER_METHOD_NOT_SUPPORTED ="ER_METHOD_NOT_SUPPORTED";
-  public static final String ER_INCRSAXSRCFILTER_NOT_RESTARTABLE = "ER_INCRSAXSRCFILTER_NOT_RESTARTABLE";
-  public static final String ER_XMLRDR_NOT_BEFORE_STARTPARSE = "ER_XMLRDR_NOT_BEFORE_STARTPARSE";
-  public static final String ER_AXIS_TRAVERSER_NOT_SUPPORTED = "ER_AXIS_TRAVERSER_NOT_SUPPORTED";
-  public static final String ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER = "ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER";
-  public static final String ER_SYSTEMID_UNKNOWN = "ER_SYSTEMID_UNKNOWN";
-  public static final String ER_LOCATION_UNKNOWN = "ER_LOCATION_UNKNOWN";
-  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
-  public static final String ER_CREATEDOCUMENT_NOT_SUPPORTED = "ER_CREATEDOCUMENT_NOT_SUPPORTED";
-  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT";
-  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT";
-  public static final String ER_CANT_OUTPUT_TEXT_BEFORE_DOC = "ER_CANT_OUTPUT_TEXT_BEFORE_DOC";
-  public static final String ER_CANT_HAVE_MORE_THAN_ONE_ROOT = "ER_CANT_HAVE_MORE_THAN_ONE_ROOT";
-  public static final String ER_ARG_LOCALNAME_NULL = "ER_ARG_LOCALNAME_NULL";
-  public static final String ER_ARG_LOCALNAME_INVALID = "ER_ARG_LOCALNAME_INVALID";
-  public static final String ER_ARG_PREFIX_INVALID = "ER_ARG_PREFIX_INVALID";
-  public static final String ER_NAME_CANT_START_WITH_COLON = "ER_NAME_CANT_START_WITH_COLON";
-
-  /*
-   * Now fill in the message text.
-   * Then fill in the message text for that message code in the
-   * array. Use the new error code as the index into the array.
-   */
-
-  // Error messages...
-
-  /**
-   * Get the lookup table for error messages
-   *
-   * @return The association list.
-   */
-  public Object[][] getContents()
-  {
-    return new Object[][] {
-
-  /** Error message ID that has a null message, but takes in a single object.    */
-    {"ER0000" , "{0}" },
-
-    { ER_FUNCTION_NOT_SUPPORTED,
-      "Funkcija ni podprta!"},
-
-    { ER_CANNOT_OVERWRITE_CAUSE,
-      "Vzroka ni mogo\u010de prepisati"},
-
-    { ER_NO_DEFAULT_IMPL,
-      "Privzete implementacije ni mogo\u010de najti "},
-
-    { ER_CHUNKEDINTARRAY_NOT_SUPPORTED,
-      "ChunkedIntArray({0}) trenutno ni podprt"},
-
-    { ER_OFFSET_BIGGER_THAN_SLOT,
-      "Odmik ve\u010dji od re\u017ee"},
-
-    { ER_COROUTINE_NOT_AVAIL,
-      "Sorutina ni na voljo, id={0}"},
-
-    { ER_COROUTINE_CO_EXIT,
-      "CoroutineManager je prejel zahtevo co_exit()"},
-
-    { ER_COJOINROUTINESET_FAILED,
-      "co_joinCoroutineSet() je spodletela"},
-
-    { ER_COROUTINE_PARAM,
-      "Napaka parametra sorutine ({0})"},
-
-    { ER_PARSER_DOTERMINATE_ANSWERS,
-      "\nNEPRI\u010cAKOVANO: Odgovor raz\u010dlenjevalnika doTerminate je {0}"},
-
-    { ER_NO_PARSE_CALL_WHILE_PARSING,
-      "med raz\u010dlenjevanjem klic raz\u010dlenitve ni mo\u017een"},
-
-    { ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED,
-      "Napaka: dolo\u010den iterator za os {0} ni implementiran"},
-
-    { ER_ITERATOR_AXIS_NOT_IMPLEMENTED,
-      "Napaka: iterator za os {0} ni implementiran "},
-
-    { ER_ITERATOR_CLONE_NOT_SUPPORTED,
-      "Klon iteratorja ni podprt"},
-
-    { ER_UNKNOWN_AXIS_TYPE,
-      "Neznan pre\u010dni tip osi: {0}"},
-
-    { ER_AXIS_NOT_SUPPORTED,
-      "Pre\u010dnik osi ni podprt: {0}"},
-
-    { ER_NO_DTMIDS_AVAIL,
-      "Na voljo ni ve\u010d DTM ID-jev"},
-
-    { ER_NOT_SUPPORTED,
-      "Ni podprto: {0}"},
-
-    { ER_NODE_NON_NULL,
-      "Vozli\u0161\u010de ne sme biti NULL za getDTMHandleFromNode"},
-
-    { ER_COULD_NOT_RESOLVE_NODE,
-      "Ne morem razre\u0161iti vozli\u0161\u010da v obravnavo"},
-
-    { ER_STARTPARSE_WHILE_PARSING,
-       "Med raz\u010dlenjevanjem klic startParse ni mogo\u010d"},
-
-    { ER_STARTPARSE_NEEDS_SAXPARSER,
-       "startParse potrebuje ne-NULL SAXParser"},
-
-    { ER_COULD_NOT_INIT_PARSER,
-       "parserja ni mogo\u010de inicializirati z"},
-
-    { ER_EXCEPTION_CREATING_POOL,
-       "izjema pri ustvarjanju novega primerka za zalogo"},
-
-    { ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
-       "Pot vsebuje neveljavno zaporedje za izhod"},
-
-    { ER_SCHEME_REQUIRED,
-       "Zahtevana je shema!"},
-
-    { ER_NO_SCHEME_IN_URI,
-       "Ne najdem sheme v URI: {0}"},
-
-    { ER_NO_SCHEME_INURI,
-       "Ne najdem sheme v URI"},
-
-    { ER_PATH_INVALID_CHAR,
-       "Pot vsebuje neveljaven znak: {0}"},
-
-    { ER_SCHEME_FROM_NULL_STRING,
-       "Ne morem nastaviti sheme iz niza NULL"},
-
-    { ER_SCHEME_NOT_CONFORMANT,
-       "Shema ni skladna."},
-
-    { ER_HOST_ADDRESS_NOT_WELLFORMED,
-       "Naslov gostitelja ni pravilno oblikovan"},
-
-    { ER_PORT_WHEN_HOST_NULL,
-       "Ko je gostitelj NULL, nastavitev vrat ni mogo\u010da"},
-
-    { ER_INVALID_PORT,
-       "Neveljavna \u0161tevilka vrat"},
-
-    { ER_FRAG_FOR_GENERIC_URI,
-       "Fragment je lahko nastavljen samo za splo\u0161ni URI"},
-
-    { ER_FRAG_WHEN_PATH_NULL,
-       "Ko je pot NULL, nastavitev fragmenta ni mogo\u010da"},
-
-    { ER_FRAG_INVALID_CHAR,
-       "Fragment vsebuje neveljaven znak"},
-
-    { ER_PARSER_IN_USE,
-      "Raz\u010dlenjevalnik je \u017ee v uporabi"},
-
-    { ER_CANNOT_CHANGE_WHILE_PARSING,
-      "Med raz\u010dlenjevanjem ni mogo\u010de spremeniti {0} {1}"},
-
-    { ER_SELF_CAUSATION_NOT_PERMITTED,
-      "Samopovzro\u010ditev ni dovoljena"},
-
-    { ER_NO_USERINFO_IF_NO_HOST,
-      "Informacije o uporabniku ne morejo biti navedene, \u010de ni naveden gostitelj"},
-
-    { ER_NO_PORT_IF_NO_HOST,
-      "Vrata ne morejo biti navedena, \u010de ni naveden gostitelj"},
-
-    { ER_NO_QUERY_STRING_IN_PATH,
-      "Poizvedbeni niz ne more biti naveden v nizu poti in poizvedbenem nizu"},
-
-    { ER_NO_FRAGMENT_STRING_IN_PATH,
-      "Fragment ne more biti hkrati naveden v poti in v fragmentu"},
-
-    { ER_CANNOT_INIT_URI_EMPTY_PARMS,
-      "Ne morem inicializirat URI-ja s praznimi parametri"},
-
-    { ER_METHOD_NOT_SUPPORTED,
-      "Metoda ni ve\u010d podprta "},
-
-    { ER_INCRSAXSRCFILTER_NOT_RESTARTABLE,
-      "IncrementalSAXSource_Filter v tem trenutku ni mogo\u010de ponovno zagnati"},
-
-    { ER_XMLRDR_NOT_BEFORE_STARTPARSE,
-      "XMLReader ne pred zahtevo za startParse"},
-
-    { ER_AXIS_TRAVERSER_NOT_SUPPORTED,
-      "Pre\u010dnik osi ni podprt: {0}"},
-
-    { ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER,
-      "ListingErrorHandler ustvarjen s PrintWriter NULL!"},
-
-    { ER_SYSTEMID_UNKNOWN,
-      "Neznan sistemski ID"},
-
-    { ER_LOCATION_UNKNOWN,
-      "Mesto napake neznano"},
-
-    { ER_PREFIX_MUST_RESOLVE,
-      "Predpona se mora razre\u0161iti v imenski prostor: {0}"},
-
-    { ER_CREATEDOCUMENT_NOT_SUPPORTED,
-      "createDocument() ni podprt v XPathContext!"},
-
-    { ER_CHILD_HAS_NO_OWNER_DOCUMENT,
-      "Podrejeni predmet atributa nima lastni\u0161kega dokumenta!"},
-
-    { ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT,
-      "Podrejeni predmet atributa nima elementa lastni\u0161kega dokumenta!"},
-
-    { ER_CANT_OUTPUT_TEXT_BEFORE_DOC,
-      "Opozorilo: besedila ne morem prikazati pred elementom dokumenta!  Ignoriram..."},
-
-    { ER_CANT_HAVE_MORE_THAN_ONE_ROOT,
-      "Na DOM-u ne more biti ve\u010d kot en koren!"},
-
-    { ER_ARG_LOCALNAME_NULL,
-       "Argument 'lokalno ime' je NULL"},
-
-    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
-    // The localname is the portion after the optional colon; the message indicates
-    // that there is a problem with that part of the QNAME.
-    { ER_ARG_LOCALNAME_INVALID,
-       "Lokalno ime v QNAME bi moralo biti veljavno NCIme"},
-
-    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
-    // The prefix is the portion before the optional colon; the message indicates
-    // that there is a problem with that part of the QNAME.
-    { ER_ARG_PREFIX_INVALID,
-       "Predpona v QNAME bi morala biti valjavno NCIme"},
-
-    { ER_NAME_CANT_START_WITH_COLON,
-      "Ime se ne more za\u010deti z dvopi\u010djem"},
-
-    { "BAD_CODE", "Parameter za ustvariSporo\u010dilo presega meje"},
-    { "FORMAT_FAILED", "Med klicem messageFormat naletel na izjemo"},
-    { "line", "Vrstica #"},
-    { "column","Stolpec #"}
-
-
-  };
-  }
-
-  /**
-   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
-   *   of ResourceBundle.getBundle().
-   *
-   *   @param className the name of the class that implements the resource bundle.
-   *   @return the ResourceBundle
-   *   @throws MissingResourceException
-   */
-  public static final XMLErrorResources loadResourceBundle(String className)
-          throws MissingResourceException
-  {
-
-    Locale locale = Locale.getDefault();
-    String suffix = getResourceSuffix(locale);
-
-    try
-    {
-
-      // first try with the given locale
-      return (XMLErrorResources) ResourceBundle.getBundle(className
-              + suffix, locale);
-    }
-    catch (MissingResourceException e)
-    {
-      try  // try to fall back to en_US if we can't load
-      {
-
-        // Since we can't find the localized property file,
-        // fall back to en_US.
-        return (XMLErrorResources) ResourceBundle.getBundle(className,
-                new Locale("sl", "SL"));
-      }
-      catch (MissingResourceException e2)
-      {
-
-        // Now we are really in trouble.
-        // very bad, definitely very bad...not going to get very far
-        throw new MissingResourceException(
-          "Could not load any resource bundles.", className, "");
-      }
-    }
-  }
-
-  /**
-   * Return the resource file suffic for the indicated locale
-   * For most locales, this will be based the language code.  However
-   * for Chinese, we do distinguish between Taiwan and PRC
-   *
-   * @param locale the locale
-   * @return an String suffix which canbe appended to a resource name
-   */
-  private static final String getResourceSuffix(Locale locale)
-  {
-
-    String suffix = "_" + locale.getLanguage();
-    String country = locale.getCountry();
-
-    if (country.equals("TW"))
-      suffix += "_" + country;
-
-    return suffix;
-  }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.res;
+
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Set up error messages.
+ * We build a two dimensional array of message keys and
+ * message strings. In order to add a new message here,
+ * you need to first add a String constant. And you need
+ * to enter key, value pair as part of the contents
+ * array. You also need to update MAX_CODE for error strings
+ * and MAX_WARNING for warnings ( Needed for only information
+ * purpose )
+ */
+public class XMLErrorResources_sl extends ListResourceBundle
+{
+
+/*
+ * This file contains error and warning messages related to Xalan Error
+ * Handling.
+ *
+ *  General notes to translators:
+ *
+ *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
+ *     components.
+ *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *     XSLTC is an acronym for XSLT Compiler.
+ *
+ *  2) A stylesheet is a description of how to transform an input XML document
+ *     into a resultant XML document (or HTML document or text).  The
+ *     stylesheet itself is described in the form of an XML document.
+ *
+ *  3) A template is a component of a stylesheet that is used to match a
+ *     particular portion of an input document and specifies the form of the
+ *     corresponding portion of the output document.
+ *
+ *  4) An element is a mark-up tag in an XML document; an attribute is a
+ *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *     "elem" is an element name, "attr" and "attr2" are attribute names with
+ *     the values "val" and "val2", respectively.
+ *
+ *  5) A namespace declaration is a special attribute that is used to associate
+ *     a prefix with a URI (the namespace).  The meanings of element names and
+ *     attribute names that use that prefix are defined with respect to that
+ *     namespace.
+ *
+ *  6) "Translet" is an invented term that describes the class file that
+ *     results from compiling an XML stylesheet into a Java class.
+ *
+ *  7) XPath is a specification that describes a notation for identifying
+ *     nodes in a tree-structured representation of an XML document.  An
+ *     instance of that notation is referred to as an XPath expression.
+ *
+ */
+
+  /*
+   * Message keys
+   */
+  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
+  public static final String ER_CANNOT_OVERWRITE_CAUSE = "ER_CANNOT_OVERWRITE_CAUSE";
+  public static final String ER_NO_DEFAULT_IMPL = "ER_NO_DEFAULT_IMPL";
+  public static final String ER_CHUNKEDINTARRAY_NOT_SUPPORTED = "ER_CHUNKEDINTARRAY_NOT_SUPPORTED";
+  public static final String ER_OFFSET_BIGGER_THAN_SLOT = "ER_OFFSET_BIGGER_THAN_SLOT";
+  public static final String ER_COROUTINE_NOT_AVAIL = "ER_COROUTINE_NOT_AVAIL";
+  public static final String ER_COROUTINE_CO_EXIT = "ER_COROUTINE_CO_EXIT";
+  public static final String ER_COJOINROUTINESET_FAILED = "ER_COJOINROUTINESET_FAILED";
+  public static final String ER_COROUTINE_PARAM = "ER_COROUTINE_PARAM";
+  public static final String ER_PARSER_DOTERMINATE_ANSWERS = "ER_PARSER_DOTERMINATE_ANSWERS";
+  public static final String ER_NO_PARSE_CALL_WHILE_PARSING = "ER_NO_PARSE_CALL_WHILE_PARSING";
+  public static final String ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED";
+  public static final String ER_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_ITERATOR_AXIS_NOT_IMPLEMENTED";
+  public static final String ER_ITERATOR_CLONE_NOT_SUPPORTED = "ER_ITERATOR_CLONE_NOT_SUPPORTED";
+  public static final String ER_UNKNOWN_AXIS_TYPE = "ER_UNKNOWN_AXIS_TYPE";
+  public static final String ER_AXIS_NOT_SUPPORTED = "ER_AXIS_NOT_SUPPORTED";
+  public static final String ER_NO_DTMIDS_AVAIL = "ER_NO_DTMIDS_AVAIL";
+  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
+  public static final String ER_NODE_NON_NULL = "ER_NODE_NON_NULL";
+  public static final String ER_COULD_NOT_RESOLVE_NODE = "ER_COULD_NOT_RESOLVE_NODE";
+  public static final String ER_STARTPARSE_WHILE_PARSING = "ER_STARTPARSE_WHILE_PARSING";
+  public static final String ER_STARTPARSE_NEEDS_SAXPARSER = "ER_STARTPARSE_NEEDS_SAXPARSER";
+  public static final String ER_COULD_NOT_INIT_PARSER = "ER_COULD_NOT_INIT_PARSER";
+  public static final String ER_EXCEPTION_CREATING_POOL = "ER_EXCEPTION_CREATING_POOL";
+  public static final String ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE = "ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE";
+  public static final String ER_SCHEME_REQUIRED = "ER_SCHEME_REQUIRED";
+  public static final String ER_NO_SCHEME_IN_URI = "ER_NO_SCHEME_IN_URI";
+  public static final String ER_NO_SCHEME_INURI = "ER_NO_SCHEME_INURI";
+  public static final String ER_PATH_INVALID_CHAR = "ER_PATH_INVALID_CHAR";
+  public static final String ER_SCHEME_FROM_NULL_STRING = "ER_SCHEME_FROM_NULL_STRING";
+  public static final String ER_SCHEME_NOT_CONFORMANT = "ER_SCHEME_NOT_CONFORMANT";
+  public static final String ER_HOST_ADDRESS_NOT_WELLFORMED = "ER_HOST_ADDRESS_NOT_WELLFORMED";
+  public static final String ER_PORT_WHEN_HOST_NULL = "ER_PORT_WHEN_HOST_NULL";
+  public static final String ER_INVALID_PORT = "ER_INVALID_PORT";
+  public static final String ER_FRAG_FOR_GENERIC_URI ="ER_FRAG_FOR_GENERIC_URI";
+  public static final String ER_FRAG_WHEN_PATH_NULL = "ER_FRAG_WHEN_PATH_NULL";
+  public static final String ER_FRAG_INVALID_CHAR = "ER_FRAG_INVALID_CHAR";
+  public static final String ER_PARSER_IN_USE = "ER_PARSER_IN_USE";
+  public static final String ER_CANNOT_CHANGE_WHILE_PARSING = "ER_CANNOT_CHANGE_WHILE_PARSING";
+  public static final String ER_SELF_CAUSATION_NOT_PERMITTED = "ER_SELF_CAUSATION_NOT_PERMITTED";
+  public static final String ER_NO_USERINFO_IF_NO_HOST = "ER_NO_USERINFO_IF_NO_HOST";
+  public static final String ER_NO_PORT_IF_NO_HOST = "ER_NO_PORT_IF_NO_HOST";
+  public static final String ER_NO_QUERY_STRING_IN_PATH = "ER_NO_QUERY_STRING_IN_PATH";
+  public static final String ER_NO_FRAGMENT_STRING_IN_PATH = "ER_NO_FRAGMENT_STRING_IN_PATH";
+  public static final String ER_CANNOT_INIT_URI_EMPTY_PARMS = "ER_CANNOT_INIT_URI_EMPTY_PARMS";
+  public static final String ER_METHOD_NOT_SUPPORTED ="ER_METHOD_NOT_SUPPORTED";
+  public static final String ER_INCRSAXSRCFILTER_NOT_RESTARTABLE = "ER_INCRSAXSRCFILTER_NOT_RESTARTABLE";
+  public static final String ER_XMLRDR_NOT_BEFORE_STARTPARSE = "ER_XMLRDR_NOT_BEFORE_STARTPARSE";
+  public static final String ER_AXIS_TRAVERSER_NOT_SUPPORTED = "ER_AXIS_TRAVERSER_NOT_SUPPORTED";
+  public static final String ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER = "ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER";
+  public static final String ER_SYSTEMID_UNKNOWN = "ER_SYSTEMID_UNKNOWN";
+  public static final String ER_LOCATION_UNKNOWN = "ER_LOCATION_UNKNOWN";
+  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
+  public static final String ER_CREATEDOCUMENT_NOT_SUPPORTED = "ER_CREATEDOCUMENT_NOT_SUPPORTED";
+  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT";
+  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT";
+  public static final String ER_CANT_OUTPUT_TEXT_BEFORE_DOC = "ER_CANT_OUTPUT_TEXT_BEFORE_DOC";
+  public static final String ER_CANT_HAVE_MORE_THAN_ONE_ROOT = "ER_CANT_HAVE_MORE_THAN_ONE_ROOT";
+  public static final String ER_ARG_LOCALNAME_NULL = "ER_ARG_LOCALNAME_NULL";
+  public static final String ER_ARG_LOCALNAME_INVALID = "ER_ARG_LOCALNAME_INVALID";
+  public static final String ER_ARG_PREFIX_INVALID = "ER_ARG_PREFIX_INVALID";
+  public static final String ER_NAME_CANT_START_WITH_COLON = "ER_NAME_CANT_START_WITH_COLON";
+
+  /*
+   * Now fill in the message text.
+   * Then fill in the message text for that message code in the
+   * array. Use the new error code as the index into the array.
+   */
+
+  // Error messages...
+
+  /**
+   * Get the lookup table for error messages
+   *
+   * @return The association list.
+   */
+  public Object[][] getContents()
+  {
+    return new Object[][] {
+
+  /** Error message ID that has a null message, but takes in a single object.    */
+    {"ER0000" , "{0}" },
+
+    { ER_FUNCTION_NOT_SUPPORTED,
+      "Funkcija ni podprta!"},
+
+    { ER_CANNOT_OVERWRITE_CAUSE,
+      "Vzroka ni mogo\u010de prepisati"},
+
+    { ER_NO_DEFAULT_IMPL,
+      "Privzete implementacije ni mogo\u010de najti "},
+
+    { ER_CHUNKEDINTARRAY_NOT_SUPPORTED,
+      "ChunkedIntArray({0}) trenutno ni podprt"},
+
+    { ER_OFFSET_BIGGER_THAN_SLOT,
+      "Odmik ve\u010dji od re\u017ee"},
+
+    { ER_COROUTINE_NOT_AVAIL,
+      "Sorutina ni na voljo, id={0}"},
+
+    { ER_COROUTINE_CO_EXIT,
+      "CoroutineManager je prejel zahtevo co_exit()"},
+
+    { ER_COJOINROUTINESET_FAILED,
+      "co_joinCoroutineSet() je spodletela"},
+
+    { ER_COROUTINE_PARAM,
+      "Napaka parametra sorutine ({0})"},
+
+    { ER_PARSER_DOTERMINATE_ANSWERS,
+      "\nNEPRI\u010cAKOVANO: Odgovor raz\u010dlenjevalnika doTerminate je {0}"},
+
+    { ER_NO_PARSE_CALL_WHILE_PARSING,
+      "med raz\u010dlenjevanjem klic raz\u010dlenitve ni mo\u017een"},
+
+    { ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED,
+      "Napaka: dolo\u010den iterator za os {0} ni implementiran"},
+
+    { ER_ITERATOR_AXIS_NOT_IMPLEMENTED,
+      "Napaka: iterator za os {0} ni implementiran "},
+
+    { ER_ITERATOR_CLONE_NOT_SUPPORTED,
+      "Klon iteratorja ni podprt"},
+
+    { ER_UNKNOWN_AXIS_TYPE,
+      "Neznan pre\u010dni tip osi: {0}"},
+
+    { ER_AXIS_NOT_SUPPORTED,
+      "Pre\u010dnik osi ni podprt: {0}"},
+
+    { ER_NO_DTMIDS_AVAIL,
+      "Na voljo ni ve\u010d DTM ID-jev"},
+
+    { ER_NOT_SUPPORTED,
+      "Ni podprto: {0}"},
+
+    { ER_NODE_NON_NULL,
+      "Vozli\u0161\u010de ne sme biti NULL za getDTMHandleFromNode"},
+
+    { ER_COULD_NOT_RESOLVE_NODE,
+      "Ne morem razre\u0161iti vozli\u0161\u010da v obravnavo"},
+
+    { ER_STARTPARSE_WHILE_PARSING,
+       "Med raz\u010dlenjevanjem klic startParse ni mogo\u010d"},
+
+    { ER_STARTPARSE_NEEDS_SAXPARSER,
+       "startParse potrebuje ne-NULL SAXParser"},
+
+    { ER_COULD_NOT_INIT_PARSER,
+       "parserja ni mogo\u010de inicializirati z"},
+
+    { ER_EXCEPTION_CREATING_POOL,
+       "izjema pri ustvarjanju novega primerka za zalogo"},
+
+    { ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
+       "Pot vsebuje neveljavno zaporedje za izhod"},
+
+    { ER_SCHEME_REQUIRED,
+       "Zahtevana je shema!"},
+
+    { ER_NO_SCHEME_IN_URI,
+       "Ne najdem sheme v URI: {0}"},
+
+    { ER_NO_SCHEME_INURI,
+       "Ne najdem sheme v URI"},
+
+    { ER_PATH_INVALID_CHAR,
+       "Pot vsebuje neveljaven znak: {0}"},
+
+    { ER_SCHEME_FROM_NULL_STRING,
+       "Ne morem nastaviti sheme iz niza NULL"},
+
+    { ER_SCHEME_NOT_CONFORMANT,
+       "Shema ni skladna."},
+
+    { ER_HOST_ADDRESS_NOT_WELLFORMED,
+       "Naslov gostitelja ni pravilno oblikovan"},
+
+    { ER_PORT_WHEN_HOST_NULL,
+       "Ko je gostitelj NULL, nastavitev vrat ni mogo\u010da"},
+
+    { ER_INVALID_PORT,
+       "Neveljavna \u0161tevilka vrat"},
+
+    { ER_FRAG_FOR_GENERIC_URI,
+       "Fragment je lahko nastavljen samo za splo\u0161ni URI"},
+
+    { ER_FRAG_WHEN_PATH_NULL,
+       "Ko je pot NULL, nastavitev fragmenta ni mogo\u010da"},
+
+    { ER_FRAG_INVALID_CHAR,
+       "Fragment vsebuje neveljaven znak"},
+
+    { ER_PARSER_IN_USE,
+      "Raz\u010dlenjevalnik je \u017ee v uporabi"},
+
+    { ER_CANNOT_CHANGE_WHILE_PARSING,
+      "Med raz\u010dlenjevanjem ni mogo\u010de spremeniti {0} {1}"},
+
+    { ER_SELF_CAUSATION_NOT_PERMITTED,
+      "Samopovzro\u010ditev ni dovoljena"},
+
+    { ER_NO_USERINFO_IF_NO_HOST,
+      "Informacije o uporabniku ne morejo biti navedene, \u010de ni naveden gostitelj"},
+
+    { ER_NO_PORT_IF_NO_HOST,
+      "Vrata ne morejo biti navedena, \u010de ni naveden gostitelj"},
+
+    { ER_NO_QUERY_STRING_IN_PATH,
+      "Poizvedbeni niz ne more biti naveden v nizu poti in poizvedbenem nizu"},
+
+    { ER_NO_FRAGMENT_STRING_IN_PATH,
+      "Fragment ne more biti hkrati naveden v poti in v fragmentu"},
+
+    { ER_CANNOT_INIT_URI_EMPTY_PARMS,
+      "Ne morem inicializirat URI-ja s praznimi parametri"},
+
+    { ER_METHOD_NOT_SUPPORTED,
+      "Metoda ni ve\u010d podprta "},
+
+    { ER_INCRSAXSRCFILTER_NOT_RESTARTABLE,
+      "IncrementalSAXSource_Filter v tem trenutku ni mogo\u010de ponovno zagnati"},
+
+    { ER_XMLRDR_NOT_BEFORE_STARTPARSE,
+      "XMLReader ne pred zahtevo za startParse"},
+
+    { ER_AXIS_TRAVERSER_NOT_SUPPORTED,
+      "Pre\u010dnik osi ni podprt: {0}"},
+
+    { ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER,
+      "ListingErrorHandler ustvarjen s PrintWriter NULL!"},
+
+    { ER_SYSTEMID_UNKNOWN,
+      "Neznan sistemski ID"},
+
+    { ER_LOCATION_UNKNOWN,
+      "Mesto napake neznano"},
+
+    { ER_PREFIX_MUST_RESOLVE,
+      "Predpona se mora razre\u0161iti v imenski prostor: {0}"},
+
+    { ER_CREATEDOCUMENT_NOT_SUPPORTED,
+      "createDocument() ni podprt v XPathContext!"},
+
+    { ER_CHILD_HAS_NO_OWNER_DOCUMENT,
+      "Podrejeni predmet atributa nima lastni\u0161kega dokumenta!"},
+
+    { ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT,
+      "Podrejeni predmet atributa nima elementa lastni\u0161kega dokumenta!"},
+
+    { ER_CANT_OUTPUT_TEXT_BEFORE_DOC,
+      "Opozorilo: besedila ne morem prikazati pred elementom dokumenta!  Ignoriram..."},
+
+    { ER_CANT_HAVE_MORE_THAN_ONE_ROOT,
+      "Na DOM-u ne more biti ve\u010d kot en koren!"},
+
+    { ER_ARG_LOCALNAME_NULL,
+       "Argument 'lokalno ime' je NULL"},
+
+    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
+    // The localname is the portion after the optional colon; the message indicates
+    // that there is a problem with that part of the QNAME.
+    { ER_ARG_LOCALNAME_INVALID,
+       "Lokalno ime v QNAME bi moralo biti veljavno NCIme"},
+
+    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
+    // The prefix is the portion before the optional colon; the message indicates
+    // that there is a problem with that part of the QNAME.
+    { ER_ARG_PREFIX_INVALID,
+       "Predpona v QNAME bi morala biti valjavno NCIme"},
+
+    { ER_NAME_CANT_START_WITH_COLON,
+      "Ime se ne more za\u010deti z dvopi\u010djem"},
+
+    { "BAD_CODE", "Parameter za ustvariSporo\u010dilo presega meje"},
+    { "FORMAT_FAILED", "Med klicem messageFormat naletel na izjemo"},
+    { "line", "Vrstica #"},
+    { "column","Stolpec #"}
+
+
+  };
+  }
+
+  /**
+   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
+   *   of ResourceBundle.getBundle().
+   *
+   *   @param className the name of the class that implements the resource bundle.
+   *   @return the ResourceBundle
+   *   @throws MissingResourceException
+   */
+  public static final XMLErrorResources loadResourceBundle(String className)
+          throws MissingResourceException
+  {
+
+    Locale locale = Locale.getDefault();
+    String suffix = getResourceSuffix(locale);
+
+    try
+    {
+
+      // first try with the given locale
+      return (XMLErrorResources) ResourceBundle.getBundle(className
+              + suffix, locale);
+    }
+    catch (MissingResourceException e)
+    {
+      try  // try to fall back to en_US if we can't load
+      {
+
+        // Since we can't find the localized property file,
+        // fall back to en_US.
+        return (XMLErrorResources) ResourceBundle.getBundle(className,
+                new Locale("sl", "SL"));
+      }
+      catch (MissingResourceException e2)
+      {
+
+        // Now we are really in trouble.
+        // very bad, definitely very bad...not going to get very far
+        throw new MissingResourceException(
+          "Could not load any resource bundles.", className, "");
+      }
+    }
+  }
+
+  /**
+   * Return the resource file suffic for the indicated locale
+   * For most locales, this will be based the language code.  However
+   * for Chinese, we do distinguish between Taiwan and PRC
+   *
+   * @param locale the locale
+   * @return an String suffix which canbe appended to a resource name
+   */
+  private static final String getResourceSuffix(Locale locale)
+  {
+
+    String suffix = "_" + locale.getLanguage();
+    String country = locale.getCountry();
+
+    if (country.equals("TW"))
+      suffix += "_" + country;
+
+    return suffix;
+  }
+
+}
diff --git a/src/org/apache/xml/res/XMLErrorResources_zh.java b/src/org/apache/xml/res/XMLErrorResources_zh.java
old mode 100755
new mode 100644
index 8ce724e..a24012e
--- a/src/org/apache/xml/res/XMLErrorResources_zh.java
+++ b/src/org/apache/xml/res/XMLErrorResources_zh.java
@@ -1,430 +1,430 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: XMLErrorResources_zh.java 338081 2004-12-15 17:35:58Z jycli $
- */
-package org.apache.xml.res;
-
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Set up error messages.
- * We build a two dimensional array of message keys and
- * message strings. In order to add a new message here,
- * you need to first add a String constant. And you need
- * to enter key, value pair as part of the contents
- * array. You also need to update MAX_CODE for error strings
- * and MAX_WARNING for warnings ( Needed for only information
- * purpose )
- */
-public class XMLErrorResources_zh extends ListResourceBundle
-{
-
-/*
- * This file contains error and warning messages related to Xalan Error
- * Handling.
- *
- *  General notes to translators:
- *
- *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
- *     components.
- *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *     XSLTC is an acronym for XSLT Compiler.
- *
- *  2) A stylesheet is a description of how to transform an input XML document
- *     into a resultant XML document (or HTML document or text).  The
- *     stylesheet itself is described in the form of an XML document.
- *
- *  3) A template is a component of a stylesheet that is used to match a
- *     particular portion of an input document and specifies the form of the
- *     corresponding portion of the output document.
- *
- *  4) An element is a mark-up tag in an XML document; an attribute is a
- *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *     "elem" is an element name, "attr" and "attr2" are attribute names with
- *     the values "val" and "val2", respectively.
- *
- *  5) A namespace declaration is a special attribute that is used to associate
- *     a prefix with a URI (the namespace).  The meanings of element names and
- *     attribute names that use that prefix are defined with respect to that
- *     namespace.
- *
- *  6) "Translet" is an invented term that describes the class file that
- *     results from compiling an XML stylesheet into a Java class.
- *
- *  7) XPath is a specification that describes a notation for identifying
- *     nodes in a tree-structured representation of an XML document.  An
- *     instance of that notation is referred to as an XPath expression.
- *
- */
-
-  /*
-   * Message keys
-   */
-  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
-  public static final String ER_CANNOT_OVERWRITE_CAUSE = "ER_CANNOT_OVERWRITE_CAUSE";
-  public static final String ER_NO_DEFAULT_IMPL = "ER_NO_DEFAULT_IMPL";
-  public static final String ER_CHUNKEDINTARRAY_NOT_SUPPORTED = "ER_CHUNKEDINTARRAY_NOT_SUPPORTED";
-  public static final String ER_OFFSET_BIGGER_THAN_SLOT = "ER_OFFSET_BIGGER_THAN_SLOT";
-  public static final String ER_COROUTINE_NOT_AVAIL = "ER_COROUTINE_NOT_AVAIL";
-  public static final String ER_COROUTINE_CO_EXIT = "ER_COROUTINE_CO_EXIT";
-  public static final String ER_COJOINROUTINESET_FAILED = "ER_COJOINROUTINESET_FAILED";
-  public static final String ER_COROUTINE_PARAM = "ER_COROUTINE_PARAM";
-  public static final String ER_PARSER_DOTERMINATE_ANSWERS = "ER_PARSER_DOTERMINATE_ANSWERS";
-  public static final String ER_NO_PARSE_CALL_WHILE_PARSING = "ER_NO_PARSE_CALL_WHILE_PARSING";
-  public static final String ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED";
-  public static final String ER_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_ITERATOR_AXIS_NOT_IMPLEMENTED";
-  public static final String ER_ITERATOR_CLONE_NOT_SUPPORTED = "ER_ITERATOR_CLONE_NOT_SUPPORTED";
-  public static final String ER_UNKNOWN_AXIS_TYPE = "ER_UNKNOWN_AXIS_TYPE";
-  public static final String ER_AXIS_NOT_SUPPORTED = "ER_AXIS_NOT_SUPPORTED";
-  public static final String ER_NO_DTMIDS_AVAIL = "ER_NO_DTMIDS_AVAIL";
-  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
-  public static final String ER_NODE_NON_NULL = "ER_NODE_NON_NULL";
-  public static final String ER_COULD_NOT_RESOLVE_NODE = "ER_COULD_NOT_RESOLVE_NODE";
-  public static final String ER_STARTPARSE_WHILE_PARSING = "ER_STARTPARSE_WHILE_PARSING";
-  public static final String ER_STARTPARSE_NEEDS_SAXPARSER = "ER_STARTPARSE_NEEDS_SAXPARSER";
-  public static final String ER_COULD_NOT_INIT_PARSER = "ER_COULD_NOT_INIT_PARSER";
-  public static final String ER_EXCEPTION_CREATING_POOL = "ER_EXCEPTION_CREATING_POOL";
-  public static final String ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE = "ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE";
-  public static final String ER_SCHEME_REQUIRED = "ER_SCHEME_REQUIRED";
-  public static final String ER_NO_SCHEME_IN_URI = "ER_NO_SCHEME_IN_URI";
-  public static final String ER_NO_SCHEME_INURI = "ER_NO_SCHEME_INURI";
-  public static final String ER_PATH_INVALID_CHAR = "ER_PATH_INVALID_CHAR";
-  public static final String ER_SCHEME_FROM_NULL_STRING = "ER_SCHEME_FROM_NULL_STRING";
-  public static final String ER_SCHEME_NOT_CONFORMANT = "ER_SCHEME_NOT_CONFORMANT";
-  public static final String ER_HOST_ADDRESS_NOT_WELLFORMED = "ER_HOST_ADDRESS_NOT_WELLFORMED";
-  public static final String ER_PORT_WHEN_HOST_NULL = "ER_PORT_WHEN_HOST_NULL";
-  public static final String ER_INVALID_PORT = "ER_INVALID_PORT";
-  public static final String ER_FRAG_FOR_GENERIC_URI ="ER_FRAG_FOR_GENERIC_URI";
-  public static final String ER_FRAG_WHEN_PATH_NULL = "ER_FRAG_WHEN_PATH_NULL";
-  public static final String ER_FRAG_INVALID_CHAR = "ER_FRAG_INVALID_CHAR";
-  public static final String ER_PARSER_IN_USE = "ER_PARSER_IN_USE";
-  public static final String ER_CANNOT_CHANGE_WHILE_PARSING = "ER_CANNOT_CHANGE_WHILE_PARSING";
-  public static final String ER_SELF_CAUSATION_NOT_PERMITTED = "ER_SELF_CAUSATION_NOT_PERMITTED";
-  public static final String ER_NO_USERINFO_IF_NO_HOST = "ER_NO_USERINFO_IF_NO_HOST";
-  public static final String ER_NO_PORT_IF_NO_HOST = "ER_NO_PORT_IF_NO_HOST";
-  public static final String ER_NO_QUERY_STRING_IN_PATH = "ER_NO_QUERY_STRING_IN_PATH";
-  public static final String ER_NO_FRAGMENT_STRING_IN_PATH = "ER_NO_FRAGMENT_STRING_IN_PATH";
-  public static final String ER_CANNOT_INIT_URI_EMPTY_PARMS = "ER_CANNOT_INIT_URI_EMPTY_PARMS";
-  public static final String ER_METHOD_NOT_SUPPORTED ="ER_METHOD_NOT_SUPPORTED";
-  public static final String ER_INCRSAXSRCFILTER_NOT_RESTARTABLE = "ER_INCRSAXSRCFILTER_NOT_RESTARTABLE";
-  public static final String ER_XMLRDR_NOT_BEFORE_STARTPARSE = "ER_XMLRDR_NOT_BEFORE_STARTPARSE";
-  public static final String ER_AXIS_TRAVERSER_NOT_SUPPORTED = "ER_AXIS_TRAVERSER_NOT_SUPPORTED";
-  public static final String ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER = "ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER";
-  public static final String ER_SYSTEMID_UNKNOWN = "ER_SYSTEMID_UNKNOWN";
-  public static final String ER_LOCATION_UNKNOWN = "ER_LOCATION_UNKNOWN";
-  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
-  public static final String ER_CREATEDOCUMENT_NOT_SUPPORTED = "ER_CREATEDOCUMENT_NOT_SUPPORTED";
-  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT";
-  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT";
-  public static final String ER_CANT_OUTPUT_TEXT_BEFORE_DOC = "ER_CANT_OUTPUT_TEXT_BEFORE_DOC";
-  public static final String ER_CANT_HAVE_MORE_THAN_ONE_ROOT = "ER_CANT_HAVE_MORE_THAN_ONE_ROOT";
-  public static final String ER_ARG_LOCALNAME_NULL = "ER_ARG_LOCALNAME_NULL";
-  public static final String ER_ARG_LOCALNAME_INVALID = "ER_ARG_LOCALNAME_INVALID";
-  public static final String ER_ARG_PREFIX_INVALID = "ER_ARG_PREFIX_INVALID";
-  public static final String ER_NAME_CANT_START_WITH_COLON = "ER_NAME_CANT_START_WITH_COLON";
-
-  /*
-   * Now fill in the message text.
-   * Then fill in the message text for that message code in the
-   * array. Use the new error code as the index into the array.
-   */
-
-  // Error messages...
-
-  /**
-   * Get the lookup table for error messages
-   *
-   * @return The association list.
-   */
-  public Object[][] getContents()
-  {
-    return new Object[][] {
-
-  /** Error message ID that has a null message, but takes in a single object.    */
-    {"ER0000" , "{0}" },
-
-    { ER_FUNCTION_NOT_SUPPORTED,
-      "\u51fd\u6570\u4e0d\u53d7\u652f\u6301\uff01"},
-
-    { ER_CANNOT_OVERWRITE_CAUSE,
-      "\u65e0\u6cd5\u8986\u76d6\u539f\u56e0"},
-
-    { ER_NO_DEFAULT_IMPL,
-      "\u627e\u4e0d\u5230\u7f3a\u7701\u5b9e\u73b0"},
-
-    { ER_CHUNKEDINTARRAY_NOT_SUPPORTED,
-      "\u5f53\u524d\u4e0d\u652f\u6301 ChunkedIntArray({0})"},
-
-    { ER_OFFSET_BIGGER_THAN_SLOT,
-      "\u504f\u79fb\u5927\u4e8e\u69fd"},
-
-    { ER_COROUTINE_NOT_AVAIL,
-      "\u534f\u540c\u7a0b\u5e8f\u4e0d\u53ef\u7528\uff0cid={0}"},
-
-    { ER_COROUTINE_CO_EXIT,
-      "CoroutineManager \u63a5\u6536\u5230 co_exit() \u8bf7\u6c42"},
-
-    { ER_COJOINROUTINESET_FAILED,
-      "co_joinCoroutineSet() \u5931\u8d25"},
-
-    { ER_COROUTINE_PARAM,
-      "\u534f\u540c\u7a0b\u5e8f\u53c2\u6570\u9519\u8bef\uff08{0}\uff09"},
-
-    { ER_PARSER_DOTERMINATE_ANSWERS,
-      "\n\u610f\u5916\uff1a\u89e3\u6790\u5668 doTerminate \u5e94\u7b54 {0}"},
-
-    { ER_NO_PARSE_CALL_WHILE_PARSING,
-      "\u89e3\u6790\u65f6\u53ef\u80fd\u6ca1\u6709\u8c03\u7528 parse"},
-
-    { ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED,
-      "\u9519\u8bef\uff1a\u6ca1\u6709\u5b9e\u73b0\u4e3a\u8f74 {0} \u8f93\u5165\u7684\u8fed\u4ee3\u5668"},
-
-    { ER_ITERATOR_AXIS_NOT_IMPLEMENTED,
-      "\u9519\u8bef\uff1a\u6ca1\u6709\u5b9e\u73b0\u8f74 {0} \u7684\u8fed\u4ee3\u5668"},
-
-    { ER_ITERATOR_CLONE_NOT_SUPPORTED,
-      "\u4e0d\u652f\u6301\u8fed\u4ee3\u5668\u514b\u9686"},
-
-    { ER_UNKNOWN_AXIS_TYPE,
-      "\u672a\u77e5\u7684\u8f74\u904d\u5386\u7c7b\u578b\uff1a{0}"},
-
-    { ER_AXIS_NOT_SUPPORTED,
-      "\u4e0d\u652f\u6301\u8f74\u904d\u5386\u7a0b\u5e8f\uff1a{0}"},
-
-    { ER_NO_DTMIDS_AVAIL,
-      "\u65e0\u66f4\u591a\u7684 DTM \u6807\u8bc6\u53ef\u7528"},
-
-    { ER_NOT_SUPPORTED,
-      "\u4e0d\u652f\u6301\uff1a{0}"},
-
-    { ER_NODE_NON_NULL,
-      "\u5bf9\u4e8e getDTMHandleFromNode\uff0c\u8282\u70b9\u5fc5\u987b\u662f\u975e\u7a7a\u7684"},
-
-    { ER_COULD_NOT_RESOLVE_NODE,
-      "\u65e0\u6cd5\u5c06\u8282\u70b9\u89e3\u6790\u5230\u53e5\u67c4"},
-
-    { ER_STARTPARSE_WHILE_PARSING,
-       "\u89e3\u6790\u65f6\u53ef\u80fd\u6ca1\u6709\u8c03\u7528 startParse"},
-
-    { ER_STARTPARSE_NEEDS_SAXPARSER,
-       "startParse \u9700\u8981\u975e\u7a7a\u7684 SAXParser"},
-
-    { ER_COULD_NOT_INIT_PARSER,
-       "\u65e0\u6cd5\u7528\u4ee5\u4e0b\u5de5\u5177\u521d\u59cb\u5316\u89e3\u6790\u5668"},
-
-    { ER_EXCEPTION_CREATING_POOL,
-       "\u4e3a\u6c60\u521b\u5efa\u65b0\u5b9e\u4f8b\u65f6\u53d1\u751f\u5f02\u5e38"},
-
-    { ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
-       "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u8f6c\u4e49\u5e8f\u5217"},
-
-    { ER_SCHEME_REQUIRED,
-       "\u6a21\u5f0f\u662f\u5fc5\u9700\u7684\uff01"},
-
-    { ER_NO_SCHEME_IN_URI,
-       "URI {0} \u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u6a21\u5f0f"},
-
-    { ER_NO_SCHEME_INURI,
-       "URI \u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u6a21\u5f0f"},
-
-    { ER_PATH_INVALID_CHAR,
-       "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26\uff1a{0}"},
-
-    { ER_SCHEME_FROM_NULL_STRING,
-       "\u65e0\u6cd5\u4ece\u7a7a\u5b57\u7b26\u4e32\u8bbe\u7f6e\u6a21\u5f0f"},
-
-    { ER_SCHEME_NOT_CONFORMANT,
-       "\u6a21\u5f0f\u4e0d\u4e00\u81f4\u3002"},
-
-    { ER_HOST_ADDRESS_NOT_WELLFORMED,
-       "\u4e3b\u673a\u4e0d\u662f\u683c\u5f0f\u6b63\u786e\u7684\u5730\u5740"},
-
-    { ER_PORT_WHEN_HOST_NULL,
-       "\u4e3b\u673a\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7aef\u53e3"},
-
-    { ER_INVALID_PORT,
-       "\u7aef\u53e3\u53f7\u65e0\u6548"},
-
-    { ER_FRAG_FOR_GENERIC_URI,
-       "\u53ea\u80fd\u4e3a\u7c7b\u5c5e URI \u8bbe\u7f6e\u7247\u6bb5"},
-
-    { ER_FRAG_WHEN_PATH_NULL,
-       "\u8def\u5f84\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7247\u6bb5"},
-
-    { ER_FRAG_INVALID_CHAR,
-       "\u7247\u6bb5\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26"},
-
-    { ER_PARSER_IN_USE,
-      "\u89e3\u6790\u5668\u5df2\u5728\u4f7f\u7528"},
-
-    { ER_CANNOT_CHANGE_WHILE_PARSING,
-      "\u89e3\u6790\u65f6\u65e0\u6cd5\u66f4\u6539 {0} {1}"},
-
-    { ER_SELF_CAUSATION_NOT_PERMITTED,
-      "\u4e0d\u5141\u8bb8\u81ea\u89e6\u53d1"},
-
-    { ER_NO_USERINFO_IF_NO_HOST,
-      "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7528\u6237\u4fe1\u606f"},
-
-    { ER_NO_PORT_IF_NO_HOST,
-      "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7aef\u53e3"},
-
-    { ER_NO_QUERY_STRING_IN_PATH,
-      "\u8def\u5f84\u548c\u67e5\u8be2\u5b57\u7b26\u4e32\u4e2d\u4e0d\u80fd\u6307\u5b9a\u67e5\u8be2\u5b57\u7b26\u4e32"},
-
-    { ER_NO_FRAGMENT_STRING_IN_PATH,
-      "\u8def\u5f84\u548c\u7247\u6bb5\u4e2d\u90fd\u4e0d\u80fd\u6307\u5b9a\u7247\u6bb5"},
-
-    { ER_CANNOT_INIT_URI_EMPTY_PARMS,
-      "\u4e0d\u80fd\u4ee5\u7a7a\u53c2\u6570\u521d\u59cb\u5316 URI"},
-
-    { ER_METHOD_NOT_SUPPORTED,
-      "\u5c1a\u4e0d\u652f\u6301\u65b9\u6cd5"},
-
-    { ER_INCRSAXSRCFILTER_NOT_RESTARTABLE,
-      "\u5f53\u524d\u4e0d\u53ef\u91cd\u65b0\u542f\u52a8 IncrementalSAXSource_Filter"},
-
-    { ER_XMLRDR_NOT_BEFORE_STARTPARSE,
-      "XMLReader \u4e0d\u5728 startParse \u8bf7\u6c42\u4e4b\u524d"},
-
-    { ER_AXIS_TRAVERSER_NOT_SUPPORTED,
-      "\u4e0d\u652f\u6301\u8f74\u904d\u5386\u7a0b\u5e8f\uff1a{0}"},
-
-    { ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER,
-      "\u4ee5\u7a7a\u7684 PrintWriter \u521b\u5efa\u4e86 ListingErrorHandler\uff01"},
-
-    { ER_SYSTEMID_UNKNOWN,
-      "SystemId \u672a\u77e5"},
-
-    { ER_LOCATION_UNKNOWN,
-      "\u9519\u8bef\u4f4d\u7f6e\u672a\u77e5"},
-
-    { ER_PREFIX_MUST_RESOLVE,
-      "\u524d\u7f00\u5fc5\u987b\u89e3\u6790\u4e3a\u540d\u79f0\u7a7a\u95f4\uff1a{0}"},
-
-    { ER_CREATEDOCUMENT_NOT_SUPPORTED,
-      "XPathContext \u4e2d\u4e0d\u652f\u6301 createDocument()\uff01"},
-
-    { ER_CHILD_HAS_NO_OWNER_DOCUMENT,
-      "\u5b50\u5c5e\u6027\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
-
-    { ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT,
-      "\u5b50\u5c5e\u6027\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\u5143\u7d20\uff01"},
-
-    { ER_CANT_OUTPUT_TEXT_BEFORE_DOC,
-      "\u8b66\u544a\uff1a\u65e0\u6cd5\u5728\u8bb0\u5f55\u5143\u7d20\u524d\u8f93\u51fa\u6587\u672c\uff01\u5ffd\u7565..."},
-
-    { ER_CANT_HAVE_MORE_THAN_ONE_ROOT,
-      "DOM \u4e0a\u4e0d\u80fd\u6709\u591a\u4e2a\u6839\uff01"},
-
-    { ER_ARG_LOCALNAME_NULL,
-       "\u81ea\u53d8\u91cf\u201clocalName\u201d\u4e3a\u7a7a"},
-
-    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
-    // The localname is the portion after the optional colon; the message indicates
-    // that there is a problem with that part of the QNAME.
-    { ER_ARG_LOCALNAME_INVALID,
-       "QNAME \u4e2d\u7684\u672c\u5730\u540d\u5e94\u5f53\u662f\u6709\u6548\u7684 NCName"},
-
-    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
-    // The prefix is the portion before the optional colon; the message indicates
-    // that there is a problem with that part of the QNAME.
-    { ER_ARG_PREFIX_INVALID,
-       "QNAME \u4e2d\u7684\u524d\u7f00\u5e94\u5f53\u662f\u6709\u6548\u7684 NCName"},
-
-    { ER_NAME_CANT_START_WITH_COLON,
-      "\u540d\u79f0\u4e0d\u80fd\u4ee5\u5192\u53f7\u5f00\u5934"},
-
-    { "BAD_CODE", "createMessage \u7684\u53c2\u6570\u8d85\u51fa\u8303\u56f4"},
-    { "FORMAT_FAILED", "\u5728 messageFormat \u8c03\u7528\u8fc7\u7a0b\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38"},
-    { "line", "\u884c\u53f7"},
-    { "column","\u5217\u53f7"}
-
-
-  };
-  }
-
-  /**
-   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
-   *   of ResourceBundle.getBundle().
-   *
-   *   @param className the name of the class that implements the resource bundle.
-   *   @return the ResourceBundle
-   *   @throws MissingResourceException
-   */
-  public static final XMLErrorResources loadResourceBundle(String className)
-          throws MissingResourceException
-  {
-
-    Locale locale = Locale.getDefault();
-    String suffix = getResourceSuffix(locale);
-
-    try
-    {
-
-      // first try with the given locale
-      return (XMLErrorResources) ResourceBundle.getBundle(className
-              + suffix, locale);
-    }
-    catch (MissingResourceException e)
-    {
-      try  // try to fall back to en_US if we can't load
-      {
-
-        // Since we can't find the localized property file,
-        // fall back to en_US.
-        return (XMLErrorResources) ResourceBundle.getBundle(className,
-                new Locale("zh", "CN"));
-      }
-      catch (MissingResourceException e2)
-      {
-
-        // Now we are really in trouble.
-        // very bad, definitely very bad...not going to get very far
-        throw new MissingResourceException(
-          "Could not load any resource bundles.", className, "");
-      }
-    }
-  }
-
-  /**
-   * Return the resource file suffic for the indicated locale
-   * For most locales, this will be based the language code.  However
-   * for Chinese, we do distinguish between Taiwan and PRC
-   *
-   * @param locale the locale
-   * @return an String suffix which canbe appended to a resource name
-   */
-  private static final String getResourceSuffix(Locale locale)
-  {
-
-    String suffix = "_" + locale.getLanguage();
-    String country = locale.getCountry();
-
-    if (country.equals("TW"))
-      suffix += "_" + country;
-
-    return suffix;
-  }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+package org.apache.xml.res;
+
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Set up error messages.
+ * We build a two dimensional array of message keys and
+ * message strings. In order to add a new message here,
+ * you need to first add a String constant. And you need
+ * to enter key, value pair as part of the contents
+ * array. You also need to update MAX_CODE for error strings
+ * and MAX_WARNING for warnings ( Needed for only information
+ * purpose )
+ */
+public class XMLErrorResources_zh extends ListResourceBundle
+{
+
+/*
+ * This file contains error and warning messages related to Xalan Error
+ * Handling.
+ *
+ *  General notes to translators:
+ *
+ *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
+ *     components.
+ *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *     XSLTC is an acronym for XSLT Compiler.
+ *
+ *  2) A stylesheet is a description of how to transform an input XML document
+ *     into a resultant XML document (or HTML document or text).  The
+ *     stylesheet itself is described in the form of an XML document.
+ *
+ *  3) A template is a component of a stylesheet that is used to match a
+ *     particular portion of an input document and specifies the form of the
+ *     corresponding portion of the output document.
+ *
+ *  4) An element is a mark-up tag in an XML document; an attribute is a
+ *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *     "elem" is an element name, "attr" and "attr2" are attribute names with
+ *     the values "val" and "val2", respectively.
+ *
+ *  5) A namespace declaration is a special attribute that is used to associate
+ *     a prefix with a URI (the namespace).  The meanings of element names and
+ *     attribute names that use that prefix are defined with respect to that
+ *     namespace.
+ *
+ *  6) "Translet" is an invented term that describes the class file that
+ *     results from compiling an XML stylesheet into a Java class.
+ *
+ *  7) XPath is a specification that describes a notation for identifying
+ *     nodes in a tree-structured representation of an XML document.  An
+ *     instance of that notation is referred to as an XPath expression.
+ *
+ */
+
+  /*
+   * Message keys
+   */
+  public static final String ER_FUNCTION_NOT_SUPPORTED = "ER_FUNCTION_NOT_SUPPORTED";
+  public static final String ER_CANNOT_OVERWRITE_CAUSE = "ER_CANNOT_OVERWRITE_CAUSE";
+  public static final String ER_NO_DEFAULT_IMPL = "ER_NO_DEFAULT_IMPL";
+  public static final String ER_CHUNKEDINTARRAY_NOT_SUPPORTED = "ER_CHUNKEDINTARRAY_NOT_SUPPORTED";
+  public static final String ER_OFFSET_BIGGER_THAN_SLOT = "ER_OFFSET_BIGGER_THAN_SLOT";
+  public static final String ER_COROUTINE_NOT_AVAIL = "ER_COROUTINE_NOT_AVAIL";
+  public static final String ER_COROUTINE_CO_EXIT = "ER_COROUTINE_CO_EXIT";
+  public static final String ER_COJOINROUTINESET_FAILED = "ER_COJOINROUTINESET_FAILED";
+  public static final String ER_COROUTINE_PARAM = "ER_COROUTINE_PARAM";
+  public static final String ER_PARSER_DOTERMINATE_ANSWERS = "ER_PARSER_DOTERMINATE_ANSWERS";
+  public static final String ER_NO_PARSE_CALL_WHILE_PARSING = "ER_NO_PARSE_CALL_WHILE_PARSING";
+  public static final String ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED";
+  public static final String ER_ITERATOR_AXIS_NOT_IMPLEMENTED = "ER_ITERATOR_AXIS_NOT_IMPLEMENTED";
+  public static final String ER_ITERATOR_CLONE_NOT_SUPPORTED = "ER_ITERATOR_CLONE_NOT_SUPPORTED";
+  public static final String ER_UNKNOWN_AXIS_TYPE = "ER_UNKNOWN_AXIS_TYPE";
+  public static final String ER_AXIS_NOT_SUPPORTED = "ER_AXIS_NOT_SUPPORTED";
+  public static final String ER_NO_DTMIDS_AVAIL = "ER_NO_DTMIDS_AVAIL";
+  public static final String ER_NOT_SUPPORTED = "ER_NOT_SUPPORTED";
+  public static final String ER_NODE_NON_NULL = "ER_NODE_NON_NULL";
+  public static final String ER_COULD_NOT_RESOLVE_NODE = "ER_COULD_NOT_RESOLVE_NODE";
+  public static final String ER_STARTPARSE_WHILE_PARSING = "ER_STARTPARSE_WHILE_PARSING";
+  public static final String ER_STARTPARSE_NEEDS_SAXPARSER = "ER_STARTPARSE_NEEDS_SAXPARSER";
+  public static final String ER_COULD_NOT_INIT_PARSER = "ER_COULD_NOT_INIT_PARSER";
+  public static final String ER_EXCEPTION_CREATING_POOL = "ER_EXCEPTION_CREATING_POOL";
+  public static final String ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE = "ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE";
+  public static final String ER_SCHEME_REQUIRED = "ER_SCHEME_REQUIRED";
+  public static final String ER_NO_SCHEME_IN_URI = "ER_NO_SCHEME_IN_URI";
+  public static final String ER_NO_SCHEME_INURI = "ER_NO_SCHEME_INURI";
+  public static final String ER_PATH_INVALID_CHAR = "ER_PATH_INVALID_CHAR";
+  public static final String ER_SCHEME_FROM_NULL_STRING = "ER_SCHEME_FROM_NULL_STRING";
+  public static final String ER_SCHEME_NOT_CONFORMANT = "ER_SCHEME_NOT_CONFORMANT";
+  public static final String ER_HOST_ADDRESS_NOT_WELLFORMED = "ER_HOST_ADDRESS_NOT_WELLFORMED";
+  public static final String ER_PORT_WHEN_HOST_NULL = "ER_PORT_WHEN_HOST_NULL";
+  public static final String ER_INVALID_PORT = "ER_INVALID_PORT";
+  public static final String ER_FRAG_FOR_GENERIC_URI ="ER_FRAG_FOR_GENERIC_URI";
+  public static final String ER_FRAG_WHEN_PATH_NULL = "ER_FRAG_WHEN_PATH_NULL";
+  public static final String ER_FRAG_INVALID_CHAR = "ER_FRAG_INVALID_CHAR";
+  public static final String ER_PARSER_IN_USE = "ER_PARSER_IN_USE";
+  public static final String ER_CANNOT_CHANGE_WHILE_PARSING = "ER_CANNOT_CHANGE_WHILE_PARSING";
+  public static final String ER_SELF_CAUSATION_NOT_PERMITTED = "ER_SELF_CAUSATION_NOT_PERMITTED";
+  public static final String ER_NO_USERINFO_IF_NO_HOST = "ER_NO_USERINFO_IF_NO_HOST";
+  public static final String ER_NO_PORT_IF_NO_HOST = "ER_NO_PORT_IF_NO_HOST";
+  public static final String ER_NO_QUERY_STRING_IN_PATH = "ER_NO_QUERY_STRING_IN_PATH";
+  public static final String ER_NO_FRAGMENT_STRING_IN_PATH = "ER_NO_FRAGMENT_STRING_IN_PATH";
+  public static final String ER_CANNOT_INIT_URI_EMPTY_PARMS = "ER_CANNOT_INIT_URI_EMPTY_PARMS";
+  public static final String ER_METHOD_NOT_SUPPORTED ="ER_METHOD_NOT_SUPPORTED";
+  public static final String ER_INCRSAXSRCFILTER_NOT_RESTARTABLE = "ER_INCRSAXSRCFILTER_NOT_RESTARTABLE";
+  public static final String ER_XMLRDR_NOT_BEFORE_STARTPARSE = "ER_XMLRDR_NOT_BEFORE_STARTPARSE";
+  public static final String ER_AXIS_TRAVERSER_NOT_SUPPORTED = "ER_AXIS_TRAVERSER_NOT_SUPPORTED";
+  public static final String ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER = "ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER";
+  public static final String ER_SYSTEMID_UNKNOWN = "ER_SYSTEMID_UNKNOWN";
+  public static final String ER_LOCATION_UNKNOWN = "ER_LOCATION_UNKNOWN";
+  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
+  public static final String ER_CREATEDOCUMENT_NOT_SUPPORTED = "ER_CREATEDOCUMENT_NOT_SUPPORTED";
+  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT";
+  public static final String ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT = "ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT";
+  public static final String ER_CANT_OUTPUT_TEXT_BEFORE_DOC = "ER_CANT_OUTPUT_TEXT_BEFORE_DOC";
+  public static final String ER_CANT_HAVE_MORE_THAN_ONE_ROOT = "ER_CANT_HAVE_MORE_THAN_ONE_ROOT";
+  public static final String ER_ARG_LOCALNAME_NULL = "ER_ARG_LOCALNAME_NULL";
+  public static final String ER_ARG_LOCALNAME_INVALID = "ER_ARG_LOCALNAME_INVALID";
+  public static final String ER_ARG_PREFIX_INVALID = "ER_ARG_PREFIX_INVALID";
+  public static final String ER_NAME_CANT_START_WITH_COLON = "ER_NAME_CANT_START_WITH_COLON";
+
+  /*
+   * Now fill in the message text.
+   * Then fill in the message text for that message code in the
+   * array. Use the new error code as the index into the array.
+   */
+
+  // Error messages...
+
+  /**
+   * Get the lookup table for error messages
+   *
+   * @return The association list.
+   */
+  public Object[][] getContents()
+  {
+    return new Object[][] {
+
+  /** Error message ID that has a null message, but takes in a single object.    */
+    {"ER0000" , "{0}" },
+
+    { ER_FUNCTION_NOT_SUPPORTED,
+      "\u51fd\u6570\u4e0d\u53d7\u652f\u6301\uff01"},
+
+    { ER_CANNOT_OVERWRITE_CAUSE,
+      "\u65e0\u6cd5\u8986\u76d6\u539f\u56e0"},
+
+    { ER_NO_DEFAULT_IMPL,
+      "\u627e\u4e0d\u5230\u7f3a\u7701\u5b9e\u73b0"},
+
+    { ER_CHUNKEDINTARRAY_NOT_SUPPORTED,
+      "\u5f53\u524d\u4e0d\u652f\u6301 ChunkedIntArray({0})"},
+
+    { ER_OFFSET_BIGGER_THAN_SLOT,
+      "\u504f\u79fb\u5927\u4e8e\u69fd"},
+
+    { ER_COROUTINE_NOT_AVAIL,
+      "\u534f\u540c\u7a0b\u5e8f\u4e0d\u53ef\u7528\uff0cid={0}"},
+
+    { ER_COROUTINE_CO_EXIT,
+      "CoroutineManager \u63a5\u6536\u5230 co_exit() \u8bf7\u6c42"},
+
+    { ER_COJOINROUTINESET_FAILED,
+      "co_joinCoroutineSet() \u5931\u8d25"},
+
+    { ER_COROUTINE_PARAM,
+      "\u534f\u540c\u7a0b\u5e8f\u53c2\u6570\u9519\u8bef\uff08{0}\uff09"},
+
+    { ER_PARSER_DOTERMINATE_ANSWERS,
+      "\n\u610f\u5916\uff1a\u89e3\u6790\u5668 doTerminate \u5e94\u7b54 {0}"},
+
+    { ER_NO_PARSE_CALL_WHILE_PARSING,
+      "\u89e3\u6790\u65f6\u53ef\u80fd\u6ca1\u6709\u8c03\u7528 parse"},
+
+    { ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED,
+      "\u9519\u8bef\uff1a\u6ca1\u6709\u5b9e\u73b0\u4e3a\u8f74 {0} \u8f93\u5165\u7684\u8fed\u4ee3\u5668"},
+
+    { ER_ITERATOR_AXIS_NOT_IMPLEMENTED,
+      "\u9519\u8bef\uff1a\u6ca1\u6709\u5b9e\u73b0\u8f74 {0} \u7684\u8fed\u4ee3\u5668"},
+
+    { ER_ITERATOR_CLONE_NOT_SUPPORTED,
+      "\u4e0d\u652f\u6301\u8fed\u4ee3\u5668\u514b\u9686"},
+
+    { ER_UNKNOWN_AXIS_TYPE,
+      "\u672a\u77e5\u7684\u8f74\u904d\u5386\u7c7b\u578b\uff1a{0}"},
+
+    { ER_AXIS_NOT_SUPPORTED,
+      "\u4e0d\u652f\u6301\u8f74\u904d\u5386\u7a0b\u5e8f\uff1a{0}"},
+
+    { ER_NO_DTMIDS_AVAIL,
+      "\u65e0\u66f4\u591a\u7684 DTM \u6807\u8bc6\u53ef\u7528"},
+
+    { ER_NOT_SUPPORTED,
+      "\u4e0d\u652f\u6301\uff1a{0}"},
+
+    { ER_NODE_NON_NULL,
+      "\u5bf9\u4e8e getDTMHandleFromNode\uff0c\u8282\u70b9\u5fc5\u987b\u662f\u975e\u7a7a\u7684"},
+
+    { ER_COULD_NOT_RESOLVE_NODE,
+      "\u65e0\u6cd5\u5c06\u8282\u70b9\u89e3\u6790\u5230\u53e5\u67c4"},
+
+    { ER_STARTPARSE_WHILE_PARSING,
+       "\u89e3\u6790\u65f6\u53ef\u80fd\u6ca1\u6709\u8c03\u7528 startParse"},
+
+    { ER_STARTPARSE_NEEDS_SAXPARSER,
+       "startParse \u9700\u8981\u975e\u7a7a\u7684 SAXParser"},
+
+    { ER_COULD_NOT_INIT_PARSER,
+       "\u65e0\u6cd5\u7528\u4ee5\u4e0b\u5de5\u5177\u521d\u59cb\u5316\u89e3\u6790\u5668"},
+
+    { ER_EXCEPTION_CREATING_POOL,
+       "\u4e3a\u6c60\u521b\u5efa\u65b0\u5b9e\u4f8b\u65f6\u53d1\u751f\u5f02\u5e38"},
+
+    { ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
+       "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u8f6c\u4e49\u5e8f\u5217"},
+
+    { ER_SCHEME_REQUIRED,
+       "\u6a21\u5f0f\u662f\u5fc5\u9700\u7684\uff01"},
+
+    { ER_NO_SCHEME_IN_URI,
+       "URI {0} \u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u6a21\u5f0f"},
+
+    { ER_NO_SCHEME_INURI,
+       "URI \u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u6a21\u5f0f"},
+
+    { ER_PATH_INVALID_CHAR,
+       "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26\uff1a{0}"},
+
+    { ER_SCHEME_FROM_NULL_STRING,
+       "\u65e0\u6cd5\u4ece\u7a7a\u5b57\u7b26\u4e32\u8bbe\u7f6e\u6a21\u5f0f"},
+
+    { ER_SCHEME_NOT_CONFORMANT,
+       "\u6a21\u5f0f\u4e0d\u4e00\u81f4\u3002"},
+
+    { ER_HOST_ADDRESS_NOT_WELLFORMED,
+       "\u4e3b\u673a\u4e0d\u662f\u683c\u5f0f\u6b63\u786e\u7684\u5730\u5740"},
+
+    { ER_PORT_WHEN_HOST_NULL,
+       "\u4e3b\u673a\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7aef\u53e3"},
+
+    { ER_INVALID_PORT,
+       "\u7aef\u53e3\u53f7\u65e0\u6548"},
+
+    { ER_FRAG_FOR_GENERIC_URI,
+       "\u53ea\u80fd\u4e3a\u7c7b\u5c5e URI \u8bbe\u7f6e\u7247\u6bb5"},
+
+    { ER_FRAG_WHEN_PATH_NULL,
+       "\u8def\u5f84\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7247\u6bb5"},
+
+    { ER_FRAG_INVALID_CHAR,
+       "\u7247\u6bb5\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26"},
+
+    { ER_PARSER_IN_USE,
+      "\u89e3\u6790\u5668\u5df2\u5728\u4f7f\u7528"},
+
+    { ER_CANNOT_CHANGE_WHILE_PARSING,
+      "\u89e3\u6790\u65f6\u65e0\u6cd5\u66f4\u6539 {0} {1}"},
+
+    { ER_SELF_CAUSATION_NOT_PERMITTED,
+      "\u4e0d\u5141\u8bb8\u81ea\u89e6\u53d1"},
+
+    { ER_NO_USERINFO_IF_NO_HOST,
+      "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7528\u6237\u4fe1\u606f"},
+
+    { ER_NO_PORT_IF_NO_HOST,
+      "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7aef\u53e3"},
+
+    { ER_NO_QUERY_STRING_IN_PATH,
+      "\u8def\u5f84\u548c\u67e5\u8be2\u5b57\u7b26\u4e32\u4e2d\u4e0d\u80fd\u6307\u5b9a\u67e5\u8be2\u5b57\u7b26\u4e32"},
+
+    { ER_NO_FRAGMENT_STRING_IN_PATH,
+      "\u8def\u5f84\u548c\u7247\u6bb5\u4e2d\u90fd\u4e0d\u80fd\u6307\u5b9a\u7247\u6bb5"},
+
+    { ER_CANNOT_INIT_URI_EMPTY_PARMS,
+      "\u4e0d\u80fd\u4ee5\u7a7a\u53c2\u6570\u521d\u59cb\u5316 URI"},
+
+    { ER_METHOD_NOT_SUPPORTED,
+      "\u5c1a\u4e0d\u652f\u6301\u65b9\u6cd5"},
+
+    { ER_INCRSAXSRCFILTER_NOT_RESTARTABLE,
+      "\u5f53\u524d\u4e0d\u53ef\u91cd\u65b0\u542f\u52a8 IncrementalSAXSource_Filter"},
+
+    { ER_XMLRDR_NOT_BEFORE_STARTPARSE,
+      "XMLReader \u4e0d\u5728 startParse \u8bf7\u6c42\u4e4b\u524d"},
+
+    { ER_AXIS_TRAVERSER_NOT_SUPPORTED,
+      "\u4e0d\u652f\u6301\u8f74\u904d\u5386\u7a0b\u5e8f\uff1a{0}"},
+
+    { ER_ERRORHANDLER_CREATED_WITH_NULL_PRINTWRITER,
+      "\u4ee5\u7a7a\u7684 PrintWriter \u521b\u5efa\u4e86 ListingErrorHandler\uff01"},
+
+    { ER_SYSTEMID_UNKNOWN,
+      "SystemId \u672a\u77e5"},
+
+    { ER_LOCATION_UNKNOWN,
+      "\u9519\u8bef\u4f4d\u7f6e\u672a\u77e5"},
+
+    { ER_PREFIX_MUST_RESOLVE,
+      "\u524d\u7f00\u5fc5\u987b\u89e3\u6790\u4e3a\u540d\u79f0\u7a7a\u95f4\uff1a{0}"},
+
+    { ER_CREATEDOCUMENT_NOT_SUPPORTED,
+      "XPathContext \u4e2d\u4e0d\u652f\u6301 createDocument()\uff01"},
+
+    { ER_CHILD_HAS_NO_OWNER_DOCUMENT,
+      "\u5b50\u5c5e\u6027\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
+
+    { ER_CHILD_HAS_NO_OWNER_DOCUMENT_ELEMENT,
+      "\u5b50\u5c5e\u6027\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\u5143\u7d20\uff01"},
+
+    { ER_CANT_OUTPUT_TEXT_BEFORE_DOC,
+      "\u8b66\u544a\uff1a\u65e0\u6cd5\u5728\u8bb0\u5f55\u5143\u7d20\u524d\u8f93\u51fa\u6587\u672c\uff01\u5ffd\u7565..."},
+
+    { ER_CANT_HAVE_MORE_THAN_ONE_ROOT,
+      "DOM \u4e0a\u4e0d\u80fd\u6709\u591a\u4e2a\u6839\uff01"},
+
+    { ER_ARG_LOCALNAME_NULL,
+       "\u81ea\u53d8\u91cf\u201clocalName\u201d\u4e3a\u7a7a"},
+
+    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
+    // The localname is the portion after the optional colon; the message indicates
+    // that there is a problem with that part of the QNAME.
+    { ER_ARG_LOCALNAME_INVALID,
+       "QNAME \u4e2d\u7684\u672c\u5730\u540d\u5e94\u5f53\u662f\u6709\u6548\u7684 NCName"},
+
+    // Note to translators:  A QNAME has the syntactic form [NCName:]NCName
+    // The prefix is the portion before the optional colon; the message indicates
+    // that there is a problem with that part of the QNAME.
+    { ER_ARG_PREFIX_INVALID,
+       "QNAME \u4e2d\u7684\u524d\u7f00\u5e94\u5f53\u662f\u6709\u6548\u7684 NCName"},
+
+    { ER_NAME_CANT_START_WITH_COLON,
+      "\u540d\u79f0\u4e0d\u80fd\u4ee5\u5192\u53f7\u5f00\u5934"},
+
+    { "BAD_CODE", "createMessage \u7684\u53c2\u6570\u8d85\u51fa\u8303\u56f4"},
+    { "FORMAT_FAILED", "\u5728 messageFormat \u8c03\u7528\u8fc7\u7a0b\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38"},
+    { "line", "\u884c\u53f7"},
+    { "column","\u5217\u53f7"}
+
+
+  };
+  }
+
+  /**
+   *   Return a named ResourceBundle for a particular locale.  This method mimics the behavior
+   *   of ResourceBundle.getBundle().
+   *
+   *   @param className the name of the class that implements the resource bundle.
+   *   @return the ResourceBundle
+   *   @throws MissingResourceException
+   */
+  public static final XMLErrorResources loadResourceBundle(String className)
+          throws MissingResourceException
+  {
+
+    Locale locale = Locale.getDefault();
+    String suffix = getResourceSuffix(locale);
+
+    try
+    {
+
+      // first try with the given locale
+      return (XMLErrorResources) ResourceBundle.getBundle(className
+              + suffix, locale);
+    }
+    catch (MissingResourceException e)
+    {
+      try  // try to fall back to en_US if we can't load
+      {
+
+        // Since we can't find the localized property file,
+        // fall back to en_US.
+        return (XMLErrorResources) ResourceBundle.getBundle(className,
+                new Locale("zh", "CN"));
+      }
+      catch (MissingResourceException e2)
+      {
+
+        // Now we are really in trouble.
+        // very bad, definitely very bad...not going to get very far
+        throw new MissingResourceException(
+          "Could not load any resource bundles.", className, "");
+      }
+    }
+  }
+
+  /**
+   * Return the resource file suffic for the indicated locale
+   * For most locales, this will be based the language code.  However
+   * for Chinese, we do distinguish between Taiwan and PRC
+   *
+   * @param locale the locale
+   * @return an String suffix which canbe appended to a resource name
+   */
+  private static final String getResourceSuffix(Locale locale)
+  {
+
+    String suffix = "_" + locale.getLanguage();
+    String country = locale.getCountry();
+
+    if (country.equals("TW"))
+      suffix += "_" + country;
+
+    return suffix;
+  }
+
+}
diff --git a/src/org/apache/xml/serializer/DOM3Serializer.java b/src/org/apache/xml/serializer/DOM3Serializer.java
index df0e1fd..82e6470 100644
--- a/src/org/apache/xml/serializer/DOM3Serializer.java
+++ b/src/org/apache/xml/serializer/DOM3Serializer.java
@@ -1,170 +1,170 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id$
- */
-
-package org.apache.xml.serializer;
-
-import java.io.IOException;
-
-import org.w3c.dom.DOMErrorHandler;
-import org.w3c.dom.Node;
-import org.w3c.dom.ls.LSSerializerFilter;
-
-/**
- * This interface is not intended to be used
- * by an end user, but rather by an XML parser that is implementing the DOM 
- * Level 3 Load and Save APIs.
- * <p>
- * 
- * See the DOM Level 3 Load and Save interface at <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer">LSSeializer</a>.
- * 
- * For a list of configuration parameters for DOM Level 3 see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">DOMConfiguration</a>.
- * For additional configuration parameters available with the DOM Level 3 Load and Save API LSSerializer see
- * <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer-config">LSerializer config</a>.
- * <p>
- * The following example uses a DOM3Serializer indirectly, through an an XML
- * parser that uses this class as part of its implementation of the DOM Level 3
- * Load and Save APIs, and is the prefered way to serialize with DOM Level 3 APIs.
- * <p>
- * Example:
- * <pre>
- *    public class TestDOM3 {
- *
- *    public static void main(String args[]) throws Exception {
- *        // Get document to serialize
- *        TestDOM3 test = new TestDOM3();
- *        
- *        // Serialize using standard DOM Level 3 Load/Save APIs        
- *        System.out.println(test.testDOM3LS());
- *    }
- *
- *    public org.w3c.dom.Document getDocument() throws Exception {
- *        // Create a simple DOM Document.
- *        javax.xml.parsers.DocumentBuilderFactory factory = 
- *            javax.xml.parsers.DocumentBuilderFactory.newInstance();
- *        javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
- *        byte[] bytes = "<parent><child/></parent>".getBytes();
- *        java.io.InputStream is = new java.io.ByteArrayInputStream(bytes);
- *        org.w3c.dom.Document doc = builder.parse(is);
- *        return doc;
- *    }
- *    
- *    //
- *    // This method uses standard DOM Level 3 Load Save APIs:
- *    //   org.w3c.dom.bootstrap.DOMImplementationRegistry
- *    //   org.w3c.dom.ls.DOMImplementationLS
- *    //   org.w3c.dom.ls.DOMImplementationLS
- *    //   org.w3c.dom.ls.LSSerializer
- *    //   org.w3c.dom.DOMConfiguration
- *    //   
- *    // The only thing non-standard in this method is the value set for the
- *    // name of the class implementing the DOM Level 3 Load Save APIs,
- *    // which in this case is:
- *    //   org.apache.xerces.dom.DOMImplementationSourceImpl
- *    //
- *
- *    public String testDOM3LS() throws Exception {
- *        
- *        // Get a simple DOM Document that will be serialized.
- *        org.w3c.dom.Document docToSerialize = getDocument();
- *
- *        // Get a factory (DOMImplementationLS) for creating a Load and Save object.
- *        org.w3c.dom.ls.DOMImplementationLS impl = 
- *            (org.w3c.dom.ls.DOMImplementationLS) 
- *            org.w3c.dom.bootstrap.DOMImplementationRegistry.newInstance().getDOMImplementation("LS");
- *
- *        // Use the factory to create an object (LSSerializer) used to 
- *        // write out or save the document.
- *        org.w3c.dom.ls.LSSerializer writer = impl.createLSSerializer();
- *        org.w3c.dom.DOMConfiguration config = writer.getDomConfig();
- *        config.setParameter("format-pretty-print", Boolean.TRUE);
- *        
- *        // Use the LSSerializer to write out or serialize the document to a String.
- *        String serializedXML = writer.writeToString(docToSerialize);
- *        return serializedXML;
- *    }
- *    
- *    }  // end of class TestDOM3
- * </pre>
- * 
- * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">DOMConfiguration</a>
- * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer-config">LSSerializer</a>
- * @see org.apache.xml.serializer.Serializer
- * @see org.apache.xml.serializer.DOMSerializer
- * 
- * @xsl.usage advanced
- *
- */
-public interface DOM3Serializer {
-    /**
-     * Serializes the Level 3 DOM node. Throws an exception only if an I/O
-     * exception occured while serializing.
-     * 
-     * This interface is a public API.
-     *
-     * @param node the Level 3 DOM node to serialize
-     * @throws IOException if an I/O exception occured while serializing
-     */
-    public void serializeDOM3(Node node) throws IOException;
-
-    /**
-     * Sets a DOMErrorHandler on the DOM Level 3 Serializer.
-     * 
-     * This interface is a public API.
-     *
-     * @param handler the Level 3 DOMErrorHandler
-     */
-    public void setErrorHandler(DOMErrorHandler handler);
-
-    /**
-     * Returns a DOMErrorHandler set on the DOM Level 3 Serializer.
-     * 
-     * This interface is a public API.
-     *
-     * @return A Level 3 DOMErrorHandler
-     */
-    public DOMErrorHandler getErrorHandler();
-
-    /**
-     * Sets a LSSerializerFilter on the DOM Level 3 Serializer to filter nodes
-     * during serialization.
-     * 
-     * This interface is a public API.
-     *
-     * @param filter the Level 3 LSSerializerFilter
-     */
-    public void setNodeFilter(LSSerializerFilter filter);
-
-    /**
-     * Returns a LSSerializerFilter set on the DOM Level 3 Serializer to filter nodes
-     * during serialization.
-     * 
-     * This interface is a public API.
-     *
-     * @return The Level 3 LSSerializerFilter
-     */
-    public LSSerializerFilter getNodeFilter();
-
-    /**
-     * Sets the end-of-line sequence of characters to be used during serialization
-     * @param newLine The end-of-line sequence of characters to be used during serialization
-     */
-    public void setNewLine(char[] newLine);
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer;
+
+import java.io.IOException;
+
+import org.w3c.dom.DOMErrorHandler;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.LSSerializerFilter;
+
+/**
+ * This interface is not intended to be used
+ * by an end user, but rather by an XML parser that is implementing the DOM 
+ * Level 3 Load and Save APIs.
+ * <p>
+ * 
+ * See the DOM Level 3 Load and Save interface at <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer">LSSeializer</a>.
+ * 
+ * For a list of configuration parameters for DOM Level 3 see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">DOMConfiguration</a>.
+ * For additional configuration parameters available with the DOM Level 3 Load and Save API LSSerializer see
+ * <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer-config">LSerializer config</a>.
+ * <p>
+ * The following example uses a DOM3Serializer indirectly, through an an XML
+ * parser that uses this class as part of its implementation of the DOM Level 3
+ * Load and Save APIs, and is the prefered way to serialize with DOM Level 3 APIs.
+ * <p>
+ * Example:
+ * <pre>
+ *    public class TestDOM3 {
+ *
+ *    public static void main(String args[]) throws Exception {
+ *        // Get document to serialize
+ *        TestDOM3 test = new TestDOM3();
+ *        
+ *        // Serialize using standard DOM Level 3 Load/Save APIs        
+ *        System.out.println(test.testDOM3LS());
+ *    }
+ *
+ *    public org.w3c.dom.Document getDocument() throws Exception {
+ *        // Create a simple DOM Document.
+ *        javax.xml.parsers.DocumentBuilderFactory factory = 
+ *            javax.xml.parsers.DocumentBuilderFactory.newInstance();
+ *        javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
+ *        byte[] bytes = "<parent><child/></parent>".getBytes();
+ *        java.io.InputStream is = new java.io.ByteArrayInputStream(bytes);
+ *        org.w3c.dom.Document doc = builder.parse(is);
+ *        return doc;
+ *    }
+ *    
+ *    //
+ *    // This method uses standard DOM Level 3 Load Save APIs:
+ *    //   org.w3c.dom.bootstrap.DOMImplementationRegistry
+ *    //   org.w3c.dom.ls.DOMImplementationLS
+ *    //   org.w3c.dom.ls.DOMImplementationLS
+ *    //   org.w3c.dom.ls.LSSerializer
+ *    //   org.w3c.dom.DOMConfiguration
+ *    //   
+ *    // The only thing non-standard in this method is the value set for the
+ *    // name of the class implementing the DOM Level 3 Load Save APIs,
+ *    // which in this case is:
+ *    //   org.apache.xerces.dom.DOMImplementationSourceImpl
+ *    //
+ *
+ *    public String testDOM3LS() throws Exception {
+ *        
+ *        // Get a simple DOM Document that will be serialized.
+ *        org.w3c.dom.Document docToSerialize = getDocument();
+ *
+ *        // Get a factory (DOMImplementationLS) for creating a Load and Save object.
+ *        org.w3c.dom.ls.DOMImplementationLS impl = 
+ *            (org.w3c.dom.ls.DOMImplementationLS) 
+ *            org.w3c.dom.bootstrap.DOMImplementationRegistry.newInstance().getDOMImplementation("LS");
+ *
+ *        // Use the factory to create an object (LSSerializer) used to 
+ *        // write out or save the document.
+ *        org.w3c.dom.ls.LSSerializer writer = impl.createLSSerializer();
+ *        org.w3c.dom.DOMConfiguration config = writer.getDomConfig();
+ *        config.setParameter("format-pretty-print", Boolean.TRUE);
+ *        
+ *        // Use the LSSerializer to write out or serialize the document to a String.
+ *        String serializedXML = writer.writeToString(docToSerialize);
+ *        return serializedXML;
+ *    }
+ *    
+ *    }  // end of class TestDOM3
+ * </pre>
+ * 
+ * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">DOMConfiguration</a>
+ * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer-config">LSSerializer</a>
+ * @see org.apache.xml.serializer.Serializer
+ * @see org.apache.xml.serializer.DOMSerializer
+ * 
+ * @xsl.usage advanced
+ *
+ */
+public interface DOM3Serializer {
+    /**
+     * Serializes the Level 3 DOM node. Throws an exception only if an I/O
+     * exception occured while serializing.
+     * 
+     * This interface is a public API.
+     *
+     * @param node the Level 3 DOM node to serialize
+     * @throws IOException if an I/O exception occured while serializing
+     */
+    public void serializeDOM3(Node node) throws IOException;
+
+    /**
+     * Sets a DOMErrorHandler on the DOM Level 3 Serializer.
+     * 
+     * This interface is a public API.
+     *
+     * @param handler the Level 3 DOMErrorHandler
+     */
+    public void setErrorHandler(DOMErrorHandler handler);
+
+    /**
+     * Returns a DOMErrorHandler set on the DOM Level 3 Serializer.
+     * 
+     * This interface is a public API.
+     *
+     * @return A Level 3 DOMErrorHandler
+     */
+    public DOMErrorHandler getErrorHandler();
+
+    /**
+     * Sets a LSSerializerFilter on the DOM Level 3 Serializer to filter nodes
+     * during serialization.
+     * 
+     * This interface is a public API.
+     *
+     * @param filter the Level 3 LSSerializerFilter
+     */
+    public void setNodeFilter(LSSerializerFilter filter);
+
+    /**
+     * Returns a LSSerializerFilter set on the DOM Level 3 Serializer to filter nodes
+     * during serialization.
+     * 
+     * This interface is a public API.
+     *
+     * @return The Level 3 LSSerializerFilter
+     */
+    public LSSerializerFilter getNodeFilter();
+
+    /**
+     * Sets the end-of-line sequence of characters to be used during serialization
+     * @param newLine The end-of-line sequence of characters to be used during serialization
+     */
+    public void setNewLine(char[] newLine);
+}
diff --git a/src/org/apache/xml/serializer/dom3/DOM3SerializerImpl.java b/src/org/apache/xml/serializer/dom3/DOM3SerializerImpl.java
index fcc9882..3f765d9 100644
--- a/src/org/apache/xml/serializer/dom3/DOM3SerializerImpl.java
+++ b/src/org/apache/xml/serializer/dom3/DOM3SerializerImpl.java
@@ -1,158 +1,158 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import java.io.IOException;
-
-import org.apache.xml.serializer.DOM3Serializer;
-import org.apache.xml.serializer.SerializationHandler;
-import org.apache.xml.serializer.utils.WrappedRuntimeException;
-import org.w3c.dom.DOMErrorHandler;
-import org.w3c.dom.Node;
-import org.w3c.dom.ls.LSSerializerFilter;
-
-/**
- * This class implements the DOM3Serializer interface.
- * 
- * @xsl.usage internal
- */
-public final class DOM3SerializerImpl implements DOM3Serializer {
-
-    /**
-     * Private class members
-     */
-    // The DOMErrorHandler
-    private DOMErrorHandler fErrorHandler;
-
-    // A LSSerializerFilter
-    private LSSerializerFilter fSerializerFilter;
-
-    // A LSSerializerFilter
-    private String fNewLine;
-
-    // A SerializationHandler ex. an instance of ToXMLStream
-    private SerializationHandler fSerializationHandler;
-
-    /**
-     * Constructor
-     * 
-     * @param handler An instance of the SerializationHandler interface. 
-     */
-    public DOM3SerializerImpl(SerializationHandler handler) {
-        fSerializationHandler = handler;
-    }
-
-    // Public memebers
-
-    /**
-     * Returns a DOMErrorHandler set on the DOM Level 3 Serializer.
-     * 
-     * This interface is a public API.
-     *
-     * @return A Level 3 DOMErrorHandler
-     */
-    public DOMErrorHandler getErrorHandler() {
-        return fErrorHandler;
-    }
-
-    /**
-     * Returns a LSSerializerFilter set on the DOM Level 3 Serializer to filter nodes
-     * during serialization.
-     * 
-     * This interface is a public API.
-     *
-     * @return The Level 3 LSSerializerFilter
-     */
-    public LSSerializerFilter getNodeFilter() {
-        return fSerializerFilter;
-    }
-    
-    /**
-     * Gets the end-of-line sequence of characters to be used during serialization.
-     */
-    public char[] getNewLine() {
-        return (fNewLine != null) ? fNewLine.toCharArray() : null;
-    }
-
-    /**
-     * Serializes the Level 3 DOM node by creating an instance of DOM3TreeWalker
-     * which traverses the DOM tree and invokes handler events to serialize
-     * the DOM NOde. Throws an exception only if an I/O exception occured
-     * while serializing.
-     * This interface is a public API.
-     *
-     * @param node the Level 3 DOM node to serialize
-     * @throws IOException if an I/O exception occured while serializing
-     */
-    public void serializeDOM3(Node node) throws IOException {
-        try {
-            DOM3TreeWalker walker = new DOM3TreeWalker(fSerializationHandler,
-                    fErrorHandler, fSerializerFilter, fNewLine);
-
-            walker.traverse(node);
-        } catch (org.xml.sax.SAXException se) {
-            throw new WrappedRuntimeException(se);
-        }
-    }
-
-    /**
-     * Sets a DOMErrorHandler on the DOM Level 3 Serializer.
-     * 
-     * This interface is a public API.
-     *
-     * @param handler the Level 3 DOMErrorHandler
-     */
-    public void setErrorHandler(DOMErrorHandler handler) {
-        fErrorHandler = handler;
-    }
-
-    /**
-     * Sets a LSSerializerFilter on the DOM Level 3 Serializer to filter nodes
-     * during serialization.
-     * 
-     * This interface is a public API.
-     *
-     * @param filter the Level 3 LSSerializerFilter
-     */
-    public void setNodeFilter(LSSerializerFilter filter) {
-        fSerializerFilter = filter;
-    }
-
-    /**
-     * Sets a SerializationHandler on the DOM Serializer.
-     * 
-     * This interface is a public API.
-     *
-     * @param handler An instance of SerializationHandler
-     */
-    public void setSerializationHandler(SerializationHandler handler) {
-        fSerializationHandler = handler;
-    }
-
-    /**
-     * Sets the end-of-line sequence of characters to be used during serialization.
-     * @param newLine The end-of-line sequence of characters to be used during serialization.
-     */
-    public void setNewLine(char[] newLine) {
-        fNewLine = (newLine != null) ? new String(newLine) : null;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import java.io.IOException;
+
+import org.apache.xml.serializer.DOM3Serializer;
+import org.apache.xml.serializer.SerializationHandler;
+import org.apache.xml.serializer.utils.WrappedRuntimeException;
+import org.w3c.dom.DOMErrorHandler;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.LSSerializerFilter;
+
+/**
+ * This class implements the DOM3Serializer interface.
+ * 
+ * @xsl.usage internal
+ */
+public final class DOM3SerializerImpl implements DOM3Serializer {
+
+    /**
+     * Private class members
+     */
+    // The DOMErrorHandler
+    private DOMErrorHandler fErrorHandler;
+
+    // A LSSerializerFilter
+    private LSSerializerFilter fSerializerFilter;
+
+    // A LSSerializerFilter
+    private String fNewLine;
+
+    // A SerializationHandler ex. an instance of ToXMLStream
+    private SerializationHandler fSerializationHandler;
+
+    /**
+     * Constructor
+     * 
+     * @param handler An instance of the SerializationHandler interface. 
+     */
+    public DOM3SerializerImpl(SerializationHandler handler) {
+        fSerializationHandler = handler;
+    }
+
+    // Public memebers
+
+    /**
+     * Returns a DOMErrorHandler set on the DOM Level 3 Serializer.
+     * 
+     * This interface is a public API.
+     *
+     * @return A Level 3 DOMErrorHandler
+     */
+    public DOMErrorHandler getErrorHandler() {
+        return fErrorHandler;
+    }
+
+    /**
+     * Returns a LSSerializerFilter set on the DOM Level 3 Serializer to filter nodes
+     * during serialization.
+     * 
+     * This interface is a public API.
+     *
+     * @return The Level 3 LSSerializerFilter
+     */
+    public LSSerializerFilter getNodeFilter() {
+        return fSerializerFilter;
+    }
+    
+    /**
+     * Gets the end-of-line sequence of characters to be used during serialization.
+     */
+    public char[] getNewLine() {
+        return (fNewLine != null) ? fNewLine.toCharArray() : null;
+    }
+
+    /**
+     * Serializes the Level 3 DOM node by creating an instance of DOM3TreeWalker
+     * which traverses the DOM tree and invokes handler events to serialize
+     * the DOM NOde. Throws an exception only if an I/O exception occured
+     * while serializing.
+     * This interface is a public API.
+     *
+     * @param node the Level 3 DOM node to serialize
+     * @throws IOException if an I/O exception occured while serializing
+     */
+    public void serializeDOM3(Node node) throws IOException {
+        try {
+            DOM3TreeWalker walker = new DOM3TreeWalker(fSerializationHandler,
+                    fErrorHandler, fSerializerFilter, fNewLine);
+
+            walker.traverse(node);
+        } catch (org.xml.sax.SAXException se) {
+            throw new WrappedRuntimeException(se);
+        }
+    }
+
+    /**
+     * Sets a DOMErrorHandler on the DOM Level 3 Serializer.
+     * 
+     * This interface is a public API.
+     *
+     * @param handler the Level 3 DOMErrorHandler
+     */
+    public void setErrorHandler(DOMErrorHandler handler) {
+        fErrorHandler = handler;
+    }
+
+    /**
+     * Sets a LSSerializerFilter on the DOM Level 3 Serializer to filter nodes
+     * during serialization.
+     * 
+     * This interface is a public API.
+     *
+     * @param filter the Level 3 LSSerializerFilter
+     */
+    public void setNodeFilter(LSSerializerFilter filter) {
+        fSerializerFilter = filter;
+    }
+
+    /**
+     * Sets a SerializationHandler on the DOM Serializer.
+     * 
+     * This interface is a public API.
+     *
+     * @param handler An instance of SerializationHandler
+     */
+    public void setSerializationHandler(SerializationHandler handler) {
+        fSerializationHandler = handler;
+    }
+
+    /**
+     * Sets the end-of-line sequence of characters to be used during serialization.
+     * @param newLine The end-of-line sequence of characters to be used during serialization.
+     */
+    public void setNewLine(char[] newLine) {
+        fNewLine = (newLine != null) ? new String(newLine) : null;
+    }
+}
diff --git a/src/org/apache/xml/serializer/dom3/DOM3TreeWalker.java b/src/org/apache/xml/serializer/dom3/DOM3TreeWalker.java
index 0b62423..643b885 100644
--- a/src/org/apache/xml/serializer/dom3/DOM3TreeWalker.java
+++ b/src/org/apache/xml/serializer/dom3/DOM3TreeWalker.java
@@ -1,2149 +1,2149 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Properties;
-
-import org.apache.xml.serializer.dom3.NamespaceSupport;
-import org.apache.xml.serializer.OutputPropertiesFactory;
-import org.apache.xml.serializer.SerializationHandler;
-import org.apache.xml.serializer.utils.MsgKey;
-import org.apache.xml.serializer.utils.Utils;
-import org.apache.xml.serializer.utils.XML11Char;
-import org.apache.xml.serializer.utils.XMLChar;
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Comment;
-import org.w3c.dom.DOMError;
-import org.w3c.dom.DOMErrorHandler;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.Element;
-import org.w3c.dom.Entity;
-import org.w3c.dom.EntityReference;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.ProcessingInstruction;
-import org.w3c.dom.Text;
-import org.w3c.dom.ls.LSSerializerFilter;
-import org.w3c.dom.traversal.NodeFilter;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.LocatorImpl;
-
-/**
- * Built on org.apache.xml.serializer.TreeWalker and adds functionality to
- * traverse and serialize a DOM Node (Level 2 or Level 3) as specified in 
- * the DOM Level 3 LS Recommedation by evaluating and applying DOMConfiguration 
- * parameters and filters if any during serialization.
- *   
- * @xsl.usage internal
- */
-final class DOM3TreeWalker {
-
-    /**
-     * The SerializationHandler, it extends ContentHandler and when
-     * this class is instantiated via the constructor provided, a
-     * SerializationHandler object is passed to it.
-     */
-    private SerializationHandler fSerializer = null;
-
-    /** We do not need DOM2Helper since DOM Level 3 LS applies to DOM Level 2 or newer */
-
-    /** Locator object for this TreeWalker          */
-    private LocatorImpl fLocator = new LocatorImpl();
-
-    /** ErrorHandler */
-    private DOMErrorHandler fErrorHandler = null;
-
-    /** LSSerializerFilter */
-    private LSSerializerFilter fFilter = null;
-
-    /** If the serializer is an instance of a LexicalHandler */
-    private LexicalHandler fLexicalHandler = null;
-
-    private int fWhatToShowFilter;
-
-    /** New Line character to use in serialization */
-    private String fNewLine = null;
-
-    /** DOMConfiguration Properties */
-    private Properties fDOMConfigProperties = null;
-
-    /** Keeps track if we are in an entity reference when entities=true */
-    private boolean fInEntityRef = false;
-
-    /** Stores the version of the XML document to be serialize */
-    private String fXMLVersion = null;
-
-    /** XML Version, default 1.0 */
-    private boolean fIsXMLVersion11 = false;
-
-    /** Is the Node a Level 3 DOM node */
-    private boolean fIsLevel3DOM = false;
-
-    /** DOM Configuration Parameters */
-    private int fFeatures = 0;
-
-    /** Flag indicating whether following text to be processed is raw text          */
-    boolean fNextIsRaw = false;
-
-    // 
-    private static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";
-
-    //
-    private static final String XMLNS_PREFIX = "xmlns";
-
-    // 
-    private static final String XML_URI = "http://www.w3.org/XML/1998/namespace";
-
-    // 
-    private static final String XML_PREFIX = "xml";
-
-    /** stores namespaces in scope */
-    protected NamespaceSupport fNSBinder;
-
-    /** stores all namespace bindings on the current element */
-    protected NamespaceSupport fLocalNSBinder;
-    
-    /** stores the current element depth */
-    private int fElementDepth = 0;
-
-    // ***********************************************************************
-    // DOMConfiguration paramter settings 
-    // ***********************************************************************
-    // Parameter canonical-form, true [optional] - NOT SUPPORTED 
-    private final static int CANONICAL = 0x1 << 0;
-
-    // Parameter cdata-sections, true [required] (default)
-    private final static int CDATA = 0x1 << 1;
-
-    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED 
-    private final static int CHARNORMALIZE = 0x1 << 2;
-
-    // Parameter comments, true [required] (default)
-    private final static int COMMENTS = 0x1 << 3;
-
-    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
-    private final static int DTNORMALIZE = 0x1 << 4;
-
-    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
-    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
-
-    // Parameter entities, true [required] (default)
-    private final static int ENTITIES = 0x1 << 6;
-
-    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
-    private final static int INFOSET = 0x1 << 7;
-
-    // Parameter namespaces, true [required] (default)
-    private final static int NAMESPACES = 0x1 << 8;
-
-    // Parameter namespace-declarations, true [required] (default)
-    private final static int NAMESPACEDECLS = 0x1 << 9;
-
-    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
-    private final static int NORMALIZECHARS = 0x1 << 10;
-
-    // Parameter split-cdata-sections, true [required] (default)
-    private final static int SPLITCDATA = 0x1 << 11;
-
-    // Parameter validate, true [optional] - NOT SUPPORTED
-    private final static int VALIDATE = 0x1 << 12;
-
-    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
-    private final static int SCHEMAVALIDATE = 0x1 << 13;
-
-    // Parameter split-cdata-sections, true [required] (default)
-    private final static int WELLFORMED = 0x1 << 14;
-
-    // Parameter discard-default-content, true [required] (default)
-    // Not sure how this will be used in level 2 Documents
-    private final static int DISCARDDEFAULT = 0x1 << 15;
-
-    // Parameter format-pretty-print, true [optional] 
-    private final static int PRETTY_PRINT = 0x1 << 16;
-
-    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
-    // We currently do not support XML 1.1 character normalization
-    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
-
-    // Parameter discard-default-content, true [required] (default)
-    private final static int XMLDECL = 0x1 << 18;
-
-    /**
-     * Constructor.
-     * @param   contentHandler serialHandler The implemention of the SerializationHandler interface
-     */
-    DOM3TreeWalker(
-        SerializationHandler serialHandler,
-        DOMErrorHandler errHandler,
-        LSSerializerFilter filter,
-        String newLine) {
-        fSerializer = serialHandler;
-        //fErrorHandler = errHandler == null ? new DOMErrorHandlerImpl() : errHandler; // Should we be using the default?
-        fErrorHandler = errHandler;
-        fFilter = filter;
-        fLexicalHandler = null;
-        fNewLine = newLine;
-
-        fNSBinder = new NamespaceSupport();
-        fLocalNSBinder = new NamespaceSupport();
-        
-        fDOMConfigProperties = fSerializer.getOutputFormat();
-        fSerializer.setDocumentLocator(fLocator);
-        initProperties(fDOMConfigProperties);
-        
-        try {
-            // Bug see Bugzilla  26741
-            fLocator.setSystemId(
-                System.getProperty("user.dir") + File.separator + "dummy.xsl");
-        } catch (SecurityException se) { // user.dir not accessible from applet
-
-        }
-    }
-
-    /**
-     * Perform a pre-order traversal non-recursive style.  
-     *
-     * Note that TreeWalker assumes that the subtree is intended to represent 
-     * a complete (though not necessarily well-formed) document and, during a 
-     * traversal, startDocument and endDocument will always be issued to the 
-     * SAX listener.
-     *  
-     * @param pos Node in the tree where to start traversal
-     *
-     * @throws TransformerException
-     */
-    public void traverse(Node pos) throws org.xml.sax.SAXException {
-        this.fSerializer.startDocument();
-
-        // Determine if the Node is a DOM Level 3 Core Node.
-        if (pos.getNodeType() != Node.DOCUMENT_NODE) {
-            Document ownerDoc = pos.getOwnerDocument();
-            if (ownerDoc != null
-                && ownerDoc.getImplementation().hasFeature("Core", "3.0")) {
-                fIsLevel3DOM = true;
-            }
-        } else {
-            if (((Document) pos)
-                .getImplementation()
-                .hasFeature("Core", "3.0")) {
-                fIsLevel3DOM = true;
-            }
-        }
-
-        if (fSerializer instanceof LexicalHandler) {
-            fLexicalHandler = ((LexicalHandler) this.fSerializer);
-        }
-
-        if (fFilter != null)
-            fWhatToShowFilter = fFilter.getWhatToShow();
-
-        Node top = pos;
-
-        while (null != pos) {
-            startNode(pos);
-
-            Node nextNode = null;
-
-            nextNode = pos.getFirstChild();
-
-            while (null == nextNode) {
-                endNode(pos);
-
-                if (top.equals(pos))
-                    break;
-
-                nextNode = pos.getNextSibling();
-
-                if (null == nextNode) {
-                    pos = pos.getParentNode();
-
-                    if ((null == pos) || (top.equals(pos))) {
-                        if (null != pos)
-                            endNode(pos);
-
-                        nextNode = null;
-
-                        break;
-                    }
-                }
-            }
-
-            pos = nextNode;
-        }
-        this.fSerializer.endDocument();
-    }
-
-    /**
-     * Perform a pre-order traversal non-recursive style.
-     
-     * Note that TreeWalker assumes that the subtree is intended to represent 
-     * a complete (though not necessarily well-formed) document and, during a 
-     * traversal, startDocument and endDocument will always be issued to the 
-     * SAX listener.
-     *
-     * @param pos Node in the tree where to start traversal
-     * @param top Node in the tree where to end traversal
-     *
-     * @throws TransformerException
-     */
-    public void traverse(Node pos, Node top) throws org.xml.sax.SAXException {
-
-        this.fSerializer.startDocument();
-
-        // Determine if the Node is a DOM Level 3 Core Node.
-        if (pos.getNodeType() != Node.DOCUMENT_NODE) {
-            Document ownerDoc = pos.getOwnerDocument();
-            if (ownerDoc != null
-                && ownerDoc.getImplementation().hasFeature("Core", "3.0")) {
-                fIsLevel3DOM = true;
-            }
-        } else {
-            if (((Document) pos)
-                .getImplementation()
-                .hasFeature("Core", "3.0")) {
-                fIsLevel3DOM = true;
-            }
-        }
-
-        if (fSerializer instanceof LexicalHandler) {
-            fLexicalHandler = ((LexicalHandler) this.fSerializer);
-        }
-
-        if (fFilter != null)
-            fWhatToShowFilter = fFilter.getWhatToShow();
-
-        while (null != pos) {
-            startNode(pos);
-
-            Node nextNode = null;
-
-            nextNode = pos.getFirstChild();
-
-            while (null == nextNode) {
-                endNode(pos);
-
-                if ((null != top) && top.equals(pos))
-                    break;
-
-                nextNode = pos.getNextSibling();
-
-                if (null == nextNode) {
-                    pos = pos.getParentNode();
-
-                    if ((null == pos) || ((null != top) && top.equals(pos))) {
-                        nextNode = null;
-
-                        break;
-                    }
-                }
-            }
-
-            pos = nextNode;
-        }
-        this.fSerializer.endDocument();
-    }
-
-    /**
-     * Optimized dispatch of characters.
-     */
-    private final void dispatachChars(Node node)
-        throws org.xml.sax.SAXException {
-        if (fSerializer != null) {
-            this.fSerializer.characters(node);
-        } else {
-            String data = ((Text) node).getData();
-            this.fSerializer.characters(data.toCharArray(), 0, data.length());
-        }
-    }
-
-    /**
-     * Start processing given node
-     *
-     * @param node Node to process
-     *
-     * @throws org.xml.sax.SAXException
-     */
-    protected void startNode(Node node) throws org.xml.sax.SAXException {
-        if (node instanceof Locator) {
-            Locator loc = (Locator) node;
-            fLocator.setColumnNumber(loc.getColumnNumber());
-            fLocator.setLineNumber(loc.getLineNumber());
-            fLocator.setPublicId(loc.getPublicId());
-            fLocator.setSystemId(loc.getSystemId());
-        } else {
-            fLocator.setColumnNumber(0);
-            fLocator.setLineNumber(0);
-        }
-
-        switch (node.getNodeType()) {
-            case Node.DOCUMENT_TYPE_NODE :
-                serializeDocType((DocumentType) node, true);
-                break;
-            case Node.COMMENT_NODE :
-                serializeComment((Comment) node);
-                break;
-            case Node.DOCUMENT_FRAGMENT_NODE :
-                // Children are traversed
-                break;
-            case Node.DOCUMENT_NODE :
-                break;
-            case Node.ELEMENT_NODE :
-                serializeElement((Element) node, true);
-                break;
-            case Node.PROCESSING_INSTRUCTION_NODE :
-                serializePI((ProcessingInstruction) node);
-                break;
-            case Node.CDATA_SECTION_NODE :
-                serializeCDATASection((CDATASection) node);
-                break;
-            case Node.TEXT_NODE :
-                serializeText((Text) node);
-                break;
-            case Node.ENTITY_REFERENCE_NODE :
-                serializeEntityReference((EntityReference) node, true);
-                break;
-            default :
-                }
-    }
-
-    /**
-     * End processing of given node 
-     *
-     *
-     * @param node Node we just finished processing
-     *
-     * @throws org.xml.sax.SAXException
-     */
-    protected void endNode(Node node) throws org.xml.sax.SAXException {
-
-        switch (node.getNodeType()) {
-            case Node.DOCUMENT_NODE :
-                break;
-            case Node.DOCUMENT_TYPE_NODE :
-                serializeDocType((DocumentType) node, false);
-                break;
-            case Node.ELEMENT_NODE :
-                serializeElement((Element) node, false);
-                break;
-            case Node.CDATA_SECTION_NODE :
-                break;
-            case Node.ENTITY_REFERENCE_NODE :
-                serializeEntityReference((EntityReference) node, false);
-                break;
-            default :
-                }
-    }
-
-    // ***********************************************************************
-    // Node serialization methods
-    // ***********************************************************************
-    /**
-     * Applies a filter on the node to serialize
-     * 
-     * @param node The Node to serialize
-     * @return True if the node is to be serialized else false if the node 
-     *         is to be rejected or skipped. 
-     */
-    protected boolean applyFilter(Node node, int nodeType) {
-        if (fFilter != null && (fWhatToShowFilter & nodeType) != 0) {
-
-            short code = fFilter.acceptNode(node);
-            switch (code) {
-                case NodeFilter.FILTER_REJECT :
-                case NodeFilter.FILTER_SKIP :
-                    return false; // skip the node
-                default : // fall through..
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Serializes a Document Type Node.
-     * 
-     * @param node The Docuemnt Type Node to serialize
-     * @param bStart Invoked at the start or end of node.  Default true. 
-     */
-    protected void serializeDocType(DocumentType node, boolean bStart)
-        throws SAXException {
-        // The DocType and internalSubset can not be modified in DOM and is
-        // considered to be well-formed as the outcome of successful parsing.
-        String docTypeName = node.getNodeName();
-        String publicId = node.getPublicId();
-        String systemId = node.getSystemId();
-        String internalSubset = node.getInternalSubset();
-
-        //DocumentType nodes are never passed to the filter
-        
-        if (internalSubset != null && !"".equals(internalSubset)) {
-
-            if (bStart) {
-                try {
-                    // The Serializer does not provide a way to write out the
-                    // DOCTYPE internal subset via an event call, so we write it
-                    // out here.
-                    Writer writer = fSerializer.getWriter();
-                    StringBuffer dtd = new StringBuffer();
-
-                    dtd.append("<!DOCTYPE ");
-                    dtd.append(docTypeName);
-                    if (null != publicId) {
-                        dtd.append(" PUBLIC \"");
-                        dtd.append(publicId);
-                        dtd.append('\"');
-                    }
-
-                    if (null != systemId) {
-                        if (null == publicId) {
-                            dtd.append(" SYSTEM \"");
-                        } else {
-                            dtd.append(" \"");
-                        }    
-                        dtd.append(systemId);
-                        dtd.append('\"');
-                    }
-                    
-                    dtd.append(" [ ");
-                    
-                    dtd.append(fNewLine);
-                    dtd.append(internalSubset);
-                    dtd.append("]>");
-                    dtd.append(new String(fNewLine));
-                    
-                    writer.write(dtd.toString());
-                    writer.flush();
-                    
-                } catch (IOException e) {
-                    throw new SAXException(Utils.messages.createMessage(
-                            MsgKey.ER_WRITING_INTERNAL_SUBSET, null), e);
-                }
-            } // else if !bStart do nothing
-            
-        } else {
-            
-            if (bStart) {
-                if (fLexicalHandler != null) {
-                    fLexicalHandler.startDTD(docTypeName, publicId, systemId);
-                }
-            } else {
-                if (fLexicalHandler != null) {
-                    fLexicalHandler.endDTD();
-                }
-            }
-        }
-    }
-
-    /**
-     * Serializes a Comment Node.
-     * 
-     * @param node The Comment Node to serialize
-     */
-    protected void serializeComment(Comment node) throws SAXException {
-        // comments=true
-        if ((fFeatures & COMMENTS) != 0) {
-            String data = node.getData();
-
-            // well-formed=true
-            if ((fFeatures & WELLFORMED) != 0) {
-                isCommentWellFormed(data);
-            }
-
-            if (fLexicalHandler != null) {
-                // apply the LSSerializer filter after the operations requested by the 
-                // DOMConfiguration parameters have been applied 
-                if (!applyFilter(node, NodeFilter.SHOW_COMMENT)) {
-                    return;
-                }
-
-                fLexicalHandler.comment(data.toCharArray(), 0, data.length());
-            }
-        }
-    }
-
-    /**
-     * Serializes an Element Node.
-     * 
-     * @param node The Element Node to serialize
-     * @param bStart Invoked at the start or end of node.   
-     */
-    protected void serializeElement(Element node, boolean bStart)
-        throws SAXException {
-        if (bStart) {
-            fElementDepth++;
-
-            // We use the Xalan specific startElement and starPrefixMapping calls 
-            // (and addAttribute and namespaceAfterStartElement) as opposed to
-            // SAX specific, for performance reasons as they reduce the overhead
-            // of creating an AttList object upfront.
-
-            // well-formed=true
-            if ((fFeatures & WELLFORMED) != 0) {
-                isElementWellFormed(node);
-            }
-
-            // REVISIT: We apply the LSSerializer filter for elements before
-            // namesapce fixup
-            if (!applyFilter(node, NodeFilter.SHOW_ELEMENT)) {
-                return;
-            }
-
-            // namespaces=true, record and fixup namspaced element
-            if ((fFeatures & NAMESPACES) != 0) {
-            	fNSBinder.pushContext();
-            	fLocalNSBinder.reset();
-            	
-                recordLocalNSDecl(node);
-                fixupElementNS(node);
-            }
-
-            // Namespace normalization
-            fSerializer.startElement(
-            		node.getNamespaceURI(),
-                    node.getLocalName(),
-                    node.getNodeName());
-
-            serializeAttList(node);
-            
-        } else {
-        	fElementDepth--;
-
-            // apply the LSSerializer filter
-            if (!applyFilter(node, NodeFilter.SHOW_ELEMENT)) {
-                return;
-            }
-
-            this.fSerializer.endElement(
-            	node.getNamespaceURI(),
-                node.getLocalName(),
-                node.getNodeName());
-            // since endPrefixMapping was not used by SerializationHandler it was removed
-            // for performance reasons.
-
-            if ((fFeatures & NAMESPACES) != 0 ) {
-                    fNSBinder.popContext();
-            }
-            
-        }
-    }
-
-    /**
-     * Serializes the Attr Nodes of an Element.
-     * 
-     * @param node The OwnerElement whose Attr Nodes are to be serialized.
-     */
-    protected void serializeAttList(Element node) throws SAXException {
-        NamedNodeMap atts = node.getAttributes();
-        int nAttrs = atts.getLength();
-
-        for (int i = 0; i < nAttrs; i++) {
-            Node attr = atts.item(i);
-
-            String localName = attr.getLocalName();
-            String attrName = attr.getNodeName();
-            String attrPrefix = attr.getPrefix() == null ? "" : attr.getPrefix();
-            String attrValue = attr.getNodeValue();
-
-            // Determine the Attr's type.
-            String type = null;
-            if (fIsLevel3DOM) {
-                type = ((Attr) attr).getSchemaTypeInfo().getTypeName();
-            }
-            type = type == null ? "CDATA" : type;
-
-            String attrNS = attr.getNamespaceURI();
-            if (attrNS !=null && attrNS.length() == 0) {
-            	attrNS=null;
-                // we must remove prefix for this attribute
-            	attrName=attr.getLocalName();
-            }
-
-            boolean isSpecified = ((Attr) attr).getSpecified();
-            boolean addAttr = true;
-            boolean applyFilter = false;
-            boolean xmlnsAttr =
-                attrName.equals("xmlns") || attrName.startsWith("xmlns:");
-
-            // well-formed=true
-            if ((fFeatures & WELLFORMED) != 0) {
-                isAttributeWellFormed(attr);
-            }
-            
-            //-----------------------------------------------------------------
-            // start Attribute namespace fixup
-            //-----------------------------------------------------------------
-            // namespaces=true, normalize all non-namespace attributes
-            // Step 3. Attribute
-            if ((fFeatures & NAMESPACES) != 0 && !xmlnsAttr) {
-           	
-        		// If the Attr has a namespace URI
-        		if (attrNS != null) {
-        			attrPrefix = attrPrefix == null ? "" : attrPrefix;
-
-        			String declAttrPrefix = fNSBinder.getPrefix(attrNS);
-        			String declAttrNS = fNSBinder.getURI(attrPrefix);
-        			
-        			// attribute has no prefix (default namespace decl does not apply to
-        			// attributes)
-        			// OR
-        			// attribute prefix is not declared
-        			// OR
-        			// conflict: attribute has a prefix that conflicts with a binding
-        			if ("".equals(attrPrefix) || "".equals(declAttrPrefix)
-        					|| !attrPrefix.equals(declAttrPrefix)) {
-
-        				// namespaceURI matches an in scope declaration of one or
-        				// more prefixes
-        				if (declAttrPrefix != null && !"".equals(declAttrPrefix)) {
-        					// pick the prefix that was found and change attribute's
-        					// prefix and nodeName.
-        					attrPrefix = declAttrPrefix;
-        					
-        					if (declAttrPrefix.length() > 0 ) { 
-        						attrName = declAttrPrefix + ":" + localName;
-        					} else {
-        						attrName = localName;
-        					}	
-        				} else {
-        					// The current prefix is not null and it has no in scope
-        					// declaration
-        					if (attrPrefix != null && !"".equals(attrPrefix)
-        							&& declAttrNS == null) {
-        						// declare this prefix
-        						if ((fFeatures & NAMESPACEDECLS) != 0) {
-        							fSerializer.addAttribute(XMLNS_URI, attrPrefix,
-        									XMLNS_PREFIX + ":" + attrPrefix, "CDATA",
-        									attrNS);
-        							fNSBinder.declarePrefix(attrPrefix, attrNS);
-        							fLocalNSBinder.declarePrefix(attrPrefix, attrNS);
-        						}
-        					} else {
-        						// find a prefix following the pattern "NS" +index
-        						// (starting at 1)
-        						// make sure this prefix is not declared in the current
-        						// scope.
-        						int counter = 1;
-        						attrPrefix = "NS" + counter++;
-
-        						while (fLocalNSBinder.getURI(attrPrefix) != null) {
-        							attrPrefix = "NS" + counter++;
-        						}
-        						// change attribute's prefix and Name
-        						attrName = attrPrefix + ":" + localName;
-        						
-        						// create a local namespace declaration attribute
-        						// Add the xmlns declaration attribute
-        						if ((fFeatures & NAMESPACEDECLS) != 0) {
-                                       							
-        							fSerializer.addAttribute(XMLNS_URI, attrPrefix,
-        									XMLNS_PREFIX + ":" + attrPrefix, "CDATA",
-        									attrNS);
-            						fNSBinder.declarePrefix(attrPrefix, attrNS);
-            						fLocalNSBinder.declarePrefix(attrPrefix, attrNS);
-        						}
-        					}
-        				}
-        			}
-
-        		} else { // if the Attr has no namespace URI
-        			// Attr has no localName
-        			if (localName == null) {
-        				// DOM Level 1 node!
-        				String msg = Utils.messages.createMessage(
-        						MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
-        						new Object[] { attrName });
-
-        				if (fErrorHandler != null) {
-        					fErrorHandler
-        							.handleError(new DOMErrorImpl(
-        									DOMError.SEVERITY_ERROR, msg,
-        									MsgKey.ER_NULL_LOCAL_ELEMENT_NAME, null,
-        									null, null));
-        				}
-
-        			} else { // uri=null and no colon
-        				// attr has no namespace URI and no prefix
-        				// no action is required, since attrs don't use default
-        			}
-        		}
-
-            }
-
-            
-            // discard-default-content=true
-            // Default attr's are not passed to the filter and this contraint
-            // is applied only when discard-default-content=true 
-            // What about default xmlns attributes???? check for xmlnsAttr
-            if ((((fFeatures & DISCARDDEFAULT) != 0) && isSpecified)
-                || ((fFeatures & DISCARDDEFAULT) == 0)) {
-                applyFilter = true;
-            } else {
-            	addAttr = false;
-            }
-
-            if (applyFilter) {
-                // apply the filter for Attributes that are not default attributes
-                // or namespace decl attributes
-                if (fFilter != null
-                    && (fFilter.getWhatToShow() & NodeFilter.SHOW_ATTRIBUTE)
-                        != 0) {
-
-                    if (!xmlnsAttr) {
-                        short code = fFilter.acceptNode(attr);
-                        switch (code) {
-                            case NodeFilter.FILTER_REJECT :
-                            case NodeFilter.FILTER_SKIP :
-                                addAttr = false;
-                                break;
-                            default : //fall through..
-                        }
-                    }
-                }
-            }
-
-            // if the node is a namespace node
-            if (addAttr && xmlnsAttr) {
-                // If namespace-declarations=true, add the node , else don't add it
-                if ((fFeatures & NAMESPACEDECLS) != 0) {
-               		// The namespace may have been fixed up, in that case don't add it.
-                	if (localName != null && !"".equals(localName)) {
-                		fSerializer.addAttribute(attrNS, localName, attrName, type, attrValue);
-                	} 
-                }
-            } else if (
-                addAttr && !xmlnsAttr) { // if the node is not a namespace node
-                // If namespace-declarations=true, add the node with the Attr nodes namespaceURI
-                // else add the node setting it's namespace to null or else the serializer will later
-                // attempt to add a xmlns attr for the prefixed attribute
-                if (((fFeatures & NAMESPACEDECLS) != 0) && (attrNS != null)) {
-                    fSerializer.addAttribute(
-                        attrNS,
-                        localName,
-                        attrName,
-                        type,
-                        attrValue);
-                } else {
-                    fSerializer.addAttribute(
-                        "",
-                        localName,
-                        attrName,
-                        type,
-                        attrValue);
-                }
-            }
-
-            // 
-            if (xmlnsAttr && ((fFeatures & NAMESPACEDECLS) != 0)) {
-                int index;
-                // Use "" instead of null, as Xerces likes "" for the 
-                // name of the default namespace.  Fix attributed 
-                // to "Steven Murray" <smurray@ebt.com>.
-                String prefix =
-                    (index = attrName.indexOf(":")) < 0
-                        ? ""
-                        : attrName.substring(index + 1);
-
-                if (!"".equals(prefix)) {
-                    fSerializer.namespaceAfterStartElement(prefix, attrValue);
-                }
-            }
-        }
-        
-    }
-   
-    /**
-     * Serializes an ProcessingInstruction Node.
-     * 
-     * @param node The ProcessingInstruction Node to serialize
-     */
-    protected void serializePI(ProcessingInstruction node)
-        throws SAXException {
-        ProcessingInstruction pi = node;
-        String name = pi.getNodeName();
-
-        // well-formed=true
-        if ((fFeatures & WELLFORMED) != 0) {
-            isPIWellFormed(node);
-        }
-
-        // apply the LSSerializer filter
-        if (!applyFilter(node, NodeFilter.SHOW_PROCESSING_INSTRUCTION)) {
-            return;
-        }
-
-        // String data = pi.getData();
-        if (name.equals("xslt-next-is-raw")) {
-            fNextIsRaw = true;
-        } else {
-            this.fSerializer.processingInstruction(name, pi.getData());
-        }
-    }
-
-    /**
-     * Serializes an CDATASection Node.
-     * 
-     * @param node The CDATASection Node to serialize
-     */
-    protected void serializeCDATASection(CDATASection node)
-        throws SAXException {
-        // well-formed=true
-        if ((fFeatures & WELLFORMED) != 0) {
-            isCDATASectionWellFormed(node);
-        }
-
-        // cdata-sections = true
-        if ((fFeatures & CDATA) != 0) {
-
-            // split-cdata-sections = true
-            // Assumption: This parameter has an effect only when
-			// cdata-sections=true
-            // ToStream, by default splits cdata-sections. Hence the check
-			// below.
-            String nodeValue = node.getNodeValue();
-            int endIndex = nodeValue.indexOf("]]>");
-            if ((fFeatures & SPLITCDATA) != 0) {
-                if (endIndex >= 0) {
-                    // The first node split will contain the ]] markers
-                    String relatedData = nodeValue.substring(0, endIndex + 2);
-
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_CDATA_SECTIONS_SPLIT,
-                            null);
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_WARNING,
-                                msg,
-                                MsgKey.ER_CDATA_SECTIONS_SPLIT,
-                                null,
-                                relatedData,
-                                null));
-                    }
-                }
-            } else {
-                if (endIndex >= 0) {
-                    // The first node split will contain the ]] markers 
-                    String relatedData = nodeValue.substring(0, endIndex + 2);
-
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_CDATA_SECTIONS_SPLIT,
-                            null);
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_ERROR,
-                                msg,
-                                MsgKey.ER_CDATA_SECTIONS_SPLIT));
-                    }
-                    // Report an error and return.  What error???
-                    return;
-                }
-            }
-
-            // apply the LSSerializer filter
-            if (!applyFilter(node, NodeFilter.SHOW_CDATA_SECTION)) {
-                return;
-            }
-
-            // splits the cdata-section
-            if (fLexicalHandler != null) {
-                fLexicalHandler.startCDATA();
-            }
-            dispatachChars(node);
-            if (fLexicalHandler != null) {
-                fLexicalHandler.endCDATA();
-            }
-        } else {
-            dispatachChars(node);
-        }
-    }
-
-    /**
-     * Serializes an Text Node.
-     * 
-     * @param node The Text Node to serialize
-     */
-    protected void serializeText(Text node) throws SAXException {
-        if (fNextIsRaw) {
-            fNextIsRaw = false;
-            fSerializer.processingInstruction(
-                javax.xml.transform.Result.PI_DISABLE_OUTPUT_ESCAPING,
-                "");
-            dispatachChars(node);
-            fSerializer.processingInstruction(
-                javax.xml.transform.Result.PI_ENABLE_OUTPUT_ESCAPING,
-                "");
-        } else {
-            // keep track of dispatch or not to avoid duplicaiton of filter code
-            boolean bDispatch = false;
-
-            // well-formed=true
-            if ((fFeatures & WELLFORMED) != 0) {
-                isTextWellFormed(node);
-            }
-
-            // if the node is whitespace
-            // Determine the Attr's type.
-            boolean isElementContentWhitespace = false;
-            if (fIsLevel3DOM) {
-                isElementContentWhitespace =
-                       node.isElementContentWhitespace();
-            }
-
-            if (isElementContentWhitespace) {
-                // element-content-whitespace=true
-                if ((fFeatures & ELEM_CONTENT_WHITESPACE) != 0) {
-                    bDispatch = true;
-                }
-            } else {
-                bDispatch = true;
-            }
-
-            // apply the LSSerializer filter
-            if (!applyFilter(node, NodeFilter.SHOW_TEXT)) {
-                return;
-            }
-
-            if (bDispatch) {
-                dispatachChars(node);
-            }
-        }
-    }
-
-    /**
-     * Serializes an EntityReference Node.
-     * 
-     * @param node The EntityReference Node to serialize
-     * @param bStart Inicates if called from start or endNode 
-     */
-    protected void serializeEntityReference(
-        EntityReference node,
-        boolean bStart)
-        throws SAXException {
-        if (bStart) {
-            EntityReference eref = node;
-            // entities=true
-            if ((fFeatures & ENTITIES) != 0) {
-                
-                // perform well-formedness and other checking only if 
-                // entities = true
-
-                // well-formed=true
-                if ((fFeatures & WELLFORMED) != 0) {
-                    isEntityReferneceWellFormed(node);
-                }
-
-                // check "unbound-prefix-in-entity-reference" [fatal] 
-                // Raised if the configuration parameter "namespaces" is set to true
-                if ((fFeatures & NAMESPACES) != 0) {
-                    checkUnboundPrefixInEntRef(node);
-                }
-
-                // The filter should not apply in this case, since the
-                // EntityReference is not being expanded.
-                // should we pass entity reference nodes to the filter???
-            } 
-            
-            if (fLexicalHandler != null) {
-
-                // startEntity outputs only Text but not Element, Attr, Comment 
-                // and PI child nodes.  It does so by setting the m_inEntityRef 
-                // in ToStream and using this to decide if a node is to be 
-                // serialized or not.
-                fLexicalHandler.startEntity(eref.getNodeName());
-            } 
-
-        } else {
-            EntityReference eref = node;
-            // entities=true or false, 
-            if (fLexicalHandler != null) {
-                fLexicalHandler.endEntity(eref.getNodeName());
-            }
-        }
-    }
-
-    
-    // ***********************************************************************
-    // Methods to check well-formedness
-    // ***********************************************************************
-    /**
-     * Taken from org.apache.xerces.dom.CoreDocumentImpl
-     * 
-     * Check the string against XML's definition of acceptable names for
-     * elements and attributes and so on using the XMLCharacterProperties
-     * utility class
-     */
-    protected boolean isXMLName(String s, boolean xml11Version) {
-
-        if (s == null) {
-            return false;
-        }
-        if (!xml11Version)
-            return XMLChar.isValidName(s);
-        else
-            return XML11Char.isXML11ValidName(s);
-    }
-
-    /**
-     * Taken from org.apache.xerces.dom.CoreDocumentImpl
-     *  
-     * Checks if the given qualified name is legal with respect
-     * to the version of XML to which this document must conform.
-     *
-     * @param prefix prefix of qualified name
-     * @param local local part of qualified name
-     */
-    protected boolean isValidQName(
-        String prefix,
-        String local,
-        boolean xml11Version) {
-
-        // check that both prefix and local part match NCName
-        if (local == null)
-            return false;
-        boolean validNCName = false;
-
-        if (!xml11Version) {
-            validNCName =
-                (prefix == null || XMLChar.isValidNCName(prefix))
-                    && XMLChar.isValidNCName(local);
-        } else {
-            validNCName =
-                (prefix == null || XML11Char.isXML11ValidNCName(prefix))
-                    && XML11Char.isXML11ValidNCName(local);
-        }
-
-        return validNCName;
-    }
-
-    /**
-     * Checks if a XML character is well-formed
-     * 
-     * @param characters A String of characters to be checked for Well-Formedness
-     * @param refInvalidChar A reference to the character to be returned that was determined invalid. 
-     */
-    protected boolean isWFXMLChar(String chardata, Character refInvalidChar) {
-        if (chardata == null || (chardata.length() == 0)) {
-            return true;
-        }
-
-        char[] dataarray = chardata.toCharArray();
-        int datalength = dataarray.length;
-
-        // version of the document is XML 1.1
-        if (fIsXMLVersion11) {
-            //we need to check all characters as per production rules of XML11
-            int i = 0;
-            while (i < datalength) {
-                if (XML11Char.isXML11Invalid(dataarray[i++])) {
-                    // check if this is a supplemental character
-                    char ch = dataarray[i - 1];
-                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
-                        char ch2 = dataarray[i++];
-                        if (XMLChar.isLowSurrogate(ch2)
-                            && XMLChar.isSupplemental(
-                                XMLChar.supplemental(ch, ch2))) {
-                            continue;
-                        }
-                    }
-                    // Reference to invalid character which is returned
-                    refInvalidChar = new Character(ch);
-                    return false;
-                }
-            }
-        } // version of the document is XML 1.0
-        else {
-            // we need to check all characters as per production rules of XML 1.0
-            int i = 0;
-            while (i < datalength) {
-                if (XMLChar.isInvalid(dataarray[i++])) {
-                    // check if this is a supplemental character
-                    char ch = dataarray[i - 1];
-                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
-                        char ch2 = dataarray[i++];
-                        if (XMLChar.isLowSurrogate(ch2)
-                            && XMLChar.isSupplemental(
-                                XMLChar.supplemental(ch, ch2))) {
-                            continue;
-                        }
-                    }
-                    // Reference to invalid character which is returned                    
-                    refInvalidChar = new Character(ch);
-                    return false;
-                }
-            }
-        } // end-else fDocument.isXMLVersion()
-
-        return true;
-    } // isXMLCharWF
-
-    /**
-     * Checks if a XML character is well-formed.  If there is a problem with
-     * the character a non-null Character is returned else null is returned.
-     * 
-     * @param characters A String of characters to be checked for Well-Formedness
-     * @return Character A reference to the character to be returned that was determined invalid. 
-     */
-    protected Character isWFXMLChar(String chardata) {
-    	Character refInvalidChar;
-        if (chardata == null || (chardata.length() == 0)) {
-            return null;
-        }
-
-        char[] dataarray = chardata.toCharArray();
-        int datalength = dataarray.length;
-
-        // version of the document is XML 1.1
-        if (fIsXMLVersion11) {
-            //we need to check all characters as per production rules of XML11
-            int i = 0;
-            while (i < datalength) {
-                if (XML11Char.isXML11Invalid(dataarray[i++])) {
-                    // check if this is a supplemental character
-                    char ch = dataarray[i - 1];
-                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
-                        char ch2 = dataarray[i++];
-                        if (XMLChar.isLowSurrogate(ch2)
-                            && XMLChar.isSupplemental(
-                                XMLChar.supplemental(ch, ch2))) {
-                            continue;
-                        }
-                    }
-                    // Reference to invalid character which is returned
-                    refInvalidChar = new Character(ch);
-                    return refInvalidChar;
-                }
-            }
-        } // version of the document is XML 1.0
-        else {
-            // we need to check all characters as per production rules of XML 1.0
-            int i = 0;
-            while (i < datalength) {
-                if (XMLChar.isInvalid(dataarray[i++])) {
-                    // check if this is a supplemental character
-                    char ch = dataarray[i - 1];
-                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
-                        char ch2 = dataarray[i++];
-                        if (XMLChar.isLowSurrogate(ch2)
-                            && XMLChar.isSupplemental(
-                                XMLChar.supplemental(ch, ch2))) {
-                            continue;
-                        }
-                    }
-                    // Reference to invalid character which is returned                    
-                    refInvalidChar = new Character(ch);
-                    return refInvalidChar;
-                }
-            }
-        } // end-else fDocument.isXMLVersion()
-
-        return null;
-    } // isXMLCharWF
-
-    /**
-     * Checks if a comment node is well-formed
-     * 
-     * @param data The contents of the comment node
-     * @return a boolean indiacating if the comment is well-formed or not.
-     */
-    protected void isCommentWellFormed(String data) {
-        if (data == null || (data.length() == 0)) {
-            return;
-        }
-
-        char[] dataarray = data.toCharArray();
-        int datalength = dataarray.length;
-
-        // version of the document is XML 1.1
-        if (fIsXMLVersion11) {
-            // we need to check all chracters as per production rules of XML11
-            int i = 0;
-            while (i < datalength) {
-                char c = dataarray[i++];
-                if (XML11Char.isXML11Invalid(c)) {
-                    // check if this is a supplemental character
-                    if (XMLChar.isHighSurrogate(c) && i < datalength) {
-                        char c2 = dataarray[i++];
-                        if (XMLChar.isLowSurrogate(c2)
-                            && XMLChar.isSupplemental(
-                                XMLChar.supplemental(c, c2))) {
-                            continue;
-                        }
-                    }
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
-                            new Object[] { new Character(c)});
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_FATAL_ERROR,
-                                msg,
-                                MsgKey.ER_WF_INVALID_CHARACTER,
-                                null,
-                                null,
-                                null));
-                    }
-                } else if (c == '-' && i < datalength && dataarray[i] == '-') {
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_WF_DASH_IN_COMMENT,
-                            null);
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_FATAL_ERROR,
-                                msg,
-                                MsgKey.ER_WF_INVALID_CHARACTER,
-                                null,
-                                null,
-                                null));
-                    }
-                }
-            }
-        } // version of the document is XML 1.0
-        else {
-            // we need to check all chracters as per production rules of XML 1.0
-            int i = 0;
-            while (i < datalength) {
-                char c = dataarray[i++];
-                if (XMLChar.isInvalid(c)) {
-                    // check if this is a supplemental character
-                    if (XMLChar.isHighSurrogate(c) && i < datalength) {
-                        char c2 = dataarray[i++];
-                        if (XMLChar.isLowSurrogate(c2)
-                            && XMLChar.isSupplemental(
-                                XMLChar.supplemental(c, c2))) {
-                            continue;
-                        }
-                    }
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
-                            new Object[] { new Character(c)});
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_FATAL_ERROR,
-                                msg,
-                                MsgKey.ER_WF_INVALID_CHARACTER,
-                                null,
-                                null,
-                                null));
-                    }
-                } else if (c == '-' && i < datalength && dataarray[i] == '-') {
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_WF_DASH_IN_COMMENT,
-                            null);
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_FATAL_ERROR,
-                                msg,
-                                MsgKey.ER_WF_INVALID_CHARACTER,
-                                null,
-                                null,
-                                null));
-                    }
-                }
-            }
-        }
-        return;
-    }
-
-    /**
-     * Checks if an element node is well-formed, by checking its Name for well-formedness.
-     * 
-     * @param data The contents of the comment node
-     * @return a boolean indiacating if the comment is well-formed or not.
-     */
-    protected void isElementWellFormed(Node node) {
-        boolean isNameWF = false;
-        if ((fFeatures & NAMESPACES) != 0) {
-            isNameWF =
-                isValidQName(
-                    node.getPrefix(),
-                    node.getLocalName(),
-                    fIsXMLVersion11);
-        } else {
-            isNameWF = isXMLName(node.getNodeName(), fIsXMLVersion11);
-        }
-
-        if (!isNameWF) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                    new Object[] { "Element", node.getNodeName()});
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                        null,
-                        null,
-                        null));
-            }
-        }
-    }
-
-    /**
-     * Checks if an attr node is well-formed, by checking it's Name and value
-     * for well-formedness.
-     * 
-     * @param data The contents of the comment node
-     * @return a boolean indiacating if the comment is well-formed or not.
-     */
-    protected void isAttributeWellFormed(Node node) {
-        boolean isNameWF = false;
-        if ((fFeatures & NAMESPACES) != 0) {
-            isNameWF =
-                isValidQName(
-                    node.getPrefix(),
-                    node.getLocalName(),
-                    fIsXMLVersion11);
-        } else {
-            isNameWF = isXMLName(node.getNodeName(), fIsXMLVersion11);
-        }
-
-        if (!isNameWF) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                    new Object[] { "Attr", node.getNodeName()});
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                        null,
-                        null,
-                        null));
-            }
-        }
-
-        // Check the Attr's node value
-        // WFC: No < in Attribute Values
-        String value = node.getNodeValue();
-        if (value.indexOf('<') >= 0) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_LT_IN_ATTVAL,
-                    new Object[] {
-                        ((Attr) node).getOwnerElement().getNodeName(),
-                        node.getNodeName()});
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_LT_IN_ATTVAL,
-                        null,
-                        null,
-                        null));
-            }
-        }
-
-        // we need to loop through the children of attr nodes and check their values for
-        // well-formedness  
-        NodeList children = node.getChildNodes();
-        for (int i = 0; i < children.getLength(); i++) {
-            Node child = children.item(i);
-            // An attribute node with no text or entity ref child for example
-            // doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ns");
-            // followes by
-            // element.setAttributeNodeNS(attribute);
-            // can potentially lead to this situation.  If the attribute
-            // was a prefix Namespace attribute declaration then then DOM Core 
-            // should have some exception defined for this.
-            if (child == null) {
-                // we should probably report an error
-                continue;
-            }
-            switch (child.getNodeType()) {
-                case Node.TEXT_NODE :
-                    isTextWellFormed((Text) child);
-                    break;
-                case Node.ENTITY_REFERENCE_NODE :
-                    isEntityReferneceWellFormed((EntityReference) child);
-                    break;
-                default :
-            }
-        }
-
-        // TODO:
-        // WFC: Check if the attribute prefix is bound to 
-        // http://www.w3.org/2000/xmlns/  
-
-        // WFC: Unique Att Spec
-        // Perhaps pass a seen boolean value to this method.  serializeAttList will determine
-        // if the attr was seen before.
-    }
-
-    /**
-     * Checks if a PI node is well-formed, by checking it's Name and data
-     * for well-formedness.
-     * 
-     * @param data The contents of the comment node
-     */
-    protected void isPIWellFormed(ProcessingInstruction node) {
-        // Is the PI Target a valid XML name
-        if (!isXMLName(node.getNodeName(), fIsXMLVersion11)) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                    new Object[] { "ProcessingInstruction", node.getTarget()});
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                        null,
-                        null,
-                        null));
-            }
-        }
-
-        // Does the PI Data carry valid XML characters
-
-        // REVISIT: Should we check if the PI DATA contains a ?> ???
-        Character invalidChar = isWFXMLChar(node.getData());
-        if (invalidChar != null) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
-                    new Object[] { Integer.toHexString(Character.getNumericValue(invalidChar.charValue())) });
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER,
-                        null,
-                        null,
-                        null));
-            }
-        }
-    }
-
-    /**
-     * Checks if an CDATASection node is well-formed, by checking it's data
-     * for well-formedness.  Note that the presence of a CDATA termination mark
-     * in the contents of a CDATASection is handled by the parameter 
-     * spli-cdata-sections
-     * 
-     * @param data The contents of the comment node
-     */
-    protected void isCDATASectionWellFormed(CDATASection node) {
-        // Does the data valid XML character data        
-        Character invalidChar = isWFXMLChar(node.getData());
-        //if (!isWFXMLChar(node.getData(), invalidChar)) {
-        if (invalidChar != null) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
-                    new Object[] { Integer.toHexString(Character.getNumericValue(invalidChar.charValue())) });
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER,
-                        null,
-                        null,
-                        null));
-            }
-        }
-    }
-
-    /**
-     * Checks if an Text node is well-formed, by checking if it contains invalid
-     * XML characters.
-     * 
-     * @param data The contents of the comment node
-     */
-    protected void isTextWellFormed(Text node) {
-        // Does the data valid XML character data        
-    	Character invalidChar = isWFXMLChar(node.getData());
-    	if (invalidChar != null) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
-                    new Object[] { Integer.toHexString(Character.getNumericValue(invalidChar.charValue())) });
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER,
-                        null,
-                        null,
-                        null));
-            }
-        }
-    }
-
-    /**
-     * Checks if an EntityRefernece node is well-formed, by checking it's node name.  Then depending
-     * on whether it is referenced in Element content or in an Attr Node, checks if the EntityReference
-     * references an unparsed entity or a external entity and if so throws raises the 
-     * appropriate well-formedness error.  
-     * 
-     * @param data The contents of the comment node
-     * @parent The parent of the EntityReference Node
-     */
-    protected void isEntityReferneceWellFormed(EntityReference node) {
-        // Is the EntityReference name a valid XML name
-        if (!isXMLName(node.getNodeName(), fIsXMLVersion11)) {
-            String msg =
-                Utils.messages.createMessage(
-                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                    new Object[] { "EntityReference", node.getNodeName()});
-
-            if (fErrorHandler != null) {
-                fErrorHandler.handleError(
-                    new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR,
-                        msg,
-                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                        null,
-                        null,
-                        null));
-            }
-        }
-
-        // determine the parent node
-        Node parent = node.getParentNode();
-
-        // Traverse the declared entities and check if the nodeName and namespaceURI
-        // of the EntityReference matches an Entity.  If so, check the if the notationName
-        // is not null, if so, report an error.
-        DocumentType docType = node.getOwnerDocument().getDoctype();
-        if (docType != null) {
-            NamedNodeMap entities = docType.getEntities();
-            for (int i = 0; i < entities.getLength(); i++) {
-                Entity ent = (Entity) entities.item(i);
-
-                String nodeName =
-                    node.getNodeName() == null ? "" : node.getNodeName();
-                String nodeNamespaceURI =
-                    node.getNamespaceURI() == null
-                        ? ""
-                        : node.getNamespaceURI();
-                String entName =
-                    ent.getNodeName() == null ? "" : ent.getNodeName();
-                String entNamespaceURI =
-                    ent.getNamespaceURI() == null ? "" : ent.getNamespaceURI();
-                // If referenced in Element content
-                // WFC: Parsed Entity
-                if (parent.getNodeType() == Node.ELEMENT_NODE) {
-                    if (entNamespaceURI.equals(nodeNamespaceURI)
-                        && entName.equals(nodeName)) {
-
-                        if (ent.getNotationName() != null) {
-                            String msg =
-                                Utils.messages.createMessage(
-                                    MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
-                                    new Object[] { node.getNodeName()});
-
-                            if (fErrorHandler != null) {
-                                fErrorHandler.handleError(
-                                    new DOMErrorImpl(
-                                        DOMError.SEVERITY_FATAL_ERROR,
-                                        msg,
-                                        MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
-                                        null,
-                                        null,
-                                        null));
-                            }
-                        }
-                    }
-                } // end if WFC: Parsed Entity
-
-                // If referenced in an Attr value
-                // WFC: No External Entity References
-                if (parent.getNodeType() == Node.ATTRIBUTE_NODE) {
-                    if (entNamespaceURI.equals(nodeNamespaceURI)
-                        && entName.equals(nodeName)) {
-
-                        if (ent.getPublicId() != null
-                            || ent.getSystemId() != null
-                            || ent.getNotationName() != null) {
-                            String msg =
-                                Utils.messages.createMessage(
-                                    MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
-                                    new Object[] { node.getNodeName()});
-
-                            if (fErrorHandler != null) {
-                                fErrorHandler.handleError(
-                                    new DOMErrorImpl(
-                                        DOMError.SEVERITY_FATAL_ERROR,
-                                        msg,
-                                        MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
-                                        null,
-                                        null,
-                                        null));
-                            }
-                        }
-                    }
-                } //end if WFC: No External Entity References
-            }
-        }
-    } // isEntityReferneceWellFormed    
-
-    /**
-     * If the configuration parameter "namespaces" is set to true, this methods
-     * checks if an entity whose replacement text contains unbound namespace 
-     * prefixes is referenced in a location where there are no bindings for 
-     * the namespace prefixes and if so raises a LSException with the error-type
-     * "unbound-prefix-in-entity-reference"   
-     * 
-     * @param Node, The EntityReference nodes whose children are to be checked
-     */
-    protected void checkUnboundPrefixInEntRef(Node node) {
-        Node child, next;
-        for (child = node.getFirstChild(); child != null; child = next) {
-            next = child.getNextSibling();
-
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-
-                //If a NamespaceURI is not declared for the current
-                //node's prefix, raise a fatal error.
-                String prefix = child.getPrefix();
-                if (prefix != null
-                		&& fNSBinder.getURI(prefix) == null) {
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
-                            new Object[] {
-                                node.getNodeName(),
-                                child.getNodeName(),
-                                prefix });
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_FATAL_ERROR,
-                                msg,
-                                MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
-                                null,
-                                null,
-                                null));
-                    }
-                }
-
-                NamedNodeMap attrs = child.getAttributes();
-
-                for (int i = 0; i < attrs.getLength(); i++) {
-                    String attrPrefix = attrs.item(i).getPrefix();
-                    if (attrPrefix != null
-                    		&& fNSBinder.getURI(attrPrefix) == null) {
-                        String msg =
-                            Utils.messages.createMessage(
-                                MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
-                                new Object[] {
-                                    node.getNodeName(),
-                                    child.getNodeName(),
-                                    attrs.item(i)});
-
-                        if (fErrorHandler != null) {
-                            fErrorHandler.handleError(
-                                new DOMErrorImpl(
-                                    DOMError.SEVERITY_FATAL_ERROR,
-                                    msg,
-                                    MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
-                                    null,
-                                    null,
-                                    null));
-                        }
-                    }
-                }
-            }
-
-            if (child.hasChildNodes()) {
-                checkUnboundPrefixInEntRef(child);
-            }
-        }
-    }
-
-    // ***********************************************************************
-    // Namespace normalization
-    // ***********************************************************************
-    /**
-     * Records local namespace declarations, to be used for normalization later
-     * 
-     * @param Node, The element node, whose namespace declarations are to be recorded
-     */
-    protected void recordLocalNSDecl(Node node) {
-        NamedNodeMap atts = ((Element) node).getAttributes();
-        int length = atts.getLength();
-
-        for (int i = 0; i < length; i++) {
-            Node attr = atts.item(i);
-
-            String localName = attr.getLocalName();
-            String attrPrefix = attr.getPrefix();
-            String attrValue = attr.getNodeValue();
-            String attrNS = attr.getNamespaceURI();
-
-            localName =
-                localName == null
-                    || XMLNS_PREFIX.equals(localName) ? "" : localName;
-            attrPrefix = attrPrefix == null ? "" : attrPrefix;
-            attrValue = attrValue == null ? "" : attrValue;
-            attrNS = attrNS == null ? "" : attrNS;
-
-            // check if attribute is a namespace decl
-            if (XMLNS_URI.equals(attrNS)) {
-
-                // No prefix may be bound to http://www.w3.org/2000/xmlns/.
-                if (XMLNS_URI.equals(attrValue)) {
-                    String msg =
-                        Utils.messages.createMessage(
-                            MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
-                            new Object[] { attrPrefix, XMLNS_URI });
-
-                    if (fErrorHandler != null) {
-                        fErrorHandler.handleError(
-                            new DOMErrorImpl(
-                                DOMError.SEVERITY_ERROR,
-                                msg,
-                                MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
-                                null,
-                                null,
-                                null));
-                    }
-                } else {
-                    // store the namespace-declaration
-                	if (XMLNS_PREFIX.equals(attrPrefix) ) {
-                        // record valid decl
-                        if (attrValue.length() != 0) {
-                            fNSBinder.declarePrefix(localName, attrValue);
-                        } else {
-                            // Error; xmlns:prefix=""
-                        }
-                    } else { // xmlns
-                        // empty prefix is always bound ("" or some string)
-                        fNSBinder.declarePrefix("", attrValue);
-                    }
-                }
-                
-            }
-        }
-    }
-
-    /**
-     * Fixes an element's namespace
-     * 
-     * @param Node, The element node, whose namespace is to be fixed
-     */
-    protected void fixupElementNS(Node node) throws SAXException {
-        String namespaceURI = ((Element) node).getNamespaceURI();
-        String prefix = ((Element) node).getPrefix();
-        String localName = ((Element) node).getLocalName();
-
-        if (namespaceURI != null) {
-            //if ( Element's prefix/namespace pair (or default namespace,
-            // if no prefix) are within the scope of a binding )
-            prefix = prefix == null ? "" : prefix;
-            String inScopeNamespaceURI = fNSBinder.getURI(prefix);
-
-            if ((inScopeNamespaceURI != null
-                && inScopeNamespaceURI.equals(namespaceURI))) {
-                // do nothing, declaration in scope is inherited
-                
-            } else {
-                // Create a local namespace declaration attr for this namespace,
-                // with Element's current prefix (or a default namespace, if
-                // no prefix). If there's a conflicting local declaration
-                // already present, change its value to use this namespace.
-                
-                // Add the xmlns declaration attribute
-            	//fNSBinder.pushNamespace(prefix, namespaceURI, fElementDepth);
-                if ((fFeatures & NAMESPACEDECLS) != 0) {
-                    if ("".equals(prefix) || "".equals(namespaceURI)) {
-                    	((Element)node).setAttributeNS(XMLNS_URI, XMLNS_PREFIX, namespaceURI);
-                    } else {
-                    	((Element)node).setAttributeNS(XMLNS_URI, XMLNS_PREFIX + ":" + prefix, namespaceURI);
-                    }
-                }
-                fLocalNSBinder.declarePrefix(prefix, namespaceURI);
-                fNSBinder.declarePrefix(prefix, namespaceURI);
-
-            } 
-        } else {
-            // Element has no namespace
-            // DOM Level 1
-            if (localName == null || "".equals(localName)) {
-                //  DOM Level 1 node!
-                String msg =
-                    Utils.messages.createMessage(
-                        MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
-                        new Object[] { node.getNodeName()});
-
-                if (fErrorHandler != null) {
-                    fErrorHandler.handleError(
-                        new DOMErrorImpl(
-                            DOMError.SEVERITY_ERROR,
-                            msg,
-                            MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
-                            null,
-                            null,
-                            null));
-                }
-            } else {
-            	namespaceURI = fNSBinder.getURI("");
-            	if (namespaceURI !=null && namespaceURI.length() > 0) {
-            	    ((Element)node).setAttributeNS(XMLNS_URI, XMLNS_PREFIX, "");
-            		fLocalNSBinder.declarePrefix("", "");
-                    fNSBinder.declarePrefix("", "");
-            	}
-            }
-        }
-    }
-    /** 
-     * This table is a quick lookup of a property key (String) to the integer that
-     * is the bit to flip in the fFeatures field, so the integers should have
-     * values 1,2,4,8,16...
-     * 
-     */
-    private static final Hashtable s_propKeys = new Hashtable();
-    static {
-
-        // Initialize the mappings of property keys to bit values (Integer objects)
-        // or mappings to a String object "", which indicates we are interested
-        // in the property, but it does not have a simple bit value to flip
-
-        // cdata-sections
-        int i = CDATA;
-        Integer val = new Integer(i);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_CDATA_SECTIONS,
-            val);
-
-        // comments
-        int i1 = COMMENTS;
-        val = new Integer(i1);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_COMMENTS,
-            val);
-
-        // element-content-whitespace
-        int i2 = ELEM_CONTENT_WHITESPACE;
-        val = new Integer(i2);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-            val);
-        int i3 = ENTITIES;
-
-        // entities
-        val = new Integer(i3);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_ENTITIES,
-            val);
-
-        // namespaces
-        int i4 = NAMESPACES;
-        val = new Integer(i4);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_NAMESPACES,
-            val);
-
-        // namespace-declarations
-        int i5 = NAMESPACEDECLS;
-        val = new Integer(i5);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-            val);
-
-        // split-cdata-sections
-        int i6 = SPLITCDATA;
-        val = new Integer(i6);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_SPLIT_CDATA,
-            val);
-
-        // discard-default-content	
-        int i7 = WELLFORMED;
-        val = new Integer(i7);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_WELLFORMED,
-            val);
-
-        // discard-default-content	
-        int i8 = DISCARDDEFAULT;
-        val = new Integer(i8);
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
-            val);
-
-        // We are interested in these properties, but they don't have a simple
-        // bit value to deal with.
-        s_propKeys.put(
-            DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_FORMAT_PRETTY_PRINT,
-            "");
-        s_propKeys.put(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "");
-        s_propKeys.put(
-            DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION,
-            "");
-        s_propKeys.put(DOMConstants.S_XSL_OUTPUT_ENCODING, "");
-        s_propKeys.put(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.DOM_ENTITIES, "");
-    }
-
-    /**
-     * Initializes fFeatures based on the DOMConfiguration Parameters set.
-     *
-     * @param properties DOMConfiguraiton properties that were set and which are
-     * to be used while serializing the DOM. 
-     */
-    protected void initProperties(Properties properties) {
-
-        for (Enumeration keys = properties.keys(); keys.hasMoreElements();) {
-
-            final String key = (String) keys.nextElement();
-    
-            // caonical-form
-            // Other features will be enabled or disabled when this is set to true or false.
-
-            // error-handler; set via the constructor
-
-            // infoset
-            // Other features will be enabled or disabled when this is set to true
-
-            // A quick lookup for the given set of properties (cdata-sections ...)
-            final Object iobj = s_propKeys.get(key);
-            if (iobj != null) {
-                if (iobj instanceof Integer) {
-                    // Dealing with a property that has a simple bit value that
-                    // we need to set
-
-                    // cdata-sections			
-                    // comments
-                    // element-content-whitespace
-                    // entities
-                    // namespaces
-                    // namespace-declarations
-                    // split-cdata-sections
-                    // well-formed
-                    // discard-default-content
-                    final int BITFLAG = ((Integer) iobj).intValue();
-                    if ((properties.getProperty(key).endsWith("yes"))) {
-                        fFeatures = fFeatures | BITFLAG;
-                    } else {
-                        fFeatures = fFeatures & ~BITFLAG;
-                    }
-                } else {
-                    // We are interested in the property, but it is not
-                    // a simple bit that we need to set.
-
-                    if ((DOMConstants.S_DOM3_PROPERTIES_NS
-                        + DOMConstants.DOM_FORMAT_PRETTY_PRINT)
-                        .equals(key)) {
-                        // format-pretty-print; set internally on the serializers via xsl:output properties in LSSerializer
-                        if ((properties.getProperty(key).endsWith("yes"))) {
-                            fSerializer.setIndent(true);
-                            fSerializer.setIndentAmount(3);
-                        } else {
-                            fSerializer.setIndent(false);
-                        }
-                    } else if (
-                        (DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL).equals(
-                            key)) {
-                        // omit-xml-declaration; set internally on the serializers via xsl:output properties in LSSerializer
-                        if ((properties.getProperty(key).endsWith("yes"))) {
-                            fSerializer.setOmitXMLDeclaration(true);
-                        } else {
-                            fSerializer.setOmitXMLDeclaration(false);
-                        }
-                    } else if (
-                        (
-                            DOMConstants.S_XERCES_PROPERTIES_NS
-                                + DOMConstants.S_XML_VERSION).equals(
-                            key)) {
-                        // Retreive the value of the XML Version attribute via the xml-version
-                        String version = properties.getProperty(key);
-                        if ("1.1".equals(version)) {
-                            fIsXMLVersion11 = true;
-                            fSerializer.setVersion(version);
-                        } else {
-                            fSerializer.setVersion("1.0");
-                        }
-                    } else if (
-                        (DOMConstants.S_XSL_OUTPUT_ENCODING).equals(key)) {
-                        // Retreive the value of the XML Encoding attribute
-                        String encoding = properties.getProperty(key);
-                        if (encoding != null) {
-                            fSerializer.setEncoding(encoding);
-                        }
-                    } else if ((DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES).equals(key)) {
-                        // Preserve entity references in the document
-                        if ((properties.getProperty(key).endsWith("yes"))) {
-                            fSerializer.setDTDEntityExpansion(false);
-                        }
-                        else {
-                            fSerializer.setDTDEntityExpansion(true);
-                        }
-                    } else {
-                        // We shouldn't get here, ever, now what?
-                    }
-                }
-            }
-        }
-        // Set the newLine character to use
-        if (fNewLine != null) {
-            fSerializer.setOutputProperty(OutputPropertiesFactory.S_KEY_LINE_SEPARATOR, fNewLine);
-        }
-    }
-
-} //TreeWalker
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Properties;
+
+import org.apache.xml.serializer.dom3.NamespaceSupport;
+import org.apache.xml.serializer.OutputPropertiesFactory;
+import org.apache.xml.serializer.SerializationHandler;
+import org.apache.xml.serializer.utils.MsgKey;
+import org.apache.xml.serializer.utils.Utils;
+import org.apache.xml.serializer.utils.XML11Char;
+import org.apache.xml.serializer.utils.XMLChar;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CDATASection;
+import org.w3c.dom.Comment;
+import org.w3c.dom.DOMError;
+import org.w3c.dom.DOMErrorHandler;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Entity;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+import org.w3c.dom.ls.LSSerializerFilter;
+import org.w3c.dom.traversal.NodeFilter;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.LocatorImpl;
+
+/**
+ * Built on org.apache.xml.serializer.TreeWalker and adds functionality to
+ * traverse and serialize a DOM Node (Level 2 or Level 3) as specified in 
+ * the DOM Level 3 LS Recommedation by evaluating and applying DOMConfiguration 
+ * parameters and filters if any during serialization.
+ *   
+ * @xsl.usage internal
+ */
+final class DOM3TreeWalker {
+
+    /**
+     * The SerializationHandler, it extends ContentHandler and when
+     * this class is instantiated via the constructor provided, a
+     * SerializationHandler object is passed to it.
+     */
+    private SerializationHandler fSerializer = null;
+
+    /** We do not need DOM2Helper since DOM Level 3 LS applies to DOM Level 2 or newer */
+
+    /** Locator object for this TreeWalker          */
+    private LocatorImpl fLocator = new LocatorImpl();
+
+    /** ErrorHandler */
+    private DOMErrorHandler fErrorHandler = null;
+
+    /** LSSerializerFilter */
+    private LSSerializerFilter fFilter = null;
+
+    /** If the serializer is an instance of a LexicalHandler */
+    private LexicalHandler fLexicalHandler = null;
+
+    private int fWhatToShowFilter;
+
+    /** New Line character to use in serialization */
+    private String fNewLine = null;
+
+    /** DOMConfiguration Properties */
+    private Properties fDOMConfigProperties = null;
+
+    /** Keeps track if we are in an entity reference when entities=true */
+    private boolean fInEntityRef = false;
+
+    /** Stores the version of the XML document to be serialize */
+    private String fXMLVersion = null;
+
+    /** XML Version, default 1.0 */
+    private boolean fIsXMLVersion11 = false;
+
+    /** Is the Node a Level 3 DOM node */
+    private boolean fIsLevel3DOM = false;
+
+    /** DOM Configuration Parameters */
+    private int fFeatures = 0;
+
+    /** Flag indicating whether following text to be processed is raw text          */
+    boolean fNextIsRaw = false;
+
+    // 
+    private static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";
+
+    //
+    private static final String XMLNS_PREFIX = "xmlns";
+
+    // 
+    private static final String XML_URI = "http://www.w3.org/XML/1998/namespace";
+
+    // 
+    private static final String XML_PREFIX = "xml";
+
+    /** stores namespaces in scope */
+    protected NamespaceSupport fNSBinder;
+
+    /** stores all namespace bindings on the current element */
+    protected NamespaceSupport fLocalNSBinder;
+    
+    /** stores the current element depth */
+    private int fElementDepth = 0;
+
+    // ***********************************************************************
+    // DOMConfiguration paramter settings 
+    // ***********************************************************************
+    // Parameter canonical-form, true [optional] - NOT SUPPORTED 
+    private final static int CANONICAL = 0x1 << 0;
+
+    // Parameter cdata-sections, true [required] (default)
+    private final static int CDATA = 0x1 << 1;
+
+    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED 
+    private final static int CHARNORMALIZE = 0x1 << 2;
+
+    // Parameter comments, true [required] (default)
+    private final static int COMMENTS = 0x1 << 3;
+
+    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
+    private final static int DTNORMALIZE = 0x1 << 4;
+
+    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
+    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
+
+    // Parameter entities, true [required] (default)
+    private final static int ENTITIES = 0x1 << 6;
+
+    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
+    private final static int INFOSET = 0x1 << 7;
+
+    // Parameter namespaces, true [required] (default)
+    private final static int NAMESPACES = 0x1 << 8;
+
+    // Parameter namespace-declarations, true [required] (default)
+    private final static int NAMESPACEDECLS = 0x1 << 9;
+
+    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
+    private final static int NORMALIZECHARS = 0x1 << 10;
+
+    // Parameter split-cdata-sections, true [required] (default)
+    private final static int SPLITCDATA = 0x1 << 11;
+
+    // Parameter validate, true [optional] - NOT SUPPORTED
+    private final static int VALIDATE = 0x1 << 12;
+
+    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
+    private final static int SCHEMAVALIDATE = 0x1 << 13;
+
+    // Parameter split-cdata-sections, true [required] (default)
+    private final static int WELLFORMED = 0x1 << 14;
+
+    // Parameter discard-default-content, true [required] (default)
+    // Not sure how this will be used in level 2 Documents
+    private final static int DISCARDDEFAULT = 0x1 << 15;
+
+    // Parameter format-pretty-print, true [optional] 
+    private final static int PRETTY_PRINT = 0x1 << 16;
+
+    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
+    // We currently do not support XML 1.1 character normalization
+    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
+
+    // Parameter discard-default-content, true [required] (default)
+    private final static int XMLDECL = 0x1 << 18;
+
+    /**
+     * Constructor.
+     * @param   contentHandler serialHandler The implemention of the SerializationHandler interface
+     */
+    DOM3TreeWalker(
+        SerializationHandler serialHandler,
+        DOMErrorHandler errHandler,
+        LSSerializerFilter filter,
+        String newLine) {
+        fSerializer = serialHandler;
+        //fErrorHandler = errHandler == null ? new DOMErrorHandlerImpl() : errHandler; // Should we be using the default?
+        fErrorHandler = errHandler;
+        fFilter = filter;
+        fLexicalHandler = null;
+        fNewLine = newLine;
+
+        fNSBinder = new NamespaceSupport();
+        fLocalNSBinder = new NamespaceSupport();
+        
+        fDOMConfigProperties = fSerializer.getOutputFormat();
+        fSerializer.setDocumentLocator(fLocator);
+        initProperties(fDOMConfigProperties);
+        
+        try {
+            // Bug see Bugzilla  26741
+            fLocator.setSystemId(
+                System.getProperty("user.dir") + File.separator + "dummy.xsl");
+        } catch (SecurityException se) { // user.dir not accessible from applet
+
+        }
+    }
+
+    /**
+     * Perform a pre-order traversal non-recursive style.  
+     *
+     * Note that TreeWalker assumes that the subtree is intended to represent 
+     * a complete (though not necessarily well-formed) document and, during a 
+     * traversal, startDocument and endDocument will always be issued to the 
+     * SAX listener.
+     *  
+     * @param pos Node in the tree where to start traversal
+     *
+     * @throws TransformerException
+     */
+    public void traverse(Node pos) throws org.xml.sax.SAXException {
+        this.fSerializer.startDocument();
+
+        // Determine if the Node is a DOM Level 3 Core Node.
+        if (pos.getNodeType() != Node.DOCUMENT_NODE) {
+            Document ownerDoc = pos.getOwnerDocument();
+            if (ownerDoc != null
+                && ownerDoc.getImplementation().hasFeature("Core", "3.0")) {
+                fIsLevel3DOM = true;
+            }
+        } else {
+            if (((Document) pos)
+                .getImplementation()
+                .hasFeature("Core", "3.0")) {
+                fIsLevel3DOM = true;
+            }
+        }
+
+        if (fSerializer instanceof LexicalHandler) {
+            fLexicalHandler = ((LexicalHandler) this.fSerializer);
+        }
+
+        if (fFilter != null)
+            fWhatToShowFilter = fFilter.getWhatToShow();
+
+        Node top = pos;
+
+        while (null != pos) {
+            startNode(pos);
+
+            Node nextNode = null;
+
+            nextNode = pos.getFirstChild();
+
+            while (null == nextNode) {
+                endNode(pos);
+
+                if (top.equals(pos))
+                    break;
+
+                nextNode = pos.getNextSibling();
+
+                if (null == nextNode) {
+                    pos = pos.getParentNode();
+
+                    if ((null == pos) || (top.equals(pos))) {
+                        if (null != pos)
+                            endNode(pos);
+
+                        nextNode = null;
+
+                        break;
+                    }
+                }
+            }
+
+            pos = nextNode;
+        }
+        this.fSerializer.endDocument();
+    }
+
+    /**
+     * Perform a pre-order traversal non-recursive style.
+     
+     * Note that TreeWalker assumes that the subtree is intended to represent 
+     * a complete (though not necessarily well-formed) document and, during a 
+     * traversal, startDocument and endDocument will always be issued to the 
+     * SAX listener.
+     *
+     * @param pos Node in the tree where to start traversal
+     * @param top Node in the tree where to end traversal
+     *
+     * @throws TransformerException
+     */
+    public void traverse(Node pos, Node top) throws org.xml.sax.SAXException {
+
+        this.fSerializer.startDocument();
+
+        // Determine if the Node is a DOM Level 3 Core Node.
+        if (pos.getNodeType() != Node.DOCUMENT_NODE) {
+            Document ownerDoc = pos.getOwnerDocument();
+            if (ownerDoc != null
+                && ownerDoc.getImplementation().hasFeature("Core", "3.0")) {
+                fIsLevel3DOM = true;
+            }
+        } else {
+            if (((Document) pos)
+                .getImplementation()
+                .hasFeature("Core", "3.0")) {
+                fIsLevel3DOM = true;
+            }
+        }
+
+        if (fSerializer instanceof LexicalHandler) {
+            fLexicalHandler = ((LexicalHandler) this.fSerializer);
+        }
+
+        if (fFilter != null)
+            fWhatToShowFilter = fFilter.getWhatToShow();
+
+        while (null != pos) {
+            startNode(pos);
+
+            Node nextNode = null;
+
+            nextNode = pos.getFirstChild();
+
+            while (null == nextNode) {
+                endNode(pos);
+
+                if ((null != top) && top.equals(pos))
+                    break;
+
+                nextNode = pos.getNextSibling();
+
+                if (null == nextNode) {
+                    pos = pos.getParentNode();
+
+                    if ((null == pos) || ((null != top) && top.equals(pos))) {
+                        nextNode = null;
+
+                        break;
+                    }
+                }
+            }
+
+            pos = nextNode;
+        }
+        this.fSerializer.endDocument();
+    }
+
+    /**
+     * Optimized dispatch of characters.
+     */
+    private final void dispatachChars(Node node)
+        throws org.xml.sax.SAXException {
+        if (fSerializer != null) {
+            this.fSerializer.characters(node);
+        } else {
+            String data = ((Text) node).getData();
+            this.fSerializer.characters(data.toCharArray(), 0, data.length());
+        }
+    }
+
+    /**
+     * Start processing given node
+     *
+     * @param node Node to process
+     *
+     * @throws org.xml.sax.SAXException
+     */
+    protected void startNode(Node node) throws org.xml.sax.SAXException {
+        if (node instanceof Locator) {
+            Locator loc = (Locator) node;
+            fLocator.setColumnNumber(loc.getColumnNumber());
+            fLocator.setLineNumber(loc.getLineNumber());
+            fLocator.setPublicId(loc.getPublicId());
+            fLocator.setSystemId(loc.getSystemId());
+        } else {
+            fLocator.setColumnNumber(0);
+            fLocator.setLineNumber(0);
+        }
+
+        switch (node.getNodeType()) {
+            case Node.DOCUMENT_TYPE_NODE :
+                serializeDocType((DocumentType) node, true);
+                break;
+            case Node.COMMENT_NODE :
+                serializeComment((Comment) node);
+                break;
+            case Node.DOCUMENT_FRAGMENT_NODE :
+                // Children are traversed
+                break;
+            case Node.DOCUMENT_NODE :
+                break;
+            case Node.ELEMENT_NODE :
+                serializeElement((Element) node, true);
+                break;
+            case Node.PROCESSING_INSTRUCTION_NODE :
+                serializePI((ProcessingInstruction) node);
+                break;
+            case Node.CDATA_SECTION_NODE :
+                serializeCDATASection((CDATASection) node);
+                break;
+            case Node.TEXT_NODE :
+                serializeText((Text) node);
+                break;
+            case Node.ENTITY_REFERENCE_NODE :
+                serializeEntityReference((EntityReference) node, true);
+                break;
+            default :
+                }
+    }
+
+    /**
+     * End processing of given node 
+     *
+     *
+     * @param node Node we just finished processing
+     *
+     * @throws org.xml.sax.SAXException
+     */
+    protected void endNode(Node node) throws org.xml.sax.SAXException {
+
+        switch (node.getNodeType()) {
+            case Node.DOCUMENT_NODE :
+                break;
+            case Node.DOCUMENT_TYPE_NODE :
+                serializeDocType((DocumentType) node, false);
+                break;
+            case Node.ELEMENT_NODE :
+                serializeElement((Element) node, false);
+                break;
+            case Node.CDATA_SECTION_NODE :
+                break;
+            case Node.ENTITY_REFERENCE_NODE :
+                serializeEntityReference((EntityReference) node, false);
+                break;
+            default :
+                }
+    }
+
+    // ***********************************************************************
+    // Node serialization methods
+    // ***********************************************************************
+    /**
+     * Applies a filter on the node to serialize
+     * 
+     * @param node The Node to serialize
+     * @return True if the node is to be serialized else false if the node 
+     *         is to be rejected or skipped. 
+     */
+    protected boolean applyFilter(Node node, int nodeType) {
+        if (fFilter != null && (fWhatToShowFilter & nodeType) != 0) {
+
+            short code = fFilter.acceptNode(node);
+            switch (code) {
+                case NodeFilter.FILTER_REJECT :
+                case NodeFilter.FILTER_SKIP :
+                    return false; // skip the node
+                default : // fall through..
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Serializes a Document Type Node.
+     * 
+     * @param node The Docuemnt Type Node to serialize
+     * @param bStart Invoked at the start or end of node.  Default true. 
+     */
+    protected void serializeDocType(DocumentType node, boolean bStart)
+        throws SAXException {
+        // The DocType and internalSubset can not be modified in DOM and is
+        // considered to be well-formed as the outcome of successful parsing.
+        String docTypeName = node.getNodeName();
+        String publicId = node.getPublicId();
+        String systemId = node.getSystemId();
+        String internalSubset = node.getInternalSubset();
+
+        //DocumentType nodes are never passed to the filter
+        
+        if (internalSubset != null && !"".equals(internalSubset)) {
+
+            if (bStart) {
+                try {
+                    // The Serializer does not provide a way to write out the
+                    // DOCTYPE internal subset via an event call, so we write it
+                    // out here.
+                    Writer writer = fSerializer.getWriter();
+                    StringBuffer dtd = new StringBuffer();
+
+                    dtd.append("<!DOCTYPE ");
+                    dtd.append(docTypeName);
+                    if (null != publicId) {
+                        dtd.append(" PUBLIC \"");
+                        dtd.append(publicId);
+                        dtd.append('\"');
+                    }
+
+                    if (null != systemId) {
+                        if (null == publicId) {
+                            dtd.append(" SYSTEM \"");
+                        } else {
+                            dtd.append(" \"");
+                        }    
+                        dtd.append(systemId);
+                        dtd.append('\"');
+                    }
+                    
+                    dtd.append(" [ ");
+                    
+                    dtd.append(fNewLine);
+                    dtd.append(internalSubset);
+                    dtd.append("]>");
+                    dtd.append(new String(fNewLine));
+                    
+                    writer.write(dtd.toString());
+                    writer.flush();
+                    
+                } catch (IOException e) {
+                    throw new SAXException(Utils.messages.createMessage(
+                            MsgKey.ER_WRITING_INTERNAL_SUBSET, null), e);
+                }
+            } // else if !bStart do nothing
+            
+        } else {
+            
+            if (bStart) {
+                if (fLexicalHandler != null) {
+                    fLexicalHandler.startDTD(docTypeName, publicId, systemId);
+                }
+            } else {
+                if (fLexicalHandler != null) {
+                    fLexicalHandler.endDTD();
+                }
+            }
+        }
+    }
+
+    /**
+     * Serializes a Comment Node.
+     * 
+     * @param node The Comment Node to serialize
+     */
+    protected void serializeComment(Comment node) throws SAXException {
+        // comments=true
+        if ((fFeatures & COMMENTS) != 0) {
+            String data = node.getData();
+
+            // well-formed=true
+            if ((fFeatures & WELLFORMED) != 0) {
+                isCommentWellFormed(data);
+            }
+
+            if (fLexicalHandler != null) {
+                // apply the LSSerializer filter after the operations requested by the 
+                // DOMConfiguration parameters have been applied 
+                if (!applyFilter(node, NodeFilter.SHOW_COMMENT)) {
+                    return;
+                }
+
+                fLexicalHandler.comment(data.toCharArray(), 0, data.length());
+            }
+        }
+    }
+
+    /**
+     * Serializes an Element Node.
+     * 
+     * @param node The Element Node to serialize
+     * @param bStart Invoked at the start or end of node.   
+     */
+    protected void serializeElement(Element node, boolean bStart)
+        throws SAXException {
+        if (bStart) {
+            fElementDepth++;
+
+            // We use the Xalan specific startElement and starPrefixMapping calls 
+            // (and addAttribute and namespaceAfterStartElement) as opposed to
+            // SAX specific, for performance reasons as they reduce the overhead
+            // of creating an AttList object upfront.
+
+            // well-formed=true
+            if ((fFeatures & WELLFORMED) != 0) {
+                isElementWellFormed(node);
+            }
+
+            // REVISIT: We apply the LSSerializer filter for elements before
+            // namesapce fixup
+            if (!applyFilter(node, NodeFilter.SHOW_ELEMENT)) {
+                return;
+            }
+
+            // namespaces=true, record and fixup namspaced element
+            if ((fFeatures & NAMESPACES) != 0) {
+            	fNSBinder.pushContext();
+            	fLocalNSBinder.reset();
+            	
+                recordLocalNSDecl(node);
+                fixupElementNS(node);
+            }
+
+            // Namespace normalization
+            fSerializer.startElement(
+            		node.getNamespaceURI(),
+                    node.getLocalName(),
+                    node.getNodeName());
+
+            serializeAttList(node);
+            
+        } else {
+        	fElementDepth--;
+
+            // apply the LSSerializer filter
+            if (!applyFilter(node, NodeFilter.SHOW_ELEMENT)) {
+                return;
+            }
+
+            this.fSerializer.endElement(
+            	node.getNamespaceURI(),
+                node.getLocalName(),
+                node.getNodeName());
+            // since endPrefixMapping was not used by SerializationHandler it was removed
+            // for performance reasons.
+
+            if ((fFeatures & NAMESPACES) != 0 ) {
+                    fNSBinder.popContext();
+            }
+            
+        }
+    }
+
+    /**
+     * Serializes the Attr Nodes of an Element.
+     * 
+     * @param node The OwnerElement whose Attr Nodes are to be serialized.
+     */
+    protected void serializeAttList(Element node) throws SAXException {
+        NamedNodeMap atts = node.getAttributes();
+        int nAttrs = atts.getLength();
+
+        for (int i = 0; i < nAttrs; i++) {
+            Node attr = atts.item(i);
+
+            String localName = attr.getLocalName();
+            String attrName = attr.getNodeName();
+            String attrPrefix = attr.getPrefix() == null ? "" : attr.getPrefix();
+            String attrValue = attr.getNodeValue();
+
+            // Determine the Attr's type.
+            String type = null;
+            if (fIsLevel3DOM) {
+                type = ((Attr) attr).getSchemaTypeInfo().getTypeName();
+            }
+            type = type == null ? "CDATA" : type;
+
+            String attrNS = attr.getNamespaceURI();
+            if (attrNS !=null && attrNS.length() == 0) {
+            	attrNS=null;
+                // we must remove prefix for this attribute
+            	attrName=attr.getLocalName();
+            }
+
+            boolean isSpecified = ((Attr) attr).getSpecified();
+            boolean addAttr = true;
+            boolean applyFilter = false;
+            boolean xmlnsAttr =
+                attrName.equals("xmlns") || attrName.startsWith("xmlns:");
+
+            // well-formed=true
+            if ((fFeatures & WELLFORMED) != 0) {
+                isAttributeWellFormed(attr);
+            }
+            
+            //-----------------------------------------------------------------
+            // start Attribute namespace fixup
+            //-----------------------------------------------------------------
+            // namespaces=true, normalize all non-namespace attributes
+            // Step 3. Attribute
+            if ((fFeatures & NAMESPACES) != 0 && !xmlnsAttr) {
+           	
+        		// If the Attr has a namespace URI
+        		if (attrNS != null) {
+        			attrPrefix = attrPrefix == null ? "" : attrPrefix;
+
+        			String declAttrPrefix = fNSBinder.getPrefix(attrNS);
+        			String declAttrNS = fNSBinder.getURI(attrPrefix);
+        			
+        			// attribute has no prefix (default namespace decl does not apply to
+        			// attributes)
+        			// OR
+        			// attribute prefix is not declared
+        			// OR
+        			// conflict: attribute has a prefix that conflicts with a binding
+        			if ("".equals(attrPrefix) || "".equals(declAttrPrefix)
+        					|| !attrPrefix.equals(declAttrPrefix)) {
+
+        				// namespaceURI matches an in scope declaration of one or
+        				// more prefixes
+        				if (declAttrPrefix != null && !"".equals(declAttrPrefix)) {
+        					// pick the prefix that was found and change attribute's
+        					// prefix and nodeName.
+        					attrPrefix = declAttrPrefix;
+        					
+        					if (declAttrPrefix.length() > 0 ) { 
+        						attrName = declAttrPrefix + ":" + localName;
+        					} else {
+        						attrName = localName;
+        					}	
+        				} else {
+        					// The current prefix is not null and it has no in scope
+        					// declaration
+        					if (attrPrefix != null && !"".equals(attrPrefix)
+        							&& declAttrNS == null) {
+        						// declare this prefix
+        						if ((fFeatures & NAMESPACEDECLS) != 0) {
+        							fSerializer.addAttribute(XMLNS_URI, attrPrefix,
+        									XMLNS_PREFIX + ":" + attrPrefix, "CDATA",
+        									attrNS);
+        							fNSBinder.declarePrefix(attrPrefix, attrNS);
+        							fLocalNSBinder.declarePrefix(attrPrefix, attrNS);
+        						}
+        					} else {
+        						// find a prefix following the pattern "NS" +index
+        						// (starting at 1)
+        						// make sure this prefix is not declared in the current
+        						// scope.
+        						int counter = 1;
+        						attrPrefix = "NS" + counter++;
+
+        						while (fLocalNSBinder.getURI(attrPrefix) != null) {
+        							attrPrefix = "NS" + counter++;
+        						}
+        						// change attribute's prefix and Name
+        						attrName = attrPrefix + ":" + localName;
+        						
+        						// create a local namespace declaration attribute
+        						// Add the xmlns declaration attribute
+        						if ((fFeatures & NAMESPACEDECLS) != 0) {
+                                       							
+        							fSerializer.addAttribute(XMLNS_URI, attrPrefix,
+        									XMLNS_PREFIX + ":" + attrPrefix, "CDATA",
+        									attrNS);
+            						fNSBinder.declarePrefix(attrPrefix, attrNS);
+            						fLocalNSBinder.declarePrefix(attrPrefix, attrNS);
+        						}
+        					}
+        				}
+        			}
+
+        		} else { // if the Attr has no namespace URI
+        			// Attr has no localName
+        			if (localName == null) {
+        				// DOM Level 1 node!
+        				String msg = Utils.messages.createMessage(
+        						MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
+        						new Object[] { attrName });
+
+        				if (fErrorHandler != null) {
+        					fErrorHandler
+        							.handleError(new DOMErrorImpl(
+        									DOMError.SEVERITY_ERROR, msg,
+        									MsgKey.ER_NULL_LOCAL_ELEMENT_NAME, null,
+        									null, null));
+        				}
+
+        			} else { // uri=null and no colon
+        				// attr has no namespace URI and no prefix
+        				// no action is required, since attrs don't use default
+        			}
+        		}
+
+            }
+
+            
+            // discard-default-content=true
+            // Default attr's are not passed to the filter and this contraint
+            // is applied only when discard-default-content=true 
+            // What about default xmlns attributes???? check for xmlnsAttr
+            if ((((fFeatures & DISCARDDEFAULT) != 0) && isSpecified)
+                || ((fFeatures & DISCARDDEFAULT) == 0)) {
+                applyFilter = true;
+            } else {
+            	addAttr = false;
+            }
+
+            if (applyFilter) {
+                // apply the filter for Attributes that are not default attributes
+                // or namespace decl attributes
+                if (fFilter != null
+                    && (fFilter.getWhatToShow() & NodeFilter.SHOW_ATTRIBUTE)
+                        != 0) {
+
+                    if (!xmlnsAttr) {
+                        short code = fFilter.acceptNode(attr);
+                        switch (code) {
+                            case NodeFilter.FILTER_REJECT :
+                            case NodeFilter.FILTER_SKIP :
+                                addAttr = false;
+                                break;
+                            default : //fall through..
+                        }
+                    }
+                }
+            }
+
+            // if the node is a namespace node
+            if (addAttr && xmlnsAttr) {
+                // If namespace-declarations=true, add the node , else don't add it
+                if ((fFeatures & NAMESPACEDECLS) != 0) {
+               		// The namespace may have been fixed up, in that case don't add it.
+                	if (localName != null && !"".equals(localName)) {
+                		fSerializer.addAttribute(attrNS, localName, attrName, type, attrValue);
+                	} 
+                }
+            } else if (
+                addAttr && !xmlnsAttr) { // if the node is not a namespace node
+                // If namespace-declarations=true, add the node with the Attr nodes namespaceURI
+                // else add the node setting it's namespace to null or else the serializer will later
+                // attempt to add a xmlns attr for the prefixed attribute
+                if (((fFeatures & NAMESPACEDECLS) != 0) && (attrNS != null)) {
+                    fSerializer.addAttribute(
+                        attrNS,
+                        localName,
+                        attrName,
+                        type,
+                        attrValue);
+                } else {
+                    fSerializer.addAttribute(
+                        "",
+                        localName,
+                        attrName,
+                        type,
+                        attrValue);
+                }
+            }
+
+            // 
+            if (xmlnsAttr && ((fFeatures & NAMESPACEDECLS) != 0)) {
+                int index;
+                // Use "" instead of null, as Xerces likes "" for the 
+                // name of the default namespace.  Fix attributed 
+                // to "Steven Murray" <smurray@ebt.com>.
+                String prefix =
+                    (index = attrName.indexOf(":")) < 0
+                        ? ""
+                        : attrName.substring(index + 1);
+
+                if (!"".equals(prefix)) {
+                    fSerializer.namespaceAfterStartElement(prefix, attrValue);
+                }
+            }
+        }
+        
+    }
+   
+    /**
+     * Serializes an ProcessingInstruction Node.
+     * 
+     * @param node The ProcessingInstruction Node to serialize
+     */
+    protected void serializePI(ProcessingInstruction node)
+        throws SAXException {
+        ProcessingInstruction pi = node;
+        String name = pi.getNodeName();
+
+        // well-formed=true
+        if ((fFeatures & WELLFORMED) != 0) {
+            isPIWellFormed(node);
+        }
+
+        // apply the LSSerializer filter
+        if (!applyFilter(node, NodeFilter.SHOW_PROCESSING_INSTRUCTION)) {
+            return;
+        }
+
+        // String data = pi.getData();
+        if (name.equals("xslt-next-is-raw")) {
+            fNextIsRaw = true;
+        } else {
+            this.fSerializer.processingInstruction(name, pi.getData());
+        }
+    }
+
+    /**
+     * Serializes an CDATASection Node.
+     * 
+     * @param node The CDATASection Node to serialize
+     */
+    protected void serializeCDATASection(CDATASection node)
+        throws SAXException {
+        // well-formed=true
+        if ((fFeatures & WELLFORMED) != 0) {
+            isCDATASectionWellFormed(node);
+        }
+
+        // cdata-sections = true
+        if ((fFeatures & CDATA) != 0) {
+
+            // split-cdata-sections = true
+            // Assumption: This parameter has an effect only when
+			// cdata-sections=true
+            // ToStream, by default splits cdata-sections. Hence the check
+			// below.
+            String nodeValue = node.getNodeValue();
+            int endIndex = nodeValue.indexOf("]]>");
+            if ((fFeatures & SPLITCDATA) != 0) {
+                if (endIndex >= 0) {
+                    // The first node split will contain the ]] markers
+                    String relatedData = nodeValue.substring(0, endIndex + 2);
+
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_CDATA_SECTIONS_SPLIT,
+                            null);
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_WARNING,
+                                msg,
+                                MsgKey.ER_CDATA_SECTIONS_SPLIT,
+                                null,
+                                relatedData,
+                                null));
+                    }
+                }
+            } else {
+                if (endIndex >= 0) {
+                    // The first node split will contain the ]] markers 
+                    String relatedData = nodeValue.substring(0, endIndex + 2);
+
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_CDATA_SECTIONS_SPLIT,
+                            null);
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_ERROR,
+                                msg,
+                                MsgKey.ER_CDATA_SECTIONS_SPLIT));
+                    }
+                    // Report an error and return.  What error???
+                    return;
+                }
+            }
+
+            // apply the LSSerializer filter
+            if (!applyFilter(node, NodeFilter.SHOW_CDATA_SECTION)) {
+                return;
+            }
+
+            // splits the cdata-section
+            if (fLexicalHandler != null) {
+                fLexicalHandler.startCDATA();
+            }
+            dispatachChars(node);
+            if (fLexicalHandler != null) {
+                fLexicalHandler.endCDATA();
+            }
+        } else {
+            dispatachChars(node);
+        }
+    }
+
+    /**
+     * Serializes an Text Node.
+     * 
+     * @param node The Text Node to serialize
+     */
+    protected void serializeText(Text node) throws SAXException {
+        if (fNextIsRaw) {
+            fNextIsRaw = false;
+            fSerializer.processingInstruction(
+                javax.xml.transform.Result.PI_DISABLE_OUTPUT_ESCAPING,
+                "");
+            dispatachChars(node);
+            fSerializer.processingInstruction(
+                javax.xml.transform.Result.PI_ENABLE_OUTPUT_ESCAPING,
+                "");
+        } else {
+            // keep track of dispatch or not to avoid duplicaiton of filter code
+            boolean bDispatch = false;
+
+            // well-formed=true
+            if ((fFeatures & WELLFORMED) != 0) {
+                isTextWellFormed(node);
+            }
+
+            // if the node is whitespace
+            // Determine the Attr's type.
+            boolean isElementContentWhitespace = false;
+            if (fIsLevel3DOM) {
+                isElementContentWhitespace =
+                       node.isElementContentWhitespace();
+            }
+
+            if (isElementContentWhitespace) {
+                // element-content-whitespace=true
+                if ((fFeatures & ELEM_CONTENT_WHITESPACE) != 0) {
+                    bDispatch = true;
+                }
+            } else {
+                bDispatch = true;
+            }
+
+            // apply the LSSerializer filter
+            if (!applyFilter(node, NodeFilter.SHOW_TEXT)) {
+                return;
+            }
+
+            if (bDispatch) {
+                dispatachChars(node);
+            }
+        }
+    }
+
+    /**
+     * Serializes an EntityReference Node.
+     * 
+     * @param node The EntityReference Node to serialize
+     * @param bStart Inicates if called from start or endNode 
+     */
+    protected void serializeEntityReference(
+        EntityReference node,
+        boolean bStart)
+        throws SAXException {
+        if (bStart) {
+            EntityReference eref = node;
+            // entities=true
+            if ((fFeatures & ENTITIES) != 0) {
+                
+                // perform well-formedness and other checking only if 
+                // entities = true
+
+                // well-formed=true
+                if ((fFeatures & WELLFORMED) != 0) {
+                    isEntityReferneceWellFormed(node);
+                }
+
+                // check "unbound-prefix-in-entity-reference" [fatal] 
+                // Raised if the configuration parameter "namespaces" is set to true
+                if ((fFeatures & NAMESPACES) != 0) {
+                    checkUnboundPrefixInEntRef(node);
+                }
+
+                // The filter should not apply in this case, since the
+                // EntityReference is not being expanded.
+                // should we pass entity reference nodes to the filter???
+            } 
+            
+            if (fLexicalHandler != null) {
+
+                // startEntity outputs only Text but not Element, Attr, Comment 
+                // and PI child nodes.  It does so by setting the m_inEntityRef 
+                // in ToStream and using this to decide if a node is to be 
+                // serialized or not.
+                fLexicalHandler.startEntity(eref.getNodeName());
+            } 
+
+        } else {
+            EntityReference eref = node;
+            // entities=true or false, 
+            if (fLexicalHandler != null) {
+                fLexicalHandler.endEntity(eref.getNodeName());
+            }
+        }
+    }
+
+    
+    // ***********************************************************************
+    // Methods to check well-formedness
+    // ***********************************************************************
+    /**
+     * Taken from org.apache.xerces.dom.CoreDocumentImpl
+     * 
+     * Check the string against XML's definition of acceptable names for
+     * elements and attributes and so on using the XMLCharacterProperties
+     * utility class
+     */
+    protected boolean isXMLName(String s, boolean xml11Version) {
+
+        if (s == null) {
+            return false;
+        }
+        if (!xml11Version)
+            return XMLChar.isValidName(s);
+        else
+            return XML11Char.isXML11ValidName(s);
+    }
+
+    /**
+     * Taken from org.apache.xerces.dom.CoreDocumentImpl
+     *  
+     * Checks if the given qualified name is legal with respect
+     * to the version of XML to which this document must conform.
+     *
+     * @param prefix prefix of qualified name
+     * @param local local part of qualified name
+     */
+    protected boolean isValidQName(
+        String prefix,
+        String local,
+        boolean xml11Version) {
+
+        // check that both prefix and local part match NCName
+        if (local == null)
+            return false;
+        boolean validNCName = false;
+
+        if (!xml11Version) {
+            validNCName =
+                (prefix == null || XMLChar.isValidNCName(prefix))
+                    && XMLChar.isValidNCName(local);
+        } else {
+            validNCName =
+                (prefix == null || XML11Char.isXML11ValidNCName(prefix))
+                    && XML11Char.isXML11ValidNCName(local);
+        }
+
+        return validNCName;
+    }
+
+    /**
+     * Checks if a XML character is well-formed
+     * 
+     * @param characters A String of characters to be checked for Well-Formedness
+     * @param refInvalidChar A reference to the character to be returned that was determined invalid. 
+     */
+    protected boolean isWFXMLChar(String chardata, Character refInvalidChar) {
+        if (chardata == null || (chardata.length() == 0)) {
+            return true;
+        }
+
+        char[] dataarray = chardata.toCharArray();
+        int datalength = dataarray.length;
+
+        // version of the document is XML 1.1
+        if (fIsXMLVersion11) {
+            //we need to check all characters as per production rules of XML11
+            int i = 0;
+            while (i < datalength) {
+                if (XML11Char.isXML11Invalid(dataarray[i++])) {
+                    // check if this is a supplemental character
+                    char ch = dataarray[i - 1];
+                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
+                        char ch2 = dataarray[i++];
+                        if (XMLChar.isLowSurrogate(ch2)
+                            && XMLChar.isSupplemental(
+                                XMLChar.supplemental(ch, ch2))) {
+                            continue;
+                        }
+                    }
+                    // Reference to invalid character which is returned
+                    refInvalidChar = new Character(ch);
+                    return false;
+                }
+            }
+        } // version of the document is XML 1.0
+        else {
+            // we need to check all characters as per production rules of XML 1.0
+            int i = 0;
+            while (i < datalength) {
+                if (XMLChar.isInvalid(dataarray[i++])) {
+                    // check if this is a supplemental character
+                    char ch = dataarray[i - 1];
+                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
+                        char ch2 = dataarray[i++];
+                        if (XMLChar.isLowSurrogate(ch2)
+                            && XMLChar.isSupplemental(
+                                XMLChar.supplemental(ch, ch2))) {
+                            continue;
+                        }
+                    }
+                    // Reference to invalid character which is returned                    
+                    refInvalidChar = new Character(ch);
+                    return false;
+                }
+            }
+        } // end-else fDocument.isXMLVersion()
+
+        return true;
+    } // isXMLCharWF
+
+    /**
+     * Checks if a XML character is well-formed.  If there is a problem with
+     * the character a non-null Character is returned else null is returned.
+     * 
+     * @param characters A String of characters to be checked for Well-Formedness
+     * @return Character A reference to the character to be returned that was determined invalid. 
+     */
+    protected Character isWFXMLChar(String chardata) {
+    	Character refInvalidChar;
+        if (chardata == null || (chardata.length() == 0)) {
+            return null;
+        }
+
+        char[] dataarray = chardata.toCharArray();
+        int datalength = dataarray.length;
+
+        // version of the document is XML 1.1
+        if (fIsXMLVersion11) {
+            //we need to check all characters as per production rules of XML11
+            int i = 0;
+            while (i < datalength) {
+                if (XML11Char.isXML11Invalid(dataarray[i++])) {
+                    // check if this is a supplemental character
+                    char ch = dataarray[i - 1];
+                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
+                        char ch2 = dataarray[i++];
+                        if (XMLChar.isLowSurrogate(ch2)
+                            && XMLChar.isSupplemental(
+                                XMLChar.supplemental(ch, ch2))) {
+                            continue;
+                        }
+                    }
+                    // Reference to invalid character which is returned
+                    refInvalidChar = new Character(ch);
+                    return refInvalidChar;
+                }
+            }
+        } // version of the document is XML 1.0
+        else {
+            // we need to check all characters as per production rules of XML 1.0
+            int i = 0;
+            while (i < datalength) {
+                if (XMLChar.isInvalid(dataarray[i++])) {
+                    // check if this is a supplemental character
+                    char ch = dataarray[i - 1];
+                    if (XMLChar.isHighSurrogate(ch) && i < datalength) {
+                        char ch2 = dataarray[i++];
+                        if (XMLChar.isLowSurrogate(ch2)
+                            && XMLChar.isSupplemental(
+                                XMLChar.supplemental(ch, ch2))) {
+                            continue;
+                        }
+                    }
+                    // Reference to invalid character which is returned                    
+                    refInvalidChar = new Character(ch);
+                    return refInvalidChar;
+                }
+            }
+        } // end-else fDocument.isXMLVersion()
+
+        return null;
+    } // isXMLCharWF
+
+    /**
+     * Checks if a comment node is well-formed
+     * 
+     * @param data The contents of the comment node
+     * @return a boolean indiacating if the comment is well-formed or not.
+     */
+    protected void isCommentWellFormed(String data) {
+        if (data == null || (data.length() == 0)) {
+            return;
+        }
+
+        char[] dataarray = data.toCharArray();
+        int datalength = dataarray.length;
+
+        // version of the document is XML 1.1
+        if (fIsXMLVersion11) {
+            // we need to check all chracters as per production rules of XML11
+            int i = 0;
+            while (i < datalength) {
+                char c = dataarray[i++];
+                if (XML11Char.isXML11Invalid(c)) {
+                    // check if this is a supplemental character
+                    if (XMLChar.isHighSurrogate(c) && i < datalength) {
+                        char c2 = dataarray[i++];
+                        if (XMLChar.isLowSurrogate(c2)
+                            && XMLChar.isSupplemental(
+                                XMLChar.supplemental(c, c2))) {
+                            continue;
+                        }
+                    }
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
+                            new Object[] { new Character(c)});
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_FATAL_ERROR,
+                                msg,
+                                MsgKey.ER_WF_INVALID_CHARACTER,
+                                null,
+                                null,
+                                null));
+                    }
+                } else if (c == '-' && i < datalength && dataarray[i] == '-') {
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_WF_DASH_IN_COMMENT,
+                            null);
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_FATAL_ERROR,
+                                msg,
+                                MsgKey.ER_WF_INVALID_CHARACTER,
+                                null,
+                                null,
+                                null));
+                    }
+                }
+            }
+        } // version of the document is XML 1.0
+        else {
+            // we need to check all chracters as per production rules of XML 1.0
+            int i = 0;
+            while (i < datalength) {
+                char c = dataarray[i++];
+                if (XMLChar.isInvalid(c)) {
+                    // check if this is a supplemental character
+                    if (XMLChar.isHighSurrogate(c) && i < datalength) {
+                        char c2 = dataarray[i++];
+                        if (XMLChar.isLowSurrogate(c2)
+                            && XMLChar.isSupplemental(
+                                XMLChar.supplemental(c, c2))) {
+                            continue;
+                        }
+                    }
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
+                            new Object[] { new Character(c)});
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_FATAL_ERROR,
+                                msg,
+                                MsgKey.ER_WF_INVALID_CHARACTER,
+                                null,
+                                null,
+                                null));
+                    }
+                } else if (c == '-' && i < datalength && dataarray[i] == '-') {
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_WF_DASH_IN_COMMENT,
+                            null);
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_FATAL_ERROR,
+                                msg,
+                                MsgKey.ER_WF_INVALID_CHARACTER,
+                                null,
+                                null,
+                                null));
+                    }
+                }
+            }
+        }
+        return;
+    }
+
+    /**
+     * Checks if an element node is well-formed, by checking its Name for well-formedness.
+     * 
+     * @param data The contents of the comment node
+     * @return a boolean indiacating if the comment is well-formed or not.
+     */
+    protected void isElementWellFormed(Node node) {
+        boolean isNameWF = false;
+        if ((fFeatures & NAMESPACES) != 0) {
+            isNameWF =
+                isValidQName(
+                    node.getPrefix(),
+                    node.getLocalName(),
+                    fIsXMLVersion11);
+        } else {
+            isNameWF = isXMLName(node.getNodeName(), fIsXMLVersion11);
+        }
+
+        if (!isNameWF) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                    new Object[] { "Element", node.getNodeName()});
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                        null,
+                        null,
+                        null));
+            }
+        }
+    }
+
+    /**
+     * Checks if an attr node is well-formed, by checking it's Name and value
+     * for well-formedness.
+     * 
+     * @param data The contents of the comment node
+     * @return a boolean indiacating if the comment is well-formed or not.
+     */
+    protected void isAttributeWellFormed(Node node) {
+        boolean isNameWF = false;
+        if ((fFeatures & NAMESPACES) != 0) {
+            isNameWF =
+                isValidQName(
+                    node.getPrefix(),
+                    node.getLocalName(),
+                    fIsXMLVersion11);
+        } else {
+            isNameWF = isXMLName(node.getNodeName(), fIsXMLVersion11);
+        }
+
+        if (!isNameWF) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                    new Object[] { "Attr", node.getNodeName()});
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                        null,
+                        null,
+                        null));
+            }
+        }
+
+        // Check the Attr's node value
+        // WFC: No < in Attribute Values
+        String value = node.getNodeValue();
+        if (value.indexOf('<') >= 0) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_LT_IN_ATTVAL,
+                    new Object[] {
+                        ((Attr) node).getOwnerElement().getNodeName(),
+                        node.getNodeName()});
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_LT_IN_ATTVAL,
+                        null,
+                        null,
+                        null));
+            }
+        }
+
+        // we need to loop through the children of attr nodes and check their values for
+        // well-formedness  
+        NodeList children = node.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node child = children.item(i);
+            // An attribute node with no text or entity ref child for example
+            // doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ns");
+            // followes by
+            // element.setAttributeNodeNS(attribute);
+            // can potentially lead to this situation.  If the attribute
+            // was a prefix Namespace attribute declaration then then DOM Core 
+            // should have some exception defined for this.
+            if (child == null) {
+                // we should probably report an error
+                continue;
+            }
+            switch (child.getNodeType()) {
+                case Node.TEXT_NODE :
+                    isTextWellFormed((Text) child);
+                    break;
+                case Node.ENTITY_REFERENCE_NODE :
+                    isEntityReferneceWellFormed((EntityReference) child);
+                    break;
+                default :
+            }
+        }
+
+        // TODO:
+        // WFC: Check if the attribute prefix is bound to 
+        // http://www.w3.org/2000/xmlns/  
+
+        // WFC: Unique Att Spec
+        // Perhaps pass a seen boolean value to this method.  serializeAttList will determine
+        // if the attr was seen before.
+    }
+
+    /**
+     * Checks if a PI node is well-formed, by checking it's Name and data
+     * for well-formedness.
+     * 
+     * @param data The contents of the comment node
+     */
+    protected void isPIWellFormed(ProcessingInstruction node) {
+        // Is the PI Target a valid XML name
+        if (!isXMLName(node.getNodeName(), fIsXMLVersion11)) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                    new Object[] { "ProcessingInstruction", node.getTarget()});
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                        null,
+                        null,
+                        null));
+            }
+        }
+
+        // Does the PI Data carry valid XML characters
+
+        // REVISIT: Should we check if the PI DATA contains a ?> ???
+        Character invalidChar = isWFXMLChar(node.getData());
+        if (invalidChar != null) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
+                    new Object[] { Integer.toHexString(Character.getNumericValue(invalidChar.charValue())) });
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER,
+                        null,
+                        null,
+                        null));
+            }
+        }
+    }
+
+    /**
+     * Checks if an CDATASection node is well-formed, by checking it's data
+     * for well-formedness.  Note that the presence of a CDATA termination mark
+     * in the contents of a CDATASection is handled by the parameter 
+     * spli-cdata-sections
+     * 
+     * @param data The contents of the comment node
+     */
+    protected void isCDATASectionWellFormed(CDATASection node) {
+        // Does the data valid XML character data        
+        Character invalidChar = isWFXMLChar(node.getData());
+        //if (!isWFXMLChar(node.getData(), invalidChar)) {
+        if (invalidChar != null) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
+                    new Object[] { Integer.toHexString(Character.getNumericValue(invalidChar.charValue())) });
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER,
+                        null,
+                        null,
+                        null));
+            }
+        }
+    }
+
+    /**
+     * Checks if an Text node is well-formed, by checking if it contains invalid
+     * XML characters.
+     * 
+     * @param data The contents of the comment node
+     */
+    protected void isTextWellFormed(Text node) {
+        // Does the data valid XML character data        
+    	Character invalidChar = isWFXMLChar(node.getData());
+    	if (invalidChar != null) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
+                    new Object[] { Integer.toHexString(Character.getNumericValue(invalidChar.charValue())) });
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER,
+                        null,
+                        null,
+                        null));
+            }
+        }
+    }
+
+    /**
+     * Checks if an EntityRefernece node is well-formed, by checking it's node name.  Then depending
+     * on whether it is referenced in Element content or in an Attr Node, checks if the EntityReference
+     * references an unparsed entity or a external entity and if so throws raises the 
+     * appropriate well-formedness error.  
+     * 
+     * @param data The contents of the comment node
+     * @parent The parent of the EntityReference Node
+     */
+    protected void isEntityReferneceWellFormed(EntityReference node) {
+        // Is the EntityReference name a valid XML name
+        if (!isXMLName(node.getNodeName(), fIsXMLVersion11)) {
+            String msg =
+                Utils.messages.createMessage(
+                    MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                    new Object[] { "EntityReference", node.getNodeName()});
+
+            if (fErrorHandler != null) {
+                fErrorHandler.handleError(
+                    new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR,
+                        msg,
+                        MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                        null,
+                        null,
+                        null));
+            }
+        }
+
+        // determine the parent node
+        Node parent = node.getParentNode();
+
+        // Traverse the declared entities and check if the nodeName and namespaceURI
+        // of the EntityReference matches an Entity.  If so, check the if the notationName
+        // is not null, if so, report an error.
+        DocumentType docType = node.getOwnerDocument().getDoctype();
+        if (docType != null) {
+            NamedNodeMap entities = docType.getEntities();
+            for (int i = 0; i < entities.getLength(); i++) {
+                Entity ent = (Entity) entities.item(i);
+
+                String nodeName =
+                    node.getNodeName() == null ? "" : node.getNodeName();
+                String nodeNamespaceURI =
+                    node.getNamespaceURI() == null
+                        ? ""
+                        : node.getNamespaceURI();
+                String entName =
+                    ent.getNodeName() == null ? "" : ent.getNodeName();
+                String entNamespaceURI =
+                    ent.getNamespaceURI() == null ? "" : ent.getNamespaceURI();
+                // If referenced in Element content
+                // WFC: Parsed Entity
+                if (parent.getNodeType() == Node.ELEMENT_NODE) {
+                    if (entNamespaceURI.equals(nodeNamespaceURI)
+                        && entName.equals(nodeName)) {
+
+                        if (ent.getNotationName() != null) {
+                            String msg =
+                                Utils.messages.createMessage(
+                                    MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
+                                    new Object[] { node.getNodeName()});
+
+                            if (fErrorHandler != null) {
+                                fErrorHandler.handleError(
+                                    new DOMErrorImpl(
+                                        DOMError.SEVERITY_FATAL_ERROR,
+                                        msg,
+                                        MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
+                                        null,
+                                        null,
+                                        null));
+                            }
+                        }
+                    }
+                } // end if WFC: Parsed Entity
+
+                // If referenced in an Attr value
+                // WFC: No External Entity References
+                if (parent.getNodeType() == Node.ATTRIBUTE_NODE) {
+                    if (entNamespaceURI.equals(nodeNamespaceURI)
+                        && entName.equals(nodeName)) {
+
+                        if (ent.getPublicId() != null
+                            || ent.getSystemId() != null
+                            || ent.getNotationName() != null) {
+                            String msg =
+                                Utils.messages.createMessage(
+                                    MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
+                                    new Object[] { node.getNodeName()});
+
+                            if (fErrorHandler != null) {
+                                fErrorHandler.handleError(
+                                    new DOMErrorImpl(
+                                        DOMError.SEVERITY_FATAL_ERROR,
+                                        msg,
+                                        MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
+                                        null,
+                                        null,
+                                        null));
+                            }
+                        }
+                    }
+                } //end if WFC: No External Entity References
+            }
+        }
+    } // isEntityReferneceWellFormed    
+
+    /**
+     * If the configuration parameter "namespaces" is set to true, this methods
+     * checks if an entity whose replacement text contains unbound namespace 
+     * prefixes is referenced in a location where there are no bindings for 
+     * the namespace prefixes and if so raises a LSException with the error-type
+     * "unbound-prefix-in-entity-reference"   
+     * 
+     * @param Node, The EntityReference nodes whose children are to be checked
+     */
+    protected void checkUnboundPrefixInEntRef(Node node) {
+        Node child, next;
+        for (child = node.getFirstChild(); child != null; child = next) {
+            next = child.getNextSibling();
+
+            if (child.getNodeType() == Node.ELEMENT_NODE) {
+
+                //If a NamespaceURI is not declared for the current
+                //node's prefix, raise a fatal error.
+                String prefix = child.getPrefix();
+                if (prefix != null
+                		&& fNSBinder.getURI(prefix) == null) {
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
+                            new Object[] {
+                                node.getNodeName(),
+                                child.getNodeName(),
+                                prefix });
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_FATAL_ERROR,
+                                msg,
+                                MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
+                                null,
+                                null,
+                                null));
+                    }
+                }
+
+                NamedNodeMap attrs = child.getAttributes();
+
+                for (int i = 0; i < attrs.getLength(); i++) {
+                    String attrPrefix = attrs.item(i).getPrefix();
+                    if (attrPrefix != null
+                    		&& fNSBinder.getURI(attrPrefix) == null) {
+                        String msg =
+                            Utils.messages.createMessage(
+                                MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
+                                new Object[] {
+                                    node.getNodeName(),
+                                    child.getNodeName(),
+                                    attrs.item(i)});
+
+                        if (fErrorHandler != null) {
+                            fErrorHandler.handleError(
+                                new DOMErrorImpl(
+                                    DOMError.SEVERITY_FATAL_ERROR,
+                                    msg,
+                                    MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
+                                    null,
+                                    null,
+                                    null));
+                        }
+                    }
+                }
+            }
+
+            if (child.hasChildNodes()) {
+                checkUnboundPrefixInEntRef(child);
+            }
+        }
+    }
+
+    // ***********************************************************************
+    // Namespace normalization
+    // ***********************************************************************
+    /**
+     * Records local namespace declarations, to be used for normalization later
+     * 
+     * @param Node, The element node, whose namespace declarations are to be recorded
+     */
+    protected void recordLocalNSDecl(Node node) {
+        NamedNodeMap atts = ((Element) node).getAttributes();
+        int length = atts.getLength();
+
+        for (int i = 0; i < length; i++) {
+            Node attr = atts.item(i);
+
+            String localName = attr.getLocalName();
+            String attrPrefix = attr.getPrefix();
+            String attrValue = attr.getNodeValue();
+            String attrNS = attr.getNamespaceURI();
+
+            localName =
+                localName == null
+                    || XMLNS_PREFIX.equals(localName) ? "" : localName;
+            attrPrefix = attrPrefix == null ? "" : attrPrefix;
+            attrValue = attrValue == null ? "" : attrValue;
+            attrNS = attrNS == null ? "" : attrNS;
+
+            // check if attribute is a namespace decl
+            if (XMLNS_URI.equals(attrNS)) {
+
+                // No prefix may be bound to http://www.w3.org/2000/xmlns/.
+                if (XMLNS_URI.equals(attrValue)) {
+                    String msg =
+                        Utils.messages.createMessage(
+                            MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
+                            new Object[] { attrPrefix, XMLNS_URI });
+
+                    if (fErrorHandler != null) {
+                        fErrorHandler.handleError(
+                            new DOMErrorImpl(
+                                DOMError.SEVERITY_ERROR,
+                                msg,
+                                MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
+                                null,
+                                null,
+                                null));
+                    }
+                } else {
+                    // store the namespace-declaration
+                	if (XMLNS_PREFIX.equals(attrPrefix) ) {
+                        // record valid decl
+                        if (attrValue.length() != 0) {
+                            fNSBinder.declarePrefix(localName, attrValue);
+                        } else {
+                            // Error; xmlns:prefix=""
+                        }
+                    } else { // xmlns
+                        // empty prefix is always bound ("" or some string)
+                        fNSBinder.declarePrefix("", attrValue);
+                    }
+                }
+                
+            }
+        }
+    }
+
+    /**
+     * Fixes an element's namespace
+     * 
+     * @param Node, The element node, whose namespace is to be fixed
+     */
+    protected void fixupElementNS(Node node) throws SAXException {
+        String namespaceURI = ((Element) node).getNamespaceURI();
+        String prefix = ((Element) node).getPrefix();
+        String localName = ((Element) node).getLocalName();
+
+        if (namespaceURI != null) {
+            //if ( Element's prefix/namespace pair (or default namespace,
+            // if no prefix) are within the scope of a binding )
+            prefix = prefix == null ? "" : prefix;
+            String inScopeNamespaceURI = fNSBinder.getURI(prefix);
+
+            if ((inScopeNamespaceURI != null
+                && inScopeNamespaceURI.equals(namespaceURI))) {
+                // do nothing, declaration in scope is inherited
+                
+            } else {
+                // Create a local namespace declaration attr for this namespace,
+                // with Element's current prefix (or a default namespace, if
+                // no prefix). If there's a conflicting local declaration
+                // already present, change its value to use this namespace.
+                
+                // Add the xmlns declaration attribute
+            	//fNSBinder.pushNamespace(prefix, namespaceURI, fElementDepth);
+                if ((fFeatures & NAMESPACEDECLS) != 0) {
+                    if ("".equals(prefix) || "".equals(namespaceURI)) {
+                    	((Element)node).setAttributeNS(XMLNS_URI, XMLNS_PREFIX, namespaceURI);
+                    } else {
+                    	((Element)node).setAttributeNS(XMLNS_URI, XMLNS_PREFIX + ":" + prefix, namespaceURI);
+                    }
+                }
+                fLocalNSBinder.declarePrefix(prefix, namespaceURI);
+                fNSBinder.declarePrefix(prefix, namespaceURI);
+
+            } 
+        } else {
+            // Element has no namespace
+            // DOM Level 1
+            if (localName == null || "".equals(localName)) {
+                //  DOM Level 1 node!
+                String msg =
+                    Utils.messages.createMessage(
+                        MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
+                        new Object[] { node.getNodeName()});
+
+                if (fErrorHandler != null) {
+                    fErrorHandler.handleError(
+                        new DOMErrorImpl(
+                            DOMError.SEVERITY_ERROR,
+                            msg,
+                            MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
+                            null,
+                            null,
+                            null));
+                }
+            } else {
+            	namespaceURI = fNSBinder.getURI("");
+            	if (namespaceURI !=null && namespaceURI.length() > 0) {
+            	    ((Element)node).setAttributeNS(XMLNS_URI, XMLNS_PREFIX, "");
+            		fLocalNSBinder.declarePrefix("", "");
+                    fNSBinder.declarePrefix("", "");
+            	}
+            }
+        }
+    }
+    /** 
+     * This table is a quick lookup of a property key (String) to the integer that
+     * is the bit to flip in the fFeatures field, so the integers should have
+     * values 1,2,4,8,16...
+     * 
+     */
+    private static final Hashtable s_propKeys = new Hashtable();
+    static {
+
+        // Initialize the mappings of property keys to bit values (Integer objects)
+        // or mappings to a String object "", which indicates we are interested
+        // in the property, but it does not have a simple bit value to flip
+
+        // cdata-sections
+        int i = CDATA;
+        Integer val = new Integer(i);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_CDATA_SECTIONS,
+            val);
+
+        // comments
+        int i1 = COMMENTS;
+        val = new Integer(i1);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_COMMENTS,
+            val);
+
+        // element-content-whitespace
+        int i2 = ELEM_CONTENT_WHITESPACE;
+        val = new Integer(i2);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
+            val);
+        int i3 = ENTITIES;
+
+        // entities
+        val = new Integer(i3);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_ENTITIES,
+            val);
+
+        // namespaces
+        int i4 = NAMESPACES;
+        val = new Integer(i4);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_NAMESPACES,
+            val);
+
+        // namespace-declarations
+        int i5 = NAMESPACEDECLS;
+        val = new Integer(i5);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
+            val);
+
+        // split-cdata-sections
+        int i6 = SPLITCDATA;
+        val = new Integer(i6);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_SPLIT_CDATA,
+            val);
+
+        // discard-default-content	
+        int i7 = WELLFORMED;
+        val = new Integer(i7);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS + DOMConstants.DOM_WELLFORMED,
+            val);
+
+        // discard-default-content	
+        int i8 = DISCARDDEFAULT;
+        val = new Integer(i8);
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
+            val);
+
+        // We are interested in these properties, but they don't have a simple
+        // bit value to deal with.
+        s_propKeys.put(
+            DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_FORMAT_PRETTY_PRINT,
+            "");
+        s_propKeys.put(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "");
+        s_propKeys.put(
+            DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION,
+            "");
+        s_propKeys.put(DOMConstants.S_XSL_OUTPUT_ENCODING, "");
+        s_propKeys.put(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.DOM_ENTITIES, "");
+    }
+
+    /**
+     * Initializes fFeatures based on the DOMConfiguration Parameters set.
+     *
+     * @param properties DOMConfiguraiton properties that were set and which are
+     * to be used while serializing the DOM. 
+     */
+    protected void initProperties(Properties properties) {
+
+        for (Enumeration keys = properties.keys(); keys.hasMoreElements();) {
+
+            final String key = (String) keys.nextElement();
+    
+            // caonical-form
+            // Other features will be enabled or disabled when this is set to true or false.
+
+            // error-handler; set via the constructor
+
+            // infoset
+            // Other features will be enabled or disabled when this is set to true
+
+            // A quick lookup for the given set of properties (cdata-sections ...)
+            final Object iobj = s_propKeys.get(key);
+            if (iobj != null) {
+                if (iobj instanceof Integer) {
+                    // Dealing with a property that has a simple bit value that
+                    // we need to set
+
+                    // cdata-sections			
+                    // comments
+                    // element-content-whitespace
+                    // entities
+                    // namespaces
+                    // namespace-declarations
+                    // split-cdata-sections
+                    // well-formed
+                    // discard-default-content
+                    final int BITFLAG = ((Integer) iobj).intValue();
+                    if ((properties.getProperty(key).endsWith("yes"))) {
+                        fFeatures = fFeatures | BITFLAG;
+                    } else {
+                        fFeatures = fFeatures & ~BITFLAG;
+                    }
+                } else {
+                    // We are interested in the property, but it is not
+                    // a simple bit that we need to set.
+
+                    if ((DOMConstants.S_DOM3_PROPERTIES_NS
+                        + DOMConstants.DOM_FORMAT_PRETTY_PRINT)
+                        .equals(key)) {
+                        // format-pretty-print; set internally on the serializers via xsl:output properties in LSSerializer
+                        if ((properties.getProperty(key).endsWith("yes"))) {
+                            fSerializer.setIndent(true);
+                            fSerializer.setIndentAmount(3);
+                        } else {
+                            fSerializer.setIndent(false);
+                        }
+                    } else if (
+                        (DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL).equals(
+                            key)) {
+                        // omit-xml-declaration; set internally on the serializers via xsl:output properties in LSSerializer
+                        if ((properties.getProperty(key).endsWith("yes"))) {
+                            fSerializer.setOmitXMLDeclaration(true);
+                        } else {
+                            fSerializer.setOmitXMLDeclaration(false);
+                        }
+                    } else if (
+                        (
+                            DOMConstants.S_XERCES_PROPERTIES_NS
+                                + DOMConstants.S_XML_VERSION).equals(
+                            key)) {
+                        // Retreive the value of the XML Version attribute via the xml-version
+                        String version = properties.getProperty(key);
+                        if ("1.1".equals(version)) {
+                            fIsXMLVersion11 = true;
+                            fSerializer.setVersion(version);
+                        } else {
+                            fSerializer.setVersion("1.0");
+                        }
+                    } else if (
+                        (DOMConstants.S_XSL_OUTPUT_ENCODING).equals(key)) {
+                        // Retreive the value of the XML Encoding attribute
+                        String encoding = properties.getProperty(key);
+                        if (encoding != null) {
+                            fSerializer.setEncoding(encoding);
+                        }
+                    } else if ((DOMConstants.S_XERCES_PROPERTIES_NS
+                            + DOMConstants.DOM_ENTITIES).equals(key)) {
+                        // Preserve entity references in the document
+                        if ((properties.getProperty(key).endsWith("yes"))) {
+                            fSerializer.setDTDEntityExpansion(false);
+                        }
+                        else {
+                            fSerializer.setDTDEntityExpansion(true);
+                        }
+                    } else {
+                        // We shouldn't get here, ever, now what?
+                    }
+                }
+            }
+        }
+        // Set the newLine character to use
+        if (fNewLine != null) {
+            fSerializer.setOutputProperty(OutputPropertiesFactory.S_KEY_LINE_SEPARATOR, fNewLine);
+        }
+    }
+
+} //TreeWalker
diff --git a/src/org/apache/xml/serializer/dom3/DOMConstants.java b/src/org/apache/xml/serializer/dom3/DOMConstants.java
index dae4f59..aec2910 100644
--- a/src/org/apache/xml/serializer/dom3/DOMConstants.java
+++ b/src/org/apache/xml/serializer/dom3/DOMConstants.java
@@ -1,134 +1,134 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-/**
- * DOM Constants used by the DOM Level 3 LSSerializer implementation.
- *
- * @xsl.usage internal
- */
-final class DOMConstants {
-    //
-    // Constants: DOM Level 3 feature ids
-    //
-    public static final String DOM3_REC_URL = "http://www.w3.org/TR/DOM-Level-3-LS";
-
-    public static final String XERCES_URL = "http://xml.apache.org/xerces-2j";
-
-    // The namespace used to qualified DOM Level 3 DOMConfiguration parameters
-    public static final String S_DOM3_PROPERTIES_NS = "{"
-            + DOMConstants.DOM3_REC_URL + "}";
-
-    public static final String S_XERCES_PROPERTIES_NS = "{"
-            + DOMConstants.XERCES_URL + "}";
-
-    // xmlns namespaces 
-    private static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";
-
-    // namespace prefix
-    private static final String XMLNS_PREFIX = "xmlns";
-
-    // ************************************************************************
-    // DOM Level 3 DOM Configuration parameter names
-    // ************************************************************************
-    // DOM Level 3 parameters defined in Core
-    public static final String DOM_CANONICAL_FORM = "canonical-form"; // Unsupported, we only appear to support this
-
-    public static final String DOM_CDATA_SECTIONS = "cdata-sections";
-
-    public static final String DOM_CHECK_CHAR_NORMALIZATION = "check-character-normalization"; // Unsupported
-
-    public static final String DOM_COMMENTS = "comments";
-
-    public static final String DOM_DATATYPE_NORMALIZATION = "datatype-normalization"; // Unsupported
-
-    public static final String DOM_ELEMENT_CONTENT_WHITESPACE = "element-content-whitespace";
-
-    public static final String DOM_ENTITIES = "entities";
-
-    public static final String DOM_INFOSET = "infoset";
-
-    public static final String DOM_NAMESPACES = "namespaces";
-
-    public static final String DOM_NAMESPACE_DECLARATIONS = "namespace-declarations";
-
-    public static final String DOM_NORMALIZE_CHARACTERS = "normalize-characters"; // Unsupported
-
-    public static final String DOM_SPLIT_CDATA = "split-cdata-sections";
-
-    public static final String DOM_VALIDATE_IF_SCHEMA = "validate-if-schema"; // Unsopported
-
-    public static final String DOM_VALIDATE = "validate"; // Unsopported
-
-    public static final String DOM_WELLFORMED = "well-formed";
-
-    // DOM Level 3 Save
-    public static final String DOM_DISCARD_DEFAULT_CONTENT = "discard-default-content";
-
-    public static final String DOM_FORMAT_PRETTY_PRINT = "format-pretty-print";
-
-    public static final String DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS = "ignore-unknown-character-denormalizations"; // Unsupported
-
-    public static final String DOM_XMLDECL = "xml-declaration";
-
-    // DOM Properties
-    public static final String DOM_ERROR_HANDLER = "error-handler";
-
-    public static final String DOM_SCHEMA_TYPE = "schema-type"; // Unsupported
-
-    public static final String DOM_SCHEMA_LOCATION = "schema-location"; // Unsupported
-
-    // ************************************************************************
-
-    // XSL Output properties
-    // The xsl:output 'indent' property used in LSSerializer 
-    public static final String S_XSL_OUTPUT_INDENT = "indent";
-
-    // The xsl:output 'indent' property used in LSSerializer 
-    public static final String S_XSL_OUTPUT_ENCODING = "encoding";
-
-    // The xsl:output 'omit-xml-declaration' property used in LSSerializer 
-    public static final String S_XSL_OUTPUT_OMIT_XML_DECL = "omit-xml-declaration";
-
-    // The xerces serializer specific 'omit-xml-declaration' property used in LSSerializer 
-    public static final String S_XML_VERSION = "xml-version";
-
-    //     
-    public static final String S_XSL_VALUE_ENTITIES = "org/apache/xml/serializer/XMLEntities";
-    
-    // Parameter values
-    public static final String DOM3_EXPLICIT_TRUE = "explicit:yes";
-
-    public static final String DOM3_DEFAULT_TRUE = "default:yes";
-
-    public static final String DOM3_EXPLICIT_FALSE = "explicit:no";
-
-    public static final String DOM3_DEFAULT_FALSE = "default:no";
-
-    // DOM Exceptions
-    public static final String DOM_EXCEPTION_FEATURE_NOT_FOUND = "FEATURE_NOT_FOUND";
-
-    public static final String DOM_EXCEPTION_FEATURE_NOT_SUPPORTED = "FEATURE_NOT_SUPPORTED";
-
-    public static final String DOM_LSEXCEPTION_SERIALIZER_ERR = "SERIALIZER_ERROR";
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+/**
+ * DOM Constants used by the DOM Level 3 LSSerializer implementation.
+ *
+ * @xsl.usage internal
+ */
+final class DOMConstants {
+    //
+    // Constants: DOM Level 3 feature ids
+    //
+    public static final String DOM3_REC_URL = "http://www.w3.org/TR/DOM-Level-3-LS";
+
+    public static final String XERCES_URL = "http://xml.apache.org/xerces-2j";
+
+    // The namespace used to qualified DOM Level 3 DOMConfiguration parameters
+    public static final String S_DOM3_PROPERTIES_NS = "{"
+            + DOMConstants.DOM3_REC_URL + "}";
+
+    public static final String S_XERCES_PROPERTIES_NS = "{"
+            + DOMConstants.XERCES_URL + "}";
+
+    // xmlns namespaces 
+    private static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";
+
+    // namespace prefix
+    private static final String XMLNS_PREFIX = "xmlns";
+
+    // ************************************************************************
+    // DOM Level 3 DOM Configuration parameter names
+    // ************************************************************************
+    // DOM Level 3 parameters defined in Core
+    public static final String DOM_CANONICAL_FORM = "canonical-form"; // Unsupported, we only appear to support this
+
+    public static final String DOM_CDATA_SECTIONS = "cdata-sections";
+
+    public static final String DOM_CHECK_CHAR_NORMALIZATION = "check-character-normalization"; // Unsupported
+
+    public static final String DOM_COMMENTS = "comments";
+
+    public static final String DOM_DATATYPE_NORMALIZATION = "datatype-normalization"; // Unsupported
+
+    public static final String DOM_ELEMENT_CONTENT_WHITESPACE = "element-content-whitespace";
+
+    public static final String DOM_ENTITIES = "entities";
+
+    public static final String DOM_INFOSET = "infoset";
+
+    public static final String DOM_NAMESPACES = "namespaces";
+
+    public static final String DOM_NAMESPACE_DECLARATIONS = "namespace-declarations";
+
+    public static final String DOM_NORMALIZE_CHARACTERS = "normalize-characters"; // Unsupported
+
+    public static final String DOM_SPLIT_CDATA = "split-cdata-sections";
+
+    public static final String DOM_VALIDATE_IF_SCHEMA = "validate-if-schema"; // Unsopported
+
+    public static final String DOM_VALIDATE = "validate"; // Unsopported
+
+    public static final String DOM_WELLFORMED = "well-formed";
+
+    // DOM Level 3 Save
+    public static final String DOM_DISCARD_DEFAULT_CONTENT = "discard-default-content";
+
+    public static final String DOM_FORMAT_PRETTY_PRINT = "format-pretty-print";
+
+    public static final String DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS = "ignore-unknown-character-denormalizations"; // Unsupported
+
+    public static final String DOM_XMLDECL = "xml-declaration";
+
+    // DOM Properties
+    public static final String DOM_ERROR_HANDLER = "error-handler";
+
+    public static final String DOM_SCHEMA_TYPE = "schema-type"; // Unsupported
+
+    public static final String DOM_SCHEMA_LOCATION = "schema-location"; // Unsupported
+
+    // ************************************************************************
+
+    // XSL Output properties
+    // The xsl:output 'indent' property used in LSSerializer 
+    public static final String S_XSL_OUTPUT_INDENT = "indent";
+
+    // The xsl:output 'indent' property used in LSSerializer 
+    public static final String S_XSL_OUTPUT_ENCODING = "encoding";
+
+    // The xsl:output 'omit-xml-declaration' property used in LSSerializer 
+    public static final String S_XSL_OUTPUT_OMIT_XML_DECL = "omit-xml-declaration";
+
+    // The xerces serializer specific 'omit-xml-declaration' property used in LSSerializer 
+    public static final String S_XML_VERSION = "xml-version";
+
+    //     
+    public static final String S_XSL_VALUE_ENTITIES = "org/apache/xml/serializer/XMLEntities";
+    
+    // Parameter values
+    public static final String DOM3_EXPLICIT_TRUE = "explicit:yes";
+
+    public static final String DOM3_DEFAULT_TRUE = "default:yes";
+
+    public static final String DOM3_EXPLICIT_FALSE = "explicit:no";
+
+    public static final String DOM3_DEFAULT_FALSE = "default:no";
+
+    // DOM Exceptions
+    public static final String DOM_EXCEPTION_FEATURE_NOT_FOUND = "FEATURE_NOT_FOUND";
+
+    public static final String DOM_EXCEPTION_FEATURE_NOT_SUPPORTED = "FEATURE_NOT_SUPPORTED";
+
+    public static final String DOM_LSEXCEPTION_SERIALIZER_ERR = "SERIALIZER_ERROR";
+
+}
diff --git a/src/org/apache/xml/serializer/dom3/DOMErrorHandlerImpl.java b/src/org/apache/xml/serializer/dom3/DOMErrorHandlerImpl.java
index fd88266..27602ff 100644
--- a/src/org/apache/xml/serializer/dom3/DOMErrorHandlerImpl.java
+++ b/src/org/apache/xml/serializer/dom3/DOMErrorHandlerImpl.java
@@ -1,67 +1,67 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import org.w3c.dom.DOMError;
-import org.w3c.dom.DOMErrorHandler;
-
-/**
- * This is the default implementation of the ErrorHandler interface and is 
- * used if one is not provided.  The default implementation simply reports
- * DOMErrors to System.err.
- * 
- * @xsl.usage internal
- */
-final class DOMErrorHandlerImpl implements DOMErrorHandler {
-    
-    /**
-     * Default Constructor 
-     */
-    DOMErrorHandlerImpl() {
-    }
-    
-    /**
-     * Implementation of DOMErrorHandler.handleError that
-     * adds copy of error to list for later retrieval.
-     *
-     */
-    public boolean handleError(DOMError error) {
-        boolean fail = true;
-        String severity = null;
-        if (error.getSeverity() == DOMError.SEVERITY_WARNING) {
-            fail = false;
-            severity = "[Warning]";
-        } else if (error.getSeverity() == DOMError.SEVERITY_ERROR) {
-            severity = "[Error]";
-        } else if (error.getSeverity() == DOMError.SEVERITY_FATAL_ERROR) {
-            severity = "[Fatal Error]";
-        }
-        
-        System.err.println(severity + ": " + error.getMessage() + "\t");
-        System.err.println("Type : " + error.getType() + "\t" + "Related Data: "
-                + error.getRelatedData() + "\t" + "Related Exception: "
-                + error.getRelatedException() );
-        
-        return fail;
-    }
-}
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import org.w3c.dom.DOMError;
+import org.w3c.dom.DOMErrorHandler;
+
+/**
+ * This is the default implementation of the ErrorHandler interface and is 
+ * used if one is not provided.  The default implementation simply reports
+ * DOMErrors to System.err.
+ * 
+ * @xsl.usage internal
+ */
+final class DOMErrorHandlerImpl implements DOMErrorHandler {
+    
+    /**
+     * Default Constructor 
+     */
+    DOMErrorHandlerImpl() {
+    }
+    
+    /**
+     * Implementation of DOMErrorHandler.handleError that
+     * adds copy of error to list for later retrieval.
+     *
+     */
+    public boolean handleError(DOMError error) {
+        boolean fail = true;
+        String severity = null;
+        if (error.getSeverity() == DOMError.SEVERITY_WARNING) {
+            fail = false;
+            severity = "[Warning]";
+        } else if (error.getSeverity() == DOMError.SEVERITY_ERROR) {
+            severity = "[Error]";
+        } else if (error.getSeverity() == DOMError.SEVERITY_FATAL_ERROR) {
+            severity = "[Fatal Error]";
+        }
+        
+        System.err.println(severity + ": " + error.getMessage() + "\t");
+        System.err.println("Type : " + error.getType() + "\t" + "Related Data: "
+                + error.getRelatedData() + "\t" + "Related Exception: "
+                + error.getRelatedException() );
+        
+        return fail;
+    }
+}
+
diff --git a/src/org/apache/xml/serializer/dom3/DOMErrorImpl.java b/src/org/apache/xml/serializer/dom3/DOMErrorImpl.java
index 81eda73..c2bd8b5 100644
--- a/src/org/apache/xml/serializer/dom3/DOMErrorImpl.java
+++ b/src/org/apache/xml/serializer/dom3/DOMErrorImpl.java
@@ -1,176 +1,176 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import org.w3c.dom.DOMError;
-import org.w3c.dom.DOMLocator;
-
-/**
- * Implementation of the DOM Level 3 DOMError interface.
- *
- * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ERROR-Interfaces-DOMError'>DOMError Interface definition from Document Object Model (DOM) Level 3 Core Specification</a>.
- * 
- * @xsl.usage internal 
- */
-
-final class DOMErrorImpl implements DOMError {
-    
-    /** private data members */
-    
-    // The DOMError Severity
-    private short fSeverity = DOMError.SEVERITY_WARNING;
-    
-    // The Error message
-    private String fMessage = null;
-    
-    //  A String indicating which related data is expected in relatedData. 
-    private String fType;
-    
-    // The platform related exception
-    private Exception fException = null;
-    
-    //  
-    private Object fRelatedData;
-    
-    // The location of the exception
-    private DOMLocatorImpl fLocation = new DOMLocatorImpl();
-    
-    
-    //
-    // Constructors
-    //
-    
-    /** 
-     * Default constructor. 
-     */    
-    DOMErrorImpl () {
-    }
-    
-    /**
-     * @param severity
-     * @param message
-     * @param type
-     */
-    DOMErrorImpl(short severity, String message, String type) {
-        fSeverity = severity;
-        fMessage = message;
-        fType = type;
-    }
-    
-    /**
-     * @param severity
-     * @param message
-     * @param type
-     * @param exception
-     */
-    DOMErrorImpl(short severity, String message, String type,
-            Exception exception) {
-        fSeverity = severity;
-        fMessage = message;
-        fType = type;
-        fException = exception;
-    }
-    
-    /**
-     * @param severity
-     * @param message
-     * @param type
-     * @param exception
-     * @param relatedData
-     * @param location
-     */
-    DOMErrorImpl(short severity, String message, String type,
-            Exception exception, Object relatedData, DOMLocatorImpl location) {
-        fSeverity = severity;
-        fMessage = message;
-        fType = type;
-        fException = exception;
-        fRelatedData = relatedData;
-        fLocation = location;
-    }
-    
-    
-    /**
-     * The severity of the error, either <code>SEVERITY_WARNING</code>, 
-     * <code>SEVERITY_ERROR</code>, or <code>SEVERITY_FATAL_ERROR</code>.
-     * 
-     * @return A short containing the DOMError severity
-     */
-    public short getSeverity() {
-        return fSeverity;
-    }
-    
-    /**
-     * The DOMError message string.
-     * 
-     * @return String
-     */
-    public String getMessage() {
-        return fMessage;
-    }
-    
-    /**
-     * The location of the DOMError.
-     * 
-     * @return A DOMLocator object containing the DOMError location.
-     */
-    public DOMLocator getLocation() {
-        return fLocation;
-    }
-    
-    /**
-     * The related platform dependent exception if any.
-     * 
-     * @return A java.lang.Exception 
-     */
-    public Object getRelatedException(){
-        return fException;
-    }
-    
-    /**
-     * Returns a String indicating which related data is expected in relatedData.
-     * 
-     * @return A String
-     */
-    public String getType(){
-        return fType;
-    }
-    
-    /**
-     * The related DOMError.type dependent data if any.
-     * 
-     * @return java.lang.Object 
-     */
-    public Object getRelatedData(){
-        return fRelatedData;
-    }
-    
-    public void reset(){
-        fSeverity = DOMError.SEVERITY_WARNING; 
-        fException = null;
-        fMessage = null;
-        fType = null;
-        fRelatedData = null;
-        fLocation = null;        
-    }
-    
-}// class DOMErrorImpl
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import org.w3c.dom.DOMError;
+import org.w3c.dom.DOMLocator;
+
+/**
+ * Implementation of the DOM Level 3 DOMError interface.
+ *
+ * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ERROR-Interfaces-DOMError'>DOMError Interface definition from Document Object Model (DOM) Level 3 Core Specification</a>.
+ * 
+ * @xsl.usage internal 
+ */
+
+final class DOMErrorImpl implements DOMError {
+    
+    /** private data members */
+    
+    // The DOMError Severity
+    private short fSeverity = DOMError.SEVERITY_WARNING;
+    
+    // The Error message
+    private String fMessage = null;
+    
+    //  A String indicating which related data is expected in relatedData. 
+    private String fType;
+    
+    // The platform related exception
+    private Exception fException = null;
+    
+    //  
+    private Object fRelatedData;
+    
+    // The location of the exception
+    private DOMLocatorImpl fLocation = new DOMLocatorImpl();
+    
+    
+    //
+    // Constructors
+    //
+    
+    /** 
+     * Default constructor. 
+     */    
+    DOMErrorImpl () {
+    }
+    
+    /**
+     * @param severity
+     * @param message
+     * @param type
+     */
+    DOMErrorImpl(short severity, String message, String type) {
+        fSeverity = severity;
+        fMessage = message;
+        fType = type;
+    }
+    
+    /**
+     * @param severity
+     * @param message
+     * @param type
+     * @param exception
+     */
+    DOMErrorImpl(short severity, String message, String type,
+            Exception exception) {
+        fSeverity = severity;
+        fMessage = message;
+        fType = type;
+        fException = exception;
+    }
+    
+    /**
+     * @param severity
+     * @param message
+     * @param type
+     * @param exception
+     * @param relatedData
+     * @param location
+     */
+    DOMErrorImpl(short severity, String message, String type,
+            Exception exception, Object relatedData, DOMLocatorImpl location) {
+        fSeverity = severity;
+        fMessage = message;
+        fType = type;
+        fException = exception;
+        fRelatedData = relatedData;
+        fLocation = location;
+    }
+    
+    
+    /**
+     * The severity of the error, either <code>SEVERITY_WARNING</code>, 
+     * <code>SEVERITY_ERROR</code>, or <code>SEVERITY_FATAL_ERROR</code>.
+     * 
+     * @return A short containing the DOMError severity
+     */
+    public short getSeverity() {
+        return fSeverity;
+    }
+    
+    /**
+     * The DOMError message string.
+     * 
+     * @return String
+     */
+    public String getMessage() {
+        return fMessage;
+    }
+    
+    /**
+     * The location of the DOMError.
+     * 
+     * @return A DOMLocator object containing the DOMError location.
+     */
+    public DOMLocator getLocation() {
+        return fLocation;
+    }
+    
+    /**
+     * The related platform dependent exception if any.
+     * 
+     * @return A java.lang.Exception 
+     */
+    public Object getRelatedException(){
+        return fException;
+    }
+    
+    /**
+     * Returns a String indicating which related data is expected in relatedData.
+     * 
+     * @return A String
+     */
+    public String getType(){
+        return fType;
+    }
+    
+    /**
+     * The related DOMError.type dependent data if any.
+     * 
+     * @return java.lang.Object 
+     */
+    public Object getRelatedData(){
+        return fRelatedData;
+    }
+    
+    public void reset(){
+        fSeverity = DOMError.SEVERITY_WARNING; 
+        fException = null;
+        fMessage = null;
+        fType = null;
+        fRelatedData = null;
+        fLocation = null;        
+    }
+    
+}// class DOMErrorImpl
diff --git a/src/org/apache/xml/serializer/dom3/DOMLocatorImpl.java b/src/org/apache/xml/serializer/dom3/DOMLocatorImpl.java
index 8add00c..f73789b 100644
--- a/src/org/apache/xml/serializer/dom3/DOMLocatorImpl.java
+++ b/src/org/apache/xml/serializer/dom3/DOMLocatorImpl.java
@@ -1,180 +1,180 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import org.w3c.dom.DOMLocator;
-import org.w3c.dom.Node;
-
-
-/**
- * <code>DOMLocatorImpl</code> is an implementaion that describes a location (e.g. 
- * where an error occured).
- * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
- * This class is a copy of the Xerces-2J class org.apache.xerces.dom.DOMLocatorImpl.java v 1.10 
- *
- * @author Gopal Sharma, SUN Microsystems Inc.
- * @version $Id: 
- * 
- * @xsl.usage internal
- */
-final class DOMLocatorImpl implements DOMLocator {
-    
-    //
-    // Data
-    //
-    
-    /**
-     * The column number where the error occured, 
-     * or -1 if there is no column number available.
-     */
-    private final int fColumnNumber;
-    
-    /**
-     * The line number where the error occured, 
-     * or -1 if there is no line number available.
-     */
-    private final int fLineNumber;
-    
-    /** related data node*/
-    private final Node fRelatedNode;
-    
-    /**
-     * The URI where the error occured, 
-     * or null if there is no URI available.
-     */
-    private final String fUri;
-    
-    /**
-     * The byte offset into the input source this locator is pointing to or -1 
-     * if there is no byte offset available
-     */
-    private final int fByteOffset;
-    
-    /**
-     * The UTF-16, as defined in [Unicode] and Amendment 1 of [ISO/IEC 10646], 
-     * offset into the input source this locator is pointing to or -1 if there 
-     * is no UTF-16 offset available.
-     */
-    private final int fUtf16Offset;
-    
-    //
-    // Constructors
-    //
-    
-    DOMLocatorImpl(){
-        fColumnNumber = -1;
-        fLineNumber = -1;
-        fRelatedNode = null;
-        fUri = null;
-        fByteOffset = -1;
-        fUtf16Offset = -1;
-    }
-    
-    DOMLocatorImpl (int lineNumber, int columnNumber, String uri ){
-        fLineNumber = lineNumber ;
-        fColumnNumber = columnNumber ;
-        fUri = uri;
-        
-        fRelatedNode = null;
-        fByteOffset = -1;
-        fUtf16Offset = -1;
-    } // DOMLocatorImpl (int lineNumber, int columnNumber, String uri )
-    
-    DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri ){
-        fLineNumber = lineNumber ;
-        fColumnNumber = columnNumber ;
-        fUri = uri;
-        fUtf16Offset = utf16Offset;
-        
-
-        fRelatedNode = null;
-        fByteOffset = -1;
-    } // DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri )
-    
-    DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri ){
-        fLineNumber = lineNumber ;
-        fColumnNumber = columnNumber ;
-        fByteOffset = byteoffset ;
-        fRelatedNode = relatedData ;
-        fUri = uri;
-        
-        fUtf16Offset = -1;
-    } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri )
-    
-    DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri, int utf16Offset ){
-        fLineNumber = lineNumber ;
-        fColumnNumber = columnNumber ;
-        fByteOffset = byteoffset ;
-        fRelatedNode = relatedData ;
-        fUri = uri;
-        fUtf16Offset = utf16Offset;
-    } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri )
-    
-    
-    /**
-     * The line number where the error occured, or -1 if there is no line 
-     * number available.
-     */
-    public int getLineNumber(){
-        return fLineNumber;
-    }
-    
-    /**
-     * The column number where the error occured, or -1 if there is no column 
-     * number available.
-     */
-    public int getColumnNumber(){
-        return fColumnNumber;
-    }
-    
-    
-    /**
-     * The URI where the error occured, or null if there is no URI available.
-     */
-    public String getUri(){
-        return fUri;
-    }
-    
-    
-    public Node getRelatedNode(){
-        return fRelatedNode;
-    }
-    
-    
-    /**
-     * The byte offset into the input source this locator is pointing to or -1 
-     * if there is no byte offset available
-     */
-    public int getByteOffset(){
-        return fByteOffset;
-    }
-    
-    /**
-     * The UTF-16, as defined in [Unicode] and Amendment 1 of [ISO/IEC 10646], 
-     * offset into the input source this locator is pointing to or -1 if there 
-     * is no UTF-16 offset available.
-     */
-    public int getUtf16Offset(){
-        return fUtf16Offset;
-    }
-    
-}// class DOMLocatorImpl
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import org.w3c.dom.DOMLocator;
+import org.w3c.dom.Node;
+
+
+/**
+ * <code>DOMLocatorImpl</code> is an implementaion that describes a location (e.g. 
+ * where an error occured).
+ * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
+ * This class is a copy of the Xerces-2J class org.apache.xerces.dom.DOMLocatorImpl.java v 1.10 
+ *
+ * @author Gopal Sharma, SUN Microsystems Inc.
+ * @version $Id: 
+ * 
+ * @xsl.usage internal
+ */
+final class DOMLocatorImpl implements DOMLocator {
+    
+    //
+    // Data
+    //
+    
+    /**
+     * The column number where the error occured, 
+     * or -1 if there is no column number available.
+     */
+    private final int fColumnNumber;
+    
+    /**
+     * The line number where the error occured, 
+     * or -1 if there is no line number available.
+     */
+    private final int fLineNumber;
+    
+    /** related data node*/
+    private final Node fRelatedNode;
+    
+    /**
+     * The URI where the error occured, 
+     * or null if there is no URI available.
+     */
+    private final String fUri;
+    
+    /**
+     * The byte offset into the input source this locator is pointing to or -1 
+     * if there is no byte offset available
+     */
+    private final int fByteOffset;
+    
+    /**
+     * The UTF-16, as defined in [Unicode] and Amendment 1 of [ISO/IEC 10646], 
+     * offset into the input source this locator is pointing to or -1 if there 
+     * is no UTF-16 offset available.
+     */
+    private final int fUtf16Offset;
+    
+    //
+    // Constructors
+    //
+    
+    DOMLocatorImpl(){
+        fColumnNumber = -1;
+        fLineNumber = -1;
+        fRelatedNode = null;
+        fUri = null;
+        fByteOffset = -1;
+        fUtf16Offset = -1;
+    }
+    
+    DOMLocatorImpl (int lineNumber, int columnNumber, String uri ){
+        fLineNumber = lineNumber ;
+        fColumnNumber = columnNumber ;
+        fUri = uri;
+        
+        fRelatedNode = null;
+        fByteOffset = -1;
+        fUtf16Offset = -1;
+    } // DOMLocatorImpl (int lineNumber, int columnNumber, String uri )
+    
+    DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri ){
+        fLineNumber = lineNumber ;
+        fColumnNumber = columnNumber ;
+        fUri = uri;
+        fUtf16Offset = utf16Offset;
+        
+
+        fRelatedNode = null;
+        fByteOffset = -1;
+    } // DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri )
+    
+    DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri ){
+        fLineNumber = lineNumber ;
+        fColumnNumber = columnNumber ;
+        fByteOffset = byteoffset ;
+        fRelatedNode = relatedData ;
+        fUri = uri;
+        
+        fUtf16Offset = -1;
+    } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri )
+    
+    DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri, int utf16Offset ){
+        fLineNumber = lineNumber ;
+        fColumnNumber = columnNumber ;
+        fByteOffset = byteoffset ;
+        fRelatedNode = relatedData ;
+        fUri = uri;
+        fUtf16Offset = utf16Offset;
+    } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri )
+    
+    
+    /**
+     * The line number where the error occured, or -1 if there is no line 
+     * number available.
+     */
+    public int getLineNumber(){
+        return fLineNumber;
+    }
+    
+    /**
+     * The column number where the error occured, or -1 if there is no column 
+     * number available.
+     */
+    public int getColumnNumber(){
+        return fColumnNumber;
+    }
+    
+    
+    /**
+     * The URI where the error occured, or null if there is no URI available.
+     */
+    public String getUri(){
+        return fUri;
+    }
+    
+    
+    public Node getRelatedNode(){
+        return fRelatedNode;
+    }
+    
+    
+    /**
+     * The byte offset into the input source this locator is pointing to or -1 
+     * if there is no byte offset available
+     */
+    public int getByteOffset(){
+        return fByteOffset;
+    }
+    
+    /**
+     * The UTF-16, as defined in [Unicode] and Amendment 1 of [ISO/IEC 10646], 
+     * offset into the input source this locator is pointing to or -1 if there 
+     * is no UTF-16 offset available.
+     */
+    public int getUtf16Offset(){
+        return fUtf16Offset;
+    }
+    
+}// class DOMLocatorImpl
diff --git a/src/org/apache/xml/serializer/dom3/DOMOutputImpl.java b/src/org/apache/xml/serializer/dom3/DOMOutputImpl.java
index 54327c0..6b1ff8c 100644
--- a/src/org/apache/xml/serializer/dom3/DOMOutputImpl.java
+++ b/src/org/apache/xml/serializer/dom3/DOMOutputImpl.java
@@ -1,177 +1,177 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import org.w3c.dom.ls.LSOutput;
-
-import java.io.Writer;
-import java.io.OutputStream;
-
-/**
- * This is a copy of the Xerces-2J class org.apache.xerces.dom.DOMOutputImpl.java
- * 
- * This class represents an output destination for data.
- * This interface allows an application to encapsulate information about an
- * output destination in a single object, which may include a URI, a byte stream
- * (possibly with a specifiedencoding), a base URI, and/or a character stream.
- * The exact definitions of a byte stream and a character stream are binding
- * dependent.
- * The application is expected to provide objects that implement this interface
- * whenever such objects are needed. The application can either provide its
- * own objects that implement this interface, or it can use the generic factory
- * method DOMImplementationLS.createLSOutput() to create objects that
- * implement this interface.
- * The DOMSerializer will use the LSOutput object to determine where to
- * serialize the output to. The DOMSerializer will look at the different
- * outputs specified in the LSOutput in the following order to know which one
- * to output to, the first one that data can be output to will be used:
- * 1.LSOutput.characterStream
- * 2.LSOutput.byteStream
- * 3.LSOutput.systemId
- * LSOutput objects belong to the application. The DOM implementation will
- * never modify them (though it may make copies and modify the copies,
- * if necessary).
- *
- *
- * @author Arun Yadav, Sun Microsytems
- * @author Gopal Sharma, Sun Microsystems
- * @version $Id : 
- * @xsl.usage internal 
- */
-
-final class DOMOutputImpl implements LSOutput {
-    
-    private Writer fCharStream = null;
-    private OutputStream fByteStream = null;
-    private String fSystemId = null;
-    private String fEncoding = null;
-    
-    /**
-     * Default Constructor
-     */
-    DOMOutputImpl() {}
-    
-    /**
-     * An attribute of a language and binding dependent type that represents a
-     * writable stream of bytes. If the application knows the character encoding
-     * of the byte stream, it should set the encoding attribute. Setting the
-     * encoding in this way will override any encoding specified in an XML
-     * declaration in the data.
-     */
-    
-    public Writer getCharacterStream(){
-        return fCharStream;
-    };
-    
-    /**
-     * An attribute of a language and binding dependent type that represents a
-     * writable stream of bytes. If the application knows the character encoding
-     * of the byte stream, it should set the encoding attribute. Setting the
-     * encoding in this way will override any encoding specified in an XML
-     * declaration in the data.
-     */
-    
-    public void setCharacterStream(Writer characterStream){
-        fCharStream = characterStream;
-    };
-    
-    /**
-     * Depending on the language binding in use, this attribute may not be
-     * available. An attribute of a language and binding dependent type that
-     * represents a writable stream to which 16-bit units can be output. The
-     * application must encode the stream using UTF-16 (defined in [Unicode] and
-     *  Amendment 1 of [ISO/IEC 10646]).
-     */
-    
-    public OutputStream getByteStream(){
-        return fByteStream;
-    };
-    
-    /**
-     * Depending on the language binding in use, this attribute may not be
-     * available. An attribute of a language and binding dependent type that
-     * represents a writable stream to which 16-bit units can be output. The
-     * application must encode the stream using UTF-16 (defined in [Unicode] and
-     *  Amendment 1 of [ISO/IEC 10646]).
-     */
-    
-    public void setByteStream(OutputStream byteStream){
-        fByteStream = byteStream;
-    };
-    
-    /**
-     * The system identifier, a URI reference [IETF RFC 2396], for this output
-     *  destination. If the application knows the character encoding of the
-     *  object pointed to by the system identifier, it can set the encoding
-     *  using the encoding attribute. If the system ID is a relative URI
-     *  reference (see section 5 in [IETF RFC 2396]), the behavior is
-     *  implementation dependent.
-     */
-    
-    public String getSystemId(){
-        return fSystemId;
-    };
-    
-    /**
-     * The system identifier, a URI reference [IETF RFC 2396], for this output
-     *  destination. If the application knows the character encoding of the
-     *  object pointed to by the system identifier, it can set the encoding
-     *  using the encoding attribute. If the system ID is a relative URI
-     *  reference (see section 5 in [IETF RFC 2396]), the behavior is
-     *  implementation dependent.
-     */
-    
-    public void setSystemId(String systemId){
-        fSystemId = systemId;
-    };
-    
-    /**
-     * The character encoding, if known. The encoding must be a string
-     * acceptable for an XML encoding declaration ([XML 1.0] section 4.3.3
-     * "Character Encoding in Entities"). This attribute has no effect when the
-     * application provides a character stream or string data. For other sources
-     * of input, an encoding specified by means of this attribute will override
-     * any encoding specified in the XML declaration or the Text declaration, or
-     * an encoding obtained from a higher level protocol, such as HTTP
-     * [IETF RFC 2616].
-     */
-    
-    public String getEncoding(){
-        return fEncoding;
-    };
-    
-    /**
-     * The character encoding, if known. The encoding must be a string
-     * acceptable for an XML encoding declaration ([XML 1.0] section 4.3.3
-     * "Character Encoding in Entities"). This attribute has no effect when the
-     * application provides a character stream or string data. For other sources
-     * of input, an encoding specified by means of this attribute will override
-     * any encoding specified in the XML declaration or the Text declaration, or
-     * an encoding obtained from a higher level protocol, such as HTTP
-     * [IETF RFC 2616].
-     */
-    
-    public void setEncoding(String encoding){
-        fEncoding = encoding;
-    };
-    
-}//DOMOutputImpl
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import org.w3c.dom.ls.LSOutput;
+
+import java.io.Writer;
+import java.io.OutputStream;
+
+/**
+ * This is a copy of the Xerces-2J class org.apache.xerces.dom.DOMOutputImpl.java
+ * 
+ * This class represents an output destination for data.
+ * This interface allows an application to encapsulate information about an
+ * output destination in a single object, which may include a URI, a byte stream
+ * (possibly with a specifiedencoding), a base URI, and/or a character stream.
+ * The exact definitions of a byte stream and a character stream are binding
+ * dependent.
+ * The application is expected to provide objects that implement this interface
+ * whenever such objects are needed. The application can either provide its
+ * own objects that implement this interface, or it can use the generic factory
+ * method DOMImplementationLS.createLSOutput() to create objects that
+ * implement this interface.
+ * The DOMSerializer will use the LSOutput object to determine where to
+ * serialize the output to. The DOMSerializer will look at the different
+ * outputs specified in the LSOutput in the following order to know which one
+ * to output to, the first one that data can be output to will be used:
+ * 1.LSOutput.characterStream
+ * 2.LSOutput.byteStream
+ * 3.LSOutput.systemId
+ * LSOutput objects belong to the application. The DOM implementation will
+ * never modify them (though it may make copies and modify the copies,
+ * if necessary).
+ *
+ *
+ * @author Arun Yadav, Sun Microsytems
+ * @author Gopal Sharma, Sun Microsystems
+ * @version $Id : 
+ * @xsl.usage internal 
+ */
+
+final class DOMOutputImpl implements LSOutput {
+    
+    private Writer fCharStream = null;
+    private OutputStream fByteStream = null;
+    private String fSystemId = null;
+    private String fEncoding = null;
+    
+    /**
+     * Default Constructor
+     */
+    DOMOutputImpl() {}
+    
+    /**
+     * An attribute of a language and binding dependent type that represents a
+     * writable stream of bytes. If the application knows the character encoding
+     * of the byte stream, it should set the encoding attribute. Setting the
+     * encoding in this way will override any encoding specified in an XML
+     * declaration in the data.
+     */
+    
+    public Writer getCharacterStream(){
+        return fCharStream;
+    };
+    
+    /**
+     * An attribute of a language and binding dependent type that represents a
+     * writable stream of bytes. If the application knows the character encoding
+     * of the byte stream, it should set the encoding attribute. Setting the
+     * encoding in this way will override any encoding specified in an XML
+     * declaration in the data.
+     */
+    
+    public void setCharacterStream(Writer characterStream){
+        fCharStream = characterStream;
+    };
+    
+    /**
+     * Depending on the language binding in use, this attribute may not be
+     * available. An attribute of a language and binding dependent type that
+     * represents a writable stream to which 16-bit units can be output. The
+     * application must encode the stream using UTF-16 (defined in [Unicode] and
+     *  Amendment 1 of [ISO/IEC 10646]).
+     */
+    
+    public OutputStream getByteStream(){
+        return fByteStream;
+    };
+    
+    /**
+     * Depending on the language binding in use, this attribute may not be
+     * available. An attribute of a language and binding dependent type that
+     * represents a writable stream to which 16-bit units can be output. The
+     * application must encode the stream using UTF-16 (defined in [Unicode] and
+     *  Amendment 1 of [ISO/IEC 10646]).
+     */
+    
+    public void setByteStream(OutputStream byteStream){
+        fByteStream = byteStream;
+    };
+    
+    /**
+     * The system identifier, a URI reference [IETF RFC 2396], for this output
+     *  destination. If the application knows the character encoding of the
+     *  object pointed to by the system identifier, it can set the encoding
+     *  using the encoding attribute. If the system ID is a relative URI
+     *  reference (see section 5 in [IETF RFC 2396]), the behavior is
+     *  implementation dependent.
+     */
+    
+    public String getSystemId(){
+        return fSystemId;
+    };
+    
+    /**
+     * The system identifier, a URI reference [IETF RFC 2396], for this output
+     *  destination. If the application knows the character encoding of the
+     *  object pointed to by the system identifier, it can set the encoding
+     *  using the encoding attribute. If the system ID is a relative URI
+     *  reference (see section 5 in [IETF RFC 2396]), the behavior is
+     *  implementation dependent.
+     */
+    
+    public void setSystemId(String systemId){
+        fSystemId = systemId;
+    };
+    
+    /**
+     * The character encoding, if known. The encoding must be a string
+     * acceptable for an XML encoding declaration ([XML 1.0] section 4.3.3
+     * "Character Encoding in Entities"). This attribute has no effect when the
+     * application provides a character stream or string data. For other sources
+     * of input, an encoding specified by means of this attribute will override
+     * any encoding specified in the XML declaration or the Text declaration, or
+     * an encoding obtained from a higher level protocol, such as HTTP
+     * [IETF RFC 2616].
+     */
+    
+    public String getEncoding(){
+        return fEncoding;
+    };
+    
+    /**
+     * The character encoding, if known. The encoding must be a string
+     * acceptable for an XML encoding declaration ([XML 1.0] section 4.3.3
+     * "Character Encoding in Entities"). This attribute has no effect when the
+     * application provides a character stream or string data. For other sources
+     * of input, an encoding specified by means of this attribute will override
+     * any encoding specified in the XML declaration or the Text declaration, or
+     * an encoding obtained from a higher level protocol, such as HTTP
+     * [IETF RFC 2616].
+     */
+    
+    public void setEncoding(String encoding){
+        fEncoding = encoding;
+    };
+    
+}//DOMOutputImpl
diff --git a/src/org/apache/xml/serializer/dom3/DOMStringListImpl.java b/src/org/apache/xml/serializer/dom3/DOMStringListImpl.java
index 5ace83a..79fa0b9 100644
--- a/src/org/apache/xml/serializer/dom3/DOMStringListImpl.java
+++ b/src/org/apache/xml/serializer/dom3/DOMStringListImpl.java
@@ -1,99 +1,99 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-package org.apache.xml.serializer.dom3;
-
-import java.util.Vector;
-
-//import org.apache.xerces.dom3.DOMStringList;
-import org.w3c.dom.DOMStringList;
-
-/**
- * This class implemets the DOM Level 3 Core interface DOMStringList.
- * 
- * @xsl.usage internal
- */
-final class DOMStringListImpl implements DOMStringList {
-    
-    //A collection of DOMString values
-    private Vector fStrings;
-    
-    /** 
-     * Construct an empty list of DOMStringListImpl
-     */ 
-    DOMStringListImpl() {
-        fStrings = new Vector();    
-    }
-    
-    /** 
-     * Construct an empty list of DOMStringListImpl
-     */ 
-    DOMStringListImpl(Vector params) {
-        fStrings = params;    
-    }
-    
-    /** 
-     * Construct an empty list of DOMStringListImpl
-     */ 
-    DOMStringListImpl(String[] params ) {
-        fStrings = new Vector();
-        if (params != null) {
-            for (int i=0; i < params.length; i++) {
-                fStrings.add(params[i]);    
-            }
-        }
-    }
-    
-    /**
-     * @see org.apache.xerces.dom3.DOMStringList#item(int)
-     */
-    public String item(int index) {
-        try {
-            return (String) fStrings.elementAt(index);
-        } catch (ArrayIndexOutOfBoundsException e) {
-            return null;
-        }
-    }
-    
-    /**
-     * @see org.apache.xerces.dom3.DOMStringList#getLength()
-     */
-    public int getLength() {
-        return fStrings.size();
-    }
-    
-    /**
-     * @see org.apache.xerces.dom3.DOMStringList#contains(String)
-     */
-    public boolean contains(String param) {
-        return fStrings.contains(param) ;
-    }
-    
-    /**
-     * DOM Internal:
-     * Add a <code>DOMString</code> to the list.
-     * 
-     * @param domString A string to add to the list
-     */
-    public void add(String param) {
-        fStrings.add(param);
-    }
-    
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+package org.apache.xml.serializer.dom3;
+
+import java.util.Vector;
+
+//import org.apache.xerces.dom3.DOMStringList;
+import org.w3c.dom.DOMStringList;
+
+/**
+ * This class implemets the DOM Level 3 Core interface DOMStringList.
+ * 
+ * @xsl.usage internal
+ */
+final class DOMStringListImpl implements DOMStringList {
+    
+    //A collection of DOMString values
+    private Vector fStrings;
+    
+    /** 
+     * Construct an empty list of DOMStringListImpl
+     */ 
+    DOMStringListImpl() {
+        fStrings = new Vector();    
+    }
+    
+    /** 
+     * Construct an empty list of DOMStringListImpl
+     */ 
+    DOMStringListImpl(Vector params) {
+        fStrings = params;    
+    }
+    
+    /** 
+     * Construct an empty list of DOMStringListImpl
+     */ 
+    DOMStringListImpl(String[] params ) {
+        fStrings = new Vector();
+        if (params != null) {
+            for (int i=0; i < params.length; i++) {
+                fStrings.add(params[i]);    
+            }
+        }
+    }
+    
+    /**
+     * @see org.apache.xerces.dom3.DOMStringList#item(int)
+     */
+    public String item(int index) {
+        try {
+            return (String) fStrings.elementAt(index);
+        } catch (ArrayIndexOutOfBoundsException e) {
+            return null;
+        }
+    }
+    
+    /**
+     * @see org.apache.xerces.dom3.DOMStringList#getLength()
+     */
+    public int getLength() {
+        return fStrings.size();
+    }
+    
+    /**
+     * @see org.apache.xerces.dom3.DOMStringList#contains(String)
+     */
+    public boolean contains(String param) {
+        return fStrings.contains(param) ;
+    }
+    
+    /**
+     * DOM Internal:
+     * Add a <code>DOMString</code> to the list.
+     * 
+     * @param domString A string to add to the list
+     */
+    public void add(String param) {
+        fStrings.add(param);
+    }
+    
+}
diff --git a/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java b/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java
index acac6fc..c2ce783 100644
--- a/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java
+++ b/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java
@@ -1,1537 +1,1537 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import org.apache.xml.serializer.DOM3Serializer;
-import org.apache.xml.serializer.Encodings;
-import org.apache.xml.serializer.OutputPropertiesFactory;
-import org.apache.xml.serializer.Serializer;
-import org.apache.xml.serializer.SerializerFactory;
-import org.apache.xml.serializer.utils.MsgKey;
-import org.apache.xml.serializer.utils.SystemIDResolver;
-import org.apache.xml.serializer.utils.Utils;
-import org.w3c.dom.DOMConfiguration;
-import org.w3c.dom.DOMError;
-import org.w3c.dom.DOMErrorHandler;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.DOMStringList;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.ls.LSException;
-import org.w3c.dom.ls.LSOutput;
-import org.w3c.dom.ls.LSSerializer;
-import org.w3c.dom.ls.LSSerializerFilter;
-
-/**
- * Implemenatation of DOM Level 3 org.w3c.ls.LSSerializer and 
- * org.w3c.dom.ls.DOMConfiguration.  Serialization is achieved by delegating 
- * serialization calls to <CODE>org.apache.xml.serializer.ToStream</CODE> or 
- * one of its derived classes depending on the serialization method, while walking
- * the DOM in DOM3TreeWalker.  
- * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer">org.w3c.dom.ls.LSSerializer</a>
- * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">org.w3c.dom.DOMConfiguration</a>
- *  
- * @version $Id:  
- * 
- * @xsl.usage internal 
- */
-final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
-    
-    // The default end-of-line character sequence used in serialization.
-    private static final String DEFAULT_END_OF_LINE;
-    static {
-        String lineSeparator = (String) AccessController.doPrivileged(new PrivilegedAction() {
-            public Object run() {
-                try {
-                    return System.getProperty("line.separator");
-                }
-                catch (SecurityException ex) {}
-                return null;
-            }
-        });
-        // The DOM Level 3 Load and Save specification requires that implementations choose a default
-        // sequence which matches one allowed by XML 1.0 (or XML 1.1). If the value of "line.separator" 
-        // isn't one of the XML 1.0 end-of-line sequences then we select "\n" as the default value.
-        DEFAULT_END_OF_LINE = lineSeparator != null && 
-            (lineSeparator.equals("\r\n") || lineSeparator.equals("\r")) ? lineSeparator : "\n";
-    }
-    
-    /** private data members */
-    private Serializer fXMLSerializer = null;
-    
-    // Tracks DOMConfiguration features. 
-    protected int fFeatures = 0;
-    
-    // Common DOM serializer
-    private  DOM3Serializer fDOMSerializer = null;
-    
-    // A filter set on the LSSerializer
-    private LSSerializerFilter fSerializerFilter = null;  
-    
-    // Stores the nodeArg parameter to speed up multiple writes of the same node.
-    private Node fVisitedNode = null;
-    
-    // The end-of-line character sequence used in serialization. "\n" is whats used on the web.
-    private String fEndOfLine = DEFAULT_END_OF_LINE;
-    
-    // The DOMErrorhandler.
-    private DOMErrorHandler fDOMErrorHandler = null;
-    
-    // The Configuration parameter to pass to the Underlying serilaizer.
-    private Properties fDOMConfigProperties = null;
-    
-    // The encoding to use during serialization.
-    private String fEncoding; 
-	
-    // ************************************************************************
-    // DOM Level 3 DOM Configuration parameter names
-    // ************************************************************************    
-    // Parameter canonical-form, true [optional] - NOT SUPPORTED 
-    private final static int CANONICAL = 0x1 << 0;
-    
-    // Parameter cdata-sections, true [required] (default)
-    private final static int CDATA = 0x1 << 1;
-    
-    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED 
-    private final static int CHARNORMALIZE = 0x1 << 2;
-    
-    // Parameter comments, true [required] (default)
-    private final static int COMMENTS = 0x1 << 3;
-    
-    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
-    private final static int DTNORMALIZE = 0x1 << 4;    
-    
-    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
-    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
-    
-    // Parameter entities, true [required] (default)
-    private final static int ENTITIES = 0x1 << 6;
-    
-    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
-    private final static int INFOSET = 0x1 << 7;
-    
-    // Parameter namespaces, true [required] (default)
-    private final static int NAMESPACES = 0x1 << 8;
-    
-    // Parameter namespace-declarations, true [required] (default)
-    private final static int NAMESPACEDECLS = 0x1 << 9;
-    
-    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
-    private final static int NORMALIZECHARS = 0x1 << 10;
-    
-    // Parameter split-cdata-sections, true [required] (default)
-    private final static int SPLITCDATA = 0x1 << 11;   
-    
-    // Parameter validate, true [optional] - NOT SUPPORTED
-    private final static int VALIDATE = 0x1 << 12;   
-    
-    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
-    private final static int SCHEMAVALIDATE = 0x1 << 13;
-    
-    // Parameter split-cdata-sections, true [required] (default)
-    private final static int WELLFORMED = 0x1 << 14;   
-    
-    // Parameter discard-default-content, true [required] (default)
-    // Not sure how this will be used in level 2 Documents
-    private final static int DISCARDDEFAULT = 0x1 << 15;       
-    
-    // Parameter format-pretty-print, true [optional] 
-    private final static int PRETTY_PRINT = 0x1 << 16;
-    
-    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
-    // We currently do not support XML 1.1 character normalization
-    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
-    
-    // Parameter discard-default-content, true [required] (default)
-    private final static int XMLDECL = 0x1 << 18;    
-    // ************************************************************************
-    
-    // Recognized parameters for which atleast one value can be set
-    private String fRecognizedParameters [] = {
-            DOMConstants.DOM_CANONICAL_FORM,
-            DOMConstants.DOM_CDATA_SECTIONS,
-            DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
-            DOMConstants.DOM_COMMENTS,
-            DOMConstants.DOM_DATATYPE_NORMALIZATION,
-            DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-            DOMConstants.DOM_ENTITIES,
-            DOMConstants.DOM_INFOSET,
-            DOMConstants.DOM_NAMESPACES,
-            DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-            //DOMConstants.DOM_NORMALIZE_CHARACTERS,
-            DOMConstants.DOM_SPLIT_CDATA,
-            DOMConstants.DOM_VALIDATE,
-            DOMConstants.DOM_VALIDATE_IF_SCHEMA,
-            DOMConstants.DOM_WELLFORMED,
-            DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
-            DOMConstants.DOM_FORMAT_PRETTY_PRINT,
-            DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS,
-            DOMConstants.DOM_XMLDECL,
-            DOMConstants.DOM_ERROR_HANDLER
-    };
-    
-    
-    /**
-     * Constructor:  Creates a LSSerializerImpl object.  The underlying
-     * XML 1.0 or XML 1.1 org.apache.xml.serializer.Serializer object is
-     * created and initialized the first time any of the write methods are  
-     * invoked to serialize the Node.  Subsequent write methods on the same
-     * LSSerializerImpl object will use the previously created Serializer object.
-     */
-    public LSSerializerImpl () {
-        // set default parameters
-        fFeatures |= CDATA;
-        fFeatures |= COMMENTS;
-        fFeatures |= ELEM_CONTENT_WHITESPACE;
-        fFeatures |= ENTITIES;
-        fFeatures |= NAMESPACES;
-        fFeatures |= NAMESPACEDECLS;
-        fFeatures |= SPLITCDATA;
-        fFeatures |= WELLFORMED;
-        fFeatures |= DISCARDDEFAULT;
-        fFeatures |= XMLDECL;
-        
-        // New OutputFormat properties
-        fDOMConfigProperties = new Properties();
-        
-        // Initialize properties to be passed on the underlying serializer
-        initializeSerializerProps();
-        
-        // Create the underlying serializer.
-        Properties  configProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
-        
-        // change xml version from 1.0 to 1.1
-        //configProps.setProperty("version", "1.1");
-        
-        // Get a serializer that seriailizes according the the properties,
-        // which in this case is to xml
-        fXMLSerializer = SerializerFactory.getSerializer(configProps);
-        
-        // Initialize Serializer
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-    }
-    
-    /**
-     * Initializes the underlying serializer's configuration depending on the
-     * default DOMConfiguration parameters. This method must be called before a
-     * node is to be serialized.
-     * 
-     * @xsl.usage internal
-     */
-    public void initializeSerializerProps () {
-        // canonical-form
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // cdata-sections
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // "check-character-normalization"
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // comments
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // datatype-normalization
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_DATATYPE_NORMALIZATION,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // element-content-whitespace
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // entities
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
-        // preserve entities
-        fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
-                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
-
-        // error-handler
-        // Should we set our default ErrorHandler
-        /*
-         * if (fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER) != null) {
-         * fDOMErrorHandler =
-         * (DOMErrorHandler)fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER); }
-         */
-        
-        // infoset
-        if ((fFeatures & INFOSET) != 0) {
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-                    DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-                    DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
-            // preserve entities
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
-                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_CDATA_SECTIONS,
-                    DOMConstants.DOM3_DEFAULT_FALSE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
-                    DOMConstants.DOM3_DEFAULT_FALSE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_DATATYPE_NORMALIZATION,
-                    DOMConstants.DOM3_DEFAULT_FALSE);
-        }
-        
-        // namespaces
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // namespace-declarations
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // normalize-characters
-        /*
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NORMALIZE_CHARACTERS,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        */
-        
-        // split-cdata-sections
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // validate
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // validate-if-schema
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // well-formed
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // pretty-print
-        fDOMConfigProperties.setProperty(
-                DOMConstants.S_XSL_OUTPUT_INDENT,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        fDOMConfigProperties.setProperty(
-                OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, Integer.toString(3));
-        
-        // 
-        
-        // discard-default-content
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // xml-declaration
-        fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
-        
-    }    
-    
-    // ************************************************************************
-    // DOMConfiguraiton implementation
-    // ************************************************************************
-    
-    /** 
-     * Checks if setting a parameter to a specific value is supported.    
-     *  
-     * @see org.w3c.dom.DOMConfiguration#canSetParameter(java.lang.String, java.lang.Object)
-     * @since DOM Level 3
-     * @param name A String containing the DOMConfiguration parameter name.
-     * @param value An Object specifying the value of the corresponding parameter. 
-     */
-    public boolean canSetParameter(String name, Object value) {
-        if (value instanceof Boolean){
-            if ( name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)    
-                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)    
-                    || name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)                
-                    || name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)){
-                // both values supported
-                return true;
-            }
-            else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
-                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
-                    ) {
-                // true is not supported
-                return !((Boolean)value).booleanValue();
-            }
-            else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
-                // false is not supported
-                return ((Boolean)value).booleanValue();
-            }
-        }
-        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) &&
-                value == null || value instanceof DOMErrorHandler){
-            return true;
-        }
-        return false;
-    }
-    /**
-     * This method returns the value of a parameter if known.
-     * 
-     * @see org.w3c.dom.DOMConfiguration#getParameter(java.lang.String)
-     * 
-     * @param name A String containing the DOMConfiguration parameter name 
-     *             whose value is to be returned.
-     * @return Object The value of the parameter if known. 
-     */
-    public Object getParameter(String name) throws DOMException {
-        if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
-            return ((fFeatures & COMMENTS) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
-            return ((fFeatures & CDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
-            return ((fFeatures & ENTITIES) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
-            return ((fFeatures & NAMESPACES) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
-            return ((fFeatures & NAMESPACEDECLS) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
-            return ((fFeatures & SPLITCDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
-            return ((fFeatures & WELLFORMED) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        }  else if (name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
-            return ((fFeatures & DISCARDDEFAULT) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
-            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
-            return ((fFeatures & XMLDECL) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
-            return ((fFeatures & ELEM_CONTENT_WHITESPACE) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
-            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
-            return Boolean.TRUE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
-                || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
-                || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) 
-                // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)                
-                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
-                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
-            return Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)){
-            if ((fFeatures & ENTITIES) == 0 &&
-                    (fFeatures & CDATA) == 0 &&
-                    (fFeatures & ELEM_CONTENT_WHITESPACE) != 0 &&
-                    (fFeatures & NAMESPACES) != 0 &&
-                    (fFeatures & NAMESPACEDECLS) != 0 &&
-                    (fFeatures & WELLFORMED) != 0 &&
-                    (fFeatures & COMMENTS) != 0) {
-                return Boolean.TRUE;
-            }                 
-            return Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
-            return fDOMErrorHandler;
-        } else if (
-                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
-                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
-            return null;
-        } else {
-            // Here we have to add the Xalan specific DOM Message Formatter
-            String msg = Utils.messages.createMessage(
-                    MsgKey.ER_FEATURE_NOT_FOUND,
-                    new Object[] { name });
-            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
-        }
-    }
-    
-    /**
-     * This method returns a of the parameters supported by this DOMConfiguration object 
-     * and for which at least one value can be set by the application
-     * 
-     * @see org.w3c.dom.DOMConfiguration#getParameterNames()
-     * 
-     * @return DOMStringList A list of DOMConfiguration parameters recognized
-     *                       by the serializer
-     */
-    public DOMStringList getParameterNames() {
-        return new DOMStringListImpl(fRecognizedParameters);
-    }
-    
-    /**
-     * This method sets the value of the named parameter.
-     *   
-     * @see org.w3c.dom.DOMConfiguration#setParameter(java.lang.String, java.lang.Object)
-     * 
-     * @param name A String containing the DOMConfiguration parameter name.
-     * @param value An Object contaiing the parameters value to set.
-     */
-    public void setParameter(String name, Object value) throws DOMException {
-        // If the value is a boolean
-        if (value instanceof Boolean) {
-            boolean state = ((Boolean) value).booleanValue();
-            
-            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
-                fFeatures = state ? fFeatures | COMMENTS : fFeatures
-                        & ~COMMENTS;
-                // comments
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }                
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
-                fFeatures =  state ? fFeatures | CDATA : fFeatures
-                        & ~CDATA;
-                // cdata-sections
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
-                fFeatures = state ? fFeatures | ENTITIES : fFeatures
-                        & ~ENTITIES;
-                // entities
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(
-                            DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    fDOMConfigProperties.setProperty(
-                            DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
-                fFeatures = state ? fFeatures | NAMESPACES : fFeatures
-                        & ~NAMESPACES;
-                // namespaces
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }       
-            } else if (name
-                    .equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
-                fFeatures = state ? fFeatures | NAMESPACEDECLS
-                        : fFeatures & ~NAMESPACEDECLS;
-                // namespace-declarations
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                } 
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
-                fFeatures = state ? fFeatures | SPLITCDATA : fFeatures
-                        & ~SPLITCDATA;
-                // split-cdata-sections
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }  
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
-                fFeatures = state ? fFeatures | WELLFORMED : fFeatures
-                        & ~WELLFORMED;
-                // well-formed
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }                  
-            } else if (name
-                    .equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
-                fFeatures = state ? fFeatures | DISCARDDEFAULT
-                        : fFeatures & ~DISCARDDEFAULT;
-                // discard-default-content
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }                    
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
-                fFeatures = state ? fFeatures | PRETTY_PRINT : fFeatures
-                        & ~PRETTY_PRINT;
-                // format-pretty-print
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_TRUE);
-                }
-                else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
-                fFeatures = state ? fFeatures | XMLDECL : fFeatures
-                        & ~XMLDECL;
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "yes"); 
-                }       
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
-                fFeatures = state ? fFeatures | ELEM_CONTENT_WHITESPACE : fFeatures
-                        & ~ELEM_CONTENT_WHITESPACE;
-                // element-content-whitespace
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }            
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
-                // false is not supported
-                if (!state) {
-                    // Here we have to add the Xalan specific DOM Message Formatter
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
-                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
-                    ) {
-                // true is not supported
-                if (state) {
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
-                } else {
-                    if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION 
-                                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } /* else if (name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_NORMALIZE_CHARACTERS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } */
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
-                // infoset
-                if (state) {
-                    fFeatures &= ~ENTITIES;
-                    fFeatures &= ~CDATA;
-                    fFeatures &= ~SCHEMAVALIDATE;
-                    fFeatures &= ~DTNORMALIZE;
-                    fFeatures |= NAMESPACES;
-                    fFeatures |= NAMESPACEDECLS;
-                    fFeatures |= WELLFORMED;
-                    fFeatures |= ELEM_CONTENT_WHITESPACE;
-                    fFeatures |= COMMENTS;
-                    
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE); 
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);            
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else {
-                // If this is a non-boolean parameter a type mismatch should be thrown.
-                if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_TYPE_MISMATCH_ERR,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-                }
-                
-                // Parameter is not recognized
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_FEATURE_NOT_FOUND,
-                        new Object[] { name });
-                throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
-            }
-        } // If the parameter value is not a boolean 
-        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
-            if (value == null || value instanceof DOMErrorHandler) {
-                fDOMErrorHandler = (DOMErrorHandler)value;
-            } else {
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_TYPE_MISMATCH_ERR,
-                        new Object[] { name });
-                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-            }
-        } else if (
-                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
-                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
-            if (value != null) {
-                if (!(value instanceof String)) {
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_TYPE_MISMATCH_ERR,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-                }
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_FEATURE_NOT_SUPPORTED,
-                        new Object[] { name });
-                throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
-            }
-        } else {
-            // If this is a boolean parameter a type mismatch should be thrown.
-            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_TYPE_MISMATCH_ERR,
-                        new Object[] { name });
-                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-            }
-            
-            // Parameter is not recognized
-            String msg = Utils.messages.createMessage(
-                    MsgKey.ER_FEATURE_NOT_FOUND,
-                    new Object[] { name });
-            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
-        }
-    }
-    // ************************************************************************
-    
-    
-    // ************************************************************************
-    // DOMConfiguraiton implementation
-    // ************************************************************************
-    
-    /** 
-     * Returns the DOMConfiguration of the LSSerializer.
-     *  
-     * @see org.w3c.dom.ls.LSSerializer#getDomConfig()
-     * @since DOM Level 3
-     * @return A DOMConfiguration object.
-     */
-    public DOMConfiguration getDomConfig() {
-        return (DOMConfiguration)this;
-    }
-    
-    /** 
-     * Returns the DOMConfiguration of the LSSerializer.
-     *  
-     * @see org.w3c.dom.ls.LSSerializer#getFilter()
-     * @since DOM Level 3
-     * @return A LSSerializerFilter object.
-     */
-    public LSSerializerFilter getFilter() {
-        return fSerializerFilter;
-    }
-    
-    /** 
-     * Returns the End-Of-Line sequence of characters to be used in the XML 
-     * being serialized.  If none is set a default "\n" is returned.
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#getNewLine()
-     * @since DOM Level 3
-     * @return A String containing the end-of-line character sequence  used in 
-     * serialization.
-     */
-    public String getNewLine() {
-        return fEndOfLine;
-    }
-    
-    /** 
-     * Set a LSSerilizerFilter on the LSSerializer.  When set, the filter is
-     * called before each node is serialized which depending on its implemention
-     * determines if the node is to be serialized or not.    
-     *  
-     * @see org.w3c.dom.ls.LSSerializer#setFilter
-     * @since DOM Level 3
-     * @param filter A LSSerializerFilter to be applied to the stream to serialize.
-     */
-    public void setFilter(LSSerializerFilter filter) {
-        fSerializerFilter = filter;
-    }
-    
-    /** 
-     * Sets the End-Of-Line sequence of characters to be used in the XML 
-     * being serialized.  Setting this attribute to null will reset its 
-     * value to the default value i.e. "\n".
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#setNewLine
-     * @since DOM Level 3
-     * @param newLine a String that is the end-of-line character sequence to be used in 
-     * serialization.
-     */
-    public void setNewLine(String newLine) {
-        fEndOfLine = (newLine != null) ? newLine : DEFAULT_END_OF_LINE;
-    }
-    
-    /** 
-     * Serializes the specified node to the specified LSOutput and returns true if the Node 
-     * was successfully serialized. 
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#write(org.w3c.dom.Node, org.w3c.dom.ls.LSOutput)
-     * @since DOM Level 3
-     * @param nodeArg The Node to serialize.
-     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
-     * LSSerializer was unable to serialize the node.
-     *      
-     */
-    public boolean write(Node nodeArg, LSOutput destination) throws LSException {
-        // If the destination is null
-        if (destination == null) {
-            String msg = Utils.messages
-            .createMessage(
-                    MsgKey.ER_NO_OUTPUT_SPECIFIED,
-                    null);
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, msg,
-                        MsgKey.ER_NO_OUTPUT_SPECIFIED));
-            }
-            throw new LSException(LSException.SERIALIZE_ERR, msg);
-        } 
-        
-        // If nodeArg is null, return false.  Should we throw and LSException instead?
-        if (nodeArg == null ) {
-            return false;
-        }
-
-        // Obtain a reference to the serializer to use
-        // Serializer serializer = getXMLSerializer(xmlVersion);
-        Serializer serializer = fXMLSerializer;
-        serializer.reset();
-        
-        // If the node has not been seen
-        if ( nodeArg != fVisitedNode) {
-            // Determine the XML Document version of the Node 
-            String xmlVersion = getXMLVersion(nodeArg);
-            
-            // Determine the encoding: 1.LSOutput.encoding, 2.Document.inputEncoding, 3.Document.xmlEncoding. 
-            fEncoding = destination.getEncoding();
-            if (fEncoding == null ) {
-            	fEncoding = getInputEncoding(nodeArg);
-            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
-            }
-
-            // If the encoding is not recognized throw an exception.
-            // Note: The serializer defaults to UTF-8 when created
-            if (!Encodings.isRecognizedEncoding(fEncoding)) {
-                String msg = Utils.messages
-                .createMessage(
-                        MsgKey.ER_UNSUPPORTED_ENCODING,
-                        null);
-                if (fDOMErrorHandler != null) {
-                    fDOMErrorHandler.handleError(new DOMErrorImpl(
-                            DOMError.SEVERITY_FATAL_ERROR, msg,
-                            MsgKey.ER_UNSUPPORTED_ENCODING));
-                }
-                throw new LSException(LSException.SERIALIZE_ERR, msg);            	
-            }
-            
-            serializer.getOutputFormat().setProperty("version", xmlVersion);
-
-            // Set the output encoding and xml version properties
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
-            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
-            
-            // If the node to be serialized is not a Document, Element, or Entity
-            // node
-            // then the XML declaration, or text declaration, should be never be
-            // serialized.
-            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
-                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
-                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
-                    && ((fFeatures & XMLDECL) != 0)) {
-                fDOMConfigProperties.setProperty(
-                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
-                        DOMConstants.DOM3_DEFAULT_FALSE);
-            }
-
-            fVisitedNode = nodeArg;
-        } 
-        
-        // Update the serializer properties
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-        
-        // 
-        try {
-            
-            // The LSSerializer will use the LSOutput object to determine 
-            // where to serialize the output to in the following order the  
-            // first one that is not null and not an empty string will be    
-            // used: 1.LSOutput.characterStream, 2.LSOutput.byteStream,   
-            // 3. LSOutput.systemId 
-            // 1.LSOutput.characterStream
-            Writer writer = destination.getCharacterStream();
-            if (writer == null ) {
-                
-                // 2.LSOutput.byteStream
-                OutputStream outputStream = destination.getByteStream();
-                if ( outputStream == null) {
-                    
-                    // 3. LSOutput.systemId
-                    String uri = destination.getSystemId();
-                    if (uri == null) {
-                        String msg = Utils.messages
-                        .createMessage(
-                                MsgKey.ER_NO_OUTPUT_SPECIFIED,
-                                null);
-                        if (fDOMErrorHandler != null) {
-                            fDOMErrorHandler.handleError(new DOMErrorImpl(
-                                    DOMError.SEVERITY_FATAL_ERROR, msg,
-                                    MsgKey.ER_NO_OUTPUT_SPECIFIED));
-                        }
-                        throw new LSException(LSException.SERIALIZE_ERR, msg);
-                        
-                    } else {
-                        // Expand the System Id and obtain an absolute URI for it.
-                        String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
-                        
-                        URL url = new URL(absoluteURI);
-                        OutputStream urlOutStream = null;
-                        String protocol = url.getProtocol();
-                        String host = url.getHost();
-                        
-                        // For file protocols, there is no need to use a URL to get its
-                        // corresponding OutputStream
-                        
-                        // Scheme names consist of a sequence of characters. The lower case
-                        // letters "a"--"z", digits, and the characters plus ("+"), period
-                        // ("."), and hyphen ("-") are allowed. For resiliency, programs
-                        // interpreting URLs should treat upper case letters as equivalent to
-                        // lower case in scheme names (e.g., allow "HTTP" as well as "http").
-                        if (protocol.equalsIgnoreCase("file") 
-                                && (host == null || host.length() == 0 || host.equals("localhost"))) {
-                            // do we also need to check for host.equals(hostname)
-                            urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
-                           
-                        } else {
-                            // This should support URL's whose schemes are mentioned in 
-                            // RFC1738 other than file
-                            
-                            URLConnection urlCon = url.openConnection();
-                            urlCon.setDoInput(false);
-                            urlCon.setDoOutput(true);
-                            urlCon.setUseCaches(false); 
-                            urlCon.setAllowUserInteraction(false);
-                            
-                            // When writing to a HTTP URI, a HTTP PUT is performed.
-                            if (urlCon instanceof HttpURLConnection) {
-                                HttpURLConnection httpCon = (HttpURLConnection) urlCon;
-                                httpCon.setRequestMethod("PUT");
-                            }
-                            urlOutStream = urlCon.getOutputStream();
-                        }
-                        // set the OutputStream to that obtained from the systemId
-                        serializer.setOutputStream(urlOutStream);
-                    }
-                } else {
-                    // 2.LSOutput.byteStream
-                    serializer.setOutputStream(outputStream);     
-                }
-            } else {
-                // 1.LSOutput.characterStream
-                serializer.setWriter(writer);
-            }
-            
-            // The associated media type by default is set to text/xml on 
-            // org.apache.xml.serializer.SerializerBase.  
-            
-            // Get a reference to the serializer then lets you serilize a DOM
-            // Use this hack till Xalan support JAXP1.3
-            if (fDOMSerializer == null) {
-               fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
-            } 
-            
-            // Set the error handler on the DOM3Serializer interface implementation
-            if (fDOMErrorHandler != null) {
-                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
-            }
-            
-            // Set the filter on the DOM3Serializer interface implementation
-            if (fSerializerFilter != null) {
-                fDOMSerializer.setNodeFilter(fSerializerFilter);
-            }
-            
-            // Set the NewLine character to be used
-            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
-            
-            // Serializer your DOM, where node is an org.w3c.dom.Node
-            // Assuming that Xalan's serializer can serialize any type of DOM node
-            fDOMSerializer.serializeDOM3(nodeArg);
-            
-        } catch( UnsupportedEncodingException ue) {
-            
-            String msg = Utils.messages
-            .createMessage(
-                    MsgKey.ER_UNSUPPORTED_ENCODING,
-                    null);
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, msg,
-                        MsgKey.ER_UNSUPPORTED_ENCODING, ue));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, ue).fillInStackTrace();
-        } catch (LSException lse) {
-            // Rethrow LSException.
-            throw lse;
-        } catch (RuntimeException e) {
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }  catch (Exception e) {
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
-                        null, e));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }        
-        return true;
-    }
-    
-    /** 
-     * Serializes the specified node and returns a String with the serialized
-     * data to the caller.  
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#writeToString(org.w3c.dom.Node)
-     * @since DOM Level 3
-     * @param nodeArg The Node to serialize.
-     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
-     * LSSerializer was unable to serialize the node.
-     *      
-     */
-    public String writeToString(Node nodeArg) throws DOMException, LSException {
-        // return null is nodeArg is null.  Should an Exception be thrown instead?
-        if (nodeArg == null) {
-            return null;
-        }
-
-        // Should we reset the serializer configuration before each write operation?
-        // Obtain a reference to the serializer to use
-        Serializer serializer = fXMLSerializer;
-        serializer.reset();
-        
-        if (nodeArg != fVisitedNode){
-            // Determine the XML Document version of the Node 
-            String xmlVersion = getXMLVersion(nodeArg);
-            
-            serializer.getOutputFormat().setProperty("version", xmlVersion);
-            
-            // Set the output encoding and xml version properties
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
-            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, "UTF-16");
-            
-            // If the node to be serialized is not a Document, Element, or Entity
-            // node
-            // then the XML declaration, or text declaration, should be never be
-            // serialized.
-            if  ((nodeArg.getNodeType() != Node.DOCUMENT_NODE
-                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
-                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
-                    && ((fFeatures & XMLDECL) != 0)) {
-                fDOMConfigProperties.setProperty(
-                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
-                        DOMConstants.DOM3_DEFAULT_FALSE);
-            }            
-
-            fVisitedNode = nodeArg;       
-        } 
-        // Update the serializer properties
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-        
-        // StringWriter to Output to
-        StringWriter output = new StringWriter();
-        
-        // 
-        try {
-            
-            // Set the Serializer's Writer to a StringWriter
-            serializer.setWriter(output);
-            
-            // Get a reference to the serializer then lets you serilize a DOM
-            // Use this hack till Xalan support JAXP1.3
-            if (fDOMSerializer == null) {
-                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
-            } 
-                        
-            // Set the error handler on the DOM3Serializer interface implementation
-            if (fDOMErrorHandler != null) {
-                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
-            }
-            
-            // Set the filter on the DOM3Serializer interface implementation
-            if (fSerializerFilter != null) {
-                fDOMSerializer.setNodeFilter(fSerializerFilter);
-            }
-            
-            // Set the NewLine character to be used
-            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
-            
-            // Serializer your DOM, where node is an org.w3c.dom.Node
-            fDOMSerializer.serializeDOM3(nodeArg);
-        } catch (LSException lse) {
-            // Rethrow LSException.
-            throw lse;
-        } catch (RuntimeException e) {
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }  catch (Exception e) {
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
-                        null, e));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }        
-        
-        // return the serialized string
-        return output.toString();
-    }
-    
-    /** 
-     * Serializes the specified node to the specified URI and returns true if the Node 
-     * was successfully serialized. 
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#writeToURI(org.w3c.dom.Node, String)
-     * @since DOM Level 3
-     * @param nodeArg The Node to serialize.
-     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
-     * LSSerializer was unable to serialize the node.
-     *      
-     */
-    public boolean writeToURI(Node nodeArg, String uri) throws LSException {
-        // If nodeArg is null, return false.  Should we throw and LSException instead?
-        if (nodeArg == null ) {
-            return false;
-        }
-
-        // Obtain a reference to the serializer to use
-        Serializer serializer = fXMLSerializer;
-        serializer.reset();
-        
-        if (nodeArg != fVisitedNode) {
-            // Determine the XML Document version of the Node 
-            String xmlVersion = getXMLVersion(nodeArg);
-            
-            // Determine the encoding: 1.LSOutput.encoding,
-            // 2.Document.inputEncoding, 3.Document.xmlEncoding.
-            fEncoding = getInputEncoding(nodeArg);
-            if (fEncoding == null ) {
-            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
-            }
-            
-            serializer.getOutputFormat().setProperty("version", xmlVersion);
-            
-            // Set the output encoding and xml version properties
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
-            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
-            
-            // If the node to be serialized is not a Document, Element, or Entity
-            // node
-            // then the XML declaration, or text declaration, should be never be
-            // serialized.
-            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
-                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
-                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
-                    && ((fFeatures & XMLDECL) != 0))  {
-                fDOMConfigProperties.setProperty(
-                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
-                        DOMConstants.DOM3_DEFAULT_FALSE);
-            }
-       
-            fVisitedNode = nodeArg;
-        } 
-        
-        // Update the serializer properties
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-        
-        // 
-        try {
-            // If the specified encoding is not supported an
-            // "unsupported-encoding" fatal error is raised. ??
-            if (uri == null) {
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_NO_OUTPUT_SPECIFIED, null);
-                if (fDOMErrorHandler != null) {
-                    fDOMErrorHandler.handleError(new DOMErrorImpl(
-                            DOMError.SEVERITY_FATAL_ERROR, msg,
-                            MsgKey.ER_NO_OUTPUT_SPECIFIED));
-                }
-                throw new LSException(LSException.SERIALIZE_ERR, msg);
-                
-            } else {
-                // REVISIT: Can this be used to get an absolute expanded URI
-                String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
-                
-                URL url = new URL(absoluteURI);
-                OutputStream urlOutStream = null;
-                String protocol = url.getProtocol();
-                String host = url.getHost();
-                
-                // For file protocols, there is no need to use a URL to get its
-                // corresponding OutputStream
-                
-                // Scheme names consist of a sequence of characters. The lower 
-                // case letters "a"--"z", digits, and the characters plus ("+"), 
-                // period ("."), and hyphen ("-") are allowed. For resiliency, 
-                // programs interpreting URLs should treat upper case letters as
-                // equivalent to lower case in scheme names 
-                // (e.g., allow "HTTP" as well as "http").
-                if (protocol.equalsIgnoreCase("file")
-                        && (host == null || host.length() == 0 || host
-                                .equals("localhost"))) {
-                    // do we also need to check for host.equals(hostname)
-                    urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
-                    
-                } else {
-                    // This should support URL's whose schemes are mentioned in
-                    // RFC1738 other than file
-                    
-                    URLConnection urlCon = url.openConnection();
-                    urlCon.setDoInput(false);
-                    urlCon.setDoOutput(true);
-                    urlCon.setUseCaches(false);
-                    urlCon.setAllowUserInteraction(false);
-                    
-                    // When writing to a HTTP URI, a HTTP PUT is performed.
-                    if (urlCon instanceof HttpURLConnection) {
-                        HttpURLConnection httpCon = (HttpURLConnection) urlCon;
-                        httpCon.setRequestMethod("PUT");
-                    }
-                    urlOutStream = urlCon.getOutputStream();
-                }
-                // set the OutputStream to that obtained from the systemId
-                serializer.setOutputStream(urlOutStream);
-            }
-            
-            // Get a reference to the serializer then lets you serilize a DOM
-            // Use this hack till Xalan support JAXP1.3
-            if (fDOMSerializer == null) {
-                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
-            } 
-            
-            // Set the error handler on the DOM3Serializer interface implementation
-            if (fDOMErrorHandler != null) {
-                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
-            }
-            
-            // Set the filter on the DOM3Serializer interface implementation
-            if (fSerializerFilter != null) {
-                fDOMSerializer.setNodeFilter(fSerializerFilter);
-            }
-            
-            // Set the NewLine character to be used
-            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
-            
-            // Serializer your DOM, where node is an org.w3c.dom.Node
-            // Assuming that Xalan's serializer can serialize any type of DOM
-            // node
-            fDOMSerializer.serializeDOM3(nodeArg);
-            
-        } catch (LSException lse) {
-            // Rethrow LSException.
-            throw lse;
-        } catch (RuntimeException e) {
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }  catch (Exception e) {
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
-                        null, e));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }        
-        
-        return true;
-    }
-    // ************************************************************************
-    
-    
-    // ************************************************************************
-    // Implementaion methods
-    // ************************************************************************
-    
-    /** 
-     * Determines the XML Version of the Document Node to serialize.  If the Document Node
-     * is not a DOM Level 3 Node, then the default version returned is 1.0.
-     * 
-     * @param  nodeArg The Node to serialize
-     * @return A String containing the version pseudo-attribute of the XMLDecl.  
-     * @throws Throwable if the DOM implementation does not implement Document.getXmlVersion()      
-     */
-    //protected String getXMLVersion(Node nodeArg) throws Throwable {
-    protected String getXMLVersion(Node nodeArg) {
-        Document doc = null;
-        
-        // Determine the XML Version of the document
-        if (nodeArg != null) {
-            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
-                // The Document node is the Node argument
-                doc = (Document)nodeArg;
-            } else { 
-                // The Document node is the Node argument's ownerDocument
-                doc = nodeArg.getOwnerDocument();
-            }
-            
-            // Determine the DOM Version.
-            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
-                return doc.getXmlVersion();
-            }
-        } 
-        // The version will be treated as "1.0" which may result in
-        // an ill-formed document being serialized.
-        // If nodeArg does not have an ownerDocument, treat this as XML 1.0
-        return "1.0";
-    }
-    
-    /** 
-     * Determines the XML Encoding of the Document Node to serialize.  If the Document Node
-     * is not a DOM Level 3 Node, then the default encoding "UTF-8" is returned.
-     * 
-     * @param  nodeArg The Node to serialize
-     * @return A String containing the encoding pseudo-attribute of the XMLDecl.  
-     * @throws Throwable if the DOM implementation does not implement Document.getXmlEncoding()     
-     */
-    protected String getXMLEncoding(Node nodeArg) {
-        Document doc = null;
-        
-        // Determine the XML Encoding of the document
-        if (nodeArg != null) {
-            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
-                // The Document node is the Node argument
-                doc = (Document)nodeArg;
-            } else { 
-                // The Document node is the Node argument's ownerDocument
-                doc = nodeArg.getOwnerDocument();
-            }
-            
-            // Determine the XML Version. 
-            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
-                return doc.getXmlEncoding();
-            }
-        } 
-        // The default encoding is UTF-8 except for the writeToString method
-        return "UTF-8";
-    }
-    
-    /** 
-     * Determines the Input Encoding of the Document Node to serialize.  If the Document Node
-     * is not a DOM Level 3 Node, then null is returned.
-     * 
-     * @param  nodeArg The Node to serialize
-     * @return A String containing the input encoding.  
-     */
-    protected String getInputEncoding(Node nodeArg)  {
-        Document doc = null;
-        
-        // Determine the Input Encoding of the document
-        if (nodeArg != null) {
-            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
-                // The Document node is the Node argument
-                doc = (Document)nodeArg;
-            } else { 
-                // The Document node is the Node argument's ownerDocument
-                doc = nodeArg.getOwnerDocument();
-            }
-            
-            // Determine the DOM Version.
-            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
-                return doc.getInputEncoding();
-            }
-        } 
-        // The default encoding returned is null
-        return null;
-    }
-    
-    /**
-     * This method returns the LSSerializer's error handler.
-     * 
-     * @return Returns the fDOMErrorHandler.
-     */
-    public DOMErrorHandler getErrorHandler() {
-        return fDOMErrorHandler;
-    }
-    
-    /**
-     * Replaces all escape sequences in the given path with their literal characters.
-     */
-    private static String getPathWithoutEscapes(String origPath) {
-        if (origPath != null && origPath.length() != 0 && origPath.indexOf('%') != -1) {
-            // Locate the escape characters
-            StringTokenizer tokenizer = new StringTokenizer(origPath, "%");
-            StringBuffer result = new StringBuffer(origPath.length());
-            int size = tokenizer.countTokens();
-            result.append(tokenizer.nextToken());
-            for(int i = 1; i < size; ++i) {
-                String token = tokenizer.nextToken();
-                if (token.length() >= 2 && isHexDigit(token.charAt(0)) && 
-                        isHexDigit(token.charAt(1))) {
-                    // Decode the 2 digit hexadecimal number following % in '%nn'
-                    result.append((char)Integer.valueOf(token.substring(0, 2), 16).intValue());
-                    token = token.substring(2);
-                }
-                result.append(token);
-            }
-            return result.toString();
-        }
-        return origPath;
-    }
-
-    /** 
-     * Returns true if the given character is a valid hex character.
-     */
-    private static boolean isHexDigit(char c) {
-        return (c >= '0' && c <= '9' || 
-                c >= 'a' && c <= 'f' || 
-                c >= 'A' && c <= 'F');
-    }
-    
-    /**
-     * Creates an LSException. On J2SE 1.4 and above the cause for the exception will be set.
-     */
-    private static LSException createLSException(short code, Throwable cause) {
-        LSException lse = new LSException(code, cause != null ? cause.getMessage() : null);
-        if (cause != null && ThrowableMethods.fgThrowableMethodsAvailable) {
-            try {
-                ThrowableMethods.fgThrowableInitCauseMethod.invoke(lse, new Object [] {cause});
-            }
-            // Something went wrong. There's not much we can do about it.
-            catch (Exception e) {}
-        }
-        return lse;
-    }
-    
-    /**
-     * Holder of methods from java.lang.Throwable.
-     */
-    static class ThrowableMethods {
-        
-        // Method: java.lang.Throwable.initCause(java.lang.Throwable)
-        private static java.lang.reflect.Method fgThrowableInitCauseMethod = null;
-        
-        // Flag indicating whether or not Throwable methods available.
-        private static boolean fgThrowableMethodsAvailable = false;
-        
-        private ThrowableMethods() {}
-        
-        // Attempt to get methods for java.lang.Throwable on class initialization.
-        static {
-            try {
-                fgThrowableInitCauseMethod = Throwable.class.getMethod("initCause", new Class [] {Throwable.class});
-                fgThrowableMethodsAvailable = true;
-            }
-            // ClassNotFoundException, NoSuchMethodException or SecurityException
-            // Whatever the case, we cannot use java.lang.Throwable.initCause(java.lang.Throwable).
-            catch (Exception exc) {
-                fgThrowableInitCauseMethod = null;
-                fgThrowableMethodsAvailable = false;
-            }
-        }
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.apache.xml.serializer.DOM3Serializer;
+import org.apache.xml.serializer.Encodings;
+import org.apache.xml.serializer.OutputPropertiesFactory;
+import org.apache.xml.serializer.Serializer;
+import org.apache.xml.serializer.SerializerFactory;
+import org.apache.xml.serializer.utils.MsgKey;
+import org.apache.xml.serializer.utils.SystemIDResolver;
+import org.apache.xml.serializer.utils.Utils;
+import org.w3c.dom.DOMConfiguration;
+import org.w3c.dom.DOMError;
+import org.w3c.dom.DOMErrorHandler;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DOMStringList;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.LSException;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+import org.w3c.dom.ls.LSSerializerFilter;
+
+/**
+ * Implemenatation of DOM Level 3 org.w3c.ls.LSSerializer and 
+ * org.w3c.dom.ls.DOMConfiguration.  Serialization is achieved by delegating 
+ * serialization calls to <CODE>org.apache.xml.serializer.ToStream</CODE> or 
+ * one of its derived classes depending on the serialization method, while walking
+ * the DOM in DOM3TreeWalker.  
+ * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer">org.w3c.dom.ls.LSSerializer</a>
+ * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">org.w3c.dom.DOMConfiguration</a>
+ *  
+ * @version $Id:  
+ * 
+ * @xsl.usage internal 
+ */
+final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
+    
+    // The default end-of-line character sequence used in serialization.
+    private static final String DEFAULT_END_OF_LINE;
+    static {
+        String lineSeparator = (String) AccessController.doPrivileged(new PrivilegedAction() {
+            public Object run() {
+                try {
+                    return System.getProperty("line.separator");
+                }
+                catch (SecurityException ex) {}
+                return null;
+            }
+        });
+        // The DOM Level 3 Load and Save specification requires that implementations choose a default
+        // sequence which matches one allowed by XML 1.0 (or XML 1.1). If the value of "line.separator" 
+        // isn't one of the XML 1.0 end-of-line sequences then we select "\n" as the default value.
+        DEFAULT_END_OF_LINE = lineSeparator != null && 
+            (lineSeparator.equals("\r\n") || lineSeparator.equals("\r")) ? lineSeparator : "\n";
+    }
+    
+    /** private data members */
+    private Serializer fXMLSerializer = null;
+    
+    // Tracks DOMConfiguration features. 
+    protected int fFeatures = 0;
+    
+    // Common DOM serializer
+    private  DOM3Serializer fDOMSerializer = null;
+    
+    // A filter set on the LSSerializer
+    private LSSerializerFilter fSerializerFilter = null;  
+    
+    // Stores the nodeArg parameter to speed up multiple writes of the same node.
+    private Node fVisitedNode = null;
+    
+    // The end-of-line character sequence used in serialization. "\n" is whats used on the web.
+    private String fEndOfLine = DEFAULT_END_OF_LINE;
+    
+    // The DOMErrorhandler.
+    private DOMErrorHandler fDOMErrorHandler = null;
+    
+    // The Configuration parameter to pass to the Underlying serilaizer.
+    private Properties fDOMConfigProperties = null;
+    
+    // The encoding to use during serialization.
+    private String fEncoding; 
+	
+    // ************************************************************************
+    // DOM Level 3 DOM Configuration parameter names
+    // ************************************************************************    
+    // Parameter canonical-form, true [optional] - NOT SUPPORTED 
+    private final static int CANONICAL = 0x1 << 0;
+    
+    // Parameter cdata-sections, true [required] (default)
+    private final static int CDATA = 0x1 << 1;
+    
+    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED 
+    private final static int CHARNORMALIZE = 0x1 << 2;
+    
+    // Parameter comments, true [required] (default)
+    private final static int COMMENTS = 0x1 << 3;
+    
+    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
+    private final static int DTNORMALIZE = 0x1 << 4;    
+    
+    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
+    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
+    
+    // Parameter entities, true [required] (default)
+    private final static int ENTITIES = 0x1 << 6;
+    
+    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
+    private final static int INFOSET = 0x1 << 7;
+    
+    // Parameter namespaces, true [required] (default)
+    private final static int NAMESPACES = 0x1 << 8;
+    
+    // Parameter namespace-declarations, true [required] (default)
+    private final static int NAMESPACEDECLS = 0x1 << 9;
+    
+    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
+    private final static int NORMALIZECHARS = 0x1 << 10;
+    
+    // Parameter split-cdata-sections, true [required] (default)
+    private final static int SPLITCDATA = 0x1 << 11;   
+    
+    // Parameter validate, true [optional] - NOT SUPPORTED
+    private final static int VALIDATE = 0x1 << 12;   
+    
+    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
+    private final static int SCHEMAVALIDATE = 0x1 << 13;
+    
+    // Parameter split-cdata-sections, true [required] (default)
+    private final static int WELLFORMED = 0x1 << 14;   
+    
+    // Parameter discard-default-content, true [required] (default)
+    // Not sure how this will be used in level 2 Documents
+    private final static int DISCARDDEFAULT = 0x1 << 15;       
+    
+    // Parameter format-pretty-print, true [optional] 
+    private final static int PRETTY_PRINT = 0x1 << 16;
+    
+    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
+    // We currently do not support XML 1.1 character normalization
+    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
+    
+    // Parameter discard-default-content, true [required] (default)
+    private final static int XMLDECL = 0x1 << 18;    
+    // ************************************************************************
+    
+    // Recognized parameters for which atleast one value can be set
+    private String fRecognizedParameters [] = {
+            DOMConstants.DOM_CANONICAL_FORM,
+            DOMConstants.DOM_CDATA_SECTIONS,
+            DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
+            DOMConstants.DOM_COMMENTS,
+            DOMConstants.DOM_DATATYPE_NORMALIZATION,
+            DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
+            DOMConstants.DOM_ENTITIES,
+            DOMConstants.DOM_INFOSET,
+            DOMConstants.DOM_NAMESPACES,
+            DOMConstants.DOM_NAMESPACE_DECLARATIONS,
+            //DOMConstants.DOM_NORMALIZE_CHARACTERS,
+            DOMConstants.DOM_SPLIT_CDATA,
+            DOMConstants.DOM_VALIDATE,
+            DOMConstants.DOM_VALIDATE_IF_SCHEMA,
+            DOMConstants.DOM_WELLFORMED,
+            DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
+            DOMConstants.DOM_FORMAT_PRETTY_PRINT,
+            DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS,
+            DOMConstants.DOM_XMLDECL,
+            DOMConstants.DOM_ERROR_HANDLER
+    };
+    
+    
+    /**
+     * Constructor:  Creates a LSSerializerImpl object.  The underlying
+     * XML 1.0 or XML 1.1 org.apache.xml.serializer.Serializer object is
+     * created and initialized the first time any of the write methods are  
+     * invoked to serialize the Node.  Subsequent write methods on the same
+     * LSSerializerImpl object will use the previously created Serializer object.
+     */
+    public LSSerializerImpl () {
+        // set default parameters
+        fFeatures |= CDATA;
+        fFeatures |= COMMENTS;
+        fFeatures |= ELEM_CONTENT_WHITESPACE;
+        fFeatures |= ENTITIES;
+        fFeatures |= NAMESPACES;
+        fFeatures |= NAMESPACEDECLS;
+        fFeatures |= SPLITCDATA;
+        fFeatures |= WELLFORMED;
+        fFeatures |= DISCARDDEFAULT;
+        fFeatures |= XMLDECL;
+        
+        // New OutputFormat properties
+        fDOMConfigProperties = new Properties();
+        
+        // Initialize properties to be passed on the underlying serializer
+        initializeSerializerProps();
+        
+        // Create the underlying serializer.
+        Properties  configProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
+        
+        // change xml version from 1.0 to 1.1
+        //configProps.setProperty("version", "1.1");
+        
+        // Get a serializer that seriailizes according the the properties,
+        // which in this case is to xml
+        fXMLSerializer = SerializerFactory.getSerializer(configProps);
+        
+        // Initialize Serializer
+        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
+    }
+    
+    /**
+     * Initializes the underlying serializer's configuration depending on the
+     * default DOMConfiguration parameters. This method must be called before a
+     * node is to be serialized.
+     * 
+     * @xsl.usage internal
+     */
+    public void initializeSerializerProps () {
+        // canonical-form
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // cdata-sections
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // "check-character-normalization"
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
+                DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // comments
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // datatype-normalization
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_DATATYPE_NORMALIZATION,
+                DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // element-content-whitespace
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
+                DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // entities
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
+        // preserve entities
+        fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
+                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
+
+        // error-handler
+        // Should we set our default ErrorHandler
+        /*
+         * if (fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER) != null) {
+         * fDOMErrorHandler =
+         * (DOMErrorHandler)fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER); }
+         */
+        
+        // infoset
+        if ((fFeatures & INFOSET) != 0) {
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
+                    DOMConstants.DOM3_DEFAULT_TRUE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
+                    DOMConstants.DOM3_DEFAULT_TRUE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
+            // preserve entities
+            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
+                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_CDATA_SECTIONS,
+                    DOMConstants.DOM3_DEFAULT_FALSE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
+                    DOMConstants.DOM3_DEFAULT_FALSE);
+            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                    + DOMConstants.DOM_DATATYPE_NORMALIZATION,
+                    DOMConstants.DOM3_DEFAULT_FALSE);
+        }
+        
+        // namespaces
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // namespace-declarations
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
+                DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // normalize-characters
+        /*
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_NORMALIZE_CHARACTERS,
+                DOMConstants.DOM3_DEFAULT_FALSE);
+        */
+        
+        // split-cdata-sections
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // validate
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // validate-if-schema
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
+                DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // well-formed
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // pretty-print
+        fDOMConfigProperties.setProperty(
+                DOMConstants.S_XSL_OUTPUT_INDENT,
+                DOMConstants.DOM3_DEFAULT_TRUE);
+        fDOMConfigProperties.setProperty(
+                OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, Integer.toString(3));
+        
+        // 
+        
+        // discard-default-content
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
+                DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // xml-declaration
+        fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
+        
+    }    
+    
+    // ************************************************************************
+    // DOMConfiguraiton implementation
+    // ************************************************************************
+    
+    /** 
+     * Checks if setting a parameter to a specific value is supported.    
+     *  
+     * @see org.w3c.dom.DOMConfiguration#canSetParameter(java.lang.String, java.lang.Object)
+     * @since DOM Level 3
+     * @param name A String containing the DOMConfiguration parameter name.
+     * @param value An Object specifying the value of the corresponding parameter. 
+     */
+    public boolean canSetParameter(String name, Object value) {
+        if (value instanceof Boolean){
+            if ( name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)    
+                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)    
+                    || name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)                
+                    || name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)){
+                // both values supported
+                return true;
+            }
+            else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
+                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
+                    ) {
+                // true is not supported
+                return !((Boolean)value).booleanValue();
+            }
+            else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
+                // false is not supported
+                return ((Boolean)value).booleanValue();
+            }
+        }
+        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) &&
+                value == null || value instanceof DOMErrorHandler){
+            return true;
+        }
+        return false;
+    }
+    /**
+     * This method returns the value of a parameter if known.
+     * 
+     * @see org.w3c.dom.DOMConfiguration#getParameter(java.lang.String)
+     * 
+     * @param name A String containing the DOMConfiguration parameter name 
+     *             whose value is to be returned.
+     * @return Object The value of the parameter if known. 
+     */
+    public Object getParameter(String name) throws DOMException {
+        if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
+            return ((fFeatures & COMMENTS) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
+            return ((fFeatures & CDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
+            return ((fFeatures & ENTITIES) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
+            return ((fFeatures & NAMESPACES) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
+            return ((fFeatures & NAMESPACEDECLS) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
+            return ((fFeatures & SPLITCDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
+            return ((fFeatures & WELLFORMED) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        }  else if (name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
+            return ((fFeatures & DISCARDDEFAULT) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
+            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
+            return ((fFeatures & XMLDECL) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
+            return ((fFeatures & ELEM_CONTENT_WHITESPACE) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
+            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
+            return Boolean.TRUE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
+                || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
+                || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) 
+                // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)                
+                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
+                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
+            return Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)){
+            if ((fFeatures & ENTITIES) == 0 &&
+                    (fFeatures & CDATA) == 0 &&
+                    (fFeatures & ELEM_CONTENT_WHITESPACE) != 0 &&
+                    (fFeatures & NAMESPACES) != 0 &&
+                    (fFeatures & NAMESPACEDECLS) != 0 &&
+                    (fFeatures & WELLFORMED) != 0 &&
+                    (fFeatures & COMMENTS) != 0) {
+                return Boolean.TRUE;
+            }                 
+            return Boolean.FALSE;
+        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
+            return fDOMErrorHandler;
+        } else if (
+                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
+                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
+            return null;
+        } else {
+            // Here we have to add the Xalan specific DOM Message Formatter
+            String msg = Utils.messages.createMessage(
+                    MsgKey.ER_FEATURE_NOT_FOUND,
+                    new Object[] { name });
+            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
+        }
+    }
+    
+    /**
+     * This method returns a of the parameters supported by this DOMConfiguration object 
+     * and for which at least one value can be set by the application
+     * 
+     * @see org.w3c.dom.DOMConfiguration#getParameterNames()
+     * 
+     * @return DOMStringList A list of DOMConfiguration parameters recognized
+     *                       by the serializer
+     */
+    public DOMStringList getParameterNames() {
+        return new DOMStringListImpl(fRecognizedParameters);
+    }
+    
+    /**
+     * This method sets the value of the named parameter.
+     *   
+     * @see org.w3c.dom.DOMConfiguration#setParameter(java.lang.String, java.lang.Object)
+     * 
+     * @param name A String containing the DOMConfiguration parameter name.
+     * @param value An Object contaiing the parameters value to set.
+     */
+    public void setParameter(String name, Object value) throws DOMException {
+        // If the value is a boolean
+        if (value instanceof Boolean) {
+            boolean state = ((Boolean) value).booleanValue();
+            
+            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
+                fFeatures = state ? fFeatures | COMMENTS : fFeatures
+                        & ~COMMENTS;
+                // comments
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_FALSE);
+                }                
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
+                fFeatures =  state ? fFeatures | CDATA : fFeatures
+                        & ~CDATA;
+                // cdata-sections
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
+                }
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
+                fFeatures = state ? fFeatures | ENTITIES : fFeatures
+                        & ~ENTITIES;
+                // entities
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
+                    fDOMConfigProperties.setProperty(
+                            DOMConstants.S_XERCES_PROPERTIES_NS
+                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    fDOMConfigProperties.setProperty(
+                            DOMConstants.S_XERCES_PROPERTIES_NS
+                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
+                }
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
+                fFeatures = state ? fFeatures | NAMESPACES : fFeatures
+                        & ~NAMESPACES;
+                // namespaces
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_FALSE); 
+                }       
+            } else if (name
+                    .equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
+                fFeatures = state ? fFeatures | NAMESPACEDECLS
+                        : fFeatures & ~NAMESPACEDECLS;
+                // namespace-declarations
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_FALSE); 
+                } 
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
+                fFeatures = state ? fFeatures | SPLITCDATA : fFeatures
+                        & ~SPLITCDATA;
+                // split-cdata-sections
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_FALSE); 
+                }  
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
+                fFeatures = state ? fFeatures | WELLFORMED : fFeatures
+                        & ~WELLFORMED;
+                // well-formed
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_FALSE); 
+                }                  
+            } else if (name
+                    .equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
+                fFeatures = state ? fFeatures | DISCARDDEFAULT
+                        : fFeatures & ~DISCARDDEFAULT;
+                // discard-default-content
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_FALSE); 
+                }                    
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
+                fFeatures = state ? fFeatures | PRETTY_PRINT : fFeatures
+                        & ~PRETTY_PRINT;
+                // format-pretty-print
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_TRUE);
+                }
+                else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_FALSE);
+                }
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
+                fFeatures = state ? fFeatures | XMLDECL : fFeatures
+                        & ~XMLDECL;
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "yes"); 
+                }       
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
+                fFeatures = state ? fFeatures | ELEM_CONTENT_WHITESPACE : fFeatures
+                        & ~ELEM_CONTENT_WHITESPACE;
+                // element-content-whitespace
+                if (state) {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_FALSE);
+                }            
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
+                // false is not supported
+                if (!state) {
+                    // Here we have to add the Xalan specific DOM Message Formatter
+                    String msg = Utils.messages.createMessage(
+                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
+                            new Object[] { name });
+                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
+                } else {
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
+                }
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
+                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
+                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
+                    ) {
+                // true is not supported
+                if (state) {
+                    String msg = Utils.messages.createMessage(
+                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
+                            new Object[] { name });
+                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
+                } else {
+                    if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)) {
+                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
+                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                                + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)) {
+                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
+                        fDOMConfigProperties.setProperty(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION 
+                                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)) {
+                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                                + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    } /* else if (name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)) {
+                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                                + DOMConstants.DOM_NORMALIZE_CHARACTERS, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    } */
+                }
+            } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
+                // infoset
+                if (state) {
+                    fFeatures &= ~ENTITIES;
+                    fFeatures &= ~CDATA;
+                    fFeatures &= ~SCHEMAVALIDATE;
+                    fFeatures &= ~DTNORMALIZE;
+                    fFeatures |= NAMESPACES;
+                    fFeatures |= NAMESPACEDECLS;
+                    fFeatures |= WELLFORMED;
+                    fFeatures |= ELEM_CONTENT_WHITESPACE;
+                    fFeatures |= COMMENTS;
+                    
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE); 
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
+                    
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
+                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);            
+                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
+                            + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
+                }
+            } else {
+                // If this is a non-boolean parameter a type mismatch should be thrown.
+                if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
+                    String msg = Utils.messages.createMessage(
+                            MsgKey.ER_TYPE_MISMATCH_ERR,
+                            new Object[] { name });
+                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
+                }
+                
+                // Parameter is not recognized
+                String msg = Utils.messages.createMessage(
+                        MsgKey.ER_FEATURE_NOT_FOUND,
+                        new Object[] { name });
+                throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
+            }
+        } // If the parameter value is not a boolean 
+        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
+            if (value == null || value instanceof DOMErrorHandler) {
+                fDOMErrorHandler = (DOMErrorHandler)value;
+            } else {
+                String msg = Utils.messages.createMessage(
+                        MsgKey.ER_TYPE_MISMATCH_ERR,
+                        new Object[] { name });
+                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
+            }
+        } else if (
+                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
+                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
+            if (value != null) {
+                if (!(value instanceof String)) {
+                    String msg = Utils.messages.createMessage(
+                            MsgKey.ER_TYPE_MISMATCH_ERR,
+                            new Object[] { name });
+                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
+                }
+                String msg = Utils.messages.createMessage(
+                        MsgKey.ER_FEATURE_NOT_SUPPORTED,
+                        new Object[] { name });
+                throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
+            }
+        } else {
+            // If this is a boolean parameter a type mismatch should be thrown.
+            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) ||
+                    name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
+                String msg = Utils.messages.createMessage(
+                        MsgKey.ER_TYPE_MISMATCH_ERR,
+                        new Object[] { name });
+                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
+            }
+            
+            // Parameter is not recognized
+            String msg = Utils.messages.createMessage(
+                    MsgKey.ER_FEATURE_NOT_FOUND,
+                    new Object[] { name });
+            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
+        }
+    }
+    // ************************************************************************
+    
+    
+    // ************************************************************************
+    // DOMConfiguraiton implementation
+    // ************************************************************************
+    
+    /** 
+     * Returns the DOMConfiguration of the LSSerializer.
+     *  
+     * @see org.w3c.dom.ls.LSSerializer#getDomConfig()
+     * @since DOM Level 3
+     * @return A DOMConfiguration object.
+     */
+    public DOMConfiguration getDomConfig() {
+        return (DOMConfiguration)this;
+    }
+    
+    /** 
+     * Returns the DOMConfiguration of the LSSerializer.
+     *  
+     * @see org.w3c.dom.ls.LSSerializer#getFilter()
+     * @since DOM Level 3
+     * @return A LSSerializerFilter object.
+     */
+    public LSSerializerFilter getFilter() {
+        return fSerializerFilter;
+    }
+    
+    /** 
+     * Returns the End-Of-Line sequence of characters to be used in the XML 
+     * being serialized.  If none is set a default "\n" is returned.
+     * 
+     * @see org.w3c.dom.ls.LSSerializer#getNewLine()
+     * @since DOM Level 3
+     * @return A String containing the end-of-line character sequence  used in 
+     * serialization.
+     */
+    public String getNewLine() {
+        return fEndOfLine;
+    }
+    
+    /** 
+     * Set a LSSerilizerFilter on the LSSerializer.  When set, the filter is
+     * called before each node is serialized which depending on its implemention
+     * determines if the node is to be serialized or not.    
+     *  
+     * @see org.w3c.dom.ls.LSSerializer#setFilter
+     * @since DOM Level 3
+     * @param filter A LSSerializerFilter to be applied to the stream to serialize.
+     */
+    public void setFilter(LSSerializerFilter filter) {
+        fSerializerFilter = filter;
+    }
+    
+    /** 
+     * Sets the End-Of-Line sequence of characters to be used in the XML 
+     * being serialized.  Setting this attribute to null will reset its 
+     * value to the default value i.e. "\n".
+     * 
+     * @see org.w3c.dom.ls.LSSerializer#setNewLine
+     * @since DOM Level 3
+     * @param newLine a String that is the end-of-line character sequence to be used in 
+     * serialization.
+     */
+    public void setNewLine(String newLine) {
+        fEndOfLine = (newLine != null) ? newLine : DEFAULT_END_OF_LINE;
+    }
+    
+    /** 
+     * Serializes the specified node to the specified LSOutput and returns true if the Node 
+     * was successfully serialized. 
+     * 
+     * @see org.w3c.dom.ls.LSSerializer#write(org.w3c.dom.Node, org.w3c.dom.ls.LSOutput)
+     * @since DOM Level 3
+     * @param nodeArg The Node to serialize.
+     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
+     * LSSerializer was unable to serialize the node.
+     *      
+     */
+    public boolean write(Node nodeArg, LSOutput destination) throws LSException {
+        // If the destination is null
+        if (destination == null) {
+            String msg = Utils.messages
+            .createMessage(
+                    MsgKey.ER_NO_OUTPUT_SPECIFIED,
+                    null);
+            if (fDOMErrorHandler != null) {
+                fDOMErrorHandler.handleError(new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR, msg,
+                        MsgKey.ER_NO_OUTPUT_SPECIFIED));
+            }
+            throw new LSException(LSException.SERIALIZE_ERR, msg);
+        } 
+        
+        // If nodeArg is null, return false.  Should we throw and LSException instead?
+        if (nodeArg == null ) {
+            return false;
+        }
+
+        // Obtain a reference to the serializer to use
+        // Serializer serializer = getXMLSerializer(xmlVersion);
+        Serializer serializer = fXMLSerializer;
+        serializer.reset();
+        
+        // If the node has not been seen
+        if ( nodeArg != fVisitedNode) {
+            // Determine the XML Document version of the Node 
+            String xmlVersion = getXMLVersion(nodeArg);
+            
+            // Determine the encoding: 1.LSOutput.encoding, 2.Document.inputEncoding, 3.Document.xmlEncoding. 
+            fEncoding = destination.getEncoding();
+            if (fEncoding == null ) {
+            	fEncoding = getInputEncoding(nodeArg);
+            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
+            }
+
+            // If the encoding is not recognized throw an exception.
+            // Note: The serializer defaults to UTF-8 when created
+            if (!Encodings.isRecognizedEncoding(fEncoding)) {
+                String msg = Utils.messages
+                .createMessage(
+                        MsgKey.ER_UNSUPPORTED_ENCODING,
+                        null);
+                if (fDOMErrorHandler != null) {
+                    fDOMErrorHandler.handleError(new DOMErrorImpl(
+                            DOMError.SEVERITY_FATAL_ERROR, msg,
+                            MsgKey.ER_UNSUPPORTED_ENCODING));
+                }
+                throw new LSException(LSException.SERIALIZE_ERR, msg);            	
+            }
+            
+            serializer.getOutputFormat().setProperty("version", xmlVersion);
+
+            // Set the output encoding and xml version properties
+            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
+            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
+            
+            // If the node to be serialized is not a Document, Element, or Entity
+            // node
+            // then the XML declaration, or text declaration, should be never be
+            // serialized.
+            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
+                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
+                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
+                    && ((fFeatures & XMLDECL) != 0)) {
+                fDOMConfigProperties.setProperty(
+                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
+                        DOMConstants.DOM3_DEFAULT_FALSE);
+            }
+
+            fVisitedNode = nodeArg;
+        } 
+        
+        // Update the serializer properties
+        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
+        
+        // 
+        try {
+            
+            // The LSSerializer will use the LSOutput object to determine 
+            // where to serialize the output to in the following order the  
+            // first one that is not null and not an empty string will be    
+            // used: 1.LSOutput.characterStream, 2.LSOutput.byteStream,   
+            // 3. LSOutput.systemId 
+            // 1.LSOutput.characterStream
+            Writer writer = destination.getCharacterStream();
+            if (writer == null ) {
+                
+                // 2.LSOutput.byteStream
+                OutputStream outputStream = destination.getByteStream();
+                if ( outputStream == null) {
+                    
+                    // 3. LSOutput.systemId
+                    String uri = destination.getSystemId();
+                    if (uri == null) {
+                        String msg = Utils.messages
+                        .createMessage(
+                                MsgKey.ER_NO_OUTPUT_SPECIFIED,
+                                null);
+                        if (fDOMErrorHandler != null) {
+                            fDOMErrorHandler.handleError(new DOMErrorImpl(
+                                    DOMError.SEVERITY_FATAL_ERROR, msg,
+                                    MsgKey.ER_NO_OUTPUT_SPECIFIED));
+                        }
+                        throw new LSException(LSException.SERIALIZE_ERR, msg);
+                        
+                    } else {
+                        // Expand the System Id and obtain an absolute URI for it.
+                        String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
+                        
+                        URL url = new URL(absoluteURI);
+                        OutputStream urlOutStream = null;
+                        String protocol = url.getProtocol();
+                        String host = url.getHost();
+                        
+                        // For file protocols, there is no need to use a URL to get its
+                        // corresponding OutputStream
+                        
+                        // Scheme names consist of a sequence of characters. The lower case
+                        // letters "a"--"z", digits, and the characters plus ("+"), period
+                        // ("."), and hyphen ("-") are allowed. For resiliency, programs
+                        // interpreting URLs should treat upper case letters as equivalent to
+                        // lower case in scheme names (e.g., allow "HTTP" as well as "http").
+                        if (protocol.equalsIgnoreCase("file") 
+                                && (host == null || host.length() == 0 || host.equals("localhost"))) {
+                            // do we also need to check for host.equals(hostname)
+                            urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
+                           
+                        } else {
+                            // This should support URL's whose schemes are mentioned in 
+                            // RFC1738 other than file
+                            
+                            URLConnection urlCon = url.openConnection();
+                            urlCon.setDoInput(false);
+                            urlCon.setDoOutput(true);
+                            urlCon.setUseCaches(false); 
+                            urlCon.setAllowUserInteraction(false);
+                            
+                            // When writing to a HTTP URI, a HTTP PUT is performed.
+                            if (urlCon instanceof HttpURLConnection) {
+                                HttpURLConnection httpCon = (HttpURLConnection) urlCon;
+                                httpCon.setRequestMethod("PUT");
+                            }
+                            urlOutStream = urlCon.getOutputStream();
+                        }
+                        // set the OutputStream to that obtained from the systemId
+                        serializer.setOutputStream(urlOutStream);
+                    }
+                } else {
+                    // 2.LSOutput.byteStream
+                    serializer.setOutputStream(outputStream);     
+                }
+            } else {
+                // 1.LSOutput.characterStream
+                serializer.setWriter(writer);
+            }
+            
+            // The associated media type by default is set to text/xml on 
+            // org.apache.xml.serializer.SerializerBase.  
+            
+            // Get a reference to the serializer then lets you serilize a DOM
+            // Use this hack till Xalan support JAXP1.3
+            if (fDOMSerializer == null) {
+               fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
+            } 
+            
+            // Set the error handler on the DOM3Serializer interface implementation
+            if (fDOMErrorHandler != null) {
+                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
+            }
+            
+            // Set the filter on the DOM3Serializer interface implementation
+            if (fSerializerFilter != null) {
+                fDOMSerializer.setNodeFilter(fSerializerFilter);
+            }
+            
+            // Set the NewLine character to be used
+            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
+            
+            // Serializer your DOM, where node is an org.w3c.dom.Node
+            // Assuming that Xalan's serializer can serialize any type of DOM node
+            fDOMSerializer.serializeDOM3(nodeArg);
+            
+        } catch( UnsupportedEncodingException ue) {
+            
+            String msg = Utils.messages
+            .createMessage(
+                    MsgKey.ER_UNSUPPORTED_ENCODING,
+                    null);
+            if (fDOMErrorHandler != null) {
+                fDOMErrorHandler.handleError(new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR, msg,
+                        MsgKey.ER_UNSUPPORTED_ENCODING, ue));
+            }
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, ue).fillInStackTrace();
+        } catch (LSException lse) {
+            // Rethrow LSException.
+            throw lse;
+        } catch (RuntimeException e) {
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
+        }  catch (Exception e) {
+            if (fDOMErrorHandler != null) {
+                fDOMErrorHandler.handleError(new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
+                        null, e));
+            }
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
+        }        
+        return true;
+    }
+    
+    /** 
+     * Serializes the specified node and returns a String with the serialized
+     * data to the caller.  
+     * 
+     * @see org.w3c.dom.ls.LSSerializer#writeToString(org.w3c.dom.Node)
+     * @since DOM Level 3
+     * @param nodeArg The Node to serialize.
+     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
+     * LSSerializer was unable to serialize the node.
+     *      
+     */
+    public String writeToString(Node nodeArg) throws DOMException, LSException {
+        // return null is nodeArg is null.  Should an Exception be thrown instead?
+        if (nodeArg == null) {
+            return null;
+        }
+
+        // Should we reset the serializer configuration before each write operation?
+        // Obtain a reference to the serializer to use
+        Serializer serializer = fXMLSerializer;
+        serializer.reset();
+        
+        if (nodeArg != fVisitedNode){
+            // Determine the XML Document version of the Node 
+            String xmlVersion = getXMLVersion(nodeArg);
+            
+            serializer.getOutputFormat().setProperty("version", xmlVersion);
+            
+            // Set the output encoding and xml version properties
+            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
+            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, "UTF-16");
+            
+            // If the node to be serialized is not a Document, Element, or Entity
+            // node
+            // then the XML declaration, or text declaration, should be never be
+            // serialized.
+            if  ((nodeArg.getNodeType() != Node.DOCUMENT_NODE
+                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
+                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
+                    && ((fFeatures & XMLDECL) != 0)) {
+                fDOMConfigProperties.setProperty(
+                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
+                        DOMConstants.DOM3_DEFAULT_FALSE);
+            }            
+
+            fVisitedNode = nodeArg;       
+        } 
+        // Update the serializer properties
+        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
+        
+        // StringWriter to Output to
+        StringWriter output = new StringWriter();
+        
+        // 
+        try {
+            
+            // Set the Serializer's Writer to a StringWriter
+            serializer.setWriter(output);
+            
+            // Get a reference to the serializer then lets you serilize a DOM
+            // Use this hack till Xalan support JAXP1.3
+            if (fDOMSerializer == null) {
+                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
+            } 
+                        
+            // Set the error handler on the DOM3Serializer interface implementation
+            if (fDOMErrorHandler != null) {
+                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
+            }
+            
+            // Set the filter on the DOM3Serializer interface implementation
+            if (fSerializerFilter != null) {
+                fDOMSerializer.setNodeFilter(fSerializerFilter);
+            }
+            
+            // Set the NewLine character to be used
+            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
+            
+            // Serializer your DOM, where node is an org.w3c.dom.Node
+            fDOMSerializer.serializeDOM3(nodeArg);
+        } catch (LSException lse) {
+            // Rethrow LSException.
+            throw lse;
+        } catch (RuntimeException e) {
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
+        }  catch (Exception e) {
+            if (fDOMErrorHandler != null) {
+                fDOMErrorHandler.handleError(new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
+                        null, e));
+            }
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
+        }        
+        
+        // return the serialized string
+        return output.toString();
+    }
+    
+    /** 
+     * Serializes the specified node to the specified URI and returns true if the Node 
+     * was successfully serialized. 
+     * 
+     * @see org.w3c.dom.ls.LSSerializer#writeToURI(org.w3c.dom.Node, String)
+     * @since DOM Level 3
+     * @param nodeArg The Node to serialize.
+     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
+     * LSSerializer was unable to serialize the node.
+     *      
+     */
+    public boolean writeToURI(Node nodeArg, String uri) throws LSException {
+        // If nodeArg is null, return false.  Should we throw and LSException instead?
+        if (nodeArg == null ) {
+            return false;
+        }
+
+        // Obtain a reference to the serializer to use
+        Serializer serializer = fXMLSerializer;
+        serializer.reset();
+        
+        if (nodeArg != fVisitedNode) {
+            // Determine the XML Document version of the Node 
+            String xmlVersion = getXMLVersion(nodeArg);
+            
+            // Determine the encoding: 1.LSOutput.encoding,
+            // 2.Document.inputEncoding, 3.Document.xmlEncoding.
+            fEncoding = getInputEncoding(nodeArg);
+            if (fEncoding == null ) {
+            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
+            }
+            
+            serializer.getOutputFormat().setProperty("version", xmlVersion);
+            
+            // Set the output encoding and xml version properties
+            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
+            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
+            
+            // If the node to be serialized is not a Document, Element, or Entity
+            // node
+            // then the XML declaration, or text declaration, should be never be
+            // serialized.
+            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
+                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
+                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
+                    && ((fFeatures & XMLDECL) != 0))  {
+                fDOMConfigProperties.setProperty(
+                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
+                        DOMConstants.DOM3_DEFAULT_FALSE);
+            }
+       
+            fVisitedNode = nodeArg;
+        } 
+        
+        // Update the serializer properties
+        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
+        
+        // 
+        try {
+            // If the specified encoding is not supported an
+            // "unsupported-encoding" fatal error is raised. ??
+            if (uri == null) {
+                String msg = Utils.messages.createMessage(
+                        MsgKey.ER_NO_OUTPUT_SPECIFIED, null);
+                if (fDOMErrorHandler != null) {
+                    fDOMErrorHandler.handleError(new DOMErrorImpl(
+                            DOMError.SEVERITY_FATAL_ERROR, msg,
+                            MsgKey.ER_NO_OUTPUT_SPECIFIED));
+                }
+                throw new LSException(LSException.SERIALIZE_ERR, msg);
+                
+            } else {
+                // REVISIT: Can this be used to get an absolute expanded URI
+                String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
+                
+                URL url = new URL(absoluteURI);
+                OutputStream urlOutStream = null;
+                String protocol = url.getProtocol();
+                String host = url.getHost();
+                
+                // For file protocols, there is no need to use a URL to get its
+                // corresponding OutputStream
+                
+                // Scheme names consist of a sequence of characters. The lower 
+                // case letters "a"--"z", digits, and the characters plus ("+"), 
+                // period ("."), and hyphen ("-") are allowed. For resiliency, 
+                // programs interpreting URLs should treat upper case letters as
+                // equivalent to lower case in scheme names 
+                // (e.g., allow "HTTP" as well as "http").
+                if (protocol.equalsIgnoreCase("file")
+                        && (host == null || host.length() == 0 || host
+                                .equals("localhost"))) {
+                    // do we also need to check for host.equals(hostname)
+                    urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
+                    
+                } else {
+                    // This should support URL's whose schemes are mentioned in
+                    // RFC1738 other than file
+                    
+                    URLConnection urlCon = url.openConnection();
+                    urlCon.setDoInput(false);
+                    urlCon.setDoOutput(true);
+                    urlCon.setUseCaches(false);
+                    urlCon.setAllowUserInteraction(false);
+                    
+                    // When writing to a HTTP URI, a HTTP PUT is performed.
+                    if (urlCon instanceof HttpURLConnection) {
+                        HttpURLConnection httpCon = (HttpURLConnection) urlCon;
+                        httpCon.setRequestMethod("PUT");
+                    }
+                    urlOutStream = urlCon.getOutputStream();
+                }
+                // set the OutputStream to that obtained from the systemId
+                serializer.setOutputStream(urlOutStream);
+            }
+            
+            // Get a reference to the serializer then lets you serilize a DOM
+            // Use this hack till Xalan support JAXP1.3
+            if (fDOMSerializer == null) {
+                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
+            } 
+            
+            // Set the error handler on the DOM3Serializer interface implementation
+            if (fDOMErrorHandler != null) {
+                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
+            }
+            
+            // Set the filter on the DOM3Serializer interface implementation
+            if (fSerializerFilter != null) {
+                fDOMSerializer.setNodeFilter(fSerializerFilter);
+            }
+            
+            // Set the NewLine character to be used
+            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
+            
+            // Serializer your DOM, where node is an org.w3c.dom.Node
+            // Assuming that Xalan's serializer can serialize any type of DOM
+            // node
+            fDOMSerializer.serializeDOM3(nodeArg);
+            
+        } catch (LSException lse) {
+            // Rethrow LSException.
+            throw lse;
+        } catch (RuntimeException e) {
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
+        }  catch (Exception e) {
+            if (fDOMErrorHandler != null) {
+                fDOMErrorHandler.handleError(new DOMErrorImpl(
+                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
+                        null, e));
+            }
+            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
+        }        
+        
+        return true;
+    }
+    // ************************************************************************
+    
+    
+    // ************************************************************************
+    // Implementaion methods
+    // ************************************************************************
+    
+    /** 
+     * Determines the XML Version of the Document Node to serialize.  If the Document Node
+     * is not a DOM Level 3 Node, then the default version returned is 1.0.
+     * 
+     * @param  nodeArg The Node to serialize
+     * @return A String containing the version pseudo-attribute of the XMLDecl.  
+     * @throws Throwable if the DOM implementation does not implement Document.getXmlVersion()      
+     */
+    //protected String getXMLVersion(Node nodeArg) throws Throwable {
+    protected String getXMLVersion(Node nodeArg) {
+        Document doc = null;
+        
+        // Determine the XML Version of the document
+        if (nodeArg != null) {
+            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
+                // The Document node is the Node argument
+                doc = (Document)nodeArg;
+            } else { 
+                // The Document node is the Node argument's ownerDocument
+                doc = nodeArg.getOwnerDocument();
+            }
+            
+            // Determine the DOM Version.
+            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
+                return doc.getXmlVersion();
+            }
+        } 
+        // The version will be treated as "1.0" which may result in
+        // an ill-formed document being serialized.
+        // If nodeArg does not have an ownerDocument, treat this as XML 1.0
+        return "1.0";
+    }
+    
+    /** 
+     * Determines the XML Encoding of the Document Node to serialize.  If the Document Node
+     * is not a DOM Level 3 Node, then the default encoding "UTF-8" is returned.
+     * 
+     * @param  nodeArg The Node to serialize
+     * @return A String containing the encoding pseudo-attribute of the XMLDecl.  
+     * @throws Throwable if the DOM implementation does not implement Document.getXmlEncoding()     
+     */
+    protected String getXMLEncoding(Node nodeArg) {
+        Document doc = null;
+        
+        // Determine the XML Encoding of the document
+        if (nodeArg != null) {
+            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
+                // The Document node is the Node argument
+                doc = (Document)nodeArg;
+            } else { 
+                // The Document node is the Node argument's ownerDocument
+                doc = nodeArg.getOwnerDocument();
+            }
+            
+            // Determine the XML Version. 
+            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
+                return doc.getXmlEncoding();
+            }
+        } 
+        // The default encoding is UTF-8 except for the writeToString method
+        return "UTF-8";
+    }
+    
+    /** 
+     * Determines the Input Encoding of the Document Node to serialize.  If the Document Node
+     * is not a DOM Level 3 Node, then null is returned.
+     * 
+     * @param  nodeArg The Node to serialize
+     * @return A String containing the input encoding.  
+     */
+    protected String getInputEncoding(Node nodeArg)  {
+        Document doc = null;
+        
+        // Determine the Input Encoding of the document
+        if (nodeArg != null) {
+            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
+                // The Document node is the Node argument
+                doc = (Document)nodeArg;
+            } else { 
+                // The Document node is the Node argument's ownerDocument
+                doc = nodeArg.getOwnerDocument();
+            }
+            
+            // Determine the DOM Version.
+            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
+                return doc.getInputEncoding();
+            }
+        } 
+        // The default encoding returned is null
+        return null;
+    }
+    
+    /**
+     * This method returns the LSSerializer's error handler.
+     * 
+     * @return Returns the fDOMErrorHandler.
+     */
+    public DOMErrorHandler getErrorHandler() {
+        return fDOMErrorHandler;
+    }
+    
+    /**
+     * Replaces all escape sequences in the given path with their literal characters.
+     */
+    private static String getPathWithoutEscapes(String origPath) {
+        if (origPath != null && origPath.length() != 0 && origPath.indexOf('%') != -1) {
+            // Locate the escape characters
+            StringTokenizer tokenizer = new StringTokenizer(origPath, "%");
+            StringBuffer result = new StringBuffer(origPath.length());
+            int size = tokenizer.countTokens();
+            result.append(tokenizer.nextToken());
+            for(int i = 1; i < size; ++i) {
+                String token = tokenizer.nextToken();
+                if (token.length() >= 2 && isHexDigit(token.charAt(0)) && 
+                        isHexDigit(token.charAt(1))) {
+                    // Decode the 2 digit hexadecimal number following % in '%nn'
+                    result.append((char)Integer.valueOf(token.substring(0, 2), 16).intValue());
+                    token = token.substring(2);
+                }
+                result.append(token);
+            }
+            return result.toString();
+        }
+        return origPath;
+    }
+
+    /** 
+     * Returns true if the given character is a valid hex character.
+     */
+    private static boolean isHexDigit(char c) {
+        return (c >= '0' && c <= '9' || 
+                c >= 'a' && c <= 'f' || 
+                c >= 'A' && c <= 'F');
+    }
+    
+    /**
+     * Creates an LSException. On J2SE 1.4 and above the cause for the exception will be set.
+     */
+    private static LSException createLSException(short code, Throwable cause) {
+        LSException lse = new LSException(code, cause != null ? cause.getMessage() : null);
+        if (cause != null && ThrowableMethods.fgThrowableMethodsAvailable) {
+            try {
+                ThrowableMethods.fgThrowableInitCauseMethod.invoke(lse, new Object [] {cause});
+            }
+            // Something went wrong. There's not much we can do about it.
+            catch (Exception e) {}
+        }
+        return lse;
+    }
+    
+    /**
+     * Holder of methods from java.lang.Throwable.
+     */
+    static class ThrowableMethods {
+        
+        // Method: java.lang.Throwable.initCause(java.lang.Throwable)
+        private static java.lang.reflect.Method fgThrowableInitCauseMethod = null;
+        
+        // Flag indicating whether or not Throwable methods available.
+        private static boolean fgThrowableMethodsAvailable = false;
+        
+        private ThrowableMethods() {}
+        
+        // Attempt to get methods for java.lang.Throwable on class initialization.
+        static {
+            try {
+                fgThrowableInitCauseMethod = Throwable.class.getMethod("initCause", new Class [] {Throwable.class});
+                fgThrowableMethodsAvailable = true;
+            }
+            // ClassNotFoundException, NoSuchMethodException or SecurityException
+            // Whatever the case, we cannot use java.lang.Throwable.initCause(java.lang.Throwable).
+            catch (Exception exc) {
+                fgThrowableInitCauseMethod = null;
+                fgThrowableMethodsAvailable = false;
+            }
+        }
+    }
+}
diff --git a/src/org/apache/xml/serializer/dom3/NamespaceSupport.java b/src/org/apache/xml/serializer/dom3/NamespaceSupport.java
index fc2b0ea..445f3eb 100644
--- a/src/org/apache/xml/serializer/dom3/NamespaceSupport.java
+++ b/src/org/apache/xml/serializer/dom3/NamespaceSupport.java
@@ -1,315 +1,315 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id:  $
- */
-
-package org.apache.xml.serializer.dom3;
-
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-/**
- * Namespace support for XML document handlers. This class doesn't 
- * perform any error checking and assumes that all strings passed
- * as arguments to methods are unique symbols. The SymbolTable class
- * can be used for this purpose.
- * 
- * Derived from org.apache.xerces.util.NamespaceSupport
- *
- * @author Andy Clark, IBM
- *
- * @version $Id: Exp $
- */
-public class NamespaceSupport {
-
-	static final String PREFIX_XML = "xml".intern();
-	
-	static final String PREFIX_XMLNS = "xmlns".intern(); 
-    
-    /**
-     * The XML Namespace ("http://www.w3.org/XML/1998/namespace"). This is
-     * the Namespace URI that is automatically mapped to the "xml" prefix.
-     */
-    public final static String XML_URI = "http://www.w3.org/XML/1998/namespace".intern();
-
-    /**
-     * XML Information Set REC
-     * all namespace attributes (including those named xmlns, 
-     * whose [prefix] property has no value) have a namespace URI of http://www.w3.org/2000/xmlns/
-     */
-    public final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/".intern();
-
-	//
-    // Data
-    //
-
-    /** 
-     * Namespace binding information. This array is composed of a
-     * series of tuples containing the namespace binding information:
-     * &lt;prefix, uri&gt;. The default size can be set to anything
-     * as long as it is a power of 2 greater than 1.
-     *
-     * @see #fNamespaceSize
-     * @see #fContext
-     */
-    protected String[] fNamespace = new String[16 * 2];
-
-    /** The top of the namespace information array. */
-    protected int fNamespaceSize;
-
-    // NOTE: The constructor depends on the initial context size 
-    //       being at least 1. -Ac
-
-    /** 
-     * Context indexes. This array contains indexes into the namespace
-     * information array. The index at the current context is the start
-     * index of declared namespace bindings and runs to the size of the
-     * namespace information array.
-     *
-     * @see #fNamespaceSize
-     */
-    protected int[] fContext = new int[8];
-
-    /** The current context. */
-    protected int fCurrentContext;
-    
-    protected String[] fPrefixes = new String[16];
-    
-    //
-    // Constructors
-    //
-
-    /** Default constructor. */
-    public NamespaceSupport() {
-    } // <init>()
-
-    //
-    // Public methods
-    //
-    
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#reset()
-	 */
-    public void reset() {
-
-        // reset namespace and context info
-        fNamespaceSize = 0;
-        fCurrentContext = 0;
-        fContext[fCurrentContext] = fNamespaceSize;
-
-        // bind "xml" prefix to the XML uri
-        fNamespace[fNamespaceSize++] = PREFIX_XML;
-        fNamespace[fNamespaceSize++] = XML_URI;
-        // bind "xmlns" prefix to the XMLNS uri
-        fNamespace[fNamespaceSize++] = PREFIX_XMLNS;
-        fNamespace[fNamespaceSize++] = XMLNS_URI;
-        ++fCurrentContext;
-
-    } // reset(SymbolTable)
-
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#pushContext()
-	 */
-    public void pushContext() {
-
-        // extend the array, if necessary
-        if (fCurrentContext + 1 == fContext.length) {
-            int[] contextarray = new int[fContext.length * 2];
-            System.arraycopy(fContext, 0, contextarray, 0, fContext.length);
-            fContext = contextarray;
-        }
-
-        // push context
-        fContext[++fCurrentContext] = fNamespaceSize;
-
-    } // pushContext()
-
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#popContext()
-	 */
-    public void popContext() {
-        fNamespaceSize = fContext[fCurrentContext--];
-    } // popContext()
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#declarePrefix(String, String)
-	 */
-    public boolean declarePrefix(String prefix, String uri) {
-        // ignore "xml" and "xmlns" prefixes
-        if (prefix == PREFIX_XML || prefix == PREFIX_XMLNS) {
-            return false;
-        }
-
-        // see if prefix already exists in current context
-        for (int i = fNamespaceSize; i > fContext[fCurrentContext]; i -= 2) {
-            //if (fNamespace[i - 2] == prefix) {
-        	if (fNamespace[i - 2].equals(prefix) )  {
-                // REVISIT: [Q] Should the new binding override the
-                //          previously declared binding or should it
-                //          it be ignored? -Ac
-                // NOTE:    The SAX2 "NamespaceSupport" helper allows
-                //          re-bindings with the new binding overwriting
-                //          the previous binding. -Ac
-                fNamespace[i - 1] = uri;
-                return true;
-            }
-        }
-
-        // resize array, if needed
-        if (fNamespaceSize == fNamespace.length) {
-            String[] namespacearray = new String[fNamespaceSize * 2];
-            System.arraycopy(fNamespace, 0, namespacearray, 0, fNamespaceSize);
-            fNamespace = namespacearray;
-        }
-
-        // bind prefix to uri in current context
-        fNamespace[fNamespaceSize++] = prefix;
-        fNamespace[fNamespaceSize++] = uri;
-
-        return true;
-
-    } // declarePrefix(String,String):boolean
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#getURI(String)
-	 */
-    public String getURI(String prefix) {
-        
-        // find prefix in current context
-        for (int i = fNamespaceSize; i > 0; i -= 2) {
-            //if (fNamespace[i - 2] == prefix) {
-        	if (fNamespace[i - 2].equals(prefix) ) {
-                return fNamespace[i - 1];
-            }
-        }
-
-        // prefix not found
-        return null;
-
-    } // getURI(String):String
-
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#getPrefix(String)
-	 */
-    public String getPrefix(String uri) {
-
-        // find uri in current context
-        for (int i = fNamespaceSize; i > 0; i -= 2) {
-            //if (fNamespace[i - 1] == uri) {
-        	if (fNamespace[i - 1].equals(uri) ) {
-                //if (getURI(fNamespace[i - 2]) == uri)
-        		if (getURI(fNamespace[i - 2]).equals(uri) )
-                    return fNamespace[i - 2];
-            }
-        }
-
-        // uri not found
-        return null;
-
-    } // getPrefix(String):String
-
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#getDeclaredPrefixCount()
-	 */
-    public int getDeclaredPrefixCount() {
-        return (fNamespaceSize - fContext[fCurrentContext]) / 2;
-    } // getDeclaredPrefixCount():int
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#getDeclaredPrefixAt(int)
-	 */
-    public String getDeclaredPrefixAt(int index) {
-        return fNamespace[fContext[fCurrentContext] + index * 2];
-    } // getDeclaredPrefixAt(int):String
-
-	/**
-	 * @see org.apache.xerces.xni.NamespaceContext#getAllPrefixes()
-	 */
-	public Enumeration getAllPrefixes() {
-        int count = 0;
-        if (fPrefixes.length < (fNamespace.length/2)) {
-            // resize prefix array          
-            String[] prefixes = new String[fNamespaceSize];
-            fPrefixes = prefixes;
-        }
-        String prefix = null;
-        boolean unique = true;
-        for (int i = 2; i < (fNamespaceSize-2); i += 2) {
-            prefix = fNamespace[i + 2];            
-            for (int k=0;k<count;k++){
-                if (fPrefixes[k]==prefix){
-                    unique = false;
-                    break;
-                }               
-            }
-            if (unique){
-                fPrefixes[count++] = prefix;
-            }
-            unique = true;
-        }
-		return new Prefixes(fPrefixes, count);
-	}
-    
-    protected final class Prefixes implements Enumeration {
-        private String[] prefixes;
-        private int counter = 0;
-        private int size = 0;
-               
-		/**
-		 * Constructor for Prefixes.
-		 */
-		public Prefixes(String [] prefixes, int size) {
-			this.prefixes = prefixes;
-            this.size = size;
-		}
-
-       /**
-		 * @see java.util.Enumeration#hasMoreElements()
-		 */
-		public boolean hasMoreElements() {           
-			return (counter< size);
-		}
-
-		/**
-		 * @see java.util.Enumeration#nextElement()
-		 */
-		public Object nextElement() {
-            if (counter< size){
-                return fPrefixes[counter++];
-            }
-			throw new NoSuchElementException("Illegal access to Namespace prefixes enumeration.");
-		}
-        
-        public String toString(){
-            StringBuffer buf = new StringBuffer();
-            for (int i=0;i<size;i++){
-                buf.append(prefixes[i]);
-                buf.append(" ");
-            }
-                
-            return buf.toString(); 
-        }
-
-}
-
-} // class NamespaceSupport
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.dom3;
+
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+/**
+ * Namespace support for XML document handlers. This class doesn't 
+ * perform any error checking and assumes that all strings passed
+ * as arguments to methods are unique symbols. The SymbolTable class
+ * can be used for this purpose.
+ * 
+ * Derived from org.apache.xerces.util.NamespaceSupport
+ *
+ * @author Andy Clark, IBM
+ *
+ * @version $Id$
+ */
+public class NamespaceSupport {
+
+	static final String PREFIX_XML = "xml".intern();
+	
+	static final String PREFIX_XMLNS = "xmlns".intern(); 
+    
+    /**
+     * The XML Namespace ("http://www.w3.org/XML/1998/namespace"). This is
+     * the Namespace URI that is automatically mapped to the "xml" prefix.
+     */
+    public final static String XML_URI = "http://www.w3.org/XML/1998/namespace".intern();
+
+    /**
+     * XML Information Set REC
+     * all namespace attributes (including those named xmlns, 
+     * whose [prefix] property has no value) have a namespace URI of http://www.w3.org/2000/xmlns/
+     */
+    public final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/".intern();
+
+	//
+    // Data
+    //
+
+    /** 
+     * Namespace binding information. This array is composed of a
+     * series of tuples containing the namespace binding information:
+     * &lt;prefix, uri&gt;. The default size can be set to anything
+     * as long as it is a power of 2 greater than 1.
+     *
+     * @see #fNamespaceSize
+     * @see #fContext
+     */
+    protected String[] fNamespace = new String[16 * 2];
+
+    /** The top of the namespace information array. */
+    protected int fNamespaceSize;
+
+    // NOTE: The constructor depends on the initial context size 
+    //       being at least 1. -Ac
+
+    /** 
+     * Context indexes. This array contains indexes into the namespace
+     * information array. The index at the current context is the start
+     * index of declared namespace bindings and runs to the size of the
+     * namespace information array.
+     *
+     * @see #fNamespaceSize
+     */
+    protected int[] fContext = new int[8];
+
+    /** The current context. */
+    protected int fCurrentContext;
+    
+    protected String[] fPrefixes = new String[16];
+    
+    //
+    // Constructors
+    //
+
+    /** Default constructor. */
+    public NamespaceSupport() {
+    } // <init>()
+
+    //
+    // Public methods
+    //
+    
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#reset()
+	 */
+    public void reset() {
+
+        // reset namespace and context info
+        fNamespaceSize = 0;
+        fCurrentContext = 0;
+        fContext[fCurrentContext] = fNamespaceSize;
+
+        // bind "xml" prefix to the XML uri
+        fNamespace[fNamespaceSize++] = PREFIX_XML;
+        fNamespace[fNamespaceSize++] = XML_URI;
+        // bind "xmlns" prefix to the XMLNS uri
+        fNamespace[fNamespaceSize++] = PREFIX_XMLNS;
+        fNamespace[fNamespaceSize++] = XMLNS_URI;
+        ++fCurrentContext;
+
+    } // reset(SymbolTable)
+
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#pushContext()
+	 */
+    public void pushContext() {
+
+        // extend the array, if necessary
+        if (fCurrentContext + 1 == fContext.length) {
+            int[] contextarray = new int[fContext.length * 2];
+            System.arraycopy(fContext, 0, contextarray, 0, fContext.length);
+            fContext = contextarray;
+        }
+
+        // push context
+        fContext[++fCurrentContext] = fNamespaceSize;
+
+    } // pushContext()
+
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#popContext()
+	 */
+    public void popContext() {
+        fNamespaceSize = fContext[fCurrentContext--];
+    } // popContext()
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#declarePrefix(String, String)
+	 */
+    public boolean declarePrefix(String prefix, String uri) {
+        // ignore "xml" and "xmlns" prefixes
+        if (prefix == PREFIX_XML || prefix == PREFIX_XMLNS) {
+            return false;
+        }
+
+        // see if prefix already exists in current context
+        for (int i = fNamespaceSize; i > fContext[fCurrentContext]; i -= 2) {
+            //if (fNamespace[i - 2] == prefix) {
+        	if (fNamespace[i - 2].equals(prefix) )  {
+                // REVISIT: [Q] Should the new binding override the
+                //          previously declared binding or should it
+                //          it be ignored? -Ac
+                // NOTE:    The SAX2 "NamespaceSupport" helper allows
+                //          re-bindings with the new binding overwriting
+                //          the previous binding. -Ac
+                fNamespace[i - 1] = uri;
+                return true;
+            }
+        }
+
+        // resize array, if needed
+        if (fNamespaceSize == fNamespace.length) {
+            String[] namespacearray = new String[fNamespaceSize * 2];
+            System.arraycopy(fNamespace, 0, namespacearray, 0, fNamespaceSize);
+            fNamespace = namespacearray;
+        }
+
+        // bind prefix to uri in current context
+        fNamespace[fNamespaceSize++] = prefix;
+        fNamespace[fNamespaceSize++] = uri;
+
+        return true;
+
+    } // declarePrefix(String,String):boolean
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#getURI(String)
+	 */
+    public String getURI(String prefix) {
+        
+        // find prefix in current context
+        for (int i = fNamespaceSize; i > 0; i -= 2) {
+            //if (fNamespace[i - 2] == prefix) {
+        	if (fNamespace[i - 2].equals(prefix) ) {
+                return fNamespace[i - 1];
+            }
+        }
+
+        // prefix not found
+        return null;
+
+    } // getURI(String):String
+
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#getPrefix(String)
+	 */
+    public String getPrefix(String uri) {
+
+        // find uri in current context
+        for (int i = fNamespaceSize; i > 0; i -= 2) {
+            //if (fNamespace[i - 1] == uri) {
+        	if (fNamespace[i - 1].equals(uri) ) {
+                //if (getURI(fNamespace[i - 2]) == uri)
+        		if (getURI(fNamespace[i - 2]).equals(uri) )
+                    return fNamespace[i - 2];
+            }
+        }
+
+        // uri not found
+        return null;
+
+    } // getPrefix(String):String
+
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#getDeclaredPrefixCount()
+	 */
+    public int getDeclaredPrefixCount() {
+        return (fNamespaceSize - fContext[fCurrentContext]) / 2;
+    } // getDeclaredPrefixCount():int
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#getDeclaredPrefixAt(int)
+	 */
+    public String getDeclaredPrefixAt(int index) {
+        return fNamespace[fContext[fCurrentContext] + index * 2];
+    } // getDeclaredPrefixAt(int):String
+
+	/**
+	 * @see org.apache.xerces.xni.NamespaceContext#getAllPrefixes()
+	 */
+	public Enumeration getAllPrefixes() {
+        int count = 0;
+        if (fPrefixes.length < (fNamespace.length/2)) {
+            // resize prefix array          
+            String[] prefixes = new String[fNamespaceSize];
+            fPrefixes = prefixes;
+        }
+        String prefix = null;
+        boolean unique = true;
+        for (int i = 2; i < (fNamespaceSize-2); i += 2) {
+            prefix = fNamespace[i + 2];            
+            for (int k=0;k<count;k++){
+                if (fPrefixes[k]==prefix){
+                    unique = false;
+                    break;
+                }               
+            }
+            if (unique){
+                fPrefixes[count++] = prefix;
+            }
+            unique = true;
+        }
+		return new Prefixes(fPrefixes, count);
+	}
+    
+    protected final class Prefixes implements Enumeration {
+        private String[] prefixes;
+        private int counter = 0;
+        private int size = 0;
+               
+		/**
+		 * Constructor for Prefixes.
+		 */
+		public Prefixes(String [] prefixes, int size) {
+			this.prefixes = prefixes;
+            this.size = size;
+		}
+
+       /**
+		 * @see java.util.Enumeration#hasMoreElements()
+		 */
+		public boolean hasMoreElements() {           
+			return (counter< size);
+		}
+
+		/**
+		 * @see java.util.Enumeration#nextElement()
+		 */
+		public Object nextElement() {
+            if (counter< size){
+                return fPrefixes[counter++];
+            }
+			throw new NoSuchElementException("Illegal access to Namespace prefixes enumeration.");
+		}
+        
+        public String toString(){
+            StringBuffer buf = new StringBuffer();
+            for (int i=0;i<size;i++){
+                buf.append(prefixes[i]);
+                buf.append(" ");
+            }
+                
+            return buf.toString(); 
+        }
+
+}
+
+} // class NamespaceSupport
diff --git a/src/org/apache/xml/serializer/utils/SerializerMessages_sk.java b/src/org/apache/xml/serializer/utils/SerializerMessages_sk.java
old mode 100755
new mode 100644
index fdabf07..3b12f70
--- a/src/org/apache/xml/serializer/utils/SerializerMessages_sk.java
+++ b/src/org/apache/xml/serializer/utils/SerializerMessages_sk.java
@@ -1,293 +1,293 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: SerializerMessages_sk.java,v 1.7 2005/03/07 20:34:36 minchau Exp $
- */
-
-package org.apache.xml.serializer.utils;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * An instance of this class is a ListResourceBundle that
- * has the required getContents() method that returns
- * an array of message-key/message associations.
- * <p>
- * The message keys are defined in {@link MsgKey}. The
- * messages that those keys map to are defined here.
- * <p>
- * The messages in the English version are intended to be
- * translated.
- *
- * This class is not a public API, it is only public because it is
- * used in org.apache.xml.serializer.
- *
- * @xsl.usage internal
- */
-public class SerializerMessages_sk extends ListResourceBundle {
-
-    /*
-     * This file contains error and warning messages related to
-     * Serializer Error Handling.
-     *
-     *  General notes to translators:
-
-     *  1) A stylesheet is a description of how to transform an input XML document
-     *     into a resultant XML document (or HTML document or text).  The
-     *     stylesheet itself is described in the form of an XML document.
-
-     *
-     *  2) An element is a mark-up tag in an XML document; an attribute is a
-     *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
-     *     "elem" is an element name, "attr" and "attr2" are attribute names with
-     *     the values "val" and "val2", respectively.
-     *
-     *  3) A namespace declaration is a special attribute that is used to associate
-     *     a prefix with a URI (the namespace).  The meanings of element names and
-     *     attribute names that use that prefix are defined with respect to that
-     *     namespace.
-     *
-     *
-     */
-
-    /** The lookup table for error messages.   */
-    public Object[][] getContents() {
-        Object[][] contents = new Object[][] {
-            {   MsgKey.BAD_MSGKEY,
-                "K\u013e\u00fa\u010d spr\u00e1vy ''{0}'' sa nenach\u00e1dza v triede spr\u00e1v ''{1}''" },
-
-            {   MsgKey.BAD_MSGFORMAT,
-                "Zlyhal form\u00e1t spr\u00e1vy ''{0}'' v triede spr\u00e1v ''{1}''." },
-
-            {   MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER,
-                "Trieda serializ\u00e1tora ''{0}'' neimplementuje org.xml.sax.ContentHandler." },
-
-            {   MsgKey.ER_RESOURCE_COULD_NOT_FIND,
-                    "Prostriedok [ {0} ] nemohol by\u0165 n\u00e1jden\u00fd.\n {1}" },
-
-            {   MsgKey.ER_RESOURCE_COULD_NOT_LOAD,
-                    "Prostriedok [ {0} ] sa nedal na\u010d\u00edta\u0165: {1} \n {2} \t {3}" },
-
-            {   MsgKey.ER_BUFFER_SIZE_LESSTHAN_ZERO,
-                    "Ve\u013ekos\u0165 vyrovn\u00e1vacej pam\u00e4te <=0" },
-
-            {   MsgKey.ER_INVALID_UTF16_SURROGATE,
-                    "Bolo zisten\u00e9 neplatn\u00e9 nahradenie UTF-16: {0} ?" },
-
-            {   MsgKey.ER_OIERROR,
-                "chyba IO" },
-
-            {   MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,
-                "Nie je mo\u017en\u00e9 prida\u0165 atrib\u00fat {0} po uzloch potomka alebo pred vytvoren\u00edm elementu.  Atrib\u00fat bude ignorovan\u00fd." },
-
-            /*
-             * Note to translators:  The stylesheet contained a reference to a
-             * namespace prefix that was undefined.  The value of the substitution
-             * text is the name of the prefix.
-             */
-            {   MsgKey.ER_NAMESPACE_PREFIX,
-                "N\u00e1zvov\u00fd priestor pre predponu ''{0}'' nebol deklarovan\u00fd." },
-
-            /*
-             * Note to translators:  This message is reported if the stylesheet
-             * being processed attempted to construct an XML document with an
-             * attribute in a place other than on an element.  The substitution text
-             * specifies the name of the attribute.
-             */
-            {   MsgKey.ER_STRAY_ATTRIBUTE,
-                "Atrib\u00fat ''{0}'' je mimo prvku." },
-
-            /*
-             * Note to translators:  As with the preceding message, a namespace
-             * declaration has the form of an attribute and is only permitted to
-             * appear on an element.  The substitution text {0} is the namespace
-             * prefix and {1} is the URI that was being used in the erroneous
-             * namespace declaration.
-             */
-            {   MsgKey.ER_STRAY_NAMESPACE,
-                "Deklar\u00e1cia n\u00e1zvov\u00e9ho priestoru ''{0}''=''{1}'' je mimo prvku." },
-
-            {   MsgKey.ER_COULD_NOT_LOAD_RESOURCE,
-                "Nebolo mo\u017en\u00e9 zavies\u0165 ''{0}'' (skontrolujte CLASSPATH), teraz sa pou\u017e\u00edvaj\u00fa iba \u0161tandardn\u00e9 nastavenia" },
-
-            {   MsgKey.ER_ILLEGAL_CHARACTER,
-                "Pokus o v\u00fdstup znaku integr\u00e1lnej hodnoty {0}, ktor\u00e1 nie je reprezentovan\u00e1 v zadanom v\u00fdstupnom k\u00f3dovan\u00ed {1}." },
-
-            {   MsgKey.ER_COULD_NOT_LOAD_METHOD_PROPERTY,
-                "Nebolo mo\u017en\u00e9 zavies\u0165 s\u00fabor vlastnost\u00ed ''{0}'' pre v\u00fdstupn\u00fa met\u00f3du ''{1}'' (skontrolujte CLASSPATH)" },
-
-            {   MsgKey.ER_INVALID_PORT,
-                "Neplatn\u00e9 \u010d\u00edslo portu" },
-
-            {   MsgKey.ER_PORT_WHEN_HOST_NULL,
-                "Nem\u00f4\u017ee by\u0165 stanoven\u00fd port, ak je hostite\u013e nulov\u00fd" },
-
-            {   MsgKey.ER_HOST_ADDRESS_NOT_WELLFORMED,
-                "Hostite\u013e nie je spr\u00e1vne form\u00e1tovan\u00e1 adresa" },
-
-            {   MsgKey.ER_SCHEME_NOT_CONFORMANT,
-                "Nezhodn\u00e1 sch\u00e9ma." },
-
-            {   MsgKey.ER_SCHEME_FROM_NULL_STRING,
-                "Nie je mo\u017en\u00e9 stanovi\u0165 sch\u00e9mu z nulov\u00e9ho re\u0165azca" },
-
-            {   MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
-                "Cesta obsahuje neplatn\u00fa \u00fanikov\u00fa sekvenciu" },
-
-            {   MsgKey.ER_PATH_INVALID_CHAR,
-                "Cesta obsahuje neplatn\u00fd znak: {0}" },
-
-            {   MsgKey.ER_FRAG_INVALID_CHAR,
-                "Fragment obsahuje neplatn\u00fd znak" },
-
-            {   MsgKey.ER_FRAG_WHEN_PATH_NULL,
-                "Ak je cesta nulov\u00e1, nem\u00f4\u017ee by\u0165 stanoven\u00fd fragment" },
-
-            {   MsgKey.ER_FRAG_FOR_GENERIC_URI,
-                "Fragment m\u00f4\u017ee by\u0165 stanoven\u00fd len pre v\u0161eobecn\u00e9 URI" },
-
-            {   MsgKey.ER_NO_SCHEME_IN_URI,
-                "V URI nebola n\u00e1jden\u00e1 \u017eiadna sch\u00e9ma" },
-
-            {   MsgKey.ER_CANNOT_INIT_URI_EMPTY_PARMS,
-                "Nie je mo\u017en\u00e9 inicializova\u0165 URI s pr\u00e1zdnymi parametrami" },
-
-            {   MsgKey.ER_NO_FRAGMENT_STRING_IN_PATH,
-                "Fragment nem\u00f4\u017ee by\u0165 zadan\u00fd v ceste, ani vo fragmente" },
-
-            {   MsgKey.ER_NO_QUERY_STRING_IN_PATH,
-                "Re\u0165azec dotazu nem\u00f4\u017ee by\u0165 zadan\u00fd v ceste a re\u0165azci dotazu" },
-
-            {   MsgKey.ER_NO_PORT_IF_NO_HOST,
-                "Ak nebol zadan\u00fd hostite\u013e, mo\u017eno nebol zadan\u00fd port" },
-
-            {   MsgKey.ER_NO_USERINFO_IF_NO_HOST,
-                "Ak nebol zadan\u00fd hostite\u013e, mo\u017eno nebolo zadan\u00e9 userinfo" },
-            {   MsgKey.ER_XML_VERSION_NOT_SUPPORTED,
-                "Varovanie:  Verzia v\u00fdstupn\u00e9ho dokumentu mus\u00ed by\u0165 povinne ''{0}''.  T\u00e1to verzia XML nie je podporovan\u00e1.  Verzia v\u00fdstupn\u00e9ho dokumentu bude ''1.0''." },
-
-            {   MsgKey.ER_SCHEME_REQUIRED,
-                "Je po\u017eadovan\u00e1 sch\u00e9ma!" },
-
-            /*
-             * Note to translators:  The words 'Properties' and
-             * 'SerializerFactory' in this message are Java class names
-             * and should not be translated.
-             */
-            {   MsgKey.ER_FACTORY_PROPERTY_MISSING,
-                "Objekt Properties, ktor\u00fd pre\u0161iel do SerializerFactory, nem\u00e1 vlastnos\u0165 ''{0}''." },
-
-            {   MsgKey.ER_ENCODING_NOT_SUPPORTED,
-                "Varovanie:  Java runtime nepodporuje k\u00f3dovanie ''{0}''." },
-
-             {MsgKey.ER_FEATURE_NOT_FOUND,
-             "Parameter ''{0}'' nebol rozpoznan\u00fd."},
-
-             {MsgKey.ER_FEATURE_NOT_SUPPORTED,
-             "Parameter ''{0}'' bol rozpoznan\u00fd, ale vy\u017eadovan\u00e1 hodnota sa ned\u00e1 nastavi\u0165."},
-
-             {MsgKey.ER_STRING_TOO_LONG,
-             "V\u00fdsledn\u00fd re\u0165azec je pr\u00edli\u0161 dlh\u00fd a nezmest\u00ed sa do DOMString: ''{0}''."},
-
-             {MsgKey.ER_TYPE_MISMATCH_ERR,
-             "Typ hodnoty pre tento n\u00e1zov parametra je nekompatibiln\u00fd s o\u010dak\u00e1van\u00fdm typom hodnoty."},
-
-             {MsgKey.ER_NO_OUTPUT_SPECIFIED,
-             "Cie\u013e v\u00fdstupu pre zap\u00edsanie \u00fadajov bol null."},
-
-             {MsgKey.ER_UNSUPPORTED_ENCODING,
-             "Bolo zaznamenan\u00e9 nepodporovan\u00e9 k\u00f3dovanie."},
-
-             {MsgKey.ER_UNABLE_TO_SERIALIZE_NODE,
-             "Uzol nebolo mo\u017en\u00e9 serializova\u0165."},
-
-             {MsgKey.ER_CDATA_SECTIONS_SPLIT,
-             "\u010cas\u0165 CDATA obsahuje jeden alebo viacer\u00e9 ozna\u010dova\u010de konca ']]>'."},
-
-             {MsgKey.ER_WARNING_WF_NOT_CHECKED,
-                 "Nebolo mo\u017en\u00e9 vytvori\u0165 in\u0161tanciu kontrol\u00f3ra Well-Formedness.  Parameter well-formed bol nastaven\u00fd na hodnotu true, ale kontrola well-formedness sa ned\u00e1 vykona\u0165."
-             },
-
-             {MsgKey.ER_WF_INVALID_CHARACTER,
-                 "Uzol ''{0}'' obsahuje neplatn\u00e9 znaky XML."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
-                 "V koment\u00e1ri bol n\u00e1jden\u00fd neplatn\u00fd znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
-                 "Pri spracovan\u00ed d\u00e1t in\u0161trukci\u00ed sa na\u0161iel neplatn\u00fd znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
-                 "V obsahu CDATASection sa na\u0161iel neplatn\u00fd znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
-                 "V obsahu znakov\u00fdch d\u00e1t uzla sa na\u0161iel neplatn\u00fd znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                 "V uzle {0} s n\u00e1zvom ''{1}'' sa na\u0161iel neplatn\u00fd znak XML."
-             },
-
-             { MsgKey.ER_WF_DASH_IN_COMMENT,
-                 "Re\u0165azec \"--\" nie je povolen\u00fd v r\u00e1mci koment\u00e1rov."
-             },
-
-             {MsgKey.ER_WF_LT_IN_ATTVAL,
-                 "Hodnota atrib\u00fatu \"{1}\", ktor\u00e1 je priraden\u00e1 k prvku typu \"{0}\", nesmie obsahova\u0165 znak ''<''."
-             },
-
-             {MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
-                 "Neanalyzovan\u00fd odkaz na entitu \"&{0};\" nie je povolen\u00fd."
-             },
-
-             {MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
-                 "Odkaz na extern\u00fa entitu \"&{0};\" nie je povolen\u00fd v hodnote atrib\u00fatu."
-             },
-
-             {MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
-                 "Predpona \"{0}\" nem\u00f4\u017ee by\u0165 naviazan\u00e1 na n\u00e1zvov\u00fd priestor \"{1}\"."
-             },
-
-             {MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
-                 "Lok\u00e1lny n\u00e1zov prvku \"{0}\" je null."
-             },
-
-             {MsgKey.ER_NULL_LOCAL_ATTR_NAME,
-                 "Lok\u00e1lny n\u00e1zov atrib\u00fatu \"{0}\" je null."
-             },
-
-             { MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
-                 "N\u00e1hradn\u00fd text pre uzol entity \"{0}\" obsahuje uzol prvku \"{1}\" s nenaviazanou predponou \"{2}\"."
-             },
-
-             { MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
-                 "N\u00e1hradn\u00fd text uzla entity \"{0}\" obsahuje uzol atrib\u00fatu \"{1}\" s nenaviazanou predponou \"{2}\"."
-             },
-
-        };
-
-        return contents;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.utils;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * An instance of this class is a ListResourceBundle that
+ * has the required getContents() method that returns
+ * an array of message-key/message associations.
+ * <p>
+ * The message keys are defined in {@link MsgKey}. The
+ * messages that those keys map to are defined here.
+ * <p>
+ * The messages in the English version are intended to be
+ * translated.
+ *
+ * This class is not a public API, it is only public because it is
+ * used in org.apache.xml.serializer.
+ *
+ * @xsl.usage internal
+ */
+public class SerializerMessages_sk extends ListResourceBundle {
+
+    /*
+     * This file contains error and warning messages related to
+     * Serializer Error Handling.
+     *
+     *  General notes to translators:
+
+     *  1) A stylesheet is a description of how to transform an input XML document
+     *     into a resultant XML document (or HTML document or text).  The
+     *     stylesheet itself is described in the form of an XML document.
+
+     *
+     *  2) An element is a mark-up tag in an XML document; an attribute is a
+     *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+     *     "elem" is an element name, "attr" and "attr2" are attribute names with
+     *     the values "val" and "val2", respectively.
+     *
+     *  3) A namespace declaration is a special attribute that is used to associate
+     *     a prefix with a URI (the namespace).  The meanings of element names and
+     *     attribute names that use that prefix are defined with respect to that
+     *     namespace.
+     *
+     *
+     */
+
+    /** The lookup table for error messages.   */
+    public Object[][] getContents() {
+        Object[][] contents = new Object[][] {
+            {   MsgKey.BAD_MSGKEY,
+                "K\u013e\u00fa\u010d spr\u00e1vy ''{0}'' sa nenach\u00e1dza v triede spr\u00e1v ''{1}''" },
+
+            {   MsgKey.BAD_MSGFORMAT,
+                "Zlyhal form\u00e1t spr\u00e1vy ''{0}'' v triede spr\u00e1v ''{1}''." },
+
+            {   MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER,
+                "Trieda serializ\u00e1tora ''{0}'' neimplementuje org.xml.sax.ContentHandler." },
+
+            {   MsgKey.ER_RESOURCE_COULD_NOT_FIND,
+                    "Prostriedok [ {0} ] nemohol by\u0165 n\u00e1jden\u00fd.\n {1}" },
+
+            {   MsgKey.ER_RESOURCE_COULD_NOT_LOAD,
+                    "Prostriedok [ {0} ] sa nedal na\u010d\u00edta\u0165: {1} \n {2} \t {3}" },
+
+            {   MsgKey.ER_BUFFER_SIZE_LESSTHAN_ZERO,
+                    "Ve\u013ekos\u0165 vyrovn\u00e1vacej pam\u00e4te <=0" },
+
+            {   MsgKey.ER_INVALID_UTF16_SURROGATE,
+                    "Bolo zisten\u00e9 neplatn\u00e9 nahradenie UTF-16: {0} ?" },
+
+            {   MsgKey.ER_OIERROR,
+                "chyba IO" },
+
+            {   MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,
+                "Nie je mo\u017en\u00e9 prida\u0165 atrib\u00fat {0} po uzloch potomka alebo pred vytvoren\u00edm elementu.  Atrib\u00fat bude ignorovan\u00fd." },
+
+            /*
+             * Note to translators:  The stylesheet contained a reference to a
+             * namespace prefix that was undefined.  The value of the substitution
+             * text is the name of the prefix.
+             */
+            {   MsgKey.ER_NAMESPACE_PREFIX,
+                "N\u00e1zvov\u00fd priestor pre predponu ''{0}'' nebol deklarovan\u00fd." },
+
+            /*
+             * Note to translators:  This message is reported if the stylesheet
+             * being processed attempted to construct an XML document with an
+             * attribute in a place other than on an element.  The substitution text
+             * specifies the name of the attribute.
+             */
+            {   MsgKey.ER_STRAY_ATTRIBUTE,
+                "Atrib\u00fat ''{0}'' je mimo prvku." },
+
+            /*
+             * Note to translators:  As with the preceding message, a namespace
+             * declaration has the form of an attribute and is only permitted to
+             * appear on an element.  The substitution text {0} is the namespace
+             * prefix and {1} is the URI that was being used in the erroneous
+             * namespace declaration.
+             */
+            {   MsgKey.ER_STRAY_NAMESPACE,
+                "Deklar\u00e1cia n\u00e1zvov\u00e9ho priestoru ''{0}''=''{1}'' je mimo prvku." },
+
+            {   MsgKey.ER_COULD_NOT_LOAD_RESOURCE,
+                "Nebolo mo\u017en\u00e9 zavies\u0165 ''{0}'' (skontrolujte CLASSPATH), teraz sa pou\u017e\u00edvaj\u00fa iba \u0161tandardn\u00e9 nastavenia" },
+
+            {   MsgKey.ER_ILLEGAL_CHARACTER,
+                "Pokus o v\u00fdstup znaku integr\u00e1lnej hodnoty {0}, ktor\u00e1 nie je reprezentovan\u00e1 v zadanom v\u00fdstupnom k\u00f3dovan\u00ed {1}." },
+
+            {   MsgKey.ER_COULD_NOT_LOAD_METHOD_PROPERTY,
+                "Nebolo mo\u017en\u00e9 zavies\u0165 s\u00fabor vlastnost\u00ed ''{0}'' pre v\u00fdstupn\u00fa met\u00f3du ''{1}'' (skontrolujte CLASSPATH)" },
+
+            {   MsgKey.ER_INVALID_PORT,
+                "Neplatn\u00e9 \u010d\u00edslo portu" },
+
+            {   MsgKey.ER_PORT_WHEN_HOST_NULL,
+                "Nem\u00f4\u017ee by\u0165 stanoven\u00fd port, ak je hostite\u013e nulov\u00fd" },
+
+            {   MsgKey.ER_HOST_ADDRESS_NOT_WELLFORMED,
+                "Hostite\u013e nie je spr\u00e1vne form\u00e1tovan\u00e1 adresa" },
+
+            {   MsgKey.ER_SCHEME_NOT_CONFORMANT,
+                "Nezhodn\u00e1 sch\u00e9ma." },
+
+            {   MsgKey.ER_SCHEME_FROM_NULL_STRING,
+                "Nie je mo\u017en\u00e9 stanovi\u0165 sch\u00e9mu z nulov\u00e9ho re\u0165azca" },
+
+            {   MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
+                "Cesta obsahuje neplatn\u00fa \u00fanikov\u00fa sekvenciu" },
+
+            {   MsgKey.ER_PATH_INVALID_CHAR,
+                "Cesta obsahuje neplatn\u00fd znak: {0}" },
+
+            {   MsgKey.ER_FRAG_INVALID_CHAR,
+                "Fragment obsahuje neplatn\u00fd znak" },
+
+            {   MsgKey.ER_FRAG_WHEN_PATH_NULL,
+                "Ak je cesta nulov\u00e1, nem\u00f4\u017ee by\u0165 stanoven\u00fd fragment" },
+
+            {   MsgKey.ER_FRAG_FOR_GENERIC_URI,
+                "Fragment m\u00f4\u017ee by\u0165 stanoven\u00fd len pre v\u0161eobecn\u00e9 URI" },
+
+            {   MsgKey.ER_NO_SCHEME_IN_URI,
+                "V URI nebola n\u00e1jden\u00e1 \u017eiadna sch\u00e9ma" },
+
+            {   MsgKey.ER_CANNOT_INIT_URI_EMPTY_PARMS,
+                "Nie je mo\u017en\u00e9 inicializova\u0165 URI s pr\u00e1zdnymi parametrami" },
+
+            {   MsgKey.ER_NO_FRAGMENT_STRING_IN_PATH,
+                "Fragment nem\u00f4\u017ee by\u0165 zadan\u00fd v ceste, ani vo fragmente" },
+
+            {   MsgKey.ER_NO_QUERY_STRING_IN_PATH,
+                "Re\u0165azec dotazu nem\u00f4\u017ee by\u0165 zadan\u00fd v ceste a re\u0165azci dotazu" },
+
+            {   MsgKey.ER_NO_PORT_IF_NO_HOST,
+                "Ak nebol zadan\u00fd hostite\u013e, mo\u017eno nebol zadan\u00fd port" },
+
+            {   MsgKey.ER_NO_USERINFO_IF_NO_HOST,
+                "Ak nebol zadan\u00fd hostite\u013e, mo\u017eno nebolo zadan\u00e9 userinfo" },
+            {   MsgKey.ER_XML_VERSION_NOT_SUPPORTED,
+                "Varovanie:  Verzia v\u00fdstupn\u00e9ho dokumentu mus\u00ed by\u0165 povinne ''{0}''.  T\u00e1to verzia XML nie je podporovan\u00e1.  Verzia v\u00fdstupn\u00e9ho dokumentu bude ''1.0''." },
+
+            {   MsgKey.ER_SCHEME_REQUIRED,
+                "Je po\u017eadovan\u00e1 sch\u00e9ma!" },
+
+            /*
+             * Note to translators:  The words 'Properties' and
+             * 'SerializerFactory' in this message are Java class names
+             * and should not be translated.
+             */
+            {   MsgKey.ER_FACTORY_PROPERTY_MISSING,
+                "Objekt Properties, ktor\u00fd pre\u0161iel do SerializerFactory, nem\u00e1 vlastnos\u0165 ''{0}''." },
+
+            {   MsgKey.ER_ENCODING_NOT_SUPPORTED,
+                "Varovanie:  Java runtime nepodporuje k\u00f3dovanie ''{0}''." },
+
+             {MsgKey.ER_FEATURE_NOT_FOUND,
+             "Parameter ''{0}'' nebol rozpoznan\u00fd."},
+
+             {MsgKey.ER_FEATURE_NOT_SUPPORTED,
+             "Parameter ''{0}'' bol rozpoznan\u00fd, ale vy\u017eadovan\u00e1 hodnota sa ned\u00e1 nastavi\u0165."},
+
+             {MsgKey.ER_STRING_TOO_LONG,
+             "V\u00fdsledn\u00fd re\u0165azec je pr\u00edli\u0161 dlh\u00fd a nezmest\u00ed sa do DOMString: ''{0}''."},
+
+             {MsgKey.ER_TYPE_MISMATCH_ERR,
+             "Typ hodnoty pre tento n\u00e1zov parametra je nekompatibiln\u00fd s o\u010dak\u00e1van\u00fdm typom hodnoty."},
+
+             {MsgKey.ER_NO_OUTPUT_SPECIFIED,
+             "Cie\u013e v\u00fdstupu pre zap\u00edsanie \u00fadajov bol null."},
+
+             {MsgKey.ER_UNSUPPORTED_ENCODING,
+             "Bolo zaznamenan\u00e9 nepodporovan\u00e9 k\u00f3dovanie."},
+
+             {MsgKey.ER_UNABLE_TO_SERIALIZE_NODE,
+             "Uzol nebolo mo\u017en\u00e9 serializova\u0165."},
+
+             {MsgKey.ER_CDATA_SECTIONS_SPLIT,
+             "\u010cas\u0165 CDATA obsahuje jeden alebo viacer\u00e9 ozna\u010dova\u010de konca ']]>'."},
+
+             {MsgKey.ER_WARNING_WF_NOT_CHECKED,
+                 "Nebolo mo\u017en\u00e9 vytvori\u0165 in\u0161tanciu kontrol\u00f3ra Well-Formedness.  Parameter well-formed bol nastaven\u00fd na hodnotu true, ale kontrola well-formedness sa ned\u00e1 vykona\u0165."
+             },
+
+             {MsgKey.ER_WF_INVALID_CHARACTER,
+                 "Uzol ''{0}'' obsahuje neplatn\u00e9 znaky XML."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
+                 "V koment\u00e1ri bol n\u00e1jden\u00fd neplatn\u00fd znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
+                 "Pri spracovan\u00ed d\u00e1t in\u0161trukci\u00ed sa na\u0161iel neplatn\u00fd znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
+                 "V obsahu CDATASection sa na\u0161iel neplatn\u00fd znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
+                 "V obsahu znakov\u00fdch d\u00e1t uzla sa na\u0161iel neplatn\u00fd znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                 "V uzle {0} s n\u00e1zvom ''{1}'' sa na\u0161iel neplatn\u00fd znak XML."
+             },
+
+             { MsgKey.ER_WF_DASH_IN_COMMENT,
+                 "Re\u0165azec \"--\" nie je povolen\u00fd v r\u00e1mci koment\u00e1rov."
+             },
+
+             {MsgKey.ER_WF_LT_IN_ATTVAL,
+                 "Hodnota atrib\u00fatu \"{1}\", ktor\u00e1 je priraden\u00e1 k prvku typu \"{0}\", nesmie obsahova\u0165 znak ''<''."
+             },
+
+             {MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
+                 "Neanalyzovan\u00fd odkaz na entitu \"&{0};\" nie je povolen\u00fd."
+             },
+
+             {MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
+                 "Odkaz na extern\u00fa entitu \"&{0};\" nie je povolen\u00fd v hodnote atrib\u00fatu."
+             },
+
+             {MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
+                 "Predpona \"{0}\" nem\u00f4\u017ee by\u0165 naviazan\u00e1 na n\u00e1zvov\u00fd priestor \"{1}\"."
+             },
+
+             {MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
+                 "Lok\u00e1lny n\u00e1zov prvku \"{0}\" je null."
+             },
+
+             {MsgKey.ER_NULL_LOCAL_ATTR_NAME,
+                 "Lok\u00e1lny n\u00e1zov atrib\u00fatu \"{0}\" je null."
+             },
+
+             { MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
+                 "N\u00e1hradn\u00fd text pre uzol entity \"{0}\" obsahuje uzol prvku \"{1}\" s nenaviazanou predponou \"{2}\"."
+             },
+
+             { MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
+                 "N\u00e1hradn\u00fd text uzla entity \"{0}\" obsahuje uzol atrib\u00fatu \"{1}\" s nenaviazanou predponou \"{2}\"."
+             },
+
+        };
+
+        return contents;
+    }
+}
diff --git a/src/org/apache/xml/serializer/utils/SerializerMessages_sl.java b/src/org/apache/xml/serializer/utils/SerializerMessages_sl.java
old mode 100755
new mode 100644
index fa40d4e..e1059e6
--- a/src/org/apache/xml/serializer/utils/SerializerMessages_sl.java
+++ b/src/org/apache/xml/serializer/utils/SerializerMessages_sl.java
@@ -1,293 +1,293 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: SerializerMessages_sl.java,v 1.7 2005/03/07 20:34:36 minchau Exp $
- */
-
-package org.apache.xml.serializer.utils;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * An instance of this class is a ListResourceBundle that
- * has the required getContents() method that returns
- * an array of message-key/message associations.
- * <p>
- * The message keys are defined in {@link MsgKey}. The
- * messages that those keys map to are defined here.
- * <p>
- * The messages in the English version are intended to be
- * translated.
- *
- * This class is not a public API, it is only public because it is
- * used in org.apache.xml.serializer.
- *
- * @xsl.usage internal
- */
-public class SerializerMessages_sl extends ListResourceBundle {
-
-    /*
-     * This file contains error and warning messages related to
-     * Serializer Error Handling.
-     *
-     *  General notes to translators:
-
-     *  1) A stylesheet is a description of how to transform an input XML document
-     *     into a resultant XML document (or HTML document or text).  The
-     *     stylesheet itself is described in the form of an XML document.
-
-     *
-     *  2) An element is a mark-up tag in an XML document; an attribute is a
-     *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
-     *     "elem" is an element name, "attr" and "attr2" are attribute names with
-     *     the values "val" and "val2", respectively.
-     *
-     *  3) A namespace declaration is a special attribute that is used to associate
-     *     a prefix with a URI (the namespace).  The meanings of element names and
-     *     attribute names that use that prefix are defined with respect to that
-     *     namespace.
-     *
-     *
-     */
-
-    /** The lookup table for error messages.   */
-    public Object[][] getContents() {
-        Object[][] contents = new Object[][] {
-            {   MsgKey.BAD_MSGKEY,
-                "Klju\u010d sporo\u010dila ''{0}'' ni v rezredu sporo\u010dila ''{1}''" },
-
-            {   MsgKey.BAD_MSGFORMAT,
-                "Format sporo\u010dila ''{0}'' v razredu sporo\u010dila ''{1}'' je spodletel." },
-
-            {   MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER,
-                "Razred serializerja ''{0}'' ne izvede org.xml.sax.ContentHandler." },
-
-            {   MsgKey.ER_RESOURCE_COULD_NOT_FIND,
-                    "Vira [ {0} ] ni mogo\u010de najti.\n {1}" },
-
-            {   MsgKey.ER_RESOURCE_COULD_NOT_LOAD,
-                    "Sredstva [ {0} ] ni bilo mogo\u010de nalo\u017eiti: {1} \n {2} \t {3}" },
-
-            {   MsgKey.ER_BUFFER_SIZE_LESSTHAN_ZERO,
-                    "Velikost medpomnilnika <=0" },
-
-            {   MsgKey.ER_INVALID_UTF16_SURROGATE,
-                    "Zaznan neveljaven nadomestek UTF-16: {0} ?" },
-
-            {   MsgKey.ER_OIERROR,
-                "Napaka V/I" },
-
-            {   MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,
-                "Atributa {0} ne morem dodati za podrejenimi vozli\u0161\u010di ali pred izdelavo elementa.  Atribut bo prezrt." },
-
-            /*
-             * Note to translators:  The stylesheet contained a reference to a
-             * namespace prefix that was undefined.  The value of the substitution
-             * text is the name of the prefix.
-             */
-            {   MsgKey.ER_NAMESPACE_PREFIX,
-                "Imenski prostor za predpono ''{0}'' ni bil naveden." },
-
-            /*
-             * Note to translators:  This message is reported if the stylesheet
-             * being processed attempted to construct an XML document with an
-             * attribute in a place other than on an element.  The substitution text
-             * specifies the name of the attribute.
-             */
-            {   MsgKey.ER_STRAY_ATTRIBUTE,
-                "Atribut ''{0}'' je zunaj elementa." },
-
-            /*
-             * Note to translators:  As with the preceding message, a namespace
-             * declaration has the form of an attribute and is only permitted to
-             * appear on an element.  The substitution text {0} is the namespace
-             * prefix and {1} is the URI that was being used in the erroneous
-             * namespace declaration.
-             */
-            {   MsgKey.ER_STRAY_NAMESPACE,
-                "Deklaracija imenskega prostora ''{0}''=''{1}'' je zunaj elementa." },
-
-            {   MsgKey.ER_COULD_NOT_LOAD_RESOURCE,
-                "Ni bilo mogo\u010de nalo\u017eiti ''{0}'' (preverite CLASSPATH), trenutno se uporabljajo samo privzete vrednosti" },
-
-            {   MsgKey.ER_ILLEGAL_CHARACTER,
-                "Poskus izpisa znaka integralne vrednosti {0}, ki v navedenem izhodnem kodiranju {1} ni zastopan." },
-
-            {   MsgKey.ER_COULD_NOT_LOAD_METHOD_PROPERTY,
-                "Datoteke z lastnostmi ''{0}'' ni bilo mogo\u010de nalo\u017eiti za izhodno metodo ''{1}'' (preverite CLASSPATH)" },
-
-            {   MsgKey.ER_INVALID_PORT,
-                "Neveljavna \u0161tevilka vrat" },
-
-            {   MsgKey.ER_PORT_WHEN_HOST_NULL,
-                "Ko je gostitelj NULL, nastavitev vrat ni mogo\u010da" },
-
-            {   MsgKey.ER_HOST_ADDRESS_NOT_WELLFORMED,
-                "Naslov gostitelja ni pravilno oblikovan" },
-
-            {   MsgKey.ER_SCHEME_NOT_CONFORMANT,
-                "Shema ni skladna." },
-
-            {   MsgKey.ER_SCHEME_FROM_NULL_STRING,
-                "Ni mogo\u010de nastaviti sheme iz niza NULL" },
-
-            {   MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
-                "Pot vsebuje neveljavno zaporedje za izhod" },
-
-            {   MsgKey.ER_PATH_INVALID_CHAR,
-                "Pot vsebuje neveljaven znak: {0}" },
-
-            {   MsgKey.ER_FRAG_INVALID_CHAR,
-                "Fragment vsebuje neveljaven znak" },
-
-            {   MsgKey.ER_FRAG_WHEN_PATH_NULL,
-                "Ko je pot NULL, nastavitev fragmenta ni mogo\u010da" },
-
-            {   MsgKey.ER_FRAG_FOR_GENERIC_URI,
-                "Fragment je lahko nastavljen samo za splo\u0161ni URI" },
-
-            {   MsgKey.ER_NO_SCHEME_IN_URI,
-                "Ne najdem sheme v URI" },
-
-            {   MsgKey.ER_CANNOT_INIT_URI_EMPTY_PARMS,
-                "Ni mogo\u010de inicializirati URI-ja s praznimi parametri" },
-
-            {   MsgKey.ER_NO_FRAGMENT_STRING_IN_PATH,
-                "Fragment ne more biti hkrati naveden v poti in v fragmentu" },
-
-            {   MsgKey.ER_NO_QUERY_STRING_IN_PATH,
-                "Poizvedbeni niz ne more biti naveden v nizu poti in poizvedbenem nizu" },
-
-            {   MsgKey.ER_NO_PORT_IF_NO_HOST,
-                "Vrata ne morejo biti navedena, \u010de ni naveden gostitelj" },
-
-            {   MsgKey.ER_NO_USERINFO_IF_NO_HOST,
-                "Informacije o uporabniku ne morejo biti navedene, \u010de ni naveden gostitelj" },
-            {   MsgKey.ER_XML_VERSION_NOT_SUPPORTED,
-                "Opozorilo: Zahtevana razli\u010dica izhodnega dokumenta je ''{0}''.  Ta razli\u010dica XML ni podprta.  Razli\u010dica izhodnega dokumenta bo ''1.0''." },
-
-            {   MsgKey.ER_SCHEME_REQUIRED,
-                "Zahtevana je shema!" },
-
-            /*
-             * Note to translators:  The words 'Properties' and
-             * 'SerializerFactory' in this message are Java class names
-             * and should not be translated.
-             */
-            {   MsgKey.ER_FACTORY_PROPERTY_MISSING,
-                "Predmet Properties (lastnosti), ki je prene\u0161en v SerializerFactory, nima lastnosti ''{0}''." },
-
-            {   MsgKey.ER_ENCODING_NOT_SUPPORTED,
-                "Opozorilo:  Izvajalno okolje Java ne podpira kodiranja ''{0}''." },
-
-             {MsgKey.ER_FEATURE_NOT_FOUND,
-             "Parameter ''{0}'' ni prepoznan."},
-
-             {MsgKey.ER_FEATURE_NOT_SUPPORTED,
-             "Parameter ''{0}'' je prepoznan, vendar pa zahtevane vrednosti ni mogo\u010de nastaviti."},
-
-             {MsgKey.ER_STRING_TOO_LONG,
-             "Nastali niz je predolg za DOMString: ''{0}''."},
-
-             {MsgKey.ER_TYPE_MISMATCH_ERR,
-             "Tip vrednosti za to ime parametra je nezdru\u017eljiv s pri\u010dakovanim tipom vrednosti."},
-
-             {MsgKey.ER_NO_OUTPUT_SPECIFIED,
-             "Izhodno mesto za vpisovanje podatkov je bilo ni\u010d."},
-
-             {MsgKey.ER_UNSUPPORTED_ENCODING,
-             "Odkrito je nepodprto kodiranje."},
-
-             {MsgKey.ER_UNABLE_TO_SERIALIZE_NODE,
-             "Vozli\u0161\u010da ni mogo\u010de serializirati."},
-
-             {MsgKey.ER_CDATA_SECTIONS_SPLIT,
-             "Odsek CDATA vsebuje enega ali ve\u010d ozna\u010devalnikov prekinitve ']]>'."},
-
-             {MsgKey.ER_WARNING_WF_NOT_CHECKED,
-                 "Primerka preverjevalnika Well-Formedness ni bilo mogo\u010de ustvariti.  Parameter well-formed je bil nastavljen na True, ampak ni mogo\u010de preveriti well-formedness."
-             },
-
-             {MsgKey.ER_WF_INVALID_CHARACTER,
-                 "Vozli\u0161\u010de ''{0}'' vsebuje neveljavne znake XML."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
-                 "V komentarju je bil najden neveljaven XML znak (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
-                 "V podatkih navodila za obdelavo je bil najden neveljaven znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
-                 "V vsebini odseka CDATASection je bil najden neveljaven znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
-                 "V podatkovni vsebini znaka vozli\u0161\u010da je bil najden neveljaven znak XML (Unicode: 0x{0})."
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                 "V vozli\u0161\u010du {0} z imenom ''{1}'' je bil najden neveljaven znak XML."
-             },
-
-             { MsgKey.ER_WF_DASH_IN_COMMENT,
-                 "Niz \"--\" ni dovoljen v komentarjih."
-             },
-
-             {MsgKey.ER_WF_LT_IN_ATTVAL,
-                 "Vrednost atributa \"{1}\", ki je povezan s tipom elementa \"{0}\", ne sme vsebovati znaka ''<''."
-             },
-
-             {MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
-                 "Neraz\u010dlenjeni sklic entitete \"&{0};\" ni dovoljen."
-             },
-
-             {MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
-                 "Zunanji sklic entitete \"&{0};\" ni dovoljen v vrednosti atributa."
-             },
-
-             {MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
-                 "Predpona \"{0}\" ne more biti povezana z imenskim prostorom \"{1}\"."
-             },
-
-             {MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
-                 "Lokalno ime elementa \"{0}\" je ni\u010d."
-             },
-
-             {MsgKey.ER_NULL_LOCAL_ATTR_NAME,
-                 "Lokalno ime atributa \"{0}\" je ni\u010d."
-             },
-
-             { MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
-                 "Besedilo za zamenjavo za vozli\u0161\u010de entitete \"{0}\" vsebuje vozli\u0161\u010de elementa \"{1}\" z nevezano predpono \"{2}\"."
-             },
-
-             { MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
-                 "Besedilo za zamenjavo za vozli\u0161\u010de entitete \"{0}\" vsebuje vozli\u0161\u010de atributa \"{1}\" z nevezano predpono \"{2}\"."
-             },
-
-        };
-
-        return contents;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xml.serializer.utils;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * An instance of this class is a ListResourceBundle that
+ * has the required getContents() method that returns
+ * an array of message-key/message associations.
+ * <p>
+ * The message keys are defined in {@link MsgKey}. The
+ * messages that those keys map to are defined here.
+ * <p>
+ * The messages in the English version are intended to be
+ * translated.
+ *
+ * This class is not a public API, it is only public because it is
+ * used in org.apache.xml.serializer.
+ *
+ * @xsl.usage internal
+ */
+public class SerializerMessages_sl extends ListResourceBundle {
+
+    /*
+     * This file contains error and warning messages related to
+     * Serializer Error Handling.
+     *
+     *  General notes to translators:
+
+     *  1) A stylesheet is a description of how to transform an input XML document
+     *     into a resultant XML document (or HTML document or text).  The
+     *     stylesheet itself is described in the form of an XML document.
+
+     *
+     *  2) An element is a mark-up tag in an XML document; an attribute is a
+     *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+     *     "elem" is an element name, "attr" and "attr2" are attribute names with
+     *     the values "val" and "val2", respectively.
+     *
+     *  3) A namespace declaration is a special attribute that is used to associate
+     *     a prefix with a URI (the namespace).  The meanings of element names and
+     *     attribute names that use that prefix are defined with respect to that
+     *     namespace.
+     *
+     *
+     */
+
+    /** The lookup table for error messages.   */
+    public Object[][] getContents() {
+        Object[][] contents = new Object[][] {
+            {   MsgKey.BAD_MSGKEY,
+                "Klju\u010d sporo\u010dila ''{0}'' ni v rezredu sporo\u010dila ''{1}''" },
+
+            {   MsgKey.BAD_MSGFORMAT,
+                "Format sporo\u010dila ''{0}'' v razredu sporo\u010dila ''{1}'' je spodletel." },
+
+            {   MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER,
+                "Razred serializerja ''{0}'' ne izvede org.xml.sax.ContentHandler." },
+
+            {   MsgKey.ER_RESOURCE_COULD_NOT_FIND,
+                    "Vira [ {0} ] ni mogo\u010de najti.\n {1}" },
+
+            {   MsgKey.ER_RESOURCE_COULD_NOT_LOAD,
+                    "Sredstva [ {0} ] ni bilo mogo\u010de nalo\u017eiti: {1} \n {2} \t {3}" },
+
+            {   MsgKey.ER_BUFFER_SIZE_LESSTHAN_ZERO,
+                    "Velikost medpomnilnika <=0" },
+
+            {   MsgKey.ER_INVALID_UTF16_SURROGATE,
+                    "Zaznan neveljaven nadomestek UTF-16: {0} ?" },
+
+            {   MsgKey.ER_OIERROR,
+                "Napaka V/I" },
+
+            {   MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,
+                "Atributa {0} ne morem dodati za podrejenimi vozli\u0161\u010di ali pred izdelavo elementa.  Atribut bo prezrt." },
+
+            /*
+             * Note to translators:  The stylesheet contained a reference to a
+             * namespace prefix that was undefined.  The value of the substitution
+             * text is the name of the prefix.
+             */
+            {   MsgKey.ER_NAMESPACE_PREFIX,
+                "Imenski prostor za predpono ''{0}'' ni bil naveden." },
+
+            /*
+             * Note to translators:  This message is reported if the stylesheet
+             * being processed attempted to construct an XML document with an
+             * attribute in a place other than on an element.  The substitution text
+             * specifies the name of the attribute.
+             */
+            {   MsgKey.ER_STRAY_ATTRIBUTE,
+                "Atribut ''{0}'' je zunaj elementa." },
+
+            /*
+             * Note to translators:  As with the preceding message, a namespace
+             * declaration has the form of an attribute and is only permitted to
+             * appear on an element.  The substitution text {0} is the namespace
+             * prefix and {1} is the URI that was being used in the erroneous
+             * namespace declaration.
+             */
+            {   MsgKey.ER_STRAY_NAMESPACE,
+                "Deklaracija imenskega prostora ''{0}''=''{1}'' je zunaj elementa." },
+
+            {   MsgKey.ER_COULD_NOT_LOAD_RESOURCE,
+                "Ni bilo mogo\u010de nalo\u017eiti ''{0}'' (preverite CLASSPATH), trenutno se uporabljajo samo privzete vrednosti" },
+
+            {   MsgKey.ER_ILLEGAL_CHARACTER,
+                "Poskus izpisa znaka integralne vrednosti {0}, ki v navedenem izhodnem kodiranju {1} ni zastopan." },
+
+            {   MsgKey.ER_COULD_NOT_LOAD_METHOD_PROPERTY,
+                "Datoteke z lastnostmi ''{0}'' ni bilo mogo\u010de nalo\u017eiti za izhodno metodo ''{1}'' (preverite CLASSPATH)" },
+
+            {   MsgKey.ER_INVALID_PORT,
+                "Neveljavna \u0161tevilka vrat" },
+
+            {   MsgKey.ER_PORT_WHEN_HOST_NULL,
+                "Ko je gostitelj NULL, nastavitev vrat ni mogo\u010da" },
+
+            {   MsgKey.ER_HOST_ADDRESS_NOT_WELLFORMED,
+                "Naslov gostitelja ni pravilno oblikovan" },
+
+            {   MsgKey.ER_SCHEME_NOT_CONFORMANT,
+                "Shema ni skladna." },
+
+            {   MsgKey.ER_SCHEME_FROM_NULL_STRING,
+                "Ni mogo\u010de nastaviti sheme iz niza NULL" },
+
+            {   MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
+                "Pot vsebuje neveljavno zaporedje za izhod" },
+
+            {   MsgKey.ER_PATH_INVALID_CHAR,
+                "Pot vsebuje neveljaven znak: {0}" },
+
+            {   MsgKey.ER_FRAG_INVALID_CHAR,
+                "Fragment vsebuje neveljaven znak" },
+
+            {   MsgKey.ER_FRAG_WHEN_PATH_NULL,
+                "Ko je pot NULL, nastavitev fragmenta ni mogo\u010da" },
+
+            {   MsgKey.ER_FRAG_FOR_GENERIC_URI,
+                "Fragment je lahko nastavljen samo za splo\u0161ni URI" },
+
+            {   MsgKey.ER_NO_SCHEME_IN_URI,
+                "Ne najdem sheme v URI" },
+
+            {   MsgKey.ER_CANNOT_INIT_URI_EMPTY_PARMS,
+                "Ni mogo\u010de inicializirati URI-ja s praznimi parametri" },
+
+            {   MsgKey.ER_NO_FRAGMENT_STRING_IN_PATH,
+                "Fragment ne more biti hkrati naveden v poti in v fragmentu" },
+
+            {   MsgKey.ER_NO_QUERY_STRING_IN_PATH,
+                "Poizvedbeni niz ne more biti naveden v nizu poti in poizvedbenem nizu" },
+
+            {   MsgKey.ER_NO_PORT_IF_NO_HOST,
+                "Vrata ne morejo biti navedena, \u010de ni naveden gostitelj" },
+
+            {   MsgKey.ER_NO_USERINFO_IF_NO_HOST,
+                "Informacije o uporabniku ne morejo biti navedene, \u010de ni naveden gostitelj" },
+            {   MsgKey.ER_XML_VERSION_NOT_SUPPORTED,
+                "Opozorilo: Zahtevana razli\u010dica izhodnega dokumenta je ''{0}''.  Ta razli\u010dica XML ni podprta.  Razli\u010dica izhodnega dokumenta bo ''1.0''." },
+
+            {   MsgKey.ER_SCHEME_REQUIRED,
+                "Zahtevana je shema!" },
+
+            /*
+             * Note to translators:  The words 'Properties' and
+             * 'SerializerFactory' in this message are Java class names
+             * and should not be translated.
+             */
+            {   MsgKey.ER_FACTORY_PROPERTY_MISSING,
+                "Predmet Properties (lastnosti), ki je prene\u0161en v SerializerFactory, nima lastnosti ''{0}''." },
+
+            {   MsgKey.ER_ENCODING_NOT_SUPPORTED,
+                "Opozorilo:  Izvajalno okolje Java ne podpira kodiranja ''{0}''." },
+
+             {MsgKey.ER_FEATURE_NOT_FOUND,
+             "Parameter ''{0}'' ni prepoznan."},
+
+             {MsgKey.ER_FEATURE_NOT_SUPPORTED,
+             "Parameter ''{0}'' je prepoznan, vendar pa zahtevane vrednosti ni mogo\u010de nastaviti."},
+
+             {MsgKey.ER_STRING_TOO_LONG,
+             "Nastali niz je predolg za DOMString: ''{0}''."},
+
+             {MsgKey.ER_TYPE_MISMATCH_ERR,
+             "Tip vrednosti za to ime parametra je nezdru\u017eljiv s pri\u010dakovanim tipom vrednosti."},
+
+             {MsgKey.ER_NO_OUTPUT_SPECIFIED,
+             "Izhodno mesto za vpisovanje podatkov je bilo ni\u010d."},
+
+             {MsgKey.ER_UNSUPPORTED_ENCODING,
+             "Odkrito je nepodprto kodiranje."},
+
+             {MsgKey.ER_UNABLE_TO_SERIALIZE_NODE,
+             "Vozli\u0161\u010da ni mogo\u010de serializirati."},
+
+             {MsgKey.ER_CDATA_SECTIONS_SPLIT,
+             "Odsek CDATA vsebuje enega ali ve\u010d ozna\u010devalnikov prekinitve ']]>'."},
+
+             {MsgKey.ER_WARNING_WF_NOT_CHECKED,
+                 "Primerka preverjevalnika Well-Formedness ni bilo mogo\u010de ustvariti.  Parameter well-formed je bil nastavljen na True, ampak ni mogo\u010de preveriti well-formedness."
+             },
+
+             {MsgKey.ER_WF_INVALID_CHARACTER,
+                 "Vozli\u0161\u010de ''{0}'' vsebuje neveljavne znake XML."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
+                 "V komentarju je bil najden neveljaven XML znak (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
+                 "V podatkih navodila za obdelavo je bil najden neveljaven znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
+                 "V vsebini odseka CDATASection je bil najden neveljaven znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
+                 "V podatkovni vsebini znaka vozli\u0161\u010da je bil najden neveljaven znak XML (Unicode: 0x{0})."
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                 "V vozli\u0161\u010du {0} z imenom ''{1}'' je bil najden neveljaven znak XML."
+             },
+
+             { MsgKey.ER_WF_DASH_IN_COMMENT,
+                 "Niz \"--\" ni dovoljen v komentarjih."
+             },
+
+             {MsgKey.ER_WF_LT_IN_ATTVAL,
+                 "Vrednost atributa \"{1}\", ki je povezan s tipom elementa \"{0}\", ne sme vsebovati znaka ''<''."
+             },
+
+             {MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
+                 "Neraz\u010dlenjeni sklic entitete \"&{0};\" ni dovoljen."
+             },
+
+             {MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
+                 "Zunanji sklic entitete \"&{0};\" ni dovoljen v vrednosti atributa."
+             },
+
+             {MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
+                 "Predpona \"{0}\" ne more biti povezana z imenskim prostorom \"{1}\"."
+             },
+
+             {MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
+                 "Lokalno ime elementa \"{0}\" je ni\u010d."
+             },
+
+             {MsgKey.ER_NULL_LOCAL_ATTR_NAME,
+                 "Lokalno ime atributa \"{0}\" je ni\u010d."
+             },
+
+             { MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
+                 "Besedilo za zamenjavo za vozli\u0161\u010de entitete \"{0}\" vsebuje vozli\u0161\u010de elementa \"{1}\" z nevezano predpono \"{2}\"."
+             },
+
+             { MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
+                 "Besedilo za zamenjavo za vozli\u0161\u010de entitete \"{0}\" vsebuje vozli\u0161\u010de atributa \"{1}\" z nevezano predpono \"{2}\"."
+             },
+
+        };
+
+        return contents;
+    }
+}
diff --git a/src/org/apache/xml/serializer/utils/SerializerMessages_zh.java b/src/org/apache/xml/serializer/utils/SerializerMessages_zh.java
old mode 100755
new mode 100644
index dbb230d..db970ce
--- a/src/org/apache/xml/serializer/utils/SerializerMessages_zh.java
+++ b/src/org/apache/xml/serializer/utils/SerializerMessages_zh.java
@@ -1,291 +1,291 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: SerializerMessages_zh.java,v 1.7 2005/03/07 20:34:36 minchau Exp $
- */
-
-
-package org.apache.xml.serializer.utils;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * An instance of this class is a ListResourceBundle that
- * has the required getContents() method that returns
- * an array of message-key/message associations.
- * <p>
- * The message keys are defined in {@link MsgKey}. The
- * messages that those keys map to are defined here.
- * <p>
- * The messages in the English version are intended to be
- * translated.
- *
- * This class is not a public API, it is only public because it is
- * used in org.apache.xml.serializer.
- *
- * @xsl.usage internal
- */
-public class SerializerMessages_zh extends ListResourceBundle {
-
-    /*
-     * This file contains error and warning messages related to
-     * Serializer Error Handling.
-     *
-     *  General notes to translators:
-
-     *  1) A stylesheet is a description of how to transform an input XML document
-     *     into a resultant XML document (or HTML document or text).  The
-     *     stylesheet itself is described in the form of an XML document.
-
-     *
-     *  2) An element is a mark-up tag in an XML document; an attribute is a
-     *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
-     *     "elem" is an element name, "attr" and "attr2" are attribute names with
-     *     the values "val" and "val2", respectively.
-     *
-     *  3) A namespace declaration is a special attribute that is used to associate
-     *     a prefix with a URI (the namespace).  The meanings of element names and
-     *     attribute names that use that prefix are defined with respect to that
-     *     namespace.
-     *
-     *
-     */
-
-    /** The lookup table for error messages.   */
-    public Object[][] getContents() {
-        Object[][] contents = new Object[][] {
-            {   MsgKey.BAD_MSGKEY,
-                "\u6d88\u606f\u5bc6\u94a5\u201c{0}\u201d\u4e0d\u5728\u6d88\u606f\u7c7b\u201c{1}\u201d\u4e2d" },
-
-            {   MsgKey.BAD_MSGFORMAT,
-                "\u6d88\u606f\u7c7b\u201c{1}\u201d\u4e2d\u7684\u6d88\u606f\u201c{0}\u201d\u7684\u683c\u5f0f\u65e0\u6548\u3002" },
-
-            {   MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER,
-                "\u4e32\u884c\u5668\u7c7b\u201c{0}\u201d\u4e0d\u80fd\u5b9e\u73b0 org.xml.sax.ContentHandler\u3002" },
-
-            {   MsgKey.ER_RESOURCE_COULD_NOT_FIND,
-                    "\u627e\u4e0d\u5230\u8d44\u6e90 [ {0} ]\u3002\n {1}" },
-
-            {   MsgKey.ER_RESOURCE_COULD_NOT_LOAD,
-                    "\u8d44\u6e90 [ {0} ] \u65e0\u6cd5\u88c5\u5165\uff1a{1} \n {2} \t {3}" },
-
-            {   MsgKey.ER_BUFFER_SIZE_LESSTHAN_ZERO,
-                    "\u7f13\u51b2\u533a\u5927\u5c0f <=0" },
-
-            {   MsgKey.ER_INVALID_UTF16_SURROGATE,
-                    "\u68c0\u6d4b\u5230\u65e0\u6548\u7684 UTF-16 \u8d85\u5927\u5b57\u7b26\u96c6\uff1a{0}\uff1f" },
-
-            {   MsgKey.ER_OIERROR,
-                "IO \u9519\u8bef" },
-
-            {   MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,
-                "\u5728\u751f\u6210\u5b50\u8282\u70b9\u4e4b\u540e\u6216\u5728\u751f\u6210\u5143\u7d20\u4e4b\u524d\u65e0\u6cd5\u6dfb\u52a0\u5c5e\u6027 {0}\u3002\u5c06\u5ffd\u7565\u5c5e\u6027\u3002" },
-
-            /*
-             * Note to translators:  The stylesheet contained a reference to a
-             * namespace prefix that was undefined.  The value of the substitution
-             * text is the name of the prefix.
-             */
-            {   MsgKey.ER_NAMESPACE_PREFIX,
-                "\u5c1a\u672a\u58f0\u660e\u524d\u7f00\u201c{0}\u201d\u7684\u540d\u79f0\u7a7a\u95f4\u3002" },
-
-            /*
-             * Note to translators:  This message is reported if the stylesheet
-             * being processed attempted to construct an XML document with an
-             * attribute in a place other than on an element.  The substitution text
-             * specifies the name of the attribute.
-             */
-            {   MsgKey.ER_STRAY_ATTRIBUTE,
-                "\u5c5e\u6027\u201c{0}\u201d\u5728\u5143\u7d20\u5916\u3002" },
-
-            /*
-             * Note to translators:  As with the preceding message, a namespace
-             * declaration has the form of an attribute and is only permitted to
-             * appear on an element.  The substitution text {0} is the namespace
-             * prefix and {1} is the URI that was being used in the erroneous
-             * namespace declaration.
-             */
-            {   MsgKey.ER_STRAY_NAMESPACE,
-                "\u540d\u79f0\u7a7a\u95f4\u58f0\u660e\u201c{0}\u201d=\u201c{1}\u201d\u5728\u5143\u7d20\u5916\u3002" },
-
-            {   MsgKey.ER_COULD_NOT_LOAD_RESOURCE,
-                "\u65e0\u6cd5\u88c5\u5165\u201c{0}\u201d\uff08\u68c0\u67e5 CLASSPATH\uff09\uff0c\u73b0\u5728\u53ea\u4f7f\u7528\u7f3a\u7701\u503c" },
-
-            {   MsgKey.ER_ILLEGAL_CHARACTER,
-                "\u5c1d\u8bd5\u8f93\u51fa\u6574\u6570\u503c {0}\uff08\u5b83\u4e0d\u662f\u4ee5\u6307\u5b9a\u7684 {1} \u8f93\u51fa\u7f16\u7801\u8868\u793a\uff09\u7684\u5b57\u7b26\u3002" },
-
-            {   MsgKey.ER_COULD_NOT_LOAD_METHOD_PROPERTY,
-                "\u65e0\u6cd5\u4e3a\u8f93\u51fa\u65b9\u6cd5\u201c{1}\u201d\u88c5\u5165\u5c5e\u6027\u6587\u4ef6\u201c{0}\u201d\uff08\u68c0\u67e5 CLASSPATH\uff09" },
-
-            {   MsgKey.ER_INVALID_PORT,
-                "\u7aef\u53e3\u53f7\u65e0\u6548" },
-
-            {   MsgKey.ER_PORT_WHEN_HOST_NULL,
-                "\u4e3b\u673a\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7aef\u53e3" },
-
-            {   MsgKey.ER_HOST_ADDRESS_NOT_WELLFORMED,
-                "\u4e3b\u673a\u4e0d\u662f\u683c\u5f0f\u6b63\u786e\u7684\u5730\u5740" },
-
-            {   MsgKey.ER_SCHEME_NOT_CONFORMANT,
-                "\u6a21\u5f0f\u4e0d\u4e00\u81f4\u3002" },
-
-            {   MsgKey.ER_SCHEME_FROM_NULL_STRING,
-                "\u65e0\u6cd5\u4ece\u7a7a\u5b57\u7b26\u4e32\u8bbe\u7f6e\u6a21\u5f0f" },
-
-            {   MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
-                "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u8f6c\u4e49\u5e8f\u5217" },
-
-            {   MsgKey.ER_PATH_INVALID_CHAR,
-                "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26\uff1a{0}" },
-
-            {   MsgKey.ER_FRAG_INVALID_CHAR,
-                "\u7247\u6bb5\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26" },
-
-            {   MsgKey.ER_FRAG_WHEN_PATH_NULL,
-                "\u8def\u5f84\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7247\u6bb5" },
-
-            {   MsgKey.ER_FRAG_FOR_GENERIC_URI,
-                "\u53ea\u80fd\u4e3a\u7c7b\u5c5e URI \u8bbe\u7f6e\u7247\u6bb5" },
-
-            {   MsgKey.ER_NO_SCHEME_IN_URI,
-                "URI \u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u6a21\u5f0f" },
-
-            {   MsgKey.ER_CANNOT_INIT_URI_EMPTY_PARMS,
-                "\u4e0d\u80fd\u4ee5\u7a7a\u53c2\u6570\u521d\u59cb\u5316 URI" },
-
-            {   MsgKey.ER_NO_FRAGMENT_STRING_IN_PATH,
-                "\u8def\u5f84\u548c\u7247\u6bb5\u4e2d\u90fd\u4e0d\u80fd\u6307\u5b9a\u7247\u6bb5" },
-
-            {   MsgKey.ER_NO_QUERY_STRING_IN_PATH,
-                "\u8def\u5f84\u548c\u67e5\u8be2\u5b57\u7b26\u4e32\u4e2d\u4e0d\u80fd\u6307\u5b9a\u67e5\u8be2\u5b57\u7b26\u4e32" },
-
-            {   MsgKey.ER_NO_PORT_IF_NO_HOST,
-                "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7aef\u53e3" },
-
-            {   MsgKey.ER_NO_USERINFO_IF_NO_HOST,
-                "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7528\u6237\u4fe1\u606f" },
-            {   MsgKey.ER_XML_VERSION_NOT_SUPPORTED,
-                "\u8b66\u544a\uff1a\u8981\u6c42\u8f93\u51fa\u6587\u6863\u7684\u7248\u672c\u662f\u201c{0}\u201d\u3002\u4e0d\u652f\u6301\u6b64 XML \u7248\u672c\u3002\u8f93\u51fa\u6587\u6863\u7684\u7248\u672c\u5c06\u4f1a\u662f\u201c1.0\u201d\u3002" },
-
-            {   MsgKey.ER_SCHEME_REQUIRED,
-                "\u6a21\u5f0f\u662f\u5fc5\u9700\u7684\uff01" },
-
-            /*
-             * Note to translators:  The words 'Properties' and
-             * 'SerializerFactory' in this message are Java class names
-             * and should not be translated.
-             */
-            {   MsgKey.ER_FACTORY_PROPERTY_MISSING,
-                "\u4f20\u9012\u7ed9 SerializerFactory \u7684 Properties \u5bf9\u8c61\u4e0d\u5177\u6709\u5c5e\u6027\u201c{0}\u201d\u3002" },
-
-             {MsgKey.ER_FEATURE_NOT_FOUND,
-             "\u672a\u8bc6\u522b\u51fa\u53c2\u6570\u201c{0}\u201d\u3002"},
-
-             {MsgKey.ER_FEATURE_NOT_SUPPORTED,
-             "\u5df2\u8bc6\u522b\u51fa\u53c2\u6570\u201c{0}\u201d\uff0c\u4f46\u65e0\u6cd5\u8bbe\u7f6e\u8bf7\u6c42\u7684\u503c\u3002"},
-
-             {MsgKey.ER_STRING_TOO_LONG,
-             "\u4ea7\u751f\u7684\u5b57\u7b26\u4e32\u8fc7\u957f\u4e0d\u80fd\u88c5\u5165 DOMString\uff1a\u201c{0}\u201d\u3002"},
-
-             {MsgKey.ER_TYPE_MISMATCH_ERR,
-             "\u6b64\u53c2\u6570\u540d\u79f0\u7684\u503c\u7c7b\u578b\u4e0e\u671f\u671b\u7684\u503c\u7c7b\u578b\u4e0d\u517c\u5bb9\u3002"},
-
-             {MsgKey.ER_NO_OUTPUT_SPECIFIED,
-             "\u5c06\u8981\u5199\u5165\u6570\u636e\u7684\u8f93\u51fa\u76ee\u6807\u4e3a\u7a7a\u3002"},
-
-             {MsgKey.ER_UNSUPPORTED_ENCODING,
-             "\u9047\u5230\u4e0d\u53d7\u652f\u6301\u7684\u7f16\u7801\u3002"},
-
-             {MsgKey.ER_UNABLE_TO_SERIALIZE_NODE,
-             "\u65e0\u6cd5\u5c06\u8282\u70b9\u5e8f\u5217\u5316\u3002 "},
-
-             {MsgKey.ER_CDATA_SECTIONS_SPLIT,
-             "CDATA \u90e8\u5206\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ec8\u6b62\u6807\u8bb0\u201c]]>\u201d\u3002"},
-
-             {MsgKey.ER_WARNING_WF_NOT_CHECKED,
-                 "\u65e0\u6cd5\u521b\u5efa\u683c\u5f0f\u6b63\u786e\u6027\u68c0\u67e5\u5668\u7684\u5b9e\u4f8b\u3002\u201c\u683c\u5f0f\u6b63\u786e\u201d\u53c2\u6570\u5df2\u8bbe\u7f6e\u4e3a true\uff0c\u4f46\u65e0\u6cd5\u6267\u884c\u683c\u5f0f\u6b63\u786e\u6027\u68c0\u67e5\u3002"
-             },
-
-             {MsgKey.ER_WF_INVALID_CHARACTER,
-                 "\u8282\u70b9\u201c{0}\u201d\u5305\u542b\u65e0\u6548\u7684 XML \u5b57\u7b26\u3002"
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
-                 "\u5728\u6ce8\u91ca\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
-                 "\u5728\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
-                 "\u5728 CDATA \u90e8\u5206\u7684\u5185\u5bb9\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
-                 "\u5728\u8282\u70b9\u7684\u5b57\u7b26\u6570\u636e\u5185\u5bb9\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
-             },
-
-             { MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
-                 "\u540d\u79f0\u4e3a\u201c{1})\u201d\u7684\u201c{0})\u201d\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26\u3002"
-             },
-
-             { MsgKey.ER_WF_DASH_IN_COMMENT,
-                 "\u6ce8\u91ca\u4e2d\u4e0d\u5141\u8bb8\u6709\u5b57\u7b26\u4e32\u201c--\u201d\u3002"
-             },
-
-             {MsgKey.ER_WF_LT_IN_ATTVAL,
-                 "\u4e0e\u5143\u7d20\u7c7b\u578b\u201c{0}\u201d\u5173\u8054\u7684\u5c5e\u6027\u201c{1}\u201d\u7684\u503c\u4e0d\u5f97\u5305\u542b\u201c<\u201d\u5b57\u7b26\u3002"
-             },
-
-             {MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
-                 "\u4e0d\u5141\u8bb8\u6709\u672a\u89e3\u6790\u7684\u5b9e\u4f53\u5f15\u7528\u201c&{0};\u201d\u3002"
-             },
-
-             {MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
-                 "\u5c5e\u6027\u503c\u4e2d\u4e0d\u5141\u8bb8\u6709\u5916\u90e8\u5b9e\u4f53\u5f15\u7528\u201c&{0};\u201d\u3002"
-             },
-
-             {MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
-                 "\u524d\u7f00\u201c{0}\u201d\u4e0d\u80fd\u7ed1\u5b9a\u5230\u540d\u79f0\u7a7a\u95f4\u201c{1}\u201d\u3002"
-             },
-
-             {MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
-                 "\u5143\u7d20\u201c{0}\u201d\u7684\u5c40\u90e8\u540d\u4e3a\u7a7a\u3002"
-             },
-
-             {MsgKey.ER_NULL_LOCAL_ATTR_NAME,
-                 "\u5c5e\u6027\u201c{0}\u201d\u7684\u5c40\u90e8\u540d\u4e3a\u7a7a\u3002"
-             },
-
-             { MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
-                 "\u5b9e\u4f53\u8282\u70b9\u201c{0}\u201d\u7684\u66ff\u4ee3\u6587\u672c\u4e2d\u5305\u542b\u5143\u7d20\u8282\u70b9\u201c{1}\u201d\uff0c\u8be5\u8282\u70b9\u5177\u6709\u672a\u7ed1\u5b9a\u7684\u524d\u7f00\u201c{2}\u201d\u3002"
-             },
-
-             { MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
-                 "\u5b9e\u4f53\u8282\u70b9\u201c{0}\u201d\u7684\u66ff\u4ee3\u6587\u672c\u4e2d\u5305\u542b\u5c5e\u6027\u8282\u70b9\u201c{1}\u201d\uff0c\u8be5\u8282\u70b9\u5177\u6709\u672a\u7ed1\u5b9a\u7684\u524d\u7f00\u201c{2}\u201d\u3002"
-             },
-
-        };
-
-        return contents;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+
+package org.apache.xml.serializer.utils;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * An instance of this class is a ListResourceBundle that
+ * has the required getContents() method that returns
+ * an array of message-key/message associations.
+ * <p>
+ * The message keys are defined in {@link MsgKey}. The
+ * messages that those keys map to are defined here.
+ * <p>
+ * The messages in the English version are intended to be
+ * translated.
+ *
+ * This class is not a public API, it is only public because it is
+ * used in org.apache.xml.serializer.
+ *
+ * @xsl.usage internal
+ */
+public class SerializerMessages_zh extends ListResourceBundle {
+
+    /*
+     * This file contains error and warning messages related to
+     * Serializer Error Handling.
+     *
+     *  General notes to translators:
+
+     *  1) A stylesheet is a description of how to transform an input XML document
+     *     into a resultant XML document (or HTML document or text).  The
+     *     stylesheet itself is described in the form of an XML document.
+
+     *
+     *  2) An element is a mark-up tag in an XML document; an attribute is a
+     *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+     *     "elem" is an element name, "attr" and "attr2" are attribute names with
+     *     the values "val" and "val2", respectively.
+     *
+     *  3) A namespace declaration is a special attribute that is used to associate
+     *     a prefix with a URI (the namespace).  The meanings of element names and
+     *     attribute names that use that prefix are defined with respect to that
+     *     namespace.
+     *
+     *
+     */
+
+    /** The lookup table for error messages.   */
+    public Object[][] getContents() {
+        Object[][] contents = new Object[][] {
+            {   MsgKey.BAD_MSGKEY,
+                "\u6d88\u606f\u5bc6\u94a5\u201c{0}\u201d\u4e0d\u5728\u6d88\u606f\u7c7b\u201c{1}\u201d\u4e2d" },
+
+            {   MsgKey.BAD_MSGFORMAT,
+                "\u6d88\u606f\u7c7b\u201c{1}\u201d\u4e2d\u7684\u6d88\u606f\u201c{0}\u201d\u7684\u683c\u5f0f\u65e0\u6548\u3002" },
+
+            {   MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER,
+                "\u4e32\u884c\u5668\u7c7b\u201c{0}\u201d\u4e0d\u80fd\u5b9e\u73b0 org.xml.sax.ContentHandler\u3002" },
+
+            {   MsgKey.ER_RESOURCE_COULD_NOT_FIND,
+                    "\u627e\u4e0d\u5230\u8d44\u6e90 [ {0} ]\u3002\n {1}" },
+
+            {   MsgKey.ER_RESOURCE_COULD_NOT_LOAD,
+                    "\u8d44\u6e90 [ {0} ] \u65e0\u6cd5\u88c5\u5165\uff1a{1} \n {2} \t {3}" },
+
+            {   MsgKey.ER_BUFFER_SIZE_LESSTHAN_ZERO,
+                    "\u7f13\u51b2\u533a\u5927\u5c0f <=0" },
+
+            {   MsgKey.ER_INVALID_UTF16_SURROGATE,
+                    "\u68c0\u6d4b\u5230\u65e0\u6548\u7684 UTF-16 \u8d85\u5927\u5b57\u7b26\u96c6\uff1a{0}\uff1f" },
+
+            {   MsgKey.ER_OIERROR,
+                "IO \u9519\u8bef" },
+
+            {   MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,
+                "\u5728\u751f\u6210\u5b50\u8282\u70b9\u4e4b\u540e\u6216\u5728\u751f\u6210\u5143\u7d20\u4e4b\u524d\u65e0\u6cd5\u6dfb\u52a0\u5c5e\u6027 {0}\u3002\u5c06\u5ffd\u7565\u5c5e\u6027\u3002" },
+
+            /*
+             * Note to translators:  The stylesheet contained a reference to a
+             * namespace prefix that was undefined.  The value of the substitution
+             * text is the name of the prefix.
+             */
+            {   MsgKey.ER_NAMESPACE_PREFIX,
+                "\u5c1a\u672a\u58f0\u660e\u524d\u7f00\u201c{0}\u201d\u7684\u540d\u79f0\u7a7a\u95f4\u3002" },
+
+            /*
+             * Note to translators:  This message is reported if the stylesheet
+             * being processed attempted to construct an XML document with an
+             * attribute in a place other than on an element.  The substitution text
+             * specifies the name of the attribute.
+             */
+            {   MsgKey.ER_STRAY_ATTRIBUTE,
+                "\u5c5e\u6027\u201c{0}\u201d\u5728\u5143\u7d20\u5916\u3002" },
+
+            /*
+             * Note to translators:  As with the preceding message, a namespace
+             * declaration has the form of an attribute and is only permitted to
+             * appear on an element.  The substitution text {0} is the namespace
+             * prefix and {1} is the URI that was being used in the erroneous
+             * namespace declaration.
+             */
+            {   MsgKey.ER_STRAY_NAMESPACE,
+                "\u540d\u79f0\u7a7a\u95f4\u58f0\u660e\u201c{0}\u201d=\u201c{1}\u201d\u5728\u5143\u7d20\u5916\u3002" },
+
+            {   MsgKey.ER_COULD_NOT_LOAD_RESOURCE,
+                "\u65e0\u6cd5\u88c5\u5165\u201c{0}\u201d\uff08\u68c0\u67e5 CLASSPATH\uff09\uff0c\u73b0\u5728\u53ea\u4f7f\u7528\u7f3a\u7701\u503c" },
+
+            {   MsgKey.ER_ILLEGAL_CHARACTER,
+                "\u5c1d\u8bd5\u8f93\u51fa\u6574\u6570\u503c {0}\uff08\u5b83\u4e0d\u662f\u4ee5\u6307\u5b9a\u7684 {1} \u8f93\u51fa\u7f16\u7801\u8868\u793a\uff09\u7684\u5b57\u7b26\u3002" },
+
+            {   MsgKey.ER_COULD_NOT_LOAD_METHOD_PROPERTY,
+                "\u65e0\u6cd5\u4e3a\u8f93\u51fa\u65b9\u6cd5\u201c{1}\u201d\u88c5\u5165\u5c5e\u6027\u6587\u4ef6\u201c{0}\u201d\uff08\u68c0\u67e5 CLASSPATH\uff09" },
+
+            {   MsgKey.ER_INVALID_PORT,
+                "\u7aef\u53e3\u53f7\u65e0\u6548" },
+
+            {   MsgKey.ER_PORT_WHEN_HOST_NULL,
+                "\u4e3b\u673a\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7aef\u53e3" },
+
+            {   MsgKey.ER_HOST_ADDRESS_NOT_WELLFORMED,
+                "\u4e3b\u673a\u4e0d\u662f\u683c\u5f0f\u6b63\u786e\u7684\u5730\u5740" },
+
+            {   MsgKey.ER_SCHEME_NOT_CONFORMANT,
+                "\u6a21\u5f0f\u4e0d\u4e00\u81f4\u3002" },
+
+            {   MsgKey.ER_SCHEME_FROM_NULL_STRING,
+                "\u65e0\u6cd5\u4ece\u7a7a\u5b57\u7b26\u4e32\u8bbe\u7f6e\u6a21\u5f0f" },
+
+            {   MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE,
+                "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u8f6c\u4e49\u5e8f\u5217" },
+
+            {   MsgKey.ER_PATH_INVALID_CHAR,
+                "\u8def\u5f84\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26\uff1a{0}" },
+
+            {   MsgKey.ER_FRAG_INVALID_CHAR,
+                "\u7247\u6bb5\u5305\u542b\u65e0\u6548\u7684\u5b57\u7b26" },
+
+            {   MsgKey.ER_FRAG_WHEN_PATH_NULL,
+                "\u8def\u5f84\u4e3a\u7a7a\u65f6\uff0c\u65e0\u6cd5\u8bbe\u7f6e\u7247\u6bb5" },
+
+            {   MsgKey.ER_FRAG_FOR_GENERIC_URI,
+                "\u53ea\u80fd\u4e3a\u7c7b\u5c5e URI \u8bbe\u7f6e\u7247\u6bb5" },
+
+            {   MsgKey.ER_NO_SCHEME_IN_URI,
+                "URI \u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u6a21\u5f0f" },
+
+            {   MsgKey.ER_CANNOT_INIT_URI_EMPTY_PARMS,
+                "\u4e0d\u80fd\u4ee5\u7a7a\u53c2\u6570\u521d\u59cb\u5316 URI" },
+
+            {   MsgKey.ER_NO_FRAGMENT_STRING_IN_PATH,
+                "\u8def\u5f84\u548c\u7247\u6bb5\u4e2d\u90fd\u4e0d\u80fd\u6307\u5b9a\u7247\u6bb5" },
+
+            {   MsgKey.ER_NO_QUERY_STRING_IN_PATH,
+                "\u8def\u5f84\u548c\u67e5\u8be2\u5b57\u7b26\u4e32\u4e2d\u4e0d\u80fd\u6307\u5b9a\u67e5\u8be2\u5b57\u7b26\u4e32" },
+
+            {   MsgKey.ER_NO_PORT_IF_NO_HOST,
+                "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7aef\u53e3" },
+
+            {   MsgKey.ER_NO_USERINFO_IF_NO_HOST,
+                "\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u4e3b\u673a\uff0c\u5219\u4e0d\u53ef\u4ee5\u6307\u5b9a\u7528\u6237\u4fe1\u606f" },
+            {   MsgKey.ER_XML_VERSION_NOT_SUPPORTED,
+                "\u8b66\u544a\uff1a\u8981\u6c42\u8f93\u51fa\u6587\u6863\u7684\u7248\u672c\u662f\u201c{0}\u201d\u3002\u4e0d\u652f\u6301\u6b64 XML \u7248\u672c\u3002\u8f93\u51fa\u6587\u6863\u7684\u7248\u672c\u5c06\u4f1a\u662f\u201c1.0\u201d\u3002" },
+
+            {   MsgKey.ER_SCHEME_REQUIRED,
+                "\u6a21\u5f0f\u662f\u5fc5\u9700\u7684\uff01" },
+
+            /*
+             * Note to translators:  The words 'Properties' and
+             * 'SerializerFactory' in this message are Java class names
+             * and should not be translated.
+             */
+            {   MsgKey.ER_FACTORY_PROPERTY_MISSING,
+                "\u4f20\u9012\u7ed9 SerializerFactory \u7684 Properties \u5bf9\u8c61\u4e0d\u5177\u6709\u5c5e\u6027\u201c{0}\u201d\u3002" },
+
+             {MsgKey.ER_FEATURE_NOT_FOUND,
+             "\u672a\u8bc6\u522b\u51fa\u53c2\u6570\u201c{0}\u201d\u3002"},
+
+             {MsgKey.ER_FEATURE_NOT_SUPPORTED,
+             "\u5df2\u8bc6\u522b\u51fa\u53c2\u6570\u201c{0}\u201d\uff0c\u4f46\u65e0\u6cd5\u8bbe\u7f6e\u8bf7\u6c42\u7684\u503c\u3002"},
+
+             {MsgKey.ER_STRING_TOO_LONG,
+             "\u4ea7\u751f\u7684\u5b57\u7b26\u4e32\u8fc7\u957f\u4e0d\u80fd\u88c5\u5165 DOMString\uff1a\u201c{0}\u201d\u3002"},
+
+             {MsgKey.ER_TYPE_MISMATCH_ERR,
+             "\u6b64\u53c2\u6570\u540d\u79f0\u7684\u503c\u7c7b\u578b\u4e0e\u671f\u671b\u7684\u503c\u7c7b\u578b\u4e0d\u517c\u5bb9\u3002"},
+
+             {MsgKey.ER_NO_OUTPUT_SPECIFIED,
+             "\u5c06\u8981\u5199\u5165\u6570\u636e\u7684\u8f93\u51fa\u76ee\u6807\u4e3a\u7a7a\u3002"},
+
+             {MsgKey.ER_UNSUPPORTED_ENCODING,
+             "\u9047\u5230\u4e0d\u53d7\u652f\u6301\u7684\u7f16\u7801\u3002"},
+
+             {MsgKey.ER_UNABLE_TO_SERIALIZE_NODE,
+             "\u65e0\u6cd5\u5c06\u8282\u70b9\u5e8f\u5217\u5316\u3002 "},
+
+             {MsgKey.ER_CDATA_SECTIONS_SPLIT,
+             "CDATA \u90e8\u5206\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ec8\u6b62\u6807\u8bb0\u201c]]>\u201d\u3002"},
+
+             {MsgKey.ER_WARNING_WF_NOT_CHECKED,
+                 "\u65e0\u6cd5\u521b\u5efa\u683c\u5f0f\u6b63\u786e\u6027\u68c0\u67e5\u5668\u7684\u5b9e\u4f8b\u3002\u201c\u683c\u5f0f\u6b63\u786e\u201d\u53c2\u6570\u5df2\u8bbe\u7f6e\u4e3a true\uff0c\u4f46\u65e0\u6cd5\u6267\u884c\u683c\u5f0f\u6b63\u786e\u6027\u68c0\u67e5\u3002"
+             },
+
+             {MsgKey.ER_WF_INVALID_CHARACTER,
+                 "\u8282\u70b9\u201c{0}\u201d\u5305\u542b\u65e0\u6548\u7684 XML \u5b57\u7b26\u3002"
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_COMMENT,
+                 "\u5728\u6ce8\u91ca\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_PI,
+                 "\u5728\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_CDATA,
+                 "\u5728 CDATA \u90e8\u5206\u7684\u5185\u5bb9\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_TEXT,
+                 "\u5728\u8282\u70b9\u7684\u5b57\u7b26\u6570\u636e\u5185\u5bb9\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26 (Unicode: 0x''{0})''\u3002"
+             },
+
+             { MsgKey.ER_WF_INVALID_CHARACTER_IN_NODE_NAME,
+                 "\u540d\u79f0\u4e3a\u201c{1})\u201d\u7684\u201c{0})\u201d\u4e2d\u627e\u5230\u65e0\u6548\u7684 XML \u5b57\u7b26\u3002"
+             },
+
+             { MsgKey.ER_WF_DASH_IN_COMMENT,
+                 "\u6ce8\u91ca\u4e2d\u4e0d\u5141\u8bb8\u6709\u5b57\u7b26\u4e32\u201c--\u201d\u3002"
+             },
+
+             {MsgKey.ER_WF_LT_IN_ATTVAL,
+                 "\u4e0e\u5143\u7d20\u7c7b\u578b\u201c{0}\u201d\u5173\u8054\u7684\u5c5e\u6027\u201c{1}\u201d\u7684\u503c\u4e0d\u5f97\u5305\u542b\u201c<\u201d\u5b57\u7b26\u3002"
+             },
+
+             {MsgKey.ER_WF_REF_TO_UNPARSED_ENT,
+                 "\u4e0d\u5141\u8bb8\u6709\u672a\u89e3\u6790\u7684\u5b9e\u4f53\u5f15\u7528\u201c&{0};\u201d\u3002"
+             },
+
+             {MsgKey.ER_WF_REF_TO_EXTERNAL_ENT,
+                 "\u5c5e\u6027\u503c\u4e2d\u4e0d\u5141\u8bb8\u6709\u5916\u90e8\u5b9e\u4f53\u5f15\u7528\u201c&{0};\u201d\u3002"
+             },
+
+             {MsgKey.ER_NS_PREFIX_CANNOT_BE_BOUND,
+                 "\u524d\u7f00\u201c{0}\u201d\u4e0d\u80fd\u7ed1\u5b9a\u5230\u540d\u79f0\u7a7a\u95f4\u201c{1}\u201d\u3002"
+             },
+
+             {MsgKey.ER_NULL_LOCAL_ELEMENT_NAME,
+                 "\u5143\u7d20\u201c{0}\u201d\u7684\u5c40\u90e8\u540d\u4e3a\u7a7a\u3002"
+             },
+
+             {MsgKey.ER_NULL_LOCAL_ATTR_NAME,
+                 "\u5c5e\u6027\u201c{0}\u201d\u7684\u5c40\u90e8\u540d\u4e3a\u7a7a\u3002"
+             },
+
+             { MsgKey.ER_ELEM_UNBOUND_PREFIX_IN_ENTREF,
+                 "\u5b9e\u4f53\u8282\u70b9\u201c{0}\u201d\u7684\u66ff\u4ee3\u6587\u672c\u4e2d\u5305\u542b\u5143\u7d20\u8282\u70b9\u201c{1}\u201d\uff0c\u8be5\u8282\u70b9\u5177\u6709\u672a\u7ed1\u5b9a\u7684\u524d\u7f00\u201c{2}\u201d\u3002"
+             },
+
+             { MsgKey.ER_ATTR_UNBOUND_PREFIX_IN_ENTREF,
+                 "\u5b9e\u4f53\u8282\u70b9\u201c{0}\u201d\u7684\u66ff\u4ee3\u6587\u672c\u4e2d\u5305\u542b\u5c5e\u6027\u8282\u70b9\u201c{1}\u201d\uff0c\u8be5\u8282\u70b9\u5177\u6709\u672a\u7ed1\u5b9a\u7684\u524d\u7f00\u201c{2}\u201d\u3002"
+             },
+
+        };
+
+        return contents;
+    }
+}
diff --git a/src/org/apache/xml/serializer/utils/XML11Char.java b/src/org/apache/xml/serializer/utils/XML11Char.java
index 2cbd522..b32249e 100644
--- a/src/org/apache/xml/serializer/utils/XML11Char.java
+++ b/src/org/apache/xml/serializer/utils/XML11Char.java
@@ -1,414 +1,414 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.xml.serializer.utils;
-
-import java.util.Arrays;
-
-/**
- * THIS IS A COPY OF THE XERCES-2J CLASS org.apache.xerces.utls.XMLChar
- *  
- * This class defines the basic properties of characters in XML 1.1. The data
- * in this class can be used to verify that a character is a valid
- * XML 1.1 character or if the character is a space, name start, or name
- * character.
- * <p>
- * A series of convenience methods are supplied to ease the burden
- * of the developer.  Using the character as an index into the <code>XML11CHARS</code>
- * array and applying the appropriate mask flag (e.g.
- * <code>MASK_VALID</code>), yields the same results as calling the
- * convenience methods. There is one exception: check the comments
- * for the <code>isValid</code> method for details.
- *
- * @author Glenn Marcy, IBM
- * @author Andy Clark, IBM
- * @author Arnaud  Le Hors, IBM
- * @author Neil Graham, IBM
- * @author Michael Glavassevich, IBM
- *
- * @version $Id: $
- */
-public class XML11Char {
-
-    //
-    // Constants
-    //
-
-    /** Character flags for XML 1.1. */
-    private static final byte XML11CHARS [] = new byte [1 << 16];
-
-    /** XML 1.1 Valid character mask. */
-    public static final int MASK_XML11_VALID = 0x01;
-
-    /** XML 1.1 Space character mask. */
-    public static final int MASK_XML11_SPACE = 0x02;
-
-    /** XML 1.1 Name start character mask. */
-    public static final int MASK_XML11_NAME_START = 0x04;
-
-    /** XML 1.1 Name character mask. */
-    public static final int MASK_XML11_NAME = 0x08;
-
-    /** XML 1.1 control character mask */
-    public static final int MASK_XML11_CONTROL = 0x10;
-
-    /** XML 1.1 content for external entities (valid - "special" chars - control chars) */
-    public static final int MASK_XML11_CONTENT = 0x20;
-
-    /** XML namespaces 1.1 NCNameStart */
-    public static final int MASK_XML11_NCNAME_START = 0x40;
-
-    /** XML namespaces 1.1 NCName */
-    public static final int MASK_XML11_NCNAME = 0x80;
-    
-    /** XML 1.1 content for internal entities (valid - "special" chars) */
-    public static final int MASK_XML11_CONTENT_INTERNAL = MASK_XML11_CONTROL | MASK_XML11_CONTENT; 
-
-    //
-    // Static initialization
-    //
-
-    static {
-    	
-        // Initializing the Character Flag Array
-        // Code generated by: XML11CharGenerator.
-        
-        Arrays.fill(XML11CHARS, 1, 9, (byte) 17 ); // Fill 8 of value (byte) 17
-        XML11CHARS[9] = 35;
-        XML11CHARS[10] = 3;
-        Arrays.fill(XML11CHARS, 11, 13, (byte) 17 ); // Fill 2 of value (byte) 17
-        XML11CHARS[13] = 3;
-        Arrays.fill(XML11CHARS, 14, 32, (byte) 17 ); // Fill 18 of value (byte) 17
-        XML11CHARS[32] = 35;
-        Arrays.fill(XML11CHARS, 33, 38, (byte) 33 ); // Fill 5 of value (byte) 33
-        XML11CHARS[38] = 1;
-        Arrays.fill(XML11CHARS, 39, 45, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(XML11CHARS, 45, 47, (byte) -87 ); // Fill 2 of value (byte) -87
-        XML11CHARS[47] = 33;
-        Arrays.fill(XML11CHARS, 48, 58, (byte) -87 ); // Fill 10 of value (byte) -87
-        XML11CHARS[58] = 45;
-        XML11CHARS[59] = 33;
-        XML11CHARS[60] = 1;
-        Arrays.fill(XML11CHARS, 61, 65, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(XML11CHARS, 65, 91, (byte) -19 ); // Fill 26 of value (byte) -19
-        Arrays.fill(XML11CHARS, 91, 93, (byte) 33 ); // Fill 2 of value (byte) 33
-        XML11CHARS[93] = 1;
-        XML11CHARS[94] = 33;
-        XML11CHARS[95] = -19;
-        XML11CHARS[96] = 33;
-        Arrays.fill(XML11CHARS, 97, 123, (byte) -19 ); // Fill 26 of value (byte) -19
-        Arrays.fill(XML11CHARS, 123, 127, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(XML11CHARS, 127, 133, (byte) 17 ); // Fill 6 of value (byte) 17
-        XML11CHARS[133] = 35;
-        Arrays.fill(XML11CHARS, 134, 160, (byte) 17 ); // Fill 26 of value (byte) 17
-        Arrays.fill(XML11CHARS, 160, 183, (byte) 33 ); // Fill 23 of value (byte) 33
-        XML11CHARS[183] = -87;
-        Arrays.fill(XML11CHARS, 184, 192, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(XML11CHARS, 192, 215, (byte) -19 ); // Fill 23 of value (byte) -19
-        XML11CHARS[215] = 33;
-        Arrays.fill(XML11CHARS, 216, 247, (byte) -19 ); // Fill 31 of value (byte) -19
-        XML11CHARS[247] = 33;
-        Arrays.fill(XML11CHARS, 248, 768, (byte) -19 ); // Fill 520 of value (byte) -19
-        Arrays.fill(XML11CHARS, 768, 880, (byte) -87 ); // Fill 112 of value (byte) -87
-        Arrays.fill(XML11CHARS, 880, 894, (byte) -19 ); // Fill 14 of value (byte) -19
-        XML11CHARS[894] = 33;
-        Arrays.fill(XML11CHARS, 895, 8192, (byte) -19 ); // Fill 7297 of value (byte) -19
-        Arrays.fill(XML11CHARS, 8192, 8204, (byte) 33 ); // Fill 12 of value (byte) 33
-        Arrays.fill(XML11CHARS, 8204, 8206, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(XML11CHARS, 8206, 8232, (byte) 33 ); // Fill 26 of value (byte) 33
-        XML11CHARS[8232] = 35;
-        Arrays.fill(XML11CHARS, 8233, 8255, (byte) 33 ); // Fill 22 of value (byte) 33
-        Arrays.fill(XML11CHARS, 8255, 8257, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(XML11CHARS, 8257, 8304, (byte) 33 ); // Fill 47 of value (byte) 33
-        Arrays.fill(XML11CHARS, 8304, 8592, (byte) -19 ); // Fill 288 of value (byte) -19
-        Arrays.fill(XML11CHARS, 8592, 11264, (byte) 33 ); // Fill 2672 of value (byte) 33
-        Arrays.fill(XML11CHARS, 11264, 12272, (byte) -19 ); // Fill 1008 of value (byte) -19
-        Arrays.fill(XML11CHARS, 12272, 12289, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(XML11CHARS, 12289, 55296, (byte) -19 ); // Fill 43007 of value (byte) -19
-        Arrays.fill(XML11CHARS, 57344, 63744, (byte) 33 ); // Fill 6400 of value (byte) 33
-        Arrays.fill(XML11CHARS, 63744, 64976, (byte) -19 ); // Fill 1232 of value (byte) -19
-        Arrays.fill(XML11CHARS, 64976, 65008, (byte) 33 ); // Fill 32 of value (byte) 33
-        Arrays.fill(XML11CHARS, 65008, 65534, (byte) -19 ); // Fill 526 of value (byte) -19
-
-    } // <clinit>()
-
-    //
-    // Public static methods
-    //
-
-    /**
-     * Returns true if the specified character is a space character
-     * as amdended in the XML 1.1 specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11Space(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_SPACE) != 0);
-    } // isXML11Space(int):boolean
-
-    /**
-     * Returns true if the specified character is valid. This method
-     * also checks the surrogate character range from 0x10000 to 0x10FFFF.
-     * <p>
-     * If the program chooses to apply the mask directly to the
-     * <code>XML11CHARS</code> array, then they are responsible for checking
-     * the surrogate character range.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11Valid(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_VALID) != 0) 
-                || (0x10000 <= c && c <= 0x10FFFF);
-    } // isXML11Valid(int):boolean
-
-    /**
-     * Returns true if the specified character is invalid.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11Invalid(int c) {
-        return !isXML11Valid(c);
-    } // isXML11Invalid(int):boolean
-
-    /**
-     * Returns true if the specified character is valid and permitted outside
-     * of a character reference.  
-     * That is, this method will return false for the same set as
-     * isXML11Valid, except it also reports false for "control characters".
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11ValidLiteral(int c) {
-        return ((c < 0x10000 && ((XML11CHARS[c] & MASK_XML11_VALID) != 0 && (XML11CHARS[c] & MASK_XML11_CONTROL) == 0))
-            || (0x10000 <= c && c <= 0x10FFFF)); 
-    } // isXML11ValidLiteral(int):boolean
-
-    /**
-     * Returns true if the specified character can be considered 
-     * content in an external parsed entity.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11Content(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT) != 0) ||
-               (0x10000 <= c && c <= 0x10FFFF);
-    } // isXML11Content(int):boolean
-    
-    /**
-     * Returns true if the specified character can be considered 
-     * content in an internal parsed entity.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11InternalEntityContent(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT_INTERNAL) != 0) ||
-               (0x10000 <= c && c <= 0x10FFFF);
-    } // isXML11InternalEntityContent(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid name start
-     * character as defined by production [4] in the XML 1.1
-     * specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11NameStart(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME_START) != 0)
-            || (0x10000 <= c && c < 0xF0000);
-    } // isXML11NameStart(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid name
-     * character as defined by production [4a] in the XML 1.1
-     * specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11Name(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME) != 0) 
-            || (c >= 0x10000 && c < 0xF0000);
-    } // isXML11Name(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid NCName start
-     * character as defined by production [4] in Namespaces in XML
-     * 1.1 recommendation.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11NCNameStart(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME_START) != 0)
-            || (0x10000 <= c && c < 0xF0000);
-    } // isXML11NCNameStart(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid NCName
-     * character as defined by production [5] in Namespaces in XML
-     * 1.1 recommendation.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11NCName(int c) {
-        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME) != 0)
-            || (0x10000 <= c && c < 0xF0000);
-    } // isXML11NCName(int):boolean
-    
-    /**
-     * Returns whether the given character is a valid 
-     * high surrogate for a name character. This includes
-     * all high surrogates for characters [0x10000-0xEFFFF].
-     * In other words everything excluding planes 15 and 16.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isXML11NameHighSurrogate(int c) {
-        return (0xD800 <= c && c <= 0xDB7F);
-    }
-
-    /*
-     * [5] Name ::= NameStartChar NameChar*
-     */
-    /**
-     * Check to see if a string is a valid Name according to [5]
-     * in the XML 1.1 Recommendation
-     *
-     * @param name string to check
-     * @return true if name is a valid Name
-     */
-    public static boolean isXML11ValidName(String name) {
-        int length = name.length();
-        if (length == 0)
-            return false;
-        int i = 1;
-        char ch = name.charAt(0);
-        if( !isXML11NameStart(ch) ) {
-            if ( length > 1 && isXML11NameHighSurrogate(ch) ) {
-                char ch2 = name.charAt(1);
-                if ( !XMLChar.isLowSurrogate(ch2) || 
-                     !isXML11NameStart(XMLChar.supplemental(ch, ch2)) ) {
-                    return false;
-                }
-                i = 2;
-            }
-            else {
-                return false;
-            }
-        }
-        while (i < length) {
-            ch = name.charAt(i);
-            if ( !isXML11Name(ch) ) {
-                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
-                    char ch2 = name.charAt(i);
-                    if ( !XMLChar.isLowSurrogate(ch2) || 
-                         !isXML11Name(XMLChar.supplemental(ch, ch2)) ) {
-                        return false;
-                    }
-                }
-                else {
-                    return false;
-                }
-            }
-            ++i;
-        }
-        return true;
-    } // isXML11ValidName(String):boolean
-    
-
-    /*
-     * from the namespace 1.1 rec
-     * [4] NCName ::= NCNameStartChar NCNameChar*
-     */
-    /**
-     * Check to see if a string is a valid NCName according to [4]
-     * from the XML Namespaces 1.1 Recommendation
-     *
-     * @param ncName string to check
-     * @return true if name is a valid NCName
-     */
-    public static boolean isXML11ValidNCName(String ncName) {
-        int length = ncName.length();
-        if (length == 0)
-            return false;
-        int i = 1;
-        char ch = ncName.charAt(0);
-        if( !isXML11NCNameStart(ch) ) {
-            if ( length > 1 && isXML11NameHighSurrogate(ch) ) {
-                char ch2 = ncName.charAt(1);
-                if ( !XMLChar.isLowSurrogate(ch2) || 
-                     !isXML11NCNameStart(XMLChar.supplemental(ch, ch2)) ) {
-                    return false;
-                }
-                i = 2;
-            }
-            else {
-                return false;
-            }
-        }
-        while (i < length) {
-            ch = ncName.charAt(i);
-            if ( !isXML11NCName(ch) ) {
-                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
-                    char ch2 = ncName.charAt(i);
-                    if ( !XMLChar.isLowSurrogate(ch2) || 
-                         !isXML11NCName(XMLChar.supplemental(ch, ch2)) ) {
-                        return false;
-                    }
-                }
-                else {
-                    return false;
-                }
-            }
-            ++i;
-        }
-        return true;
-    } // isXML11ValidNCName(String):boolean
-
-    /*
-     * [7] Nmtoken ::= (NameChar)+
-     */
-    /**
-     * Check to see if a string is a valid Nmtoken according to [7]
-     * in the XML 1.1 Recommendation
-     *
-     * @param nmtoken string to check
-     * @return true if nmtoken is a valid Nmtoken 
-     */
-    public static boolean isXML11ValidNmtoken(String nmtoken) {
-        int length = nmtoken.length();
-        if (length == 0)
-            return false;
-        for (int i = 0; i < length; ++i ) {
-            char ch = nmtoken.charAt(i);
-            if( !isXML11Name(ch) ) {
-                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
-                    char ch2 = nmtoken.charAt(i);
-                    if ( !XMLChar.isLowSurrogate(ch2) || 
-                         !isXML11Name(XMLChar.supplemental(ch, ch2)) ) {
-                        return false;
-                    }
-                }
-                else {
-                    return false;
-                }
-            }
-        }
-        return true;
-    } // isXML11ValidName(String):boolean
-
-} // class XML11Char
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.xml.serializer.utils;
+
+import java.util.Arrays;
+
+/**
+ * THIS IS A COPY OF THE XERCES-2J CLASS org.apache.xerces.utls.XMLChar
+ *  
+ * This class defines the basic properties of characters in XML 1.1. The data
+ * in this class can be used to verify that a character is a valid
+ * XML 1.1 character or if the character is a space, name start, or name
+ * character.
+ * <p>
+ * A series of convenience methods are supplied to ease the burden
+ * of the developer.  Using the character as an index into the <code>XML11CHARS</code>
+ * array and applying the appropriate mask flag (e.g.
+ * <code>MASK_VALID</code>), yields the same results as calling the
+ * convenience methods. There is one exception: check the comments
+ * for the <code>isValid</code> method for details.
+ *
+ * @author Glenn Marcy, IBM
+ * @author Andy Clark, IBM
+ * @author Arnaud  Le Hors, IBM
+ * @author Neil Graham, IBM
+ * @author Michael Glavassevich, IBM
+ *
+ * @version $Id$
+ */
+public class XML11Char {
+
+    //
+    // Constants
+    //
+
+    /** Character flags for XML 1.1. */
+    private static final byte XML11CHARS [] = new byte [1 << 16];
+
+    /** XML 1.1 Valid character mask. */
+    public static final int MASK_XML11_VALID = 0x01;
+
+    /** XML 1.1 Space character mask. */
+    public static final int MASK_XML11_SPACE = 0x02;
+
+    /** XML 1.1 Name start character mask. */
+    public static final int MASK_XML11_NAME_START = 0x04;
+
+    /** XML 1.1 Name character mask. */
+    public static final int MASK_XML11_NAME = 0x08;
+
+    /** XML 1.1 control character mask */
+    public static final int MASK_XML11_CONTROL = 0x10;
+
+    /** XML 1.1 content for external entities (valid - "special" chars - control chars) */
+    public static final int MASK_XML11_CONTENT = 0x20;
+
+    /** XML namespaces 1.1 NCNameStart */
+    public static final int MASK_XML11_NCNAME_START = 0x40;
+
+    /** XML namespaces 1.1 NCName */
+    public static final int MASK_XML11_NCNAME = 0x80;
+    
+    /** XML 1.1 content for internal entities (valid - "special" chars) */
+    public static final int MASK_XML11_CONTENT_INTERNAL = MASK_XML11_CONTROL | MASK_XML11_CONTENT; 
+
+    //
+    // Static initialization
+    //
+
+    static {
+    	
+        // Initializing the Character Flag Array
+        // Code generated by: XML11CharGenerator.
+        
+        Arrays.fill(XML11CHARS, 1, 9, (byte) 17 ); // Fill 8 of value (byte) 17
+        XML11CHARS[9] = 35;
+        XML11CHARS[10] = 3;
+        Arrays.fill(XML11CHARS, 11, 13, (byte) 17 ); // Fill 2 of value (byte) 17
+        XML11CHARS[13] = 3;
+        Arrays.fill(XML11CHARS, 14, 32, (byte) 17 ); // Fill 18 of value (byte) 17
+        XML11CHARS[32] = 35;
+        Arrays.fill(XML11CHARS, 33, 38, (byte) 33 ); // Fill 5 of value (byte) 33
+        XML11CHARS[38] = 1;
+        Arrays.fill(XML11CHARS, 39, 45, (byte) 33 ); // Fill 6 of value (byte) 33
+        Arrays.fill(XML11CHARS, 45, 47, (byte) -87 ); // Fill 2 of value (byte) -87
+        XML11CHARS[47] = 33;
+        Arrays.fill(XML11CHARS, 48, 58, (byte) -87 ); // Fill 10 of value (byte) -87
+        XML11CHARS[58] = 45;
+        XML11CHARS[59] = 33;
+        XML11CHARS[60] = 1;
+        Arrays.fill(XML11CHARS, 61, 65, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(XML11CHARS, 65, 91, (byte) -19 ); // Fill 26 of value (byte) -19
+        Arrays.fill(XML11CHARS, 91, 93, (byte) 33 ); // Fill 2 of value (byte) 33
+        XML11CHARS[93] = 1;
+        XML11CHARS[94] = 33;
+        XML11CHARS[95] = -19;
+        XML11CHARS[96] = 33;
+        Arrays.fill(XML11CHARS, 97, 123, (byte) -19 ); // Fill 26 of value (byte) -19
+        Arrays.fill(XML11CHARS, 123, 127, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(XML11CHARS, 127, 133, (byte) 17 ); // Fill 6 of value (byte) 17
+        XML11CHARS[133] = 35;
+        Arrays.fill(XML11CHARS, 134, 160, (byte) 17 ); // Fill 26 of value (byte) 17
+        Arrays.fill(XML11CHARS, 160, 183, (byte) 33 ); // Fill 23 of value (byte) 33
+        XML11CHARS[183] = -87;
+        Arrays.fill(XML11CHARS, 184, 192, (byte) 33 ); // Fill 8 of value (byte) 33
+        Arrays.fill(XML11CHARS, 192, 215, (byte) -19 ); // Fill 23 of value (byte) -19
+        XML11CHARS[215] = 33;
+        Arrays.fill(XML11CHARS, 216, 247, (byte) -19 ); // Fill 31 of value (byte) -19
+        XML11CHARS[247] = 33;
+        Arrays.fill(XML11CHARS, 248, 768, (byte) -19 ); // Fill 520 of value (byte) -19
+        Arrays.fill(XML11CHARS, 768, 880, (byte) -87 ); // Fill 112 of value (byte) -87
+        Arrays.fill(XML11CHARS, 880, 894, (byte) -19 ); // Fill 14 of value (byte) -19
+        XML11CHARS[894] = 33;
+        Arrays.fill(XML11CHARS, 895, 8192, (byte) -19 ); // Fill 7297 of value (byte) -19
+        Arrays.fill(XML11CHARS, 8192, 8204, (byte) 33 ); // Fill 12 of value (byte) 33
+        Arrays.fill(XML11CHARS, 8204, 8206, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(XML11CHARS, 8206, 8232, (byte) 33 ); // Fill 26 of value (byte) 33
+        XML11CHARS[8232] = 35;
+        Arrays.fill(XML11CHARS, 8233, 8255, (byte) 33 ); // Fill 22 of value (byte) 33
+        Arrays.fill(XML11CHARS, 8255, 8257, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(XML11CHARS, 8257, 8304, (byte) 33 ); // Fill 47 of value (byte) 33
+        Arrays.fill(XML11CHARS, 8304, 8592, (byte) -19 ); // Fill 288 of value (byte) -19
+        Arrays.fill(XML11CHARS, 8592, 11264, (byte) 33 ); // Fill 2672 of value (byte) 33
+        Arrays.fill(XML11CHARS, 11264, 12272, (byte) -19 ); // Fill 1008 of value (byte) -19
+        Arrays.fill(XML11CHARS, 12272, 12289, (byte) 33 ); // Fill 17 of value (byte) 33
+        Arrays.fill(XML11CHARS, 12289, 55296, (byte) -19 ); // Fill 43007 of value (byte) -19
+        Arrays.fill(XML11CHARS, 57344, 63744, (byte) 33 ); // Fill 6400 of value (byte) 33
+        Arrays.fill(XML11CHARS, 63744, 64976, (byte) -19 ); // Fill 1232 of value (byte) -19
+        Arrays.fill(XML11CHARS, 64976, 65008, (byte) 33 ); // Fill 32 of value (byte) 33
+        Arrays.fill(XML11CHARS, 65008, 65534, (byte) -19 ); // Fill 526 of value (byte) -19
+
+    } // <clinit>()
+
+    //
+    // Public static methods
+    //
+
+    /**
+     * Returns true if the specified character is a space character
+     * as amdended in the XML 1.1 specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11Space(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_SPACE) != 0);
+    } // isXML11Space(int):boolean
+
+    /**
+     * Returns true if the specified character is valid. This method
+     * also checks the surrogate character range from 0x10000 to 0x10FFFF.
+     * <p>
+     * If the program chooses to apply the mask directly to the
+     * <code>XML11CHARS</code> array, then they are responsible for checking
+     * the surrogate character range.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11Valid(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_VALID) != 0) 
+                || (0x10000 <= c && c <= 0x10FFFF);
+    } // isXML11Valid(int):boolean
+
+    /**
+     * Returns true if the specified character is invalid.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11Invalid(int c) {
+        return !isXML11Valid(c);
+    } // isXML11Invalid(int):boolean
+
+    /**
+     * Returns true if the specified character is valid and permitted outside
+     * of a character reference.  
+     * That is, this method will return false for the same set as
+     * isXML11Valid, except it also reports false for "control characters".
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11ValidLiteral(int c) {
+        return ((c < 0x10000 && ((XML11CHARS[c] & MASK_XML11_VALID) != 0 && (XML11CHARS[c] & MASK_XML11_CONTROL) == 0))
+            || (0x10000 <= c && c <= 0x10FFFF)); 
+    } // isXML11ValidLiteral(int):boolean
+
+    /**
+     * Returns true if the specified character can be considered 
+     * content in an external parsed entity.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11Content(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT) != 0) ||
+               (0x10000 <= c && c <= 0x10FFFF);
+    } // isXML11Content(int):boolean
+    
+    /**
+     * Returns true if the specified character can be considered 
+     * content in an internal parsed entity.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11InternalEntityContent(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT_INTERNAL) != 0) ||
+               (0x10000 <= c && c <= 0x10FFFF);
+    } // isXML11InternalEntityContent(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid name start
+     * character as defined by production [4] in the XML 1.1
+     * specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11NameStart(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME_START) != 0)
+            || (0x10000 <= c && c < 0xF0000);
+    } // isXML11NameStart(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid name
+     * character as defined by production [4a] in the XML 1.1
+     * specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11Name(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME) != 0) 
+            || (c >= 0x10000 && c < 0xF0000);
+    } // isXML11Name(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid NCName start
+     * character as defined by production [4] in Namespaces in XML
+     * 1.1 recommendation.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11NCNameStart(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME_START) != 0)
+            || (0x10000 <= c && c < 0xF0000);
+    } // isXML11NCNameStart(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid NCName
+     * character as defined by production [5] in Namespaces in XML
+     * 1.1 recommendation.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11NCName(int c) {
+        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME) != 0)
+            || (0x10000 <= c && c < 0xF0000);
+    } // isXML11NCName(int):boolean
+    
+    /**
+     * Returns whether the given character is a valid 
+     * high surrogate for a name character. This includes
+     * all high surrogates for characters [0x10000-0xEFFFF].
+     * In other words everything excluding planes 15 and 16.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isXML11NameHighSurrogate(int c) {
+        return (0xD800 <= c && c <= 0xDB7F);
+    }
+
+    /*
+     * [5] Name ::= NameStartChar NameChar*
+     */
+    /**
+     * Check to see if a string is a valid Name according to [5]
+     * in the XML 1.1 Recommendation
+     *
+     * @param name string to check
+     * @return true if name is a valid Name
+     */
+    public static boolean isXML11ValidName(String name) {
+        int length = name.length();
+        if (length == 0)
+            return false;
+        int i = 1;
+        char ch = name.charAt(0);
+        if( !isXML11NameStart(ch) ) {
+            if ( length > 1 && isXML11NameHighSurrogate(ch) ) {
+                char ch2 = name.charAt(1);
+                if ( !XMLChar.isLowSurrogate(ch2) || 
+                     !isXML11NameStart(XMLChar.supplemental(ch, ch2)) ) {
+                    return false;
+                }
+                i = 2;
+            }
+            else {
+                return false;
+            }
+        }
+        while (i < length) {
+            ch = name.charAt(i);
+            if ( !isXML11Name(ch) ) {
+                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
+                    char ch2 = name.charAt(i);
+                    if ( !XMLChar.isLowSurrogate(ch2) || 
+                         !isXML11Name(XMLChar.supplemental(ch, ch2)) ) {
+                        return false;
+                    }
+                }
+                else {
+                    return false;
+                }
+            }
+            ++i;
+        }
+        return true;
+    } // isXML11ValidName(String):boolean
+    
+
+    /*
+     * from the namespace 1.1 rec
+     * [4] NCName ::= NCNameStartChar NCNameChar*
+     */
+    /**
+     * Check to see if a string is a valid NCName according to [4]
+     * from the XML Namespaces 1.1 Recommendation
+     *
+     * @param ncName string to check
+     * @return true if name is a valid NCName
+     */
+    public static boolean isXML11ValidNCName(String ncName) {
+        int length = ncName.length();
+        if (length == 0)
+            return false;
+        int i = 1;
+        char ch = ncName.charAt(0);
+        if( !isXML11NCNameStart(ch) ) {
+            if ( length > 1 && isXML11NameHighSurrogate(ch) ) {
+                char ch2 = ncName.charAt(1);
+                if ( !XMLChar.isLowSurrogate(ch2) || 
+                     !isXML11NCNameStart(XMLChar.supplemental(ch, ch2)) ) {
+                    return false;
+                }
+                i = 2;
+            }
+            else {
+                return false;
+            }
+        }
+        while (i < length) {
+            ch = ncName.charAt(i);
+            if ( !isXML11NCName(ch) ) {
+                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
+                    char ch2 = ncName.charAt(i);
+                    if ( !XMLChar.isLowSurrogate(ch2) || 
+                         !isXML11NCName(XMLChar.supplemental(ch, ch2)) ) {
+                        return false;
+                    }
+                }
+                else {
+                    return false;
+                }
+            }
+            ++i;
+        }
+        return true;
+    } // isXML11ValidNCName(String):boolean
+
+    /*
+     * [7] Nmtoken ::= (NameChar)+
+     */
+    /**
+     * Check to see if a string is a valid Nmtoken according to [7]
+     * in the XML 1.1 Recommendation
+     *
+     * @param nmtoken string to check
+     * @return true if nmtoken is a valid Nmtoken 
+     */
+    public static boolean isXML11ValidNmtoken(String nmtoken) {
+        int length = nmtoken.length();
+        if (length == 0)
+            return false;
+        for (int i = 0; i < length; ++i ) {
+            char ch = nmtoken.charAt(i);
+            if( !isXML11Name(ch) ) {
+                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
+                    char ch2 = nmtoken.charAt(i);
+                    if ( !XMLChar.isLowSurrogate(ch2) || 
+                         !isXML11Name(XMLChar.supplemental(ch, ch2)) ) {
+                        return false;
+                    }
+                }
+                else {
+                    return false;
+                }
+            }
+        }
+        return true;
+    } // isXML11ValidName(String):boolean
+
+} // class XML11Char
+
diff --git a/src/org/apache/xml/serializer/utils/XMLChar.java b/src/org/apache/xml/serializer/utils/XMLChar.java
index 313dd10..a0d8c85 100644
--- a/src/org/apache/xml/serializer/utils/XMLChar.java
+++ b/src/org/apache/xml/serializer/utils/XMLChar.java
@@ -1,1026 +1,1026 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.xml.serializer.utils;
-
-import java.util.Arrays;
-
-/**
- * THIS IS A COPY OF THE XERCES-2J CLASS org.apache.xerces.utls.XMLChar
- * 
- * This class defines the basic XML character properties. The data
- * in this class can be used to verify that a character is a valid
- * XML character or if the character is a space, name start, or name
- * character.
- * <p>
- * A series of convenience methods are supplied to ease the burden
- * of the developer. Because inlining the checks can improve per
- * character performance, the tables of character properties are
- * public. Using the character as an index into the <code>CHARS</code>
- * array and applying the appropriate mask flag (e.g.
- * <code>MASK_VALID</code>), yields the same results as calling the
- * convenience methods. There is one exception: check the comments
- * for the <code>isValid</code> method for details.
- *
- * @author Glenn Marcy, IBM
- * @author Andy Clark, IBM
- * @author Eric Ye, IBM
- * @author Arnaud  Le Hors, IBM
- * @author Michael Glavassevich, IBM
- * @author Rahul Srivastava, Sun Microsystems Inc.
- *
- * @version $Id: $
- */
-public class XMLChar {
-
-    //
-    // Constants
-    //
-
-    /** Character flags. */
-    private static final byte[] CHARS = new byte[1 << 16];
-
-    /** Valid character mask. */
-    public static final int MASK_VALID = 0x01;
-
-    /** Space character mask. */
-    public static final int MASK_SPACE = 0x02;
-
-    /** Name start character mask. */
-    public static final int MASK_NAME_START = 0x04;
-
-    /** Name character mask. */
-    public static final int MASK_NAME = 0x08;
-
-    /** Pubid character mask. */
-    public static final int MASK_PUBID = 0x10;
-    
-    /** 
-     * Content character mask. Special characters are those that can
-     * be considered the start of markup, such as '&lt;' and '&amp;'. 
-     * The various newline characters are considered special as well.
-     * All other valid XML characters can be considered content.
-     * <p>
-     * This is an optimization for the inner loop of character scanning.
-     */
-    public static final int MASK_CONTENT = 0x20;
-
-    /** NCName start character mask. */
-    public static final int MASK_NCNAME_START = 0x40;
-
-    /** NCName character mask. */
-    public static final int MASK_NCNAME = 0x80;
-
-    //
-    // Static initialization
-    //
-
-    static {
-        
-        // Initializing the Character Flag Array
-        // Code generated by: XMLCharGenerator.
-        
-        CHARS[9] = 35;
-        CHARS[10] = 19;
-        CHARS[13] = 19;
-        CHARS[32] = 51;
-        CHARS[33] = 49;
-        CHARS[34] = 33;
-        Arrays.fill(CHARS, 35, 38, (byte) 49 ); // Fill 3 of value (byte) 49
-        CHARS[38] = 1;
-        Arrays.fill(CHARS, 39, 45, (byte) 49 ); // Fill 6 of value (byte) 49
-        Arrays.fill(CHARS, 45, 47, (byte) -71 ); // Fill 2 of value (byte) -71
-        CHARS[47] = 49;
-        Arrays.fill(CHARS, 48, 58, (byte) -71 ); // Fill 10 of value (byte) -71
-        CHARS[58] = 61;
-        CHARS[59] = 49;
-        CHARS[60] = 1;
-        CHARS[61] = 49;
-        CHARS[62] = 33;
-        Arrays.fill(CHARS, 63, 65, (byte) 49 ); // Fill 2 of value (byte) 49
-        Arrays.fill(CHARS, 65, 91, (byte) -3 ); // Fill 26 of value (byte) -3
-        Arrays.fill(CHARS, 91, 93, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[93] = 1;
-        CHARS[94] = 33;
-        CHARS[95] = -3;
-        CHARS[96] = 33;
-        Arrays.fill(CHARS, 97, 123, (byte) -3 ); // Fill 26 of value (byte) -3
-        Arrays.fill(CHARS, 123, 183, (byte) 33 ); // Fill 60 of value (byte) 33
-        CHARS[183] = -87;
-        Arrays.fill(CHARS, 184, 192, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(CHARS, 192, 215, (byte) -19 ); // Fill 23 of value (byte) -19
-        CHARS[215] = 33;
-        Arrays.fill(CHARS, 216, 247, (byte) -19 ); // Fill 31 of value (byte) -19
-        CHARS[247] = 33;
-        Arrays.fill(CHARS, 248, 306, (byte) -19 ); // Fill 58 of value (byte) -19
-        Arrays.fill(CHARS, 306, 308, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 308, 319, (byte) -19 ); // Fill 11 of value (byte) -19
-        Arrays.fill(CHARS, 319, 321, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 321, 329, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[329] = 33;
-        Arrays.fill(CHARS, 330, 383, (byte) -19 ); // Fill 53 of value (byte) -19
-        CHARS[383] = 33;
-        Arrays.fill(CHARS, 384, 452, (byte) -19 ); // Fill 68 of value (byte) -19
-        Arrays.fill(CHARS, 452, 461, (byte) 33 ); // Fill 9 of value (byte) 33
-        Arrays.fill(CHARS, 461, 497, (byte) -19 ); // Fill 36 of value (byte) -19
-        Arrays.fill(CHARS, 497, 500, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 500, 502, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 502, 506, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 506, 536, (byte) -19 ); // Fill 30 of value (byte) -19
-        Arrays.fill(CHARS, 536, 592, (byte) 33 ); // Fill 56 of value (byte) 33
-        Arrays.fill(CHARS, 592, 681, (byte) -19 ); // Fill 89 of value (byte) -19
-        Arrays.fill(CHARS, 681, 699, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 699, 706, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 706, 720, (byte) 33 ); // Fill 14 of value (byte) 33
-        Arrays.fill(CHARS, 720, 722, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 722, 768, (byte) 33 ); // Fill 46 of value (byte) 33
-        Arrays.fill(CHARS, 768, 838, (byte) -87 ); // Fill 70 of value (byte) -87
-        Arrays.fill(CHARS, 838, 864, (byte) 33 ); // Fill 26 of value (byte) 33
-        Arrays.fill(CHARS, 864, 866, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 866, 902, (byte) 33 ); // Fill 36 of value (byte) 33
-        CHARS[902] = -19;
-        CHARS[903] = -87;
-        Arrays.fill(CHARS, 904, 907, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[907] = 33;
-        CHARS[908] = -19;
-        CHARS[909] = 33;
-        Arrays.fill(CHARS, 910, 930, (byte) -19 ); // Fill 20 of value (byte) -19
-        CHARS[930] = 33;
-        Arrays.fill(CHARS, 931, 975, (byte) -19 ); // Fill 44 of value (byte) -19
-        CHARS[975] = 33;
-        Arrays.fill(CHARS, 976, 983, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 983, 986, (byte) 33 ); // Fill 3 of value (byte) 33
-        CHARS[986] = -19;
-        CHARS[987] = 33;
-        CHARS[988] = -19;
-        CHARS[989] = 33;
-        CHARS[990] = -19;
-        CHARS[991] = 33;
-        CHARS[992] = -19;
-        CHARS[993] = 33;
-        Arrays.fill(CHARS, 994, 1012, (byte) -19 ); // Fill 18 of value (byte) -19
-        Arrays.fill(CHARS, 1012, 1025, (byte) 33 ); // Fill 13 of value (byte) 33
-        Arrays.fill(CHARS, 1025, 1037, (byte) -19 ); // Fill 12 of value (byte) -19
-        CHARS[1037] = 33;
-        Arrays.fill(CHARS, 1038, 1104, (byte) -19 ); // Fill 66 of value (byte) -19
-        CHARS[1104] = 33;
-        Arrays.fill(CHARS, 1105, 1117, (byte) -19 ); // Fill 12 of value (byte) -19
-        CHARS[1117] = 33;
-        Arrays.fill(CHARS, 1118, 1154, (byte) -19 ); // Fill 36 of value (byte) -19
-        CHARS[1154] = 33;
-        Arrays.fill(CHARS, 1155, 1159, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 1159, 1168, (byte) 33 ); // Fill 9 of value (byte) 33
-        Arrays.fill(CHARS, 1168, 1221, (byte) -19 ); // Fill 53 of value (byte) -19
-        Arrays.fill(CHARS, 1221, 1223, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1223, 1225, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1225, 1227, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1227, 1229, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1229, 1232, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 1232, 1260, (byte) -19 ); // Fill 28 of value (byte) -19
-        Arrays.fill(CHARS, 1260, 1262, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1262, 1270, (byte) -19 ); // Fill 8 of value (byte) -19
-        Arrays.fill(CHARS, 1270, 1272, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1272, 1274, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1274, 1329, (byte) 33 ); // Fill 55 of value (byte) 33
-        Arrays.fill(CHARS, 1329, 1367, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 1367, 1369, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[1369] = -19;
-        Arrays.fill(CHARS, 1370, 1377, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 1377, 1415, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 1415, 1425, (byte) 33 ); // Fill 10 of value (byte) 33
-        Arrays.fill(CHARS, 1425, 1442, (byte) -87 ); // Fill 17 of value (byte) -87
-        CHARS[1442] = 33;
-        Arrays.fill(CHARS, 1443, 1466, (byte) -87 ); // Fill 23 of value (byte) -87
-        CHARS[1466] = 33;
-        Arrays.fill(CHARS, 1467, 1470, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[1470] = 33;
-        CHARS[1471] = -87;
-        CHARS[1472] = 33;
-        Arrays.fill(CHARS, 1473, 1475, (byte) -87 ); // Fill 2 of value (byte) -87
-        CHARS[1475] = 33;
-        CHARS[1476] = -87;
-        Arrays.fill(CHARS, 1477, 1488, (byte) 33 ); // Fill 11 of value (byte) 33
-        Arrays.fill(CHARS, 1488, 1515, (byte) -19 ); // Fill 27 of value (byte) -19
-        Arrays.fill(CHARS, 1515, 1520, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 1520, 1523, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 1523, 1569, (byte) 33 ); // Fill 46 of value (byte) 33
-        Arrays.fill(CHARS, 1569, 1595, (byte) -19 ); // Fill 26 of value (byte) -19
-        Arrays.fill(CHARS, 1595, 1600, (byte) 33 ); // Fill 5 of value (byte) 33
-        CHARS[1600] = -87;
-        Arrays.fill(CHARS, 1601, 1611, (byte) -19 ); // Fill 10 of value (byte) -19
-        Arrays.fill(CHARS, 1611, 1619, (byte) -87 ); // Fill 8 of value (byte) -87
-        Arrays.fill(CHARS, 1619, 1632, (byte) 33 ); // Fill 13 of value (byte) 33
-        Arrays.fill(CHARS, 1632, 1642, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 1642, 1648, (byte) 33 ); // Fill 6 of value (byte) 33
-        CHARS[1648] = -87;
-        Arrays.fill(CHARS, 1649, 1720, (byte) -19 ); // Fill 71 of value (byte) -19
-        Arrays.fill(CHARS, 1720, 1722, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1722, 1727, (byte) -19 ); // Fill 5 of value (byte) -19
-        CHARS[1727] = 33;
-        Arrays.fill(CHARS, 1728, 1743, (byte) -19 ); // Fill 15 of value (byte) -19
-        CHARS[1743] = 33;
-        Arrays.fill(CHARS, 1744, 1748, (byte) -19 ); // Fill 4 of value (byte) -19
-        CHARS[1748] = 33;
-        CHARS[1749] = -19;
-        Arrays.fill(CHARS, 1750, 1765, (byte) -87 ); // Fill 15 of value (byte) -87
-        Arrays.fill(CHARS, 1765, 1767, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1767, 1769, (byte) -87 ); // Fill 2 of value (byte) -87
-        CHARS[1769] = 33;
-        Arrays.fill(CHARS, 1770, 1774, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 1774, 1776, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1776, 1786, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 1786, 2305, (byte) 33 ); // Fill 519 of value (byte) 33
-        Arrays.fill(CHARS, 2305, 2308, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[2308] = 33;
-        Arrays.fill(CHARS, 2309, 2362, (byte) -19 ); // Fill 53 of value (byte) -19
-        Arrays.fill(CHARS, 2362, 2364, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[2364] = -87;
-        CHARS[2365] = -19;
-        Arrays.fill(CHARS, 2366, 2382, (byte) -87 ); // Fill 16 of value (byte) -87
-        Arrays.fill(CHARS, 2382, 2385, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2385, 2389, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 2389, 2392, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2392, 2402, (byte) -19 ); // Fill 10 of value (byte) -19
-        Arrays.fill(CHARS, 2402, 2404, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2404, 2406, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2406, 2416, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2416, 2433, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(CHARS, 2433, 2436, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[2436] = 33;
-        Arrays.fill(CHARS, 2437, 2445, (byte) -19 ); // Fill 8 of value (byte) -19
-        Arrays.fill(CHARS, 2445, 2447, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2447, 2449, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2449, 2451, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2451, 2473, (byte) -19 ); // Fill 22 of value (byte) -19
-        CHARS[2473] = 33;
-        Arrays.fill(CHARS, 2474, 2481, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[2481] = 33;
-        CHARS[2482] = -19;
-        Arrays.fill(CHARS, 2483, 2486, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2486, 2490, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 2490, 2492, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[2492] = -87;
-        CHARS[2493] = 33;
-        Arrays.fill(CHARS, 2494, 2501, (byte) -87 ); // Fill 7 of value (byte) -87
-        Arrays.fill(CHARS, 2501, 2503, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2503, 2505, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2505, 2507, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2507, 2510, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2510, 2519, (byte) 33 ); // Fill 9 of value (byte) 33
-        CHARS[2519] = -87;
-        Arrays.fill(CHARS, 2520, 2524, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2524, 2526, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[2526] = 33;
-        Arrays.fill(CHARS, 2527, 2530, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2530, 2532, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2532, 2534, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2534, 2544, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2544, 2546, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2546, 2562, (byte) 33 ); // Fill 16 of value (byte) 33
-        CHARS[2562] = -87;
-        Arrays.fill(CHARS, 2563, 2565, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2565, 2571, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 2571, 2575, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2575, 2577, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2577, 2579, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2579, 2601, (byte) -19 ); // Fill 22 of value (byte) -19
-        CHARS[2601] = 33;
-        Arrays.fill(CHARS, 2602, 2609, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[2609] = 33;
-        Arrays.fill(CHARS, 2610, 2612, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[2612] = 33;
-        Arrays.fill(CHARS, 2613, 2615, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[2615] = 33;
-        Arrays.fill(CHARS, 2616, 2618, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2618, 2620, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[2620] = -87;
-        CHARS[2621] = 33;
-        Arrays.fill(CHARS, 2622, 2627, (byte) -87 ); // Fill 5 of value (byte) -87
-        Arrays.fill(CHARS, 2627, 2631, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2631, 2633, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2633, 2635, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2635, 2638, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2638, 2649, (byte) 33 ); // Fill 11 of value (byte) 33
-        Arrays.fill(CHARS, 2649, 2653, (byte) -19 ); // Fill 4 of value (byte) -19
-        CHARS[2653] = 33;
-        CHARS[2654] = -19;
-        Arrays.fill(CHARS, 2655, 2662, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 2662, 2674, (byte) -87 ); // Fill 12 of value (byte) -87
-        Arrays.fill(CHARS, 2674, 2677, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2677, 2689, (byte) 33 ); // Fill 12 of value (byte) 33
-        Arrays.fill(CHARS, 2689, 2692, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[2692] = 33;
-        Arrays.fill(CHARS, 2693, 2700, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[2700] = 33;
-        CHARS[2701] = -19;
-        CHARS[2702] = 33;
-        Arrays.fill(CHARS, 2703, 2706, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[2706] = 33;
-        Arrays.fill(CHARS, 2707, 2729, (byte) -19 ); // Fill 22 of value (byte) -19
-        CHARS[2729] = 33;
-        Arrays.fill(CHARS, 2730, 2737, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[2737] = 33;
-        Arrays.fill(CHARS, 2738, 2740, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[2740] = 33;
-        Arrays.fill(CHARS, 2741, 2746, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 2746, 2748, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[2748] = -87;
-        CHARS[2749] = -19;
-        Arrays.fill(CHARS, 2750, 2758, (byte) -87 ); // Fill 8 of value (byte) -87
-        CHARS[2758] = 33;
-        Arrays.fill(CHARS, 2759, 2762, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[2762] = 33;
-        Arrays.fill(CHARS, 2763, 2766, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2766, 2784, (byte) 33 ); // Fill 18 of value (byte) 33
-        CHARS[2784] = -19;
-        Arrays.fill(CHARS, 2785, 2790, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 2790, 2800, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2800, 2817, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(CHARS, 2817, 2820, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[2820] = 33;
-        Arrays.fill(CHARS, 2821, 2829, (byte) -19 ); // Fill 8 of value (byte) -19
-        Arrays.fill(CHARS, 2829, 2831, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2831, 2833, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2833, 2835, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2835, 2857, (byte) -19 ); // Fill 22 of value (byte) -19
-        CHARS[2857] = 33;
-        Arrays.fill(CHARS, 2858, 2865, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[2865] = 33;
-        Arrays.fill(CHARS, 2866, 2868, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2868, 2870, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2870, 2874, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 2874, 2876, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[2876] = -87;
-        CHARS[2877] = -19;
-        Arrays.fill(CHARS, 2878, 2884, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 2884, 2887, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2887, 2889, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2889, 2891, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2891, 2894, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2894, 2902, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(CHARS, 2902, 2904, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2904, 2908, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2908, 2910, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[2910] = 33;
-        Arrays.fill(CHARS, 2911, 2914, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2914, 2918, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2918, 2928, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2928, 2946, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 2946, 2948, (byte) -87 ); // Fill 2 of value (byte) -87
-        CHARS[2948] = 33;
-        Arrays.fill(CHARS, 2949, 2955, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 2955, 2958, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2958, 2961, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[2961] = 33;
-        Arrays.fill(CHARS, 2962, 2966, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 2966, 2969, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2969, 2971, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[2971] = 33;
-        CHARS[2972] = -19;
-        CHARS[2973] = 33;
-        Arrays.fill(CHARS, 2974, 2976, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2976, 2979, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2979, 2981, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2981, 2984, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2984, 2987, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2987, 2990, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2990, 2998, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[2998] = 33;
-        Arrays.fill(CHARS, 2999, 3002, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 3002, 3006, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3006, 3011, (byte) -87 ); // Fill 5 of value (byte) -87
-        Arrays.fill(CHARS, 3011, 3014, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 3014, 3017, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[3017] = 33;
-        Arrays.fill(CHARS, 3018, 3022, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3022, 3031, (byte) 33 ); // Fill 9 of value (byte) 33
-        CHARS[3031] = -87;
-        Arrays.fill(CHARS, 3032, 3047, (byte) 33 ); // Fill 15 of value (byte) 33
-        Arrays.fill(CHARS, 3047, 3056, (byte) -87 ); // Fill 9 of value (byte) -87
-        Arrays.fill(CHARS, 3056, 3073, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(CHARS, 3073, 3076, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[3076] = 33;
-        Arrays.fill(CHARS, 3077, 3085, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[3085] = 33;
-        Arrays.fill(CHARS, 3086, 3089, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[3089] = 33;
-        Arrays.fill(CHARS, 3090, 3113, (byte) -19 ); // Fill 23 of value (byte) -19
-        CHARS[3113] = 33;
-        Arrays.fill(CHARS, 3114, 3124, (byte) -19 ); // Fill 10 of value (byte) -19
-        CHARS[3124] = 33;
-        Arrays.fill(CHARS, 3125, 3130, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 3130, 3134, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3134, 3141, (byte) -87 ); // Fill 7 of value (byte) -87
-        CHARS[3141] = 33;
-        Arrays.fill(CHARS, 3142, 3145, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[3145] = 33;
-        Arrays.fill(CHARS, 3146, 3150, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3150, 3157, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 3157, 3159, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3159, 3168, (byte) 33 ); // Fill 9 of value (byte) 33
-        Arrays.fill(CHARS, 3168, 3170, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3170, 3174, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3174, 3184, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3184, 3202, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 3202, 3204, (byte) -87 ); // Fill 2 of value (byte) -87
-        CHARS[3204] = 33;
-        Arrays.fill(CHARS, 3205, 3213, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[3213] = 33;
-        Arrays.fill(CHARS, 3214, 3217, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[3217] = 33;
-        Arrays.fill(CHARS, 3218, 3241, (byte) -19 ); // Fill 23 of value (byte) -19
-        CHARS[3241] = 33;
-        Arrays.fill(CHARS, 3242, 3252, (byte) -19 ); // Fill 10 of value (byte) -19
-        CHARS[3252] = 33;
-        Arrays.fill(CHARS, 3253, 3258, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 3258, 3262, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3262, 3269, (byte) -87 ); // Fill 7 of value (byte) -87
-        CHARS[3269] = 33;
-        Arrays.fill(CHARS, 3270, 3273, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[3273] = 33;
-        Arrays.fill(CHARS, 3274, 3278, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3278, 3285, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 3285, 3287, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3287, 3294, (byte) 33 ); // Fill 7 of value (byte) 33
-        CHARS[3294] = -19;
-        CHARS[3295] = 33;
-        Arrays.fill(CHARS, 3296, 3298, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3298, 3302, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3302, 3312, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3312, 3330, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 3330, 3332, (byte) -87 ); // Fill 2 of value (byte) -87
-        CHARS[3332] = 33;
-        Arrays.fill(CHARS, 3333, 3341, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[3341] = 33;
-        Arrays.fill(CHARS, 3342, 3345, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[3345] = 33;
-        Arrays.fill(CHARS, 3346, 3369, (byte) -19 ); // Fill 23 of value (byte) -19
-        CHARS[3369] = 33;
-        Arrays.fill(CHARS, 3370, 3386, (byte) -19 ); // Fill 16 of value (byte) -19
-        Arrays.fill(CHARS, 3386, 3390, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3390, 3396, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 3396, 3398, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3398, 3401, (byte) -87 ); // Fill 3 of value (byte) -87
-        CHARS[3401] = 33;
-        Arrays.fill(CHARS, 3402, 3406, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3406, 3415, (byte) 33 ); // Fill 9 of value (byte) 33
-        CHARS[3415] = -87;
-        Arrays.fill(CHARS, 3416, 3424, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(CHARS, 3424, 3426, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3426, 3430, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3430, 3440, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3440, 3585, (byte) 33 ); // Fill 145 of value (byte) 33
-        Arrays.fill(CHARS, 3585, 3631, (byte) -19 ); // Fill 46 of value (byte) -19
-        CHARS[3631] = 33;
-        CHARS[3632] = -19;
-        CHARS[3633] = -87;
-        Arrays.fill(CHARS, 3634, 3636, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3636, 3643, (byte) -87 ); // Fill 7 of value (byte) -87
-        Arrays.fill(CHARS, 3643, 3648, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 3648, 3654, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 3654, 3663, (byte) -87 ); // Fill 9 of value (byte) -87
-        CHARS[3663] = 33;
-        Arrays.fill(CHARS, 3664, 3674, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3674, 3713, (byte) 33 ); // Fill 39 of value (byte) 33
-        Arrays.fill(CHARS, 3713, 3715, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[3715] = 33;
-        CHARS[3716] = -19;
-        Arrays.fill(CHARS, 3717, 3719, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3719, 3721, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[3721] = 33;
-        CHARS[3722] = -19;
-        Arrays.fill(CHARS, 3723, 3725, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[3725] = -19;
-        Arrays.fill(CHARS, 3726, 3732, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 3732, 3736, (byte) -19 ); // Fill 4 of value (byte) -19
-        CHARS[3736] = 33;
-        Arrays.fill(CHARS, 3737, 3744, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[3744] = 33;
-        Arrays.fill(CHARS, 3745, 3748, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[3748] = 33;
-        CHARS[3749] = -19;
-        CHARS[3750] = 33;
-        CHARS[3751] = -19;
-        Arrays.fill(CHARS, 3752, 3754, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3754, 3756, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[3756] = 33;
-        Arrays.fill(CHARS, 3757, 3759, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[3759] = 33;
-        CHARS[3760] = -19;
-        CHARS[3761] = -87;
-        Arrays.fill(CHARS, 3762, 3764, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3764, 3770, (byte) -87 ); // Fill 6 of value (byte) -87
-        CHARS[3770] = 33;
-        Arrays.fill(CHARS, 3771, 3773, (byte) -87 ); // Fill 2 of value (byte) -87
-        CHARS[3773] = -19;
-        Arrays.fill(CHARS, 3774, 3776, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3776, 3781, (byte) -19 ); // Fill 5 of value (byte) -19
-        CHARS[3781] = 33;
-        CHARS[3782] = -87;
-        CHARS[3783] = 33;
-        Arrays.fill(CHARS, 3784, 3790, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 3790, 3792, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3792, 3802, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3802, 3864, (byte) 33 ); // Fill 62 of value (byte) 33
-        Arrays.fill(CHARS, 3864, 3866, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3866, 3872, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 3872, 3882, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3882, 3893, (byte) 33 ); // Fill 11 of value (byte) 33
-        CHARS[3893] = -87;
-        CHARS[3894] = 33;
-        CHARS[3895] = -87;
-        CHARS[3896] = 33;
-        CHARS[3897] = -87;
-        Arrays.fill(CHARS, 3898, 3902, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3902, 3904, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3904, 3912, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[3912] = 33;
-        Arrays.fill(CHARS, 3913, 3946, (byte) -19 ); // Fill 33 of value (byte) -19
-        Arrays.fill(CHARS, 3946, 3953, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 3953, 3973, (byte) -87 ); // Fill 20 of value (byte) -87
-        CHARS[3973] = 33;
-        Arrays.fill(CHARS, 3974, 3980, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 3980, 3984, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3984, 3990, (byte) -87 ); // Fill 6 of value (byte) -87
-        CHARS[3990] = 33;
-        CHARS[3991] = -87;
-        CHARS[3992] = 33;
-        Arrays.fill(CHARS, 3993, 4014, (byte) -87 ); // Fill 21 of value (byte) -87
-        Arrays.fill(CHARS, 4014, 4017, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4017, 4024, (byte) -87 ); // Fill 7 of value (byte) -87
-        CHARS[4024] = 33;
-        CHARS[4025] = -87;
-        Arrays.fill(CHARS, 4026, 4256, (byte) 33 ); // Fill 230 of value (byte) 33
-        Arrays.fill(CHARS, 4256, 4294, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 4294, 4304, (byte) 33 ); // Fill 10 of value (byte) 33
-        Arrays.fill(CHARS, 4304, 4343, (byte) -19 ); // Fill 39 of value (byte) -19
-        Arrays.fill(CHARS, 4343, 4352, (byte) 33 ); // Fill 9 of value (byte) 33
-        CHARS[4352] = -19;
-        CHARS[4353] = 33;
-        Arrays.fill(CHARS, 4354, 4356, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[4356] = 33;
-        Arrays.fill(CHARS, 4357, 4360, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[4360] = 33;
-        CHARS[4361] = -19;
-        CHARS[4362] = 33;
-        Arrays.fill(CHARS, 4363, 4365, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[4365] = 33;
-        Arrays.fill(CHARS, 4366, 4371, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 4371, 4412, (byte) 33 ); // Fill 41 of value (byte) 33
-        CHARS[4412] = -19;
-        CHARS[4413] = 33;
-        CHARS[4414] = -19;
-        CHARS[4415] = 33;
-        CHARS[4416] = -19;
-        Arrays.fill(CHARS, 4417, 4428, (byte) 33 ); // Fill 11 of value (byte) 33
-        CHARS[4428] = -19;
-        CHARS[4429] = 33;
-        CHARS[4430] = -19;
-        CHARS[4431] = 33;
-        CHARS[4432] = -19;
-        Arrays.fill(CHARS, 4433, 4436, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4436, 4438, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 4438, 4441, (byte) 33 ); // Fill 3 of value (byte) 33
-        CHARS[4441] = -19;
-        Arrays.fill(CHARS, 4442, 4447, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 4447, 4450, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[4450] = 33;
-        CHARS[4451] = -19;
-        CHARS[4452] = 33;
-        CHARS[4453] = -19;
-        CHARS[4454] = 33;
-        CHARS[4455] = -19;
-        CHARS[4456] = 33;
-        CHARS[4457] = -19;
-        Arrays.fill(CHARS, 4458, 4461, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4461, 4463, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 4463, 4466, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4466, 4468, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[4468] = 33;
-        CHARS[4469] = -19;
-        Arrays.fill(CHARS, 4470, 4510, (byte) 33 ); // Fill 40 of value (byte) 33
-        CHARS[4510] = -19;
-        Arrays.fill(CHARS, 4511, 4520, (byte) 33 ); // Fill 9 of value (byte) 33
-        CHARS[4520] = -19;
-        Arrays.fill(CHARS, 4521, 4523, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[4523] = -19;
-        Arrays.fill(CHARS, 4524, 4526, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 4526, 4528, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 4528, 4535, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 4535, 4537, (byte) -19 ); // Fill 2 of value (byte) -19
-        CHARS[4537] = 33;
-        CHARS[4538] = -19;
-        CHARS[4539] = 33;
-        Arrays.fill(CHARS, 4540, 4547, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 4547, 4587, (byte) 33 ); // Fill 40 of value (byte) 33
-        CHARS[4587] = -19;
-        Arrays.fill(CHARS, 4588, 4592, (byte) 33 ); // Fill 4 of value (byte) 33
-        CHARS[4592] = -19;
-        Arrays.fill(CHARS, 4593, 4601, (byte) 33 ); // Fill 8 of value (byte) 33
-        CHARS[4601] = -19;
-        Arrays.fill(CHARS, 4602, 7680, (byte) 33 ); // Fill 3078 of value (byte) 33
-        Arrays.fill(CHARS, 7680, 7836, (byte) -19 ); // Fill 156 of value (byte) -19
-        Arrays.fill(CHARS, 7836, 7840, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 7840, 7930, (byte) -19 ); // Fill 90 of value (byte) -19
-        Arrays.fill(CHARS, 7930, 7936, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 7936, 7958, (byte) -19 ); // Fill 22 of value (byte) -19
-        Arrays.fill(CHARS, 7958, 7960, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 7960, 7966, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 7966, 7968, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 7968, 8006, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 8006, 8008, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8008, 8014, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 8014, 8016, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8016, 8024, (byte) -19 ); // Fill 8 of value (byte) -19
-        CHARS[8024] = 33;
-        CHARS[8025] = -19;
-        CHARS[8026] = 33;
-        CHARS[8027] = -19;
-        CHARS[8028] = 33;
-        CHARS[8029] = -19;
-        CHARS[8030] = 33;
-        Arrays.fill(CHARS, 8031, 8062, (byte) -19 ); // Fill 31 of value (byte) -19
-        Arrays.fill(CHARS, 8062, 8064, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8064, 8117, (byte) -19 ); // Fill 53 of value (byte) -19
-        CHARS[8117] = 33;
-        Arrays.fill(CHARS, 8118, 8125, (byte) -19 ); // Fill 7 of value (byte) -19
-        CHARS[8125] = 33;
-        CHARS[8126] = -19;
-        Arrays.fill(CHARS, 8127, 8130, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 8130, 8133, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[8133] = 33;
-        Arrays.fill(CHARS, 8134, 8141, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 8141, 8144, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 8144, 8148, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 8148, 8150, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8150, 8156, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 8156, 8160, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 8160, 8173, (byte) -19 ); // Fill 13 of value (byte) -19
-        Arrays.fill(CHARS, 8173, 8178, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 8178, 8181, (byte) -19 ); // Fill 3 of value (byte) -19
-        CHARS[8181] = 33;
-        Arrays.fill(CHARS, 8182, 8189, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 8189, 8400, (byte) 33 ); // Fill 211 of value (byte) 33
-        Arrays.fill(CHARS, 8400, 8413, (byte) -87 ); // Fill 13 of value (byte) -87
-        Arrays.fill(CHARS, 8413, 8417, (byte) 33 ); // Fill 4 of value (byte) 33
-        CHARS[8417] = -87;
-        Arrays.fill(CHARS, 8418, 8486, (byte) 33 ); // Fill 68 of value (byte) 33
-        CHARS[8486] = -19;
-        Arrays.fill(CHARS, 8487, 8490, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 8490, 8492, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 8492, 8494, (byte) 33 ); // Fill 2 of value (byte) 33
-        CHARS[8494] = -19;
-        Arrays.fill(CHARS, 8495, 8576, (byte) 33 ); // Fill 81 of value (byte) 33
-        Arrays.fill(CHARS, 8576, 8579, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 8579, 12293, (byte) 33 ); // Fill 3714 of value (byte) 33
-        CHARS[12293] = -87;
-        CHARS[12294] = 33;
-        CHARS[12295] = -19;
-        Arrays.fill(CHARS, 12296, 12321, (byte) 33 ); // Fill 25 of value (byte) 33
-        Arrays.fill(CHARS, 12321, 12330, (byte) -19 ); // Fill 9 of value (byte) -19
-        Arrays.fill(CHARS, 12330, 12336, (byte) -87 ); // Fill 6 of value (byte) -87
-        CHARS[12336] = 33;
-        Arrays.fill(CHARS, 12337, 12342, (byte) -87 ); // Fill 5 of value (byte) -87
-        Arrays.fill(CHARS, 12342, 12353, (byte) 33 ); // Fill 11 of value (byte) 33
-        Arrays.fill(CHARS, 12353, 12437, (byte) -19 ); // Fill 84 of value (byte) -19
-        Arrays.fill(CHARS, 12437, 12441, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 12441, 12443, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 12443, 12445, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 12445, 12447, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 12447, 12449, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 12449, 12539, (byte) -19 ); // Fill 90 of value (byte) -19
-        CHARS[12539] = 33;
-        Arrays.fill(CHARS, 12540, 12543, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 12543, 12549, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 12549, 12589, (byte) -19 ); // Fill 40 of value (byte) -19
-        Arrays.fill(CHARS, 12589, 19968, (byte) 33 ); // Fill 7379 of value (byte) 33
-        Arrays.fill(CHARS, 19968, 40870, (byte) -19 ); // Fill 20902 of value (byte) -19
-        Arrays.fill(CHARS, 40870, 44032, (byte) 33 ); // Fill 3162 of value (byte) 33
-        Arrays.fill(CHARS, 44032, 55204, (byte) -19 ); // Fill 11172 of value (byte) -19
-        Arrays.fill(CHARS, 55204, 55296, (byte) 33 ); // Fill 92 of value (byte) 33
-        Arrays.fill(CHARS, 57344, 65534, (byte) 33 ); // Fill 8190 of value (byte) 33
-
-    } // <clinit>()
-
-    //
-    // Public static methods
-    //
-
-    /**
-     * Returns true if the specified character is a supplemental character.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isSupplemental(int c) {
-        return (c >= 0x10000 && c <= 0x10FFFF);
-    }
-
-    /**
-     * Returns true the supplemental character corresponding to the given
-     * surrogates.
-     *
-     * @param h The high surrogate.
-     * @param l The low surrogate.
-     */
-    public static int supplemental(char h, char l) {
-        return (h - 0xD800) * 0x400 + (l - 0xDC00) + 0x10000;
-    }
-
-    /**
-     * Returns the high surrogate of a supplemental character
-     *
-     * @param c The supplemental character to "split".
-     */
-    public static char highSurrogate(int c) {
-        return (char) (((c - 0x00010000) >> 10) + 0xD800);
-    }
-
-    /**
-     * Returns the low surrogate of a supplemental character
-     *
-     * @param c The supplemental character to "split".
-     */
-    public static char lowSurrogate(int c) {
-        return (char) (((c - 0x00010000) & 0x3FF) + 0xDC00);
-    }
-
-    /**
-     * Returns whether the given character is a high surrogate
-     *
-     * @param c The character to check.
-     */
-    public static boolean isHighSurrogate(int c) {
-        return (0xD800 <= c && c <= 0xDBFF);
-    }
-
-    /**
-     * Returns whether the given character is a low surrogate
-     *
-     * @param c The character to check.
-     */
-    public static boolean isLowSurrogate(int c) {
-        return (0xDC00 <= c && c <= 0xDFFF);
-    }
-
-
-    /**
-     * Returns true if the specified character is valid. This method
-     * also checks the surrogate character range from 0x10000 to 0x10FFFF.
-     * <p>
-     * If the program chooses to apply the mask directly to the
-     * <code>CHARS</code> array, then they are responsible for checking
-     * the surrogate character range.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isValid(int c) {
-        return (c < 0x10000 && (CHARS[c] & MASK_VALID) != 0) ||
-               (0x10000 <= c && c <= 0x10FFFF);
-    } // isValid(int):boolean
-
-    /**
-     * Returns true if the specified character is invalid.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isInvalid(int c) {
-        return !isValid(c);
-    } // isInvalid(int):boolean
-
-    /**
-     * Returns true if the specified character can be considered content.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isContent(int c) {
-        return (c < 0x10000 && (CHARS[c] & MASK_CONTENT) != 0) ||
-               (0x10000 <= c && c <= 0x10FFFF);
-    } // isContent(int):boolean
-
-    /**
-     * Returns true if the specified character can be considered markup.
-     * Markup characters include '&lt;', '&amp;', and '%'.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isMarkup(int c) {
-        return c == '<' || c == '&' || c == '%';
-    } // isMarkup(int):boolean
-
-    /**
-     * Returns true if the specified character is a space character
-     * as defined by production [3] in the XML 1.0 specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isSpace(int c) {
-        return c <= 0x20 && (CHARS[c] & MASK_SPACE) != 0;
-    } // isSpace(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid name start
-     * character as defined by production [5] in the XML 1.0
-     * specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isNameStart(int c) {
-        return c < 0x10000 && (CHARS[c] & MASK_NAME_START) != 0;
-    } // isNameStart(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid name
-     * character as defined by production [4] in the XML 1.0
-     * specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isName(int c) {
-        return c < 0x10000 && (CHARS[c] & MASK_NAME) != 0;
-    } // isName(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid NCName start
-     * character as defined by production [4] in Namespaces in XML
-     * recommendation.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isNCNameStart(int c) {
-        return c < 0x10000 && (CHARS[c] & MASK_NCNAME_START) != 0;
-    } // isNCNameStart(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid NCName
-     * character as defined by production [5] in Namespaces in XML
-     * recommendation.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isNCName(int c) {
-        return c < 0x10000 && (CHARS[c] & MASK_NCNAME) != 0;
-    } // isNCName(int):boolean
-
-    /**
-     * Returns true if the specified character is a valid Pubid
-     * character as defined by production [13] in the XML 1.0
-     * specification.
-     *
-     * @param c The character to check.
-     */
-    public static boolean isPubid(int c) {
-        return c < 0x10000 && (CHARS[c] & MASK_PUBID) != 0;
-    } // isPubid(int):boolean
-
-    /*
-     * [5] Name ::= (Letter | '_' | ':') (NameChar)*
-     */
-    /**
-     * Check to see if a string is a valid Name according to [5]
-     * in the XML 1.0 Recommendation
-     *
-     * @param name string to check
-     * @return true if name is a valid Name
-     */
-    public static boolean isValidName(String name) {
-        if (name.length() == 0)
-            return false;
-        char ch = name.charAt(0);
-        if( isNameStart(ch) == false)
-           return false;
-        for (int i = 1; i < name.length(); i++ ) {
-           ch = name.charAt(i);
-           if( isName( ch ) == false ){
-              return false;
-           }
-        }
-        return true;
-    } // isValidName(String):boolean
-    
-
-    /*
-     * from the namespace rec
-     * [4] NCName ::= (Letter | '_') (NCNameChar)*
-     */
-    /**
-     * Check to see if a string is a valid NCName according to [4]
-     * from the XML Namespaces 1.0 Recommendation
-     *
-     * @param ncName string to check
-     * @return true if name is a valid NCName
-     */
-    public static boolean isValidNCName(String ncName) {
-        if (ncName.length() == 0)
-            return false;
-        char ch = ncName.charAt(0);
-        if( isNCNameStart(ch) == false)
-           return false;
-        for (int i = 1; i < ncName.length(); i++ ) {
-           ch = ncName.charAt(i);
-           if( isNCName( ch ) == false ){
-              return false;
-           }
-        }
-        return true;
-    } // isValidNCName(String):boolean
-
-    /*
-     * [7] Nmtoken ::= (NameChar)+
-     */
-    /**
-     * Check to see if a string is a valid Nmtoken according to [7]
-     * in the XML 1.0 Recommendation
-     *
-     * @param nmtoken string to check
-     * @return true if nmtoken is a valid Nmtoken 
-     */
-    public static boolean isValidNmtoken(String nmtoken) {
-        if (nmtoken.length() == 0)
-            return false;
-        for (int i = 0; i < nmtoken.length(); i++ ) {
-           char ch = nmtoken.charAt(i);
-           if(  ! isName( ch ) ){
-              return false;
-           }
-        }
-        return true;
-    } // isValidName(String):boolean
-
-
-
-
-
-    // encodings
-
-    /**
-     * Returns true if the encoding name is a valid IANA encoding.
-     * This method does not verify that there is a decoder available
-     * for this encoding, only that the characters are valid for an
-     * IANA encoding name.
-     *
-     * @param ianaEncoding The IANA encoding name.
-     */
-    public static boolean isValidIANAEncoding(String ianaEncoding) {
-        if (ianaEncoding != null) {
-            int length = ianaEncoding.length();
-            if (length > 0) {
-                char c = ianaEncoding.charAt(0);
-                if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
-                    for (int i = 1; i < length; i++) {
-                        c = ianaEncoding.charAt(i);
-                        if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
-                            (c < '0' || c > '9') && c != '.' && c != '_' &&
-                            c != '-') {
-                            return false;
-                        }
-                    }
-                    return true;
-                }
-            }
-        }
-        return false;
-    } // isValidIANAEncoding(String):boolean
-
-    /**
-     * Returns true if the encoding name is a valid Java encoding.
-     * This method does not verify that there is a decoder available
-     * for this encoding, only that the characters are valid for an
-     * Java encoding name.
-     *
-     * @param javaEncoding The Java encoding name.
-     */
-    public static boolean isValidJavaEncoding(String javaEncoding) {
-        if (javaEncoding != null) {
-            int length = javaEncoding.length();
-            if (length > 0) {
-                for (int i = 1; i < length; i++) {
-                    char c = javaEncoding.charAt(i);
-                    if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
-                        (c < '0' || c > '9') && c != '.' && c != '_' &&
-                        c != '-') {
-                        return false;
-                    }
-                }
-                return true;
-            }
-        }
-        return false;
-    } // isValidIANAEncoding(String):boolean
-
-
-} // class XMLChar
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.xml.serializer.utils;
+
+import java.util.Arrays;
+
+/**
+ * THIS IS A COPY OF THE XERCES-2J CLASS org.apache.xerces.utls.XMLChar
+ * 
+ * This class defines the basic XML character properties. The data
+ * in this class can be used to verify that a character is a valid
+ * XML character or if the character is a space, name start, or name
+ * character.
+ * <p>
+ * A series of convenience methods are supplied to ease the burden
+ * of the developer. Because inlining the checks can improve per
+ * character performance, the tables of character properties are
+ * public. Using the character as an index into the <code>CHARS</code>
+ * array and applying the appropriate mask flag (e.g.
+ * <code>MASK_VALID</code>), yields the same results as calling the
+ * convenience methods. There is one exception: check the comments
+ * for the <code>isValid</code> method for details.
+ *
+ * @author Glenn Marcy, IBM
+ * @author Andy Clark, IBM
+ * @author Eric Ye, IBM
+ * @author Arnaud  Le Hors, IBM
+ * @author Michael Glavassevich, IBM
+ * @author Rahul Srivastava, Sun Microsystems Inc.
+ *
+ * @version $Id$
+ */
+public class XMLChar {
+
+    //
+    // Constants
+    //
+
+    /** Character flags. */
+    private static final byte[] CHARS = new byte[1 << 16];
+
+    /** Valid character mask. */
+    public static final int MASK_VALID = 0x01;
+
+    /** Space character mask. */
+    public static final int MASK_SPACE = 0x02;
+
+    /** Name start character mask. */
+    public static final int MASK_NAME_START = 0x04;
+
+    /** Name character mask. */
+    public static final int MASK_NAME = 0x08;
+
+    /** Pubid character mask. */
+    public static final int MASK_PUBID = 0x10;
+    
+    /** 
+     * Content character mask. Special characters are those that can
+     * be considered the start of markup, such as '&lt;' and '&amp;'. 
+     * The various newline characters are considered special as well.
+     * All other valid XML characters can be considered content.
+     * <p>
+     * This is an optimization for the inner loop of character scanning.
+     */
+    public static final int MASK_CONTENT = 0x20;
+
+    /** NCName start character mask. */
+    public static final int MASK_NCNAME_START = 0x40;
+
+    /** NCName character mask. */
+    public static final int MASK_NCNAME = 0x80;
+
+    //
+    // Static initialization
+    //
+
+    static {
+        
+        // Initializing the Character Flag Array
+        // Code generated by: XMLCharGenerator.
+        
+        CHARS[9] = 35;
+        CHARS[10] = 19;
+        CHARS[13] = 19;
+        CHARS[32] = 51;
+        CHARS[33] = 49;
+        CHARS[34] = 33;
+        Arrays.fill(CHARS, 35, 38, (byte) 49 ); // Fill 3 of value (byte) 49
+        CHARS[38] = 1;
+        Arrays.fill(CHARS, 39, 45, (byte) 49 ); // Fill 6 of value (byte) 49
+        Arrays.fill(CHARS, 45, 47, (byte) -71 ); // Fill 2 of value (byte) -71
+        CHARS[47] = 49;
+        Arrays.fill(CHARS, 48, 58, (byte) -71 ); // Fill 10 of value (byte) -71
+        CHARS[58] = 61;
+        CHARS[59] = 49;
+        CHARS[60] = 1;
+        CHARS[61] = 49;
+        CHARS[62] = 33;
+        Arrays.fill(CHARS, 63, 65, (byte) 49 ); // Fill 2 of value (byte) 49
+        Arrays.fill(CHARS, 65, 91, (byte) -3 ); // Fill 26 of value (byte) -3
+        Arrays.fill(CHARS, 91, 93, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[93] = 1;
+        CHARS[94] = 33;
+        CHARS[95] = -3;
+        CHARS[96] = 33;
+        Arrays.fill(CHARS, 97, 123, (byte) -3 ); // Fill 26 of value (byte) -3
+        Arrays.fill(CHARS, 123, 183, (byte) 33 ); // Fill 60 of value (byte) 33
+        CHARS[183] = -87;
+        Arrays.fill(CHARS, 184, 192, (byte) 33 ); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 192, 215, (byte) -19 ); // Fill 23 of value (byte) -19
+        CHARS[215] = 33;
+        Arrays.fill(CHARS, 216, 247, (byte) -19 ); // Fill 31 of value (byte) -19
+        CHARS[247] = 33;
+        Arrays.fill(CHARS, 248, 306, (byte) -19 ); // Fill 58 of value (byte) -19
+        Arrays.fill(CHARS, 306, 308, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 308, 319, (byte) -19 ); // Fill 11 of value (byte) -19
+        Arrays.fill(CHARS, 319, 321, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 321, 329, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[329] = 33;
+        Arrays.fill(CHARS, 330, 383, (byte) -19 ); // Fill 53 of value (byte) -19
+        CHARS[383] = 33;
+        Arrays.fill(CHARS, 384, 452, (byte) -19 ); // Fill 68 of value (byte) -19
+        Arrays.fill(CHARS, 452, 461, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 461, 497, (byte) -19 ); // Fill 36 of value (byte) -19
+        Arrays.fill(CHARS, 497, 500, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 500, 502, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 502, 506, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 506, 536, (byte) -19 ); // Fill 30 of value (byte) -19
+        Arrays.fill(CHARS, 536, 592, (byte) 33 ); // Fill 56 of value (byte) 33
+        Arrays.fill(CHARS, 592, 681, (byte) -19 ); // Fill 89 of value (byte) -19
+        Arrays.fill(CHARS, 681, 699, (byte) 33 ); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 699, 706, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 706, 720, (byte) 33 ); // Fill 14 of value (byte) 33
+        Arrays.fill(CHARS, 720, 722, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 722, 768, (byte) 33 ); // Fill 46 of value (byte) 33
+        Arrays.fill(CHARS, 768, 838, (byte) -87 ); // Fill 70 of value (byte) -87
+        Arrays.fill(CHARS, 838, 864, (byte) 33 ); // Fill 26 of value (byte) 33
+        Arrays.fill(CHARS, 864, 866, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 866, 902, (byte) 33 ); // Fill 36 of value (byte) 33
+        CHARS[902] = -19;
+        CHARS[903] = -87;
+        Arrays.fill(CHARS, 904, 907, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[907] = 33;
+        CHARS[908] = -19;
+        CHARS[909] = 33;
+        Arrays.fill(CHARS, 910, 930, (byte) -19 ); // Fill 20 of value (byte) -19
+        CHARS[930] = 33;
+        Arrays.fill(CHARS, 931, 975, (byte) -19 ); // Fill 44 of value (byte) -19
+        CHARS[975] = 33;
+        Arrays.fill(CHARS, 976, 983, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 983, 986, (byte) 33 ); // Fill 3 of value (byte) 33
+        CHARS[986] = -19;
+        CHARS[987] = 33;
+        CHARS[988] = -19;
+        CHARS[989] = 33;
+        CHARS[990] = -19;
+        CHARS[991] = 33;
+        CHARS[992] = -19;
+        CHARS[993] = 33;
+        Arrays.fill(CHARS, 994, 1012, (byte) -19 ); // Fill 18 of value (byte) -19
+        Arrays.fill(CHARS, 1012, 1025, (byte) 33 ); // Fill 13 of value (byte) 33
+        Arrays.fill(CHARS, 1025, 1037, (byte) -19 ); // Fill 12 of value (byte) -19
+        CHARS[1037] = 33;
+        Arrays.fill(CHARS, 1038, 1104, (byte) -19 ); // Fill 66 of value (byte) -19
+        CHARS[1104] = 33;
+        Arrays.fill(CHARS, 1105, 1117, (byte) -19 ); // Fill 12 of value (byte) -19
+        CHARS[1117] = 33;
+        Arrays.fill(CHARS, 1118, 1154, (byte) -19 ); // Fill 36 of value (byte) -19
+        CHARS[1154] = 33;
+        Arrays.fill(CHARS, 1155, 1159, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 1159, 1168, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 1168, 1221, (byte) -19 ); // Fill 53 of value (byte) -19
+        Arrays.fill(CHARS, 1221, 1223, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1223, 1225, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1225, 1227, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1227, 1229, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1229, 1232, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 1232, 1260, (byte) -19 ); // Fill 28 of value (byte) -19
+        Arrays.fill(CHARS, 1260, 1262, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1262, 1270, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 1270, 1272, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1272, 1274, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1274, 1329, (byte) 33 ); // Fill 55 of value (byte) 33
+        Arrays.fill(CHARS, 1329, 1367, (byte) -19 ); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 1367, 1369, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[1369] = -19;
+        Arrays.fill(CHARS, 1370, 1377, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 1377, 1415, (byte) -19 ); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 1415, 1425, (byte) 33 ); // Fill 10 of value (byte) 33
+        Arrays.fill(CHARS, 1425, 1442, (byte) -87 ); // Fill 17 of value (byte) -87
+        CHARS[1442] = 33;
+        Arrays.fill(CHARS, 1443, 1466, (byte) -87 ); // Fill 23 of value (byte) -87
+        CHARS[1466] = 33;
+        Arrays.fill(CHARS, 1467, 1470, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[1470] = 33;
+        CHARS[1471] = -87;
+        CHARS[1472] = 33;
+        Arrays.fill(CHARS, 1473, 1475, (byte) -87 ); // Fill 2 of value (byte) -87
+        CHARS[1475] = 33;
+        CHARS[1476] = -87;
+        Arrays.fill(CHARS, 1477, 1488, (byte) 33 ); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 1488, 1515, (byte) -19 ); // Fill 27 of value (byte) -19
+        Arrays.fill(CHARS, 1515, 1520, (byte) 33 ); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 1520, 1523, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 1523, 1569, (byte) 33 ); // Fill 46 of value (byte) 33
+        Arrays.fill(CHARS, 1569, 1595, (byte) -19 ); // Fill 26 of value (byte) -19
+        Arrays.fill(CHARS, 1595, 1600, (byte) 33 ); // Fill 5 of value (byte) 33
+        CHARS[1600] = -87;
+        Arrays.fill(CHARS, 1601, 1611, (byte) -19 ); // Fill 10 of value (byte) -19
+        Arrays.fill(CHARS, 1611, 1619, (byte) -87 ); // Fill 8 of value (byte) -87
+        Arrays.fill(CHARS, 1619, 1632, (byte) 33 ); // Fill 13 of value (byte) 33
+        Arrays.fill(CHARS, 1632, 1642, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 1642, 1648, (byte) 33 ); // Fill 6 of value (byte) 33
+        CHARS[1648] = -87;
+        Arrays.fill(CHARS, 1649, 1720, (byte) -19 ); // Fill 71 of value (byte) -19
+        Arrays.fill(CHARS, 1720, 1722, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1722, 1727, (byte) -19 ); // Fill 5 of value (byte) -19
+        CHARS[1727] = 33;
+        Arrays.fill(CHARS, 1728, 1743, (byte) -19 ); // Fill 15 of value (byte) -19
+        CHARS[1743] = 33;
+        Arrays.fill(CHARS, 1744, 1748, (byte) -19 ); // Fill 4 of value (byte) -19
+        CHARS[1748] = 33;
+        CHARS[1749] = -19;
+        Arrays.fill(CHARS, 1750, 1765, (byte) -87 ); // Fill 15 of value (byte) -87
+        Arrays.fill(CHARS, 1765, 1767, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1767, 1769, (byte) -87 ); // Fill 2 of value (byte) -87
+        CHARS[1769] = 33;
+        Arrays.fill(CHARS, 1770, 1774, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 1774, 1776, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1776, 1786, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 1786, 2305, (byte) 33 ); // Fill 519 of value (byte) 33
+        Arrays.fill(CHARS, 2305, 2308, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[2308] = 33;
+        Arrays.fill(CHARS, 2309, 2362, (byte) -19 ); // Fill 53 of value (byte) -19
+        Arrays.fill(CHARS, 2362, 2364, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[2364] = -87;
+        CHARS[2365] = -19;
+        Arrays.fill(CHARS, 2366, 2382, (byte) -87 ); // Fill 16 of value (byte) -87
+        Arrays.fill(CHARS, 2382, 2385, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2385, 2389, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 2389, 2392, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2392, 2402, (byte) -19 ); // Fill 10 of value (byte) -19
+        Arrays.fill(CHARS, 2402, 2404, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2404, 2406, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2406, 2416, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2416, 2433, (byte) 33 ); // Fill 17 of value (byte) 33
+        Arrays.fill(CHARS, 2433, 2436, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[2436] = 33;
+        Arrays.fill(CHARS, 2437, 2445, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 2445, 2447, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2447, 2449, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2449, 2451, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2451, 2473, (byte) -19 ); // Fill 22 of value (byte) -19
+        CHARS[2473] = 33;
+        Arrays.fill(CHARS, 2474, 2481, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[2481] = 33;
+        CHARS[2482] = -19;
+        Arrays.fill(CHARS, 2483, 2486, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2486, 2490, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2490, 2492, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[2492] = -87;
+        CHARS[2493] = 33;
+        Arrays.fill(CHARS, 2494, 2501, (byte) -87 ); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 2501, 2503, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2503, 2505, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2505, 2507, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2507, 2510, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2510, 2519, (byte) 33 ); // Fill 9 of value (byte) 33
+        CHARS[2519] = -87;
+        Arrays.fill(CHARS, 2520, 2524, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2524, 2526, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[2526] = 33;
+        Arrays.fill(CHARS, 2527, 2530, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2530, 2532, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2532, 2534, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2534, 2544, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2544, 2546, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2546, 2562, (byte) 33 ); // Fill 16 of value (byte) 33
+        CHARS[2562] = -87;
+        Arrays.fill(CHARS, 2563, 2565, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2565, 2571, (byte) -19 ); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 2571, 2575, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2575, 2577, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2577, 2579, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2579, 2601, (byte) -19 ); // Fill 22 of value (byte) -19
+        CHARS[2601] = 33;
+        Arrays.fill(CHARS, 2602, 2609, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[2609] = 33;
+        Arrays.fill(CHARS, 2610, 2612, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[2612] = 33;
+        Arrays.fill(CHARS, 2613, 2615, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[2615] = 33;
+        Arrays.fill(CHARS, 2616, 2618, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2618, 2620, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[2620] = -87;
+        CHARS[2621] = 33;
+        Arrays.fill(CHARS, 2622, 2627, (byte) -87 ); // Fill 5 of value (byte) -87
+        Arrays.fill(CHARS, 2627, 2631, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2631, 2633, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2633, 2635, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2635, 2638, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2638, 2649, (byte) 33 ); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 2649, 2653, (byte) -19 ); // Fill 4 of value (byte) -19
+        CHARS[2653] = 33;
+        CHARS[2654] = -19;
+        Arrays.fill(CHARS, 2655, 2662, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 2662, 2674, (byte) -87 ); // Fill 12 of value (byte) -87
+        Arrays.fill(CHARS, 2674, 2677, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2677, 2689, (byte) 33 ); // Fill 12 of value (byte) 33
+        Arrays.fill(CHARS, 2689, 2692, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[2692] = 33;
+        Arrays.fill(CHARS, 2693, 2700, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[2700] = 33;
+        CHARS[2701] = -19;
+        CHARS[2702] = 33;
+        Arrays.fill(CHARS, 2703, 2706, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[2706] = 33;
+        Arrays.fill(CHARS, 2707, 2729, (byte) -19 ); // Fill 22 of value (byte) -19
+        CHARS[2729] = 33;
+        Arrays.fill(CHARS, 2730, 2737, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[2737] = 33;
+        Arrays.fill(CHARS, 2738, 2740, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[2740] = 33;
+        Arrays.fill(CHARS, 2741, 2746, (byte) -19 ); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 2746, 2748, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[2748] = -87;
+        CHARS[2749] = -19;
+        Arrays.fill(CHARS, 2750, 2758, (byte) -87 ); // Fill 8 of value (byte) -87
+        CHARS[2758] = 33;
+        Arrays.fill(CHARS, 2759, 2762, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[2762] = 33;
+        Arrays.fill(CHARS, 2763, 2766, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2766, 2784, (byte) 33 ); // Fill 18 of value (byte) 33
+        CHARS[2784] = -19;
+        Arrays.fill(CHARS, 2785, 2790, (byte) 33 ); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 2790, 2800, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2800, 2817, (byte) 33 ); // Fill 17 of value (byte) 33
+        Arrays.fill(CHARS, 2817, 2820, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[2820] = 33;
+        Arrays.fill(CHARS, 2821, 2829, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 2829, 2831, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2831, 2833, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2833, 2835, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2835, 2857, (byte) -19 ); // Fill 22 of value (byte) -19
+        CHARS[2857] = 33;
+        Arrays.fill(CHARS, 2858, 2865, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[2865] = 33;
+        Arrays.fill(CHARS, 2866, 2868, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2868, 2870, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2870, 2874, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2874, 2876, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[2876] = -87;
+        CHARS[2877] = -19;
+        Arrays.fill(CHARS, 2878, 2884, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 2884, 2887, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2887, 2889, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2889, 2891, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2891, 2894, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2894, 2902, (byte) 33 ); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 2902, 2904, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2904, 2908, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2908, 2910, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[2910] = 33;
+        Arrays.fill(CHARS, 2911, 2914, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2914, 2918, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2918, 2928, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2928, 2946, (byte) 33 ); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 2946, 2948, (byte) -87 ); // Fill 2 of value (byte) -87
+        CHARS[2948] = 33;
+        Arrays.fill(CHARS, 2949, 2955, (byte) -19 ); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 2955, 2958, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2958, 2961, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[2961] = 33;
+        Arrays.fill(CHARS, 2962, 2966, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2966, 2969, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2969, 2971, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[2971] = 33;
+        CHARS[2972] = -19;
+        CHARS[2973] = 33;
+        Arrays.fill(CHARS, 2974, 2976, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2976, 2979, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2979, 2981, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2981, 2984, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2984, 2987, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2987, 2990, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2990, 2998, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[2998] = 33;
+        Arrays.fill(CHARS, 2999, 3002, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 3002, 3006, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3006, 3011, (byte) -87 ); // Fill 5 of value (byte) -87
+        Arrays.fill(CHARS, 3011, 3014, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 3014, 3017, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[3017] = 33;
+        Arrays.fill(CHARS, 3018, 3022, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3022, 3031, (byte) 33 ); // Fill 9 of value (byte) 33
+        CHARS[3031] = -87;
+        Arrays.fill(CHARS, 3032, 3047, (byte) 33 ); // Fill 15 of value (byte) 33
+        Arrays.fill(CHARS, 3047, 3056, (byte) -87 ); // Fill 9 of value (byte) -87
+        Arrays.fill(CHARS, 3056, 3073, (byte) 33 ); // Fill 17 of value (byte) 33
+        Arrays.fill(CHARS, 3073, 3076, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[3076] = 33;
+        Arrays.fill(CHARS, 3077, 3085, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[3085] = 33;
+        Arrays.fill(CHARS, 3086, 3089, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[3089] = 33;
+        Arrays.fill(CHARS, 3090, 3113, (byte) -19 ); // Fill 23 of value (byte) -19
+        CHARS[3113] = 33;
+        Arrays.fill(CHARS, 3114, 3124, (byte) -19 ); // Fill 10 of value (byte) -19
+        CHARS[3124] = 33;
+        Arrays.fill(CHARS, 3125, 3130, (byte) -19 ); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 3130, 3134, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3134, 3141, (byte) -87 ); // Fill 7 of value (byte) -87
+        CHARS[3141] = 33;
+        Arrays.fill(CHARS, 3142, 3145, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[3145] = 33;
+        Arrays.fill(CHARS, 3146, 3150, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3150, 3157, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3157, 3159, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3159, 3168, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 3168, 3170, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3170, 3174, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3174, 3184, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3184, 3202, (byte) 33 ); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 3202, 3204, (byte) -87 ); // Fill 2 of value (byte) -87
+        CHARS[3204] = 33;
+        Arrays.fill(CHARS, 3205, 3213, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[3213] = 33;
+        Arrays.fill(CHARS, 3214, 3217, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[3217] = 33;
+        Arrays.fill(CHARS, 3218, 3241, (byte) -19 ); // Fill 23 of value (byte) -19
+        CHARS[3241] = 33;
+        Arrays.fill(CHARS, 3242, 3252, (byte) -19 ); // Fill 10 of value (byte) -19
+        CHARS[3252] = 33;
+        Arrays.fill(CHARS, 3253, 3258, (byte) -19 ); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 3258, 3262, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3262, 3269, (byte) -87 ); // Fill 7 of value (byte) -87
+        CHARS[3269] = 33;
+        Arrays.fill(CHARS, 3270, 3273, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[3273] = 33;
+        Arrays.fill(CHARS, 3274, 3278, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3278, 3285, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3285, 3287, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3287, 3294, (byte) 33 ); // Fill 7 of value (byte) 33
+        CHARS[3294] = -19;
+        CHARS[3295] = 33;
+        Arrays.fill(CHARS, 3296, 3298, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3298, 3302, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3302, 3312, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3312, 3330, (byte) 33 ); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 3330, 3332, (byte) -87 ); // Fill 2 of value (byte) -87
+        CHARS[3332] = 33;
+        Arrays.fill(CHARS, 3333, 3341, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[3341] = 33;
+        Arrays.fill(CHARS, 3342, 3345, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[3345] = 33;
+        Arrays.fill(CHARS, 3346, 3369, (byte) -19 ); // Fill 23 of value (byte) -19
+        CHARS[3369] = 33;
+        Arrays.fill(CHARS, 3370, 3386, (byte) -19 ); // Fill 16 of value (byte) -19
+        Arrays.fill(CHARS, 3386, 3390, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3390, 3396, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3396, 3398, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3398, 3401, (byte) -87 ); // Fill 3 of value (byte) -87
+        CHARS[3401] = 33;
+        Arrays.fill(CHARS, 3402, 3406, (byte) -87 ); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3406, 3415, (byte) 33 ); // Fill 9 of value (byte) 33
+        CHARS[3415] = -87;
+        Arrays.fill(CHARS, 3416, 3424, (byte) 33 ); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 3424, 3426, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3426, 3430, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3430, 3440, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3440, 3585, (byte) 33 ); // Fill 145 of value (byte) 33
+        Arrays.fill(CHARS, 3585, 3631, (byte) -19 ); // Fill 46 of value (byte) -19
+        CHARS[3631] = 33;
+        CHARS[3632] = -19;
+        CHARS[3633] = -87;
+        Arrays.fill(CHARS, 3634, 3636, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3636, 3643, (byte) -87 ); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 3643, 3648, (byte) 33 ); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 3648, 3654, (byte) -19 ); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 3654, 3663, (byte) -87 ); // Fill 9 of value (byte) -87
+        CHARS[3663] = 33;
+        Arrays.fill(CHARS, 3664, 3674, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3674, 3713, (byte) 33 ); // Fill 39 of value (byte) 33
+        Arrays.fill(CHARS, 3713, 3715, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[3715] = 33;
+        CHARS[3716] = -19;
+        Arrays.fill(CHARS, 3717, 3719, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3719, 3721, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[3721] = 33;
+        CHARS[3722] = -19;
+        Arrays.fill(CHARS, 3723, 3725, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[3725] = -19;
+        Arrays.fill(CHARS, 3726, 3732, (byte) 33 ); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 3732, 3736, (byte) -19 ); // Fill 4 of value (byte) -19
+        CHARS[3736] = 33;
+        Arrays.fill(CHARS, 3737, 3744, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[3744] = 33;
+        Arrays.fill(CHARS, 3745, 3748, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[3748] = 33;
+        CHARS[3749] = -19;
+        CHARS[3750] = 33;
+        CHARS[3751] = -19;
+        Arrays.fill(CHARS, 3752, 3754, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3754, 3756, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[3756] = 33;
+        Arrays.fill(CHARS, 3757, 3759, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[3759] = 33;
+        CHARS[3760] = -19;
+        CHARS[3761] = -87;
+        Arrays.fill(CHARS, 3762, 3764, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3764, 3770, (byte) -87 ); // Fill 6 of value (byte) -87
+        CHARS[3770] = 33;
+        Arrays.fill(CHARS, 3771, 3773, (byte) -87 ); // Fill 2 of value (byte) -87
+        CHARS[3773] = -19;
+        Arrays.fill(CHARS, 3774, 3776, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3776, 3781, (byte) -19 ); // Fill 5 of value (byte) -19
+        CHARS[3781] = 33;
+        CHARS[3782] = -87;
+        CHARS[3783] = 33;
+        Arrays.fill(CHARS, 3784, 3790, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3790, 3792, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3792, 3802, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3802, 3864, (byte) 33 ); // Fill 62 of value (byte) 33
+        Arrays.fill(CHARS, 3864, 3866, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3866, 3872, (byte) 33 ); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 3872, 3882, (byte) -87 ); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3882, 3893, (byte) 33 ); // Fill 11 of value (byte) 33
+        CHARS[3893] = -87;
+        CHARS[3894] = 33;
+        CHARS[3895] = -87;
+        CHARS[3896] = 33;
+        CHARS[3897] = -87;
+        Arrays.fill(CHARS, 3898, 3902, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3902, 3904, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3904, 3912, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[3912] = 33;
+        Arrays.fill(CHARS, 3913, 3946, (byte) -19 ); // Fill 33 of value (byte) -19
+        Arrays.fill(CHARS, 3946, 3953, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3953, 3973, (byte) -87 ); // Fill 20 of value (byte) -87
+        CHARS[3973] = 33;
+        Arrays.fill(CHARS, 3974, 3980, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3980, 3984, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3984, 3990, (byte) -87 ); // Fill 6 of value (byte) -87
+        CHARS[3990] = 33;
+        CHARS[3991] = -87;
+        CHARS[3992] = 33;
+        Arrays.fill(CHARS, 3993, 4014, (byte) -87 ); // Fill 21 of value (byte) -87
+        Arrays.fill(CHARS, 4014, 4017, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4017, 4024, (byte) -87 ); // Fill 7 of value (byte) -87
+        CHARS[4024] = 33;
+        CHARS[4025] = -87;
+        Arrays.fill(CHARS, 4026, 4256, (byte) 33 ); // Fill 230 of value (byte) 33
+        Arrays.fill(CHARS, 4256, 4294, (byte) -19 ); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 4294, 4304, (byte) 33 ); // Fill 10 of value (byte) 33
+        Arrays.fill(CHARS, 4304, 4343, (byte) -19 ); // Fill 39 of value (byte) -19
+        Arrays.fill(CHARS, 4343, 4352, (byte) 33 ); // Fill 9 of value (byte) 33
+        CHARS[4352] = -19;
+        CHARS[4353] = 33;
+        Arrays.fill(CHARS, 4354, 4356, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[4356] = 33;
+        Arrays.fill(CHARS, 4357, 4360, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[4360] = 33;
+        CHARS[4361] = -19;
+        CHARS[4362] = 33;
+        Arrays.fill(CHARS, 4363, 4365, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[4365] = 33;
+        Arrays.fill(CHARS, 4366, 4371, (byte) -19 ); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 4371, 4412, (byte) 33 ); // Fill 41 of value (byte) 33
+        CHARS[4412] = -19;
+        CHARS[4413] = 33;
+        CHARS[4414] = -19;
+        CHARS[4415] = 33;
+        CHARS[4416] = -19;
+        Arrays.fill(CHARS, 4417, 4428, (byte) 33 ); // Fill 11 of value (byte) 33
+        CHARS[4428] = -19;
+        CHARS[4429] = 33;
+        CHARS[4430] = -19;
+        CHARS[4431] = 33;
+        CHARS[4432] = -19;
+        Arrays.fill(CHARS, 4433, 4436, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4436, 4438, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4438, 4441, (byte) 33 ); // Fill 3 of value (byte) 33
+        CHARS[4441] = -19;
+        Arrays.fill(CHARS, 4442, 4447, (byte) 33 ); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 4447, 4450, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[4450] = 33;
+        CHARS[4451] = -19;
+        CHARS[4452] = 33;
+        CHARS[4453] = -19;
+        CHARS[4454] = 33;
+        CHARS[4455] = -19;
+        CHARS[4456] = 33;
+        CHARS[4457] = -19;
+        Arrays.fill(CHARS, 4458, 4461, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4461, 4463, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4463, 4466, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4466, 4468, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[4468] = 33;
+        CHARS[4469] = -19;
+        Arrays.fill(CHARS, 4470, 4510, (byte) 33 ); // Fill 40 of value (byte) 33
+        CHARS[4510] = -19;
+        Arrays.fill(CHARS, 4511, 4520, (byte) 33 ); // Fill 9 of value (byte) 33
+        CHARS[4520] = -19;
+        Arrays.fill(CHARS, 4521, 4523, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[4523] = -19;
+        Arrays.fill(CHARS, 4524, 4526, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 4526, 4528, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4528, 4535, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 4535, 4537, (byte) -19 ); // Fill 2 of value (byte) -19
+        CHARS[4537] = 33;
+        CHARS[4538] = -19;
+        CHARS[4539] = 33;
+        Arrays.fill(CHARS, 4540, 4547, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 4547, 4587, (byte) 33 ); // Fill 40 of value (byte) 33
+        CHARS[4587] = -19;
+        Arrays.fill(CHARS, 4588, 4592, (byte) 33 ); // Fill 4 of value (byte) 33
+        CHARS[4592] = -19;
+        Arrays.fill(CHARS, 4593, 4601, (byte) 33 ); // Fill 8 of value (byte) 33
+        CHARS[4601] = -19;
+        Arrays.fill(CHARS, 4602, 7680, (byte) 33 ); // Fill 3078 of value (byte) 33
+        Arrays.fill(CHARS, 7680, 7836, (byte) -19 ); // Fill 156 of value (byte) -19
+        Arrays.fill(CHARS, 7836, 7840, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 7840, 7930, (byte) -19 ); // Fill 90 of value (byte) -19
+        Arrays.fill(CHARS, 7930, 7936, (byte) 33 ); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 7936, 7958, (byte) -19 ); // Fill 22 of value (byte) -19
+        Arrays.fill(CHARS, 7958, 7960, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 7960, 7966, (byte) -19 ); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 7966, 7968, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 7968, 8006, (byte) -19 ); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 8006, 8008, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8008, 8014, (byte) -19 ); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 8014, 8016, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8016, 8024, (byte) -19 ); // Fill 8 of value (byte) -19
+        CHARS[8024] = 33;
+        CHARS[8025] = -19;
+        CHARS[8026] = 33;
+        CHARS[8027] = -19;
+        CHARS[8028] = 33;
+        CHARS[8029] = -19;
+        CHARS[8030] = 33;
+        Arrays.fill(CHARS, 8031, 8062, (byte) -19 ); // Fill 31 of value (byte) -19
+        Arrays.fill(CHARS, 8062, 8064, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8064, 8117, (byte) -19 ); // Fill 53 of value (byte) -19
+        CHARS[8117] = 33;
+        Arrays.fill(CHARS, 8118, 8125, (byte) -19 ); // Fill 7 of value (byte) -19
+        CHARS[8125] = 33;
+        CHARS[8126] = -19;
+        Arrays.fill(CHARS, 8127, 8130, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 8130, 8133, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[8133] = 33;
+        Arrays.fill(CHARS, 8134, 8141, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 8141, 8144, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 8144, 8148, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 8148, 8150, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8150, 8156, (byte) -19 ); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 8156, 8160, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 8160, 8173, (byte) -19 ); // Fill 13 of value (byte) -19
+        Arrays.fill(CHARS, 8173, 8178, (byte) 33 ); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 8178, 8181, (byte) -19 ); // Fill 3 of value (byte) -19
+        CHARS[8181] = 33;
+        Arrays.fill(CHARS, 8182, 8189, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 8189, 8400, (byte) 33 ); // Fill 211 of value (byte) 33
+        Arrays.fill(CHARS, 8400, 8413, (byte) -87 ); // Fill 13 of value (byte) -87
+        Arrays.fill(CHARS, 8413, 8417, (byte) 33 ); // Fill 4 of value (byte) 33
+        CHARS[8417] = -87;
+        Arrays.fill(CHARS, 8418, 8486, (byte) 33 ); // Fill 68 of value (byte) 33
+        CHARS[8486] = -19;
+        Arrays.fill(CHARS, 8487, 8490, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 8490, 8492, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 8492, 8494, (byte) 33 ); // Fill 2 of value (byte) 33
+        CHARS[8494] = -19;
+        Arrays.fill(CHARS, 8495, 8576, (byte) 33 ); // Fill 81 of value (byte) 33
+        Arrays.fill(CHARS, 8576, 8579, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 8579, 12293, (byte) 33 ); // Fill 3714 of value (byte) 33
+        CHARS[12293] = -87;
+        CHARS[12294] = 33;
+        CHARS[12295] = -19;
+        Arrays.fill(CHARS, 12296, 12321, (byte) 33 ); // Fill 25 of value (byte) 33
+        Arrays.fill(CHARS, 12321, 12330, (byte) -19 ); // Fill 9 of value (byte) -19
+        Arrays.fill(CHARS, 12330, 12336, (byte) -87 ); // Fill 6 of value (byte) -87
+        CHARS[12336] = 33;
+        Arrays.fill(CHARS, 12337, 12342, (byte) -87 ); // Fill 5 of value (byte) -87
+        Arrays.fill(CHARS, 12342, 12353, (byte) 33 ); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 12353, 12437, (byte) -19 ); // Fill 84 of value (byte) -19
+        Arrays.fill(CHARS, 12437, 12441, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 12441, 12443, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 12443, 12445, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 12445, 12447, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 12447, 12449, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 12449, 12539, (byte) -19 ); // Fill 90 of value (byte) -19
+        CHARS[12539] = 33;
+        Arrays.fill(CHARS, 12540, 12543, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 12543, 12549, (byte) 33 ); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 12549, 12589, (byte) -19 ); // Fill 40 of value (byte) -19
+        Arrays.fill(CHARS, 12589, 19968, (byte) 33 ); // Fill 7379 of value (byte) 33
+        Arrays.fill(CHARS, 19968, 40870, (byte) -19 ); // Fill 20902 of value (byte) -19
+        Arrays.fill(CHARS, 40870, 44032, (byte) 33 ); // Fill 3162 of value (byte) 33
+        Arrays.fill(CHARS, 44032, 55204, (byte) -19 ); // Fill 11172 of value (byte) -19
+        Arrays.fill(CHARS, 55204, 55296, (byte) 33 ); // Fill 92 of value (byte) 33
+        Arrays.fill(CHARS, 57344, 65534, (byte) 33 ); // Fill 8190 of value (byte) 33
+
+    } // <clinit>()
+
+    //
+    // Public static methods
+    //
+
+    /**
+     * Returns true if the specified character is a supplemental character.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isSupplemental(int c) {
+        return (c >= 0x10000 && c <= 0x10FFFF);
+    }
+
+    /**
+     * Returns true the supplemental character corresponding to the given
+     * surrogates.
+     *
+     * @param h The high surrogate.
+     * @param l The low surrogate.
+     */
+    public static int supplemental(char h, char l) {
+        return (h - 0xD800) * 0x400 + (l - 0xDC00) + 0x10000;
+    }
+
+    /**
+     * Returns the high surrogate of a supplemental character
+     *
+     * @param c The supplemental character to "split".
+     */
+    public static char highSurrogate(int c) {
+        return (char) (((c - 0x00010000) >> 10) + 0xD800);
+    }
+
+    /**
+     * Returns the low surrogate of a supplemental character
+     *
+     * @param c The supplemental character to "split".
+     */
+    public static char lowSurrogate(int c) {
+        return (char) (((c - 0x00010000) & 0x3FF) + 0xDC00);
+    }
+
+    /**
+     * Returns whether the given character is a high surrogate
+     *
+     * @param c The character to check.
+     */
+    public static boolean isHighSurrogate(int c) {
+        return (0xD800 <= c && c <= 0xDBFF);
+    }
+
+    /**
+     * Returns whether the given character is a low surrogate
+     *
+     * @param c The character to check.
+     */
+    public static boolean isLowSurrogate(int c) {
+        return (0xDC00 <= c && c <= 0xDFFF);
+    }
+
+
+    /**
+     * Returns true if the specified character is valid. This method
+     * also checks the surrogate character range from 0x10000 to 0x10FFFF.
+     * <p>
+     * If the program chooses to apply the mask directly to the
+     * <code>CHARS</code> array, then they are responsible for checking
+     * the surrogate character range.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isValid(int c) {
+        return (c < 0x10000 && (CHARS[c] & MASK_VALID) != 0) ||
+               (0x10000 <= c && c <= 0x10FFFF);
+    } // isValid(int):boolean
+
+    /**
+     * Returns true if the specified character is invalid.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isInvalid(int c) {
+        return !isValid(c);
+    } // isInvalid(int):boolean
+
+    /**
+     * Returns true if the specified character can be considered content.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isContent(int c) {
+        return (c < 0x10000 && (CHARS[c] & MASK_CONTENT) != 0) ||
+               (0x10000 <= c && c <= 0x10FFFF);
+    } // isContent(int):boolean
+
+    /**
+     * Returns true if the specified character can be considered markup.
+     * Markup characters include '&lt;', '&amp;', and '%'.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isMarkup(int c) {
+        return c == '<' || c == '&' || c == '%';
+    } // isMarkup(int):boolean
+
+    /**
+     * Returns true if the specified character is a space character
+     * as defined by production [3] in the XML 1.0 specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isSpace(int c) {
+        return c <= 0x20 && (CHARS[c] & MASK_SPACE) != 0;
+    } // isSpace(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid name start
+     * character as defined by production [5] in the XML 1.0
+     * specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isNameStart(int c) {
+        return c < 0x10000 && (CHARS[c] & MASK_NAME_START) != 0;
+    } // isNameStart(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid name
+     * character as defined by production [4] in the XML 1.0
+     * specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isName(int c) {
+        return c < 0x10000 && (CHARS[c] & MASK_NAME) != 0;
+    } // isName(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid NCName start
+     * character as defined by production [4] in Namespaces in XML
+     * recommendation.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isNCNameStart(int c) {
+        return c < 0x10000 && (CHARS[c] & MASK_NCNAME_START) != 0;
+    } // isNCNameStart(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid NCName
+     * character as defined by production [5] in Namespaces in XML
+     * recommendation.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isNCName(int c) {
+        return c < 0x10000 && (CHARS[c] & MASK_NCNAME) != 0;
+    } // isNCName(int):boolean
+
+    /**
+     * Returns true if the specified character is a valid Pubid
+     * character as defined by production [13] in the XML 1.0
+     * specification.
+     *
+     * @param c The character to check.
+     */
+    public static boolean isPubid(int c) {
+        return c < 0x10000 && (CHARS[c] & MASK_PUBID) != 0;
+    } // isPubid(int):boolean
+
+    /*
+     * [5] Name ::= (Letter | '_' | ':') (NameChar)*
+     */
+    /**
+     * Check to see if a string is a valid Name according to [5]
+     * in the XML 1.0 Recommendation
+     *
+     * @param name string to check
+     * @return true if name is a valid Name
+     */
+    public static boolean isValidName(String name) {
+        if (name.length() == 0)
+            return false;
+        char ch = name.charAt(0);
+        if( isNameStart(ch) == false)
+           return false;
+        for (int i = 1; i < name.length(); i++ ) {
+           ch = name.charAt(i);
+           if( isName( ch ) == false ){
+              return false;
+           }
+        }
+        return true;
+    } // isValidName(String):boolean
+    
+
+    /*
+     * from the namespace rec
+     * [4] NCName ::= (Letter | '_') (NCNameChar)*
+     */
+    /**
+     * Check to see if a string is a valid NCName according to [4]
+     * from the XML Namespaces 1.0 Recommendation
+     *
+     * @param ncName string to check
+     * @return true if name is a valid NCName
+     */
+    public static boolean isValidNCName(String ncName) {
+        if (ncName.length() == 0)
+            return false;
+        char ch = ncName.charAt(0);
+        if( isNCNameStart(ch) == false)
+           return false;
+        for (int i = 1; i < ncName.length(); i++ ) {
+           ch = ncName.charAt(i);
+           if( isNCName( ch ) == false ){
+              return false;
+           }
+        }
+        return true;
+    } // isValidNCName(String):boolean
+
+    /*
+     * [7] Nmtoken ::= (NameChar)+
+     */
+    /**
+     * Check to see if a string is a valid Nmtoken according to [7]
+     * in the XML 1.0 Recommendation
+     *
+     * @param nmtoken string to check
+     * @return true if nmtoken is a valid Nmtoken 
+     */
+    public static boolean isValidNmtoken(String nmtoken) {
+        if (nmtoken.length() == 0)
+            return false;
+        for (int i = 0; i < nmtoken.length(); i++ ) {
+           char ch = nmtoken.charAt(i);
+           if(  ! isName( ch ) ){
+              return false;
+           }
+        }
+        return true;
+    } // isValidName(String):boolean
+
+
+
+
+
+    // encodings
+
+    /**
+     * Returns true if the encoding name is a valid IANA encoding.
+     * This method does not verify that there is a decoder available
+     * for this encoding, only that the characters are valid for an
+     * IANA encoding name.
+     *
+     * @param ianaEncoding The IANA encoding name.
+     */
+    public static boolean isValidIANAEncoding(String ianaEncoding) {
+        if (ianaEncoding != null) {
+            int length = ianaEncoding.length();
+            if (length > 0) {
+                char c = ianaEncoding.charAt(0);
+                if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
+                    for (int i = 1; i < length; i++) {
+                        c = ianaEncoding.charAt(i);
+                        if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
+                            (c < '0' || c > '9') && c != '.' && c != '_' &&
+                            c != '-') {
+                            return false;
+                        }
+                    }
+                    return true;
+                }
+            }
+        }
+        return false;
+    } // isValidIANAEncoding(String):boolean
+
+    /**
+     * Returns true if the encoding name is a valid Java encoding.
+     * This method does not verify that there is a decoder available
+     * for this encoding, only that the characters are valid for an
+     * Java encoding name.
+     *
+     * @param javaEncoding The Java encoding name.
+     */
+    public static boolean isValidJavaEncoding(String javaEncoding) {
+        if (javaEncoding != null) {
+            int length = javaEncoding.length();
+            if (length > 0) {
+                for (int i = 1; i < length; i++) {
+                    char c = javaEncoding.charAt(i);
+                    if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
+                        (c < '0' || c > '9') && c != '.' && c != '_' &&
+                        c != '-') {
+                        return false;
+                    }
+                }
+                return true;
+            }
+        }
+        return false;
+    } // isValidIANAEncoding(String):boolean
+
+
+} // class XMLChar
diff --git a/src/org/apache/xml/utils/ObjectFactory.java b/src/org/apache/xml/utils/ObjectFactory.java
index 189537c..5077e53 100644
--- a/src/org/apache/xml/utils/ObjectFactory.java
+++ b/src/org/apache/xml/utils/ObjectFactory.java
@@ -45,7 +45,7 @@
  * class and modified to be used as a general utility for creating objects 
  * dynamically.
  *
- * @version $Id:  $
+ * @version $Id$
  */
 class ObjectFactory {
 
diff --git a/src/org/apache/xml/utils/XMLChar.java b/src/org/apache/xml/utils/XMLChar.java
index 779a4c0..29345fc 100644
--- a/src/org/apache/xml/utils/XMLChar.java
+++ b/src/org/apache/xml/utils/XMLChar.java
@@ -42,7 +42,7 @@
  * @author Arnaud  Le Hors, IBM
  * @author Rahul Srivastava, Sun Microsystems Inc.
  *
- * @version $Id: XMLChar.java,v 1.7 2002/01/29 01:15:18 lehors Exp $
+ * @version $Id$
  */
 public class XMLChar {
 
diff --git a/src/org/apache/xpath/res/XPATHErrorResources_sl.java b/src/org/apache/xpath/res/XPATHErrorResources_sl.java
old mode 100755
new mode 100644
index 5f418f0..afe4790
--- a/src/org/apache/xpath/res/XPATHErrorResources_sl.java
+++ b/src/org/apache/xpath/res/XPATHErrorResources_sl.java
@@ -1,992 +1,992 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: XPATHErrorResources_sl.java,v 1.29 2005/02/09 21:44:08 zongaro Exp $
- */
-
-package org.apache.xpath.res;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Set up error messages.
- * We build a two dimensional array of message keys and
- * message strings. In order to add a new message here,
- * you need to first add a Static string constant for the
- * Key and update the contents array with Key, Value pair
-  * Also you need to  update the count of messages(MAX_CODE)or
- * the count of warnings(MAX_WARNING) [ Information purpose only]
- * @xsl.usage advanced
- */
-public class XPATHErrorResources_sl extends ListResourceBundle
-{
-
-/*
- * General notes to translators:
- *
- * This file contains error and warning messages related to XPath Error
- * Handling.
- *
- *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
- *     components.
- *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *     XSLTC is an acronym for XSLT Compiler.
- *
- *  2) A stylesheet is a description of how to transform an input XML document
- *     into a resultant XML document (or HTML document or text).  The
- *     stylesheet itself is described in the form of an XML document.
- *
- *  3) A template is a component of a stylesheet that is used to match a
- *     particular portion of an input document and specifies the form of the
- *     corresponding portion of the output document.
- *
- *  4) An element is a mark-up tag in an XML document; an attribute is a
- *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *     "elem" is an element name, "attr" and "attr2" are attribute names with
- *     the values "val" and "val2", respectively.
- *
- *  5) A namespace declaration is a special attribute that is used to associate
- *     a prefix with a URI (the namespace).  The meanings of element names and
- *     attribute names that use that prefix are defined with respect to that
- *     namespace.
- *
- *  6) "Translet" is an invented term that describes the class file that
- *     results from compiling an XML stylesheet into a Java class.
- *
- *  7) XPath is a specification that describes a notation for identifying
- *     nodes in a tree-structured representation of an XML document.  An
- *     instance of that notation is referred to as an XPath expression.
- *
- *  8) The context node is the node in the document with respect to which an
- *     XPath expression is being evaluated.
- *
- *  9) An iterator is an object that traverses nodes in the tree, one at a time.
- *
- *  10) NCName is an XML term used to describe a name that does not contain a
- *     colon (a "no-colon name").
- *
- *  11) QName is an XML term meaning "qualified name".
- */
-
-  /*
-   * static variables
-   */
-  public static final String ERROR0000 = "ERROR0000";
-  public static final String ER_CURRENT_NOT_ALLOWED_IN_MATCH =
-         "ER_CURRENT_NOT_ALLOWED_IN_MATCH";
-  public static final String ER_CURRENT_TAKES_NO_ARGS =
-         "ER_CURRENT_TAKES_NO_ARGS";
-  public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
-  public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
-         "ER_CONTEXT_HAS_NO_OWNERDOC";
-  public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
-         "ER_LOCALNAME_HAS_TOO_MANY_ARGS";
-  public static final String ER_NAMESPACEURI_HAS_TOO_MANY_ARGS =
-         "ER_NAMESPACEURI_HAS_TOO_MANY_ARGS";
-  public static final String ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS =
-         "ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS";
-  public static final String ER_NUMBER_HAS_TOO_MANY_ARGS =
-         "ER_NUMBER_HAS_TOO_MANY_ARGS";
-  public static final String ER_NAME_HAS_TOO_MANY_ARGS =
-         "ER_NAME_HAS_TOO_MANY_ARGS";
-  public static final String ER_STRING_HAS_TOO_MANY_ARGS =
-         "ER_STRING_HAS_TOO_MANY_ARGS";
-  public static final String ER_STRINGLENGTH_HAS_TOO_MANY_ARGS =
-         "ER_STRINGLENGTH_HAS_TOO_MANY_ARGS";
-  public static final String ER_TRANSLATE_TAKES_3_ARGS =
-         "ER_TRANSLATE_TAKES_3_ARGS";
-  public static final String ER_UNPARSEDENTITYURI_TAKES_1_ARG =
-         "ER_UNPARSEDENTITYURI_TAKES_1_ARG";
-  public static final String ER_NAMESPACEAXIS_NOT_IMPLEMENTED =
-         "ER_NAMESPACEAXIS_NOT_IMPLEMENTED";
-  public static final String ER_UNKNOWN_AXIS = "ER_UNKNOWN_AXIS";
-  public static final String ER_UNKNOWN_MATCH_OPERATION =
-         "ER_UNKNOWN_MATCH_OPERATION";
-  public static final String ER_INCORRECT_ARG_LENGTH ="ER_INCORRECT_ARG_LENGTH";
-  public static final String ER_CANT_CONVERT_TO_NUMBER =
-         "ER_CANT_CONVERT_TO_NUMBER";
-  public static final String ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER =
-           "ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER";
-  public static final String ER_CANT_CONVERT_TO_NODELIST =
-         "ER_CANT_CONVERT_TO_NODELIST";
-  public static final String ER_CANT_CONVERT_TO_MUTABLENODELIST =
-         "ER_CANT_CONVERT_TO_MUTABLENODELIST";
-  public static final String ER_CANT_CONVERT_TO_TYPE ="ER_CANT_CONVERT_TO_TYPE";
-  public static final String ER_EXPECTED_MATCH_PATTERN =
-         "ER_EXPECTED_MATCH_PATTERN";
-  public static final String ER_COULDNOT_GET_VAR_NAMED =
-         "ER_COULDNOT_GET_VAR_NAMED";
-  public static final String ER_UNKNOWN_OPCODE = "ER_UNKNOWN_OPCODE";
-  public static final String ER_EXTRA_ILLEGAL_TOKENS ="ER_EXTRA_ILLEGAL_TOKENS";
-  public static final String ER_EXPECTED_DOUBLE_QUOTE =
-         "ER_EXPECTED_DOUBLE_QUOTE";
-  public static final String ER_EXPECTED_SINGLE_QUOTE =
-         "ER_EXPECTED_SINGLE_QUOTE";
-  public static final String ER_EMPTY_EXPRESSION = "ER_EMPTY_EXPRESSION";
-  public static final String ER_EXPECTED_BUT_FOUND = "ER_EXPECTED_BUT_FOUND";
-  public static final String ER_INCORRECT_PROGRAMMER_ASSERTION =
-         "ER_INCORRECT_PROGRAMMER_ASSERTION";
-  public static final String ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL =
-         "ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL";
-  public static final String ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG =
-         "ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG";
-  public static final String ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG =
-         "ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG";
-  public static final String ER_PREDICATE_ILLEGAL_SYNTAX =
-         "ER_PREDICATE_ILLEGAL_SYNTAX";
-  public static final String ER_ILLEGAL_AXIS_NAME = "ER_ILLEGAL_AXIS_NAME";
-  public static final String ER_UNKNOWN_NODETYPE = "ER_UNKNOWN_NODETYPE";
-  public static final String ER_PATTERN_LITERAL_NEEDS_BE_QUOTED =
-         "ER_PATTERN_LITERAL_NEEDS_BE_QUOTED";
-  public static final String ER_COULDNOT_BE_FORMATTED_TO_NUMBER =
-         "ER_COULDNOT_BE_FORMATTED_TO_NUMBER";
-  public static final String ER_COULDNOT_CREATE_XMLPROCESSORLIAISON =
-         "ER_COULDNOT_CREATE_XMLPROCESSORLIAISON";
-  public static final String ER_DIDNOT_FIND_XPATH_SELECT_EXP =
-         "ER_DIDNOT_FIND_XPATH_SELECT_EXP";
-  public static final String ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH =
-         "ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH";
-  public static final String ER_ERROR_OCCURED = "ER_ERROR_OCCURED";
-  public static final String ER_ILLEGAL_VARIABLE_REFERENCE =
-         "ER_ILLEGAL_VARIABLE_REFERENCE";
-  public static final String ER_AXES_NOT_ALLOWED = "ER_AXES_NOT_ALLOWED";
-  public static final String ER_KEY_HAS_TOO_MANY_ARGS =
-         "ER_KEY_HAS_TOO_MANY_ARGS";
-  public static final String ER_COUNT_TAKES_1_ARG = "ER_COUNT_TAKES_1_ARG";
-  public static final String ER_COULDNOT_FIND_FUNCTION =
-         "ER_COULDNOT_FIND_FUNCTION";
-  public static final String ER_UNSUPPORTED_ENCODING ="ER_UNSUPPORTED_ENCODING";
-  public static final String ER_PROBLEM_IN_DTM_NEXTSIBLING =
-         "ER_PROBLEM_IN_DTM_NEXTSIBLING";
-  public static final String ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL =
-         "ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL";
-  public static final String ER_SETDOMFACTORY_NOT_SUPPORTED =
-         "ER_SETDOMFACTORY_NOT_SUPPORTED";
-  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
-  public static final String ER_PARSE_NOT_SUPPORTED = "ER_PARSE_NOT_SUPPORTED";
-  public static final String ER_SAX_API_NOT_HANDLED = "ER_SAX_API_NOT_HANDLED";
-public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
-         "ER_IGNORABLE_WHITESPACE_NOT_HANDLED";
-  public static final String ER_DTM_CANNOT_HANDLE_NODES =
-         "ER_DTM_CANNOT_HANDLE_NODES";
-  public static final String ER_XERCES_CANNOT_HANDLE_NODES =
-         "ER_XERCES_CANNOT_HANDLE_NODES";
-  public static final String ER_XERCES_PARSE_ERROR_DETAILS =
-         "ER_XERCES_PARSE_ERROR_DETAILS";
-  public static final String ER_XERCES_PARSE_ERROR = "ER_XERCES_PARSE_ERROR";
-  public static final String ER_INVALID_UTF16_SURROGATE =
-         "ER_INVALID_UTF16_SURROGATE";
-  public static final String ER_OIERROR = "ER_OIERROR";
-  public static final String ER_CANNOT_CREATE_URL = "ER_CANNOT_CREATE_URL";
-  public static final String ER_XPATH_READOBJECT = "ER_XPATH_READOBJECT";
- public static final String ER_FUNCTION_TOKEN_NOT_FOUND =
-         "ER_FUNCTION_TOKEN_NOT_FOUND";
-  public static final String ER_CANNOT_DEAL_XPATH_TYPE =
-         "ER_CANNOT_DEAL_XPATH_TYPE";
-  public static final String ER_NODESET_NOT_MUTABLE = "ER_NODESET_NOT_MUTABLE";
-  public static final String ER_NODESETDTM_NOT_MUTABLE =
-         "ER_NODESETDTM_NOT_MUTABLE";
-   /**  Variable not resolvable:   */
-  public static final String ER_VAR_NOT_RESOLVABLE = "ER_VAR_NOT_RESOLVABLE";
-   /** Null error handler  */
- public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
-   /**  Programmer's assertion: unknown opcode  */
-  public static final String ER_PROG_ASSERT_UNKNOWN_OPCODE =
-         "ER_PROG_ASSERT_UNKNOWN_OPCODE";
-   /**  0 or 1   */
-  public static final String ER_ZERO_OR_ONE = "ER_ZERO_OR_ONE";
-   /**  rtf() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-   /**  asNodeIterator() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER = "ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-   /**  fsb() not supported for XStringForChars   */
-  public static final String ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS =
-         "ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS";
-   /**  Could not find variable with the name of   */
- public static final String ER_COULD_NOT_FIND_VAR = "ER_COULD_NOT_FIND_VAR";
-   /**  XStringForChars can not take a string for an argument   */
- public static final String ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING =
-         "ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING";
-   /**  The FastStringBuffer argument can not be null   */
- public static final String ER_FASTSTRINGBUFFER_CANNOT_BE_NULL =
-         "ER_FASTSTRINGBUFFER_CANNOT_BE_NULL";
-   /**  2 or 3   */
-  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
-   /** Variable accessed before it is bound! */
-  public static final String ER_VARIABLE_ACCESSED_BEFORE_BIND =
-         "ER_VARIABLE_ACCESSED_BEFORE_BIND";
-   /** XStringForFSB can not take a string for an argument! */
- public static final String ER_FSB_CANNOT_TAKE_STRING =
-         "ER_FSB_CANNOT_TAKE_STRING";
-   /** Error! Setting the root of a walker to null! */
-  public static final String ER_SETTING_WALKER_ROOT_TO_NULL =
-         "ER_SETTING_WALKER_ROOT_TO_NULL";
-   /** This NodeSetDTM can not iterate to a previous node! */
-  public static final String ER_NODESETDTM_CANNOT_ITERATE =
-         "ER_NODESETDTM_CANNOT_ITERATE";
-  /** This NodeSet can not iterate to a previous node! */
- public static final String ER_NODESET_CANNOT_ITERATE =
-         "ER_NODESET_CANNOT_ITERATE";
-  /** This NodeSetDTM can not do indexing or counting functions! */
-  public static final String ER_NODESETDTM_CANNOT_INDEX =
-         "ER_NODESETDTM_CANNOT_INDEX";
-  /** This NodeSet can not do indexing or counting functions! */
-  public static final String ER_NODESET_CANNOT_INDEX =
-         "ER_NODESET_CANNOT_INDEX";
-  /** Can not call setShouldCacheNodes after nextNode has been called! */
-  public static final String ER_CANNOT_CALL_SETSHOULDCACHENODE =
-         "ER_CANNOT_CALL_SETSHOULDCACHENODE";
-  /** {0} only allows {1} arguments */
- public static final String ER_ONLY_ALLOWS = "ER_ONLY_ALLOWS";
-  /** Programmer's assertion in getNextStepPos: unknown stepType: {0} */
-  public static final String ER_UNKNOWN_STEP = "ER_UNKNOWN_STEP";
-  /** Problem with RelativeLocationPath */
-  public static final String ER_EXPECTED_REL_LOC_PATH =
-         "ER_EXPECTED_REL_LOC_PATH";
-  /** Problem with LocationPath */
-  public static final String ER_EXPECTED_LOC_PATH = "ER_EXPECTED_LOC_PATH";
-  public static final String ER_EXPECTED_LOC_PATH_AT_END_EXPR =
-                                        "ER_EXPECTED_LOC_PATH_AT_END_EXPR";
-  /** Problem with Step */
-  public static final String ER_EXPECTED_LOC_STEP = "ER_EXPECTED_LOC_STEP";
-  /** Problem with NodeTest */
-  public static final String ER_EXPECTED_NODE_TEST = "ER_EXPECTED_NODE_TEST";
-  /** Expected step pattern */
-  public static final String ER_EXPECTED_STEP_PATTERN =
-        "ER_EXPECTED_STEP_PATTERN";
-  /** Expected relative path pattern */
-  public static final String ER_EXPECTED_REL_PATH_PATTERN =
-         "ER_EXPECTED_REL_PATH_PATTERN";
-  /** ER_CANT_CONVERT_XPATHRESULTTYPE_TO_BOOLEAN          */
-  public static final String ER_CANT_CONVERT_TO_BOOLEAN =
-         "ER_CANT_CONVERT_TO_BOOLEAN";
-  /** Field ER_CANT_CONVERT_TO_SINGLENODE       */
-  public static final String ER_CANT_CONVERT_TO_SINGLENODE =
-         "ER_CANT_CONVERT_TO_SINGLENODE";
-  /** Field ER_CANT_GET_SNAPSHOT_LENGTH         */
-  public static final String ER_CANT_GET_SNAPSHOT_LENGTH =
-         "ER_CANT_GET_SNAPSHOT_LENGTH";
-  /** Field ER_NON_ITERATOR_TYPE                */
-  public static final String ER_NON_ITERATOR_TYPE = "ER_NON_ITERATOR_TYPE";
-  /** Field ER_DOC_MUTATED                      */
-  public static final String ER_DOC_MUTATED = "ER_DOC_MUTATED";
-  public static final String ER_INVALID_XPATH_TYPE = "ER_INVALID_XPATH_TYPE";
-  public static final String ER_EMPTY_XPATH_RESULT = "ER_EMPTY_XPATH_RESULT";
-  public static final String ER_INCOMPATIBLE_TYPES = "ER_INCOMPATIBLE_TYPES";
-  public static final String ER_NULL_RESOLVER = "ER_NULL_RESOLVER";
-  public static final String ER_CANT_CONVERT_TO_STRING =
-         "ER_CANT_CONVERT_TO_STRING";
-  public static final String ER_NON_SNAPSHOT_TYPE = "ER_NON_SNAPSHOT_TYPE";
-  public static final String ER_WRONG_DOCUMENT = "ER_WRONG_DOCUMENT";
-  /* Note to translators:  The XPath expression cannot be evaluated with respect
-   * to this type of node.
-   */
-  /** Field ER_WRONG_NODETYPE                    */
-  public static final String ER_WRONG_NODETYPE = "ER_WRONG_NODETYPE";
-  public static final String ER_XPATH_ERROR = "ER_XPATH_ERROR";
-
-  //BEGIN: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
-  public static final String ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED = "ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED";
-  public static final String ER_RESOLVE_VARIABLE_RETURNS_NULL = "ER_RESOLVE_VARIABLE_RETURNS_NULL";
-  public static final String ER_UNSUPPORTED_RETURN_TYPE = "ER_UNSUPPORTED_RETURN_TYPE";
-  public static final String ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL = "ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL";
-  public static final String ER_ARG_CANNOT_BE_NULL = "ER_ARG_CANNOT_BE_NULL";
-
-  public static final String ER_OBJECT_MODEL_NULL = "ER_OBJECT_MODEL_NULL";
-  public static final String ER_OBJECT_MODEL_EMPTY = "ER_OBJECT_MODEL_EMPTY";
-  public static final String ER_FEATURE_NAME_NULL = "ER_FEATURE_NAME_NULL";
-  public static final String ER_FEATURE_UNKNOWN = "ER_FEATURE_UNKNOWN";
-  public static final String ER_GETTING_NULL_FEATURE = "ER_GETTING_NULL_FEATURE";
-  public static final String ER_GETTING_UNKNOWN_FEATURE = "ER_GETTING_UNKNOWN_FEATURE";
-  public static final String ER_NULL_XPATH_FUNCTION_RESOLVER = "ER_NULL_XPATH_FUNCTION_RESOLVER";
-  public static final String ER_NULL_XPATH_VARIABLE_RESOLVER = "ER_NULL_XPATH_VARIABLE_RESOLVER";
-  //END: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
-
-  public static final String WG_LOCALE_NAME_NOT_HANDLED =
-         "WG_LOCALE_NAME_NOT_HANDLED";
-  public static final String WG_PROPERTY_NOT_SUPPORTED =
-         "WG_PROPERTY_NOT_SUPPORTED";
-  public static final String WG_DONT_DO_ANYTHING_WITH_NS =
-         "WG_DONT_DO_ANYTHING_WITH_NS";
-  public static final String WG_SECURITY_EXCEPTION = "WG_SECURITY_EXCEPTION";
-  public static final String WG_QUO_NO_LONGER_DEFINED =
-         "WG_QUO_NO_LONGER_DEFINED";
-  public static final String WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST =
-         "WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST";
-  public static final String WG_FUNCTION_TOKEN_NOT_FOUND =
-         "WG_FUNCTION_TOKEN_NOT_FOUND";
-  public static final String WG_COULDNOT_FIND_FUNCTION =
-         "WG_COULDNOT_FIND_FUNCTION";
-  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
-  public static final String WG_EXPAND_ENTITIES_NOT_SUPPORTED =
-         "WG_EXPAND_ENTITIES_NOT_SUPPORTED";
-  public static final String WG_ILLEGAL_VARIABLE_REFERENCE =
-         "WG_ILLEGAL_VARIABLE_REFERENCE";
-  public static final String WG_UNSUPPORTED_ENCODING ="WG_UNSUPPORTED_ENCODING";
-
-  /**  detach() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-  /**  num() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-  /**  xstr() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-  /**  str() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-
-  // Error messages...
-
-
-  /**
-   * Get the association list.
-   *
-   * @return The association list.
-   */
-  public Object[][] getContents()
-  {
-    return new Object[][]{
-
-  { "ERROR0000" , "{0}" },
-
-  { ER_CURRENT_NOT_ALLOWED_IN_MATCH, "Funkcija current() v primerjalnem vzorcu ni dovoljena!" },
-
-  { ER_CURRENT_TAKES_NO_ARGS, "Funkcija current() ne sprejema argumentov!" },
-
-  { ER_DOCUMENT_REPLACED,
-      "Implementacija funkcije document() je bila nadome\u0161\u010dena z org.apache.xalan.xslt.FuncDocument!"},
-
-  { ER_CONTEXT_HAS_NO_OWNERDOC,
-      "Kontekst ne vsebuje lastni\u0161kega dokumenta!"},
-
-  { ER_LOCALNAME_HAS_TOO_MANY_ARGS,
-      "local-name() ima preve\u010d argumentov."},
-
-  { ER_NAMESPACEURI_HAS_TOO_MANY_ARGS,
-      "namespace-uri() ima preve\u010d argumentov."},
-
-  { ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS,
-      "normalize-space() ima preve\u010d argumentov."},
-
-  { ER_NUMBER_HAS_TOO_MANY_ARGS,
-      "number() ima preve\u010d argumentov."},
-
-  { ER_NAME_HAS_TOO_MANY_ARGS,
-     "name() ima preve\u010d argumentov."},
-
-  { ER_STRING_HAS_TOO_MANY_ARGS,
-      "string() ima preve\u010d argumentov."},
-
-  { ER_STRINGLENGTH_HAS_TOO_MANY_ARGS,
-      "string-length() ima preve\u010d argumentov."},
-
-  { ER_TRANSLATE_TAKES_3_ARGS,
-      "Funkcija translate() sprejme tri argumente!"},
-
-  { ER_UNPARSEDENTITYURI_TAKES_1_ARG,
-      "Funkcija unparsed-entity-uri bi morala vsebovati en argument!"},
-
-  { ER_NAMESPACEAXIS_NOT_IMPLEMENTED,
-      "Os imenskega prostora \u0161e ni implementirana!"},
-
-  { ER_UNKNOWN_AXIS,
-     "neznana os: {0}"},
-
-  { ER_UNKNOWN_MATCH_OPERATION,
-     "neznana operacija ujemanja!"},
-
-  { ER_INCORRECT_ARG_LENGTH,
-      "Dol\u017eina argumenta pri preskusu vozli\u0161\u010da s processing-instruction() ni pravilna!"},
-
-  { ER_CANT_CONVERT_TO_NUMBER,
-      "{0} ni mogo\u010de pretvoriti v \u0161tevilko"},
-
-  { ER_CANT_CONVERT_TO_NODELIST,
-      "{0} ni mogo\u010de pretvoriti v seznam vozli\u0161\u010d (NodeList)"},
-
-  { ER_CANT_CONVERT_TO_MUTABLENODELIST,
-      "{0} ni mogo\u010de pretvoriti v NodeSetDTM"},
-
-  { ER_CANT_CONVERT_TO_TYPE,
-      "{0} ni mogo\u010de pretvoriti v type#{1}"},
-
-  { ER_EXPECTED_MATCH_PATTERN,
-      "Pri\u010dakovan primerjalni vzorec v getMatchScore!"},
-
-  { ER_COULDNOT_GET_VAR_NAMED,
-      "Nisem na\u0161el predloge z imenom {0}"},
-
-  { ER_UNKNOWN_OPCODE,
-     "NAPAKA! Neznana op. koda: {0}"},
-
-  { ER_EXTRA_ILLEGAL_TOKENS,
-     "Dodatni neveljavni \u017eetoni: {0}"},
-
-
-  { ER_EXPECTED_DOUBLE_QUOTE,
-      "Napa\u010dno postavljena dobesedna navedba... pri\u010dakovani dvojni narekovaji!"},
-
-  { ER_EXPECTED_SINGLE_QUOTE,
-      "Napa\u010dno postavljena dobesedna navedba... pri\u010dakovani enojni narekovaji!"},
-
-  { ER_EMPTY_EXPRESSION,
-     "Prazen izraz!"},
-
-  { ER_EXPECTED_BUT_FOUND,
-     "Pri\u010dakovano {0}, najdeno: {1}"},
-
-  { ER_INCORRECT_PROGRAMMER_ASSERTION,
-      "Programerjeva predpostavka ni pravilna! - {0}"},
-
-  { ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL,
-      "Argument logi\u010dne vrednosti(...) ni ve\u010d izbiren z osnutkom 19990709 XPath."},
-
-  { ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG,
-      "Najdeno ',' vendar ni predhodnih argumentov!"},
-
-  { ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG,
-      "Najdeno ',' vendar ni slede\u010dih argumentov!"},
-
-  { ER_PREDICATE_ILLEGAL_SYNTAX,
-      "'..[predicate]' ali '.[predicate]' je neveljavna sintaksa.  Namesto tega uporabite 'self::node()[predicate]'."},
-
-  { ER_ILLEGAL_AXIS_NAME,
-     "Neveljavno ime osi: {0}"},
-
-  { ER_UNKNOWN_NODETYPE,
-     "Neveljavni tip vozli\u0161\u010da: {0}"},
-
-  { ER_PATTERN_LITERAL_NEEDS_BE_QUOTED,
-      "Navedek vzorca ({0}) mora biti v navednicah!"},
-
-  { ER_COULDNOT_BE_FORMATTED_TO_NUMBER,
-      "{0} ni mogo\u010de oblikovati v \u0161tevilko!"},
-
-  { ER_COULDNOT_CREATE_XMLPROCESSORLIAISON,
-      "Ne morem ustvariti zveze XML TransformerFactory: {0}"},
-
-  { ER_DIDNOT_FIND_XPATH_SELECT_EXP,
-      "Napaka! Ne najdem izbirnega izraza xpath (-select)."},
-
-  { ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH,
-      "NAPAKA! Ne najdem ENDOP po OP_LOCATIONPATH"},
-
-  { ER_ERROR_OCCURED,
-     "Pri\u0161lo je do napake!"},
-
-  { ER_ILLEGAL_VARIABLE_REFERENCE,
-      "Dani VariableReference je izven konteksta ali brez definicije!  Ime = {0}"},
-
-  { ER_AXES_NOT_ALLOWED,
-      "V primerjalnih vzorcih so dovoljene samo osi podrejenega:: in atributa::!  Sporne osi = {0}"},
-
-  { ER_KEY_HAS_TOO_MANY_ARGS,
-      "key()ima nepravilno \u0161tevilo argumentov."},
-
-  { ER_COUNT_TAKES_1_ARG,
-      "\u0160tevna funkcija zahteva en argument!"},
-
-  { ER_COULDNOT_FIND_FUNCTION,
-     "Ne najdem funkcije: {0}"},
-
-  { ER_UNSUPPORTED_ENCODING,
-     "Nepodprto kodiranje: {0}"},
-
-  { ER_PROBLEM_IN_DTM_NEXTSIBLING,
-      "Pri\u0161lo je do te\u017eave v DTM pri getNextSibling... poskus obnovitve"},
-
-  { ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL,
-      "Programerska napaka: pisanje v EmptyNodeList ni mogo\u010de."},
-
-  { ER_SETDOMFACTORY_NOT_SUPPORTED,
-      "setDOMFactory v XPathContext ni podprt!"},
-
-  { ER_PREFIX_MUST_RESOLVE,
-      "Predpona se mora razre\u0161iti v imenski prostor: {0}"},
-
-  { ER_PARSE_NOT_SUPPORTED,
-      "Raz\u010dlenitev (vir InputSource) v XPathContext ni podprta! Ne morem odpreti {0}"},
-
-  { ER_SAX_API_NOT_HANDLED,
-      "Znaki SAX API(znaka ch[]... ne obravnava DTM!"},
-
-  { ER_IGNORABLE_WHITESPACE_NOT_HANDLED,
-      "ignorableWhitespace(znaka ch[]... ne obravnava DTM!"},
-
-  { ER_DTM_CANNOT_HANDLE_NODES,
-      "DTMLiaison ne more upravljati z vozli\u0161\u010di tipa {0}"},
-
-  { ER_XERCES_CANNOT_HANDLE_NODES,
-      "DOM2Helper ne more upravljati z vozli\u0161\u010di tipa {0}"},
-
-  { ER_XERCES_PARSE_ERROR_DETAILS,
-      "Napaka DOM2Helper.parse: ID sistema - {0} vrstica - {1}"},
-
-  { ER_XERCES_PARSE_ERROR,
-     "Napaka DOM2Helper.parse"},
-
-  { ER_INVALID_UTF16_SURROGATE,
-      "Zaznan neveljaven nadomestek UTF-16: {0} ?"},
-
-  { ER_OIERROR,
-     "Napaka V/I"},
-
-  { ER_CANNOT_CREATE_URL,
-     "Ne morem ustvariti naslova URL za: {0}"},
-
-  { ER_XPATH_READOBJECT,
-     "V XPath.readObject: {0}"},
-
-  { ER_FUNCTION_TOKEN_NOT_FOUND,
-      "ne najdem \u017eetona funkcije."},
-
-  { ER_CANNOT_DEAL_XPATH_TYPE,
-       "Ne morem ravnati z tipom XPath: {0}"},
-
-  { ER_NODESET_NOT_MUTABLE,
-       "Ta NodeSet ni spremenljiv"},
-
-  { ER_NODESETDTM_NOT_MUTABLE,
-       "Ta NodeSetDTM ni spremenljiv"},
-
-  { ER_VAR_NOT_RESOLVABLE,
-        "Spremenljivka ni razre\u0161ljiva: {0}"},
-
-  { ER_NULL_ERROR_HANDLER,
-        "Program za obravnavo napak NULL"},
-
-  { ER_PROG_ASSERT_UNKNOWN_OPCODE,
-       "Programerjeva izjava: neznana opkoda: {0}"},
-
-  { ER_ZERO_OR_ONE,
-       "0 ali 1"},
-
-  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-       "XRTreeFragSelectWrapper ne podpira rtf()"},
-
-  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-       "XRTreeFragSelectWrapper ne podpira asNodeIterator()"},
-
-   { ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper ne podpira detach()"},
-
-   { ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper ne podpira num()"},
-
-   { ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper ne podpira xstr()"},
-
-   { ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper ne podpira str()"},
-
-  { ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS,
-       "fsb() ni podprt za XStringForChars"},
-
-  { ER_COULD_NOT_FIND_VAR,
-      "Spremenljivke z imenom {0} ni mogo\u010de najti"},
-
-  { ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING,
-      "XStringForChars ne more uporabiti niza za argument"},
-
-  { ER_FASTSTRINGBUFFER_CANNOT_BE_NULL,
-      "Argument FastStringBuffer ne more biti NULL"},
-
-  { ER_TWO_OR_THREE,
-       "2 ali 3"},
-
-  { ER_VARIABLE_ACCESSED_BEFORE_BIND,
-       "Spremenljivka uporabljena \u0161e pred njeno vezavo!"},
-
-  { ER_FSB_CANNOT_TAKE_STRING,
-       "XStringForFSB ne more uporabiti niza za argument!"},
-
-  { ER_SETTING_WALKER_ROOT_TO_NULL,
-       "\n !!!! Napaka! Koren sprehajalca nastavljam na NULL!!!"},
-
-  { ER_NODESETDTM_CANNOT_ITERATE,
-       "Tega NodeSetDTM ni mogo\u010de ponavljati do prej\u0161njega vozli\u0161\u010da!"},
-
-  { ER_NODESET_CANNOT_ITERATE,
-       "Tega NodeSet ni mogo\u010de ponavljati do prej\u0161njega vozli\u0161\u010da!"},
-
-  { ER_NODESETDTM_CANNOT_INDEX,
-       "Ta NodeSetDTM ne more opravljati funkcij priprave kazala ali \u0161tetja!"},
-
-  { ER_NODESET_CANNOT_INDEX,
-       "Ta NodeSet ne more opravljati funkcij priprave kazala ali \u0161tetja!"},
-
-  { ER_CANNOT_CALL_SETSHOULDCACHENODE,
-       "Za klicem nextNode klic setShouldCacheNodes ni mogo\u010d!"},
-
-  { ER_ONLY_ALLOWS,
-       "{0} dovoljuje samo argumente {1}"},
-
-  { ER_UNKNOWN_STEP,
-       "Programerjeva izjava v getNextStepPos: neznan stepType: {0}"},
-
-  //Note to translators:  A relative location path is a form of XPath expression.
-  // The message indicates that such an expression was expected following the
-  // characters '/' or '//', but was not found.
-  { ER_EXPECTED_REL_LOC_PATH,
-      "Za \u017eetonom '/' ali '//' je pri\u010dakovana relativna pot do mesta."},
-
-  // Note to translators:  A location path is a form of XPath expression.
-  // The message indicates that syntactically such an expression was expected,but
-  // the characters specified by the substitution text were encountered instead.
-  { ER_EXPECTED_LOC_PATH,
-       "Pri\u010dakovana pot do lokacije, na\u0161jden pa je naslednji \u017eeton\u003a  {0}"},
-
-  // Note to translators:  A location path is a form of XPath expression.
-  // The message indicates that syntactically such a subexpression was expected,
-  // but no more characters were found in the expression.
-  { ER_EXPECTED_LOC_PATH_AT_END_EXPR,
-       "Namesto pri\u010dakovane poti do lokacije je najden konec izraza XPath."},
-
-  // Note to translators:  A location step is part of an XPath expression.
-  // The message indicates that syntactically such an expression was expected
-  // following the specified characters.
-  { ER_EXPECTED_LOC_STEP,
-       "Za \u017eetonom '/' ali '//' je pri\u010dakovan korak mesta."},
-
-  // Note to translators:  A node test is part of an XPath expression that is
-  // used to test for particular kinds of nodes.  In this case, a node test that
-  // consists of an NCName followed by a colon and an asterisk or that consists
-  // of a QName was expected, but was not found.
-  { ER_EXPECTED_NODE_TEST,
-       "Pri\u010dakovan preskus vozli\u0161\u010da, ki ustreza NCImenu:* ali QImenu."},
-
-  // Note to translators:  A step pattern is part of an XPath expression.
-  // The message indicates that syntactically such an expression was expected,
-  // but the specified character was found in the expression instead.
-  { ER_EXPECTED_STEP_PATTERN,
-       "Pri\u010dakovan stopnjevalni vzorec, najden pa je '/'."},
-
-  // Note to translators: A relative path pattern is part of an XPath expression.
-  // The message indicates that syntactically such an expression was expected,
-  // but was not found.
-  { ER_EXPECTED_REL_PATH_PATTERN,
-       "Pri\u010dakovan vzorec z relativno potjo."},
-
-  // Note to translators:  The substitution text is the name of a data type.  The
-  // message indicates that a value of a particular type could not be converted
-  // to a value of type boolean.
-  { ER_CANT_CONVERT_TO_BOOLEAN,
-       "XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogoe\u010de pretvoriti v boolovo vrednost."},
-
-  // Note to translators: Do not translate ANY_UNORDERED_NODE_TYPE and
-  // FIRST_ORDERED_NODE_TYPE.
-  { ER_CANT_CONVERT_TO_SINGLENODE,
-       "XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de pretvoriti v eno vozli\u0161\u010de. Metoda getSingleNodeValue velja samo za tipa ANY_UNORDERED_NODE_TYPE in FIRST_ORDERED_NODE_TYPE."},
-
-  // Note to translators: Do not translate UNORDERED_NODE_SNAPSHOT_TYPE and
-  // ORDERED_NODE_SNAPSHOT_TYPE.
-  { ER_CANT_GET_SNAPSHOT_LENGTH,
-       "Metoda getSnapshotLength ne more biti priklicana za XPathResult izraza XPath ''{0}'', ker je tip XPathResultType {1}. Ta metoda se nana\u0161a samo na tipa UNORDERED_NODE_SNAPSHOT_TYPE in ORDERED_NODE_SNAPSHOT_TYPE."},
-
-  { ER_NON_ITERATOR_TYPE,
-       "Metoda iterateNext ne more biti priklicana za XPathResult izraza XPath ''{0}'', ker je tip XPathResultType {1}. Ta metoda se nana\u0161a samo na tipa UNORDERED_NODE_ITERATOR_TYPE in ORDERED_NODE_ITERATOR_TYPE."},
-
-  // Note to translators: This message indicates that the document being operated
-  // upon changed, so the iterator object that was being used to traverse the
-  // document has now become invalid.
-  { ER_DOC_MUTATED,
-       "Dokument se je spremenil po vrnitvi rezultatov. Iterator je neveljaven."},
-
-  { ER_INVALID_XPATH_TYPE,
-       "Neveljaven argument tipa XPath: {0}"},
-
-  { ER_EMPTY_XPATH_RESULT,
-       "Prazen objekt rezultatov XPath"},
-
-  { ER_INCOMPATIBLE_TYPES,
-       "Rezultat XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de prisiliti v dolo\u010den tip XPathResultType {2}."},
-
-  { ER_NULL_RESOLVER,
-       "Predpone ni bilo mogo\u010de razre\u0161iti z razre\u0161evalnikom predpon NULL."},
-
-  // Note to translators:  The substitution text is the name of a data type.  The
-  // message indicates that a value of a particular type could not be converted
-  // to a value of type string.
-  { ER_CANT_CONVERT_TO_STRING,
-       "Rezultat XPathResult izraza XPath''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de pretvoriti v niz."},
-
-  // Note to translators: Do not translate snapshotItem,
-  // UNORDERED_NODE_SNAPSHOT_TYPE and ORDERED_NODE_SNAPSHOT_TYPE.
-  { ER_NON_SNAPSHOT_TYPE,
-       "Metoda snapshotItem ne more biti priklicana za XPathResult izraza XPath ''{0}'', ker je tip XPathResultType {1}. Ta metoda se nana\u0161a samo na tipa UNORDERED_NODE_SNAPSHOT_TYPE in ORDERED_NODE_SNAPSHOT_TYPE."},
-
-  // Note to translators:  XPathEvaluator is a Java interface name.  An
-  // XPathEvaluator is created with respect to a particular XML document, and in
-  // this case the expression represented by this object was being evaluated with
-  // respect to a context node from a different document.
-  { ER_WRONG_DOCUMENT,
-       "Kontekstno vozli\u0161\u010de ne pripada dokumentu, povezanem s tem XPathEvaluator."},
-
-  // Note to translators:  The XPath expression cannot be evaluated with respect
-  // to this type of node.
-  { ER_WRONG_NODETYPE,
-       "Tip kontekstnega vozli\u0161\u010da ni podprt."},
-
-  { ER_XPATH_ERROR,
-       "Neznana napaka v XPath."},
-
-        { ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER,
-                "XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de pretvoriti v \u0161tevilko."},
-
-  //BEGIN:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
-
-  /** Field ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED                       */
-
-  { ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED,
-       "Raz\u0161iritvene funkcije: ''{0}'' ni mogo\u010de priklicati, kadar je zna\u010dilnost XMLConstants.FEATURE_SECURE_PROCESSING nastavljena na True."},
-
-  /** Field ER_RESOLVE_VARIABLE_RETURNS_NULL                       */
-
-  { ER_RESOLVE_VARIABLE_RETURNS_NULL,
-       "Funkcija resolveVariable za spremenljivko {0} vra\u010da rezultat ni\u010d"},
-
-  /** Field ER_UNSUPPORTED_RETURN_TYPE                       */
-
-  { ER_UNSUPPORTED_RETURN_TYPE,
-       "Nepodprt tip vrnitve : {0}"},
-
-  /** Field ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL                       */
-
-  { ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL,
-       "Vir in/ali Tip vrnitve ne moreta biti ni\u010d"},
-
-  /** Field ER_ARG_CANNOT_BE_NULL                       */
-
-  { ER_ARG_CANNOT_BE_NULL,
-       "Argument {0} ne more biti ni\u010d"},
-
-  /** Field ER_OBJECT_MODEL_NULL                       */
-
-  { ER_OBJECT_MODEL_NULL,
-       "Funkcije {0}#isObjectModelSupported( String objectModel ) ni mogo\u010de priklicati, kadar je objectModel == null"},
-
-  /** Field ER_OBJECT_MODEL_EMPTY                       */
-
-  { ER_OBJECT_MODEL_EMPTY,
-       "Funkcije {0}#isObjectModelSupported( String objectModel ) ni mogo\u010de priklicati, kadar je objectModel == \"\""},
-
-  /** Field ER_OBJECT_MODEL_EMPTY                       */
-
-  { ER_FEATURE_NAME_NULL,
-       "Poskus nastavitve funkcije brez imena (null name): {0}#setFeature( null, {1})"},
-
-  /** Field ER_FEATURE_UNKNOWN                       */
-
-  { ER_FEATURE_UNKNOWN,
-       "Poskus nastavitve neznane funkcije \"{0}\":{1}#setFeature({0},{2})"},
-
-  /** Field ER_GETTING_NULL_FEATURE                       */
-
-  { ER_GETTING_NULL_FEATURE,
-       "Poskus pridobitve funkcije brez imena (null name): {0}#getFeature(null)"},
-
-  /** Field ER_GETTING_NULL_FEATURE                       */
-
-  { ER_GETTING_UNKNOWN_FEATURE,
-       "Poskus pridobitve neznane funkcije \"{0}\":{1}#getFeature({0})"},
-
-  /** Field ER_NULL_XPATH_FUNCTION_RESOLVER                       */
-
-  { ER_NULL_XPATH_FUNCTION_RESOLVER,
-       "Poskus nastavitve XPathFunctionResolver na ni\u010d:{0}#setXPathFunctionResolver(null)"},
-
-  /** Field ER_NULL_XPATH_VARIABLE_RESOLVER                       */
-
-  { ER_NULL_XPATH_VARIABLE_RESOLVER,
-       "Poskus nastavitve funkcije XPathVariableResolver na ni\u010d:{0}#setXPathVariableResolver(null)"},
-
-  //END:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
-
-  // Warnings...
-
-  { WG_LOCALE_NAME_NOT_HANDLED,
-      "Podro\u010dno ime v funkciji za oblikovanje \u0161tevilk \u0161e ni podprto!"},
-
-  { WG_PROPERTY_NOT_SUPPORTED,
-      "Lastnost XSL ni podprta: {0}"},
-
-  { WG_DONT_DO_ANYTHING_WITH_NS,
-      "V tem trenutku ne po\u010dnite ni\u010desar z imenskim prostorom {0} v lastnosti: {1}"},
-
-  { WG_SECURITY_EXCEPTION,
-      "Pri\u0161lo je do SecurityException (varnostna izjema) pri poskusu dostopa do sistemske lastnosti XSL: {0}"},
-
-  { WG_QUO_NO_LONGER_DEFINED,
-      "Stara sintaksa: quo(...) v XPath ni ve\u010d definiran."},
-
-  { WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST,
-      "XPath potrebuje izpeljani objekt za implementacijo nodeTest!"},
-
-  { WG_FUNCTION_TOKEN_NOT_FOUND,
-      "ne najdem \u017eetona funkcije."},
-
-  { WG_COULDNOT_FIND_FUNCTION,
-      "Ne najdem funkcije: {0}"},
-
-  { WG_CANNOT_MAKE_URL_FROM,
-      "Ne morem narediti naslova URL iz: {0}"},
-
-  { WG_EXPAND_ENTITIES_NOT_SUPPORTED,
-      "Mo\u017enost -E za raz\u010dlenjevalnik DTM ni podprta."},
-
-  { WG_ILLEGAL_VARIABLE_REFERENCE,
-      "Dani VariableReference je izven konteksta ali brez definicije!  Ime = {0}"},
-
-  { WG_UNSUPPORTED_ENCODING,
-     "Nepodprto kodiranje: {0}"},
-
-
-
-  // Other miscellaneous text used inside the code...
-  { "ui_language", "sl"},
-  { "help_language", "sl"},
-  { "language", "sl"},
-  { "BAD_CODE", "Parameter za createMessage presega meje"},
-  { "FORMAT_FAILED", "Med klicem je messageFormat naletel na izjemo"},
-  { "version", ">>>>>>> Razli\u010dica Xalan "},
-  { "version2", "<<<<<<<"},
-  { "yes", "da"},
-  { "line", "Vrstica #"},
-  { "column", "Stolpec #"},
-  { "xsldone", "XSLProcessor: dokon\u010dano"},
-  { "xpath_option", "Mo\u017enosti xpath: "},
-  { "optionIN", "   [-in inputXMLURL]"},
-  { "optionSelect", "   [-select izraz xpath]"},
-  { "optionMatch", "   [-match primerjalni vzorec (za diagnostiko ujemanja)]"},
-  { "optionAnyExpr", "Ali pa bo samo izraz xpath izvedel diagnosti\u010dni izvoz podatkov"},
-  { "noParsermsg1", "Postopek XSL ni uspel."},
-  { "noParsermsg2", "** Nisem na\u0161el raz\u010dlenjevalnika **"},
-  { "noParsermsg3", "Preverite pot razreda."},
-  { "noParsermsg4", "\u010ce nimate IBM raz\u010dlenjevalnika za Javo, ga lahko prenesete iz"},
-  { "noParsermsg5", "IBM AlphaWorks: http://www.alphaworks.ibm.com/formula/xml"},
-  { "gtone", ">1" },
-  { "zero", "0" },
-  { "one", "1" },
-  { "two" , "2" },
-  { "three", "3" }
-
-  };
-  }
-
-
-  // ================= INFRASTRUCTURE ======================
-
-  /** Field BAD_CODE          */
-  public static final String BAD_CODE = "BAD_CODE";
-
-  /** Field FORMAT_FAILED          */
-  public static final String FORMAT_FAILED = "FORMAT_FAILED";
-
-  /** Field ERROR_RESOURCES          */
-  public static final String ERROR_RESOURCES =
-    "org.apache.xpath.res.XPATHErrorResources";
-
-  /** Field ERROR_STRING          */
-  public static final String ERROR_STRING = "#error";
-
-  /** Field ERROR_HEADER          */
-  public static final String ERROR_HEADER = "Napaka: ";
-
-  /** Field WARNING_HEADER          */
-  public static final String WARNING_HEADER = "Opozorilo: ";
-
-  /** Field XSL_HEADER          */
-  public static final String XSL_HEADER = "XSL ";
-
-  /** Field XML_HEADER          */
-  public static final String XML_HEADER = "XML ";
-
-  /** Field QUERY_HEADER          */
-  public static final String QUERY_HEADER = "VZOREC ";
-
-
-  /**
-   * Return a named ResourceBundle for a particular locale.  This method mimics the behavior
-   * of ResourceBundle.getBundle().
-   *
-   * @param className Name of local-specific subclass.
-   * @return the ResourceBundle
-   * @throws MissingResourceException
-   */
-  public static final XPATHErrorResources loadResourceBundle(String className)
-          throws MissingResourceException
-  {
-
-    Locale locale = Locale.getDefault();
-    String suffix = getResourceSuffix(locale);
-
-    try
-    {
-
-      // first try with the given locale
-      return (XPATHErrorResources) ResourceBundle.getBundle(className
-              + suffix, locale);
-    }
-    catch (MissingResourceException e)
-    {
-      try  // try to fall back to en_US if we can't load
-      {
-
-        // Since we can't find the localized property file,
-        // fall back to en_US.
-        return (XPATHErrorResources) ResourceBundle.getBundle(className,
-                new Locale("sl", "SL"));
-      }
-      catch (MissingResourceException e2)
-      {
-
-        // Now we are really in trouble.
-        // very bad, definitely very bad...not going to get very far
-        throw new MissingResourceException(
-          "Could not load any resource bundles.", className, "");
-      }
-    }
-  }
-
-  /**
-   * Return the resource file suffic for the indicated locale
-   * For most locales, this will be based the language code.  However
-   * for Chinese, we do distinguish between Taiwan and PRC
-   *
-   * @param locale the locale
-   * @return an String suffix which canbe appended to a resource name
-   */
-  private static final String getResourceSuffix(Locale locale)
-  {
-
-    String suffix = "_" + locale.getLanguage();
-    String country = locale.getCountry();
-
-    if (country.equals("TW"))
-      suffix += "_" + country;
-
-    return suffix;
-  }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+
+package org.apache.xpath.res;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Set up error messages.
+ * We build a two dimensional array of message keys and
+ * message strings. In order to add a new message here,
+ * you need to first add a Static string constant for the
+ * Key and update the contents array with Key, Value pair
+  * Also you need to  update the count of messages(MAX_CODE)or
+ * the count of warnings(MAX_WARNING) [ Information purpose only]
+ * @xsl.usage advanced
+ */
+public class XPATHErrorResources_sl extends ListResourceBundle
+{
+
+/*
+ * General notes to translators:
+ *
+ * This file contains error and warning messages related to XPath Error
+ * Handling.
+ *
+ *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
+ *     components.
+ *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *     XSLTC is an acronym for XSLT Compiler.
+ *
+ *  2) A stylesheet is a description of how to transform an input XML document
+ *     into a resultant XML document (or HTML document or text).  The
+ *     stylesheet itself is described in the form of an XML document.
+ *
+ *  3) A template is a component of a stylesheet that is used to match a
+ *     particular portion of an input document and specifies the form of the
+ *     corresponding portion of the output document.
+ *
+ *  4) An element is a mark-up tag in an XML document; an attribute is a
+ *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *     "elem" is an element name, "attr" and "attr2" are attribute names with
+ *     the values "val" and "val2", respectively.
+ *
+ *  5) A namespace declaration is a special attribute that is used to associate
+ *     a prefix with a URI (the namespace).  The meanings of element names and
+ *     attribute names that use that prefix are defined with respect to that
+ *     namespace.
+ *
+ *  6) "Translet" is an invented term that describes the class file that
+ *     results from compiling an XML stylesheet into a Java class.
+ *
+ *  7) XPath is a specification that describes a notation for identifying
+ *     nodes in a tree-structured representation of an XML document.  An
+ *     instance of that notation is referred to as an XPath expression.
+ *
+ *  8) The context node is the node in the document with respect to which an
+ *     XPath expression is being evaluated.
+ *
+ *  9) An iterator is an object that traverses nodes in the tree, one at a time.
+ *
+ *  10) NCName is an XML term used to describe a name that does not contain a
+ *     colon (a "no-colon name").
+ *
+ *  11) QName is an XML term meaning "qualified name".
+ */
+
+  /*
+   * static variables
+   */
+  public static final String ERROR0000 = "ERROR0000";
+  public static final String ER_CURRENT_NOT_ALLOWED_IN_MATCH =
+         "ER_CURRENT_NOT_ALLOWED_IN_MATCH";
+  public static final String ER_CURRENT_TAKES_NO_ARGS =
+         "ER_CURRENT_TAKES_NO_ARGS";
+  public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
+  public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
+         "ER_CONTEXT_HAS_NO_OWNERDOC";
+  public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
+         "ER_LOCALNAME_HAS_TOO_MANY_ARGS";
+  public static final String ER_NAMESPACEURI_HAS_TOO_MANY_ARGS =
+         "ER_NAMESPACEURI_HAS_TOO_MANY_ARGS";
+  public static final String ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS =
+         "ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS";
+  public static final String ER_NUMBER_HAS_TOO_MANY_ARGS =
+         "ER_NUMBER_HAS_TOO_MANY_ARGS";
+  public static final String ER_NAME_HAS_TOO_MANY_ARGS =
+         "ER_NAME_HAS_TOO_MANY_ARGS";
+  public static final String ER_STRING_HAS_TOO_MANY_ARGS =
+         "ER_STRING_HAS_TOO_MANY_ARGS";
+  public static final String ER_STRINGLENGTH_HAS_TOO_MANY_ARGS =
+         "ER_STRINGLENGTH_HAS_TOO_MANY_ARGS";
+  public static final String ER_TRANSLATE_TAKES_3_ARGS =
+         "ER_TRANSLATE_TAKES_3_ARGS";
+  public static final String ER_UNPARSEDENTITYURI_TAKES_1_ARG =
+         "ER_UNPARSEDENTITYURI_TAKES_1_ARG";
+  public static final String ER_NAMESPACEAXIS_NOT_IMPLEMENTED =
+         "ER_NAMESPACEAXIS_NOT_IMPLEMENTED";
+  public static final String ER_UNKNOWN_AXIS = "ER_UNKNOWN_AXIS";
+  public static final String ER_UNKNOWN_MATCH_OPERATION =
+         "ER_UNKNOWN_MATCH_OPERATION";
+  public static final String ER_INCORRECT_ARG_LENGTH ="ER_INCORRECT_ARG_LENGTH";
+  public static final String ER_CANT_CONVERT_TO_NUMBER =
+         "ER_CANT_CONVERT_TO_NUMBER";
+  public static final String ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER =
+           "ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER";
+  public static final String ER_CANT_CONVERT_TO_NODELIST =
+         "ER_CANT_CONVERT_TO_NODELIST";
+  public static final String ER_CANT_CONVERT_TO_MUTABLENODELIST =
+         "ER_CANT_CONVERT_TO_MUTABLENODELIST";
+  public static final String ER_CANT_CONVERT_TO_TYPE ="ER_CANT_CONVERT_TO_TYPE";
+  public static final String ER_EXPECTED_MATCH_PATTERN =
+         "ER_EXPECTED_MATCH_PATTERN";
+  public static final String ER_COULDNOT_GET_VAR_NAMED =
+         "ER_COULDNOT_GET_VAR_NAMED";
+  public static final String ER_UNKNOWN_OPCODE = "ER_UNKNOWN_OPCODE";
+  public static final String ER_EXTRA_ILLEGAL_TOKENS ="ER_EXTRA_ILLEGAL_TOKENS";
+  public static final String ER_EXPECTED_DOUBLE_QUOTE =
+         "ER_EXPECTED_DOUBLE_QUOTE";
+  public static final String ER_EXPECTED_SINGLE_QUOTE =
+         "ER_EXPECTED_SINGLE_QUOTE";
+  public static final String ER_EMPTY_EXPRESSION = "ER_EMPTY_EXPRESSION";
+  public static final String ER_EXPECTED_BUT_FOUND = "ER_EXPECTED_BUT_FOUND";
+  public static final String ER_INCORRECT_PROGRAMMER_ASSERTION =
+         "ER_INCORRECT_PROGRAMMER_ASSERTION";
+  public static final String ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL =
+         "ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL";
+  public static final String ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG =
+         "ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG";
+  public static final String ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG =
+         "ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG";
+  public static final String ER_PREDICATE_ILLEGAL_SYNTAX =
+         "ER_PREDICATE_ILLEGAL_SYNTAX";
+  public static final String ER_ILLEGAL_AXIS_NAME = "ER_ILLEGAL_AXIS_NAME";
+  public static final String ER_UNKNOWN_NODETYPE = "ER_UNKNOWN_NODETYPE";
+  public static final String ER_PATTERN_LITERAL_NEEDS_BE_QUOTED =
+         "ER_PATTERN_LITERAL_NEEDS_BE_QUOTED";
+  public static final String ER_COULDNOT_BE_FORMATTED_TO_NUMBER =
+         "ER_COULDNOT_BE_FORMATTED_TO_NUMBER";
+  public static final String ER_COULDNOT_CREATE_XMLPROCESSORLIAISON =
+         "ER_COULDNOT_CREATE_XMLPROCESSORLIAISON";
+  public static final String ER_DIDNOT_FIND_XPATH_SELECT_EXP =
+         "ER_DIDNOT_FIND_XPATH_SELECT_EXP";
+  public static final String ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH =
+         "ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH";
+  public static final String ER_ERROR_OCCURED = "ER_ERROR_OCCURED";
+  public static final String ER_ILLEGAL_VARIABLE_REFERENCE =
+         "ER_ILLEGAL_VARIABLE_REFERENCE";
+  public static final String ER_AXES_NOT_ALLOWED = "ER_AXES_NOT_ALLOWED";
+  public static final String ER_KEY_HAS_TOO_MANY_ARGS =
+         "ER_KEY_HAS_TOO_MANY_ARGS";
+  public static final String ER_COUNT_TAKES_1_ARG = "ER_COUNT_TAKES_1_ARG";
+  public static final String ER_COULDNOT_FIND_FUNCTION =
+         "ER_COULDNOT_FIND_FUNCTION";
+  public static final String ER_UNSUPPORTED_ENCODING ="ER_UNSUPPORTED_ENCODING";
+  public static final String ER_PROBLEM_IN_DTM_NEXTSIBLING =
+         "ER_PROBLEM_IN_DTM_NEXTSIBLING";
+  public static final String ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL =
+         "ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL";
+  public static final String ER_SETDOMFACTORY_NOT_SUPPORTED =
+         "ER_SETDOMFACTORY_NOT_SUPPORTED";
+  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
+  public static final String ER_PARSE_NOT_SUPPORTED = "ER_PARSE_NOT_SUPPORTED";
+  public static final String ER_SAX_API_NOT_HANDLED = "ER_SAX_API_NOT_HANDLED";
+public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
+         "ER_IGNORABLE_WHITESPACE_NOT_HANDLED";
+  public static final String ER_DTM_CANNOT_HANDLE_NODES =
+         "ER_DTM_CANNOT_HANDLE_NODES";
+  public static final String ER_XERCES_CANNOT_HANDLE_NODES =
+         "ER_XERCES_CANNOT_HANDLE_NODES";
+  public static final String ER_XERCES_PARSE_ERROR_DETAILS =
+         "ER_XERCES_PARSE_ERROR_DETAILS";
+  public static final String ER_XERCES_PARSE_ERROR = "ER_XERCES_PARSE_ERROR";
+  public static final String ER_INVALID_UTF16_SURROGATE =
+         "ER_INVALID_UTF16_SURROGATE";
+  public static final String ER_OIERROR = "ER_OIERROR";
+  public static final String ER_CANNOT_CREATE_URL = "ER_CANNOT_CREATE_URL";
+  public static final String ER_XPATH_READOBJECT = "ER_XPATH_READOBJECT";
+ public static final String ER_FUNCTION_TOKEN_NOT_FOUND =
+         "ER_FUNCTION_TOKEN_NOT_FOUND";
+  public static final String ER_CANNOT_DEAL_XPATH_TYPE =
+         "ER_CANNOT_DEAL_XPATH_TYPE";
+  public static final String ER_NODESET_NOT_MUTABLE = "ER_NODESET_NOT_MUTABLE";
+  public static final String ER_NODESETDTM_NOT_MUTABLE =
+         "ER_NODESETDTM_NOT_MUTABLE";
+   /**  Variable not resolvable:   */
+  public static final String ER_VAR_NOT_RESOLVABLE = "ER_VAR_NOT_RESOLVABLE";
+   /** Null error handler  */
+ public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
+   /**  Programmer's assertion: unknown opcode  */
+  public static final String ER_PROG_ASSERT_UNKNOWN_OPCODE =
+         "ER_PROG_ASSERT_UNKNOWN_OPCODE";
+   /**  0 or 1   */
+  public static final String ER_ZERO_OR_ONE = "ER_ZERO_OR_ONE";
+   /**  rtf() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+   /**  asNodeIterator() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER = "ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+   /**  fsb() not supported for XStringForChars   */
+  public static final String ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS =
+         "ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS";
+   /**  Could not find variable with the name of   */
+ public static final String ER_COULD_NOT_FIND_VAR = "ER_COULD_NOT_FIND_VAR";
+   /**  XStringForChars can not take a string for an argument   */
+ public static final String ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING =
+         "ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING";
+   /**  The FastStringBuffer argument can not be null   */
+ public static final String ER_FASTSTRINGBUFFER_CANNOT_BE_NULL =
+         "ER_FASTSTRINGBUFFER_CANNOT_BE_NULL";
+   /**  2 or 3   */
+  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
+   /** Variable accessed before it is bound! */
+  public static final String ER_VARIABLE_ACCESSED_BEFORE_BIND =
+         "ER_VARIABLE_ACCESSED_BEFORE_BIND";
+   /** XStringForFSB can not take a string for an argument! */
+ public static final String ER_FSB_CANNOT_TAKE_STRING =
+         "ER_FSB_CANNOT_TAKE_STRING";
+   /** Error! Setting the root of a walker to null! */
+  public static final String ER_SETTING_WALKER_ROOT_TO_NULL =
+         "ER_SETTING_WALKER_ROOT_TO_NULL";
+   /** This NodeSetDTM can not iterate to a previous node! */
+  public static final String ER_NODESETDTM_CANNOT_ITERATE =
+         "ER_NODESETDTM_CANNOT_ITERATE";
+  /** This NodeSet can not iterate to a previous node! */
+ public static final String ER_NODESET_CANNOT_ITERATE =
+         "ER_NODESET_CANNOT_ITERATE";
+  /** This NodeSetDTM can not do indexing or counting functions! */
+  public static final String ER_NODESETDTM_CANNOT_INDEX =
+         "ER_NODESETDTM_CANNOT_INDEX";
+  /** This NodeSet can not do indexing or counting functions! */
+  public static final String ER_NODESET_CANNOT_INDEX =
+         "ER_NODESET_CANNOT_INDEX";
+  /** Can not call setShouldCacheNodes after nextNode has been called! */
+  public static final String ER_CANNOT_CALL_SETSHOULDCACHENODE =
+         "ER_CANNOT_CALL_SETSHOULDCACHENODE";
+  /** {0} only allows {1} arguments */
+ public static final String ER_ONLY_ALLOWS = "ER_ONLY_ALLOWS";
+  /** Programmer's assertion in getNextStepPos: unknown stepType: {0} */
+  public static final String ER_UNKNOWN_STEP = "ER_UNKNOWN_STEP";
+  /** Problem with RelativeLocationPath */
+  public static final String ER_EXPECTED_REL_LOC_PATH =
+         "ER_EXPECTED_REL_LOC_PATH";
+  /** Problem with LocationPath */
+  public static final String ER_EXPECTED_LOC_PATH = "ER_EXPECTED_LOC_PATH";
+  public static final String ER_EXPECTED_LOC_PATH_AT_END_EXPR =
+                                        "ER_EXPECTED_LOC_PATH_AT_END_EXPR";
+  /** Problem with Step */
+  public static final String ER_EXPECTED_LOC_STEP = "ER_EXPECTED_LOC_STEP";
+  /** Problem with NodeTest */
+  public static final String ER_EXPECTED_NODE_TEST = "ER_EXPECTED_NODE_TEST";
+  /** Expected step pattern */
+  public static final String ER_EXPECTED_STEP_PATTERN =
+        "ER_EXPECTED_STEP_PATTERN";
+  /** Expected relative path pattern */
+  public static final String ER_EXPECTED_REL_PATH_PATTERN =
+         "ER_EXPECTED_REL_PATH_PATTERN";
+  /** ER_CANT_CONVERT_XPATHRESULTTYPE_TO_BOOLEAN          */
+  public static final String ER_CANT_CONVERT_TO_BOOLEAN =
+         "ER_CANT_CONVERT_TO_BOOLEAN";
+  /** Field ER_CANT_CONVERT_TO_SINGLENODE       */
+  public static final String ER_CANT_CONVERT_TO_SINGLENODE =
+         "ER_CANT_CONVERT_TO_SINGLENODE";
+  /** Field ER_CANT_GET_SNAPSHOT_LENGTH         */
+  public static final String ER_CANT_GET_SNAPSHOT_LENGTH =
+         "ER_CANT_GET_SNAPSHOT_LENGTH";
+  /** Field ER_NON_ITERATOR_TYPE                */
+  public static final String ER_NON_ITERATOR_TYPE = "ER_NON_ITERATOR_TYPE";
+  /** Field ER_DOC_MUTATED                      */
+  public static final String ER_DOC_MUTATED = "ER_DOC_MUTATED";
+  public static final String ER_INVALID_XPATH_TYPE = "ER_INVALID_XPATH_TYPE";
+  public static final String ER_EMPTY_XPATH_RESULT = "ER_EMPTY_XPATH_RESULT";
+  public static final String ER_INCOMPATIBLE_TYPES = "ER_INCOMPATIBLE_TYPES";
+  public static final String ER_NULL_RESOLVER = "ER_NULL_RESOLVER";
+  public static final String ER_CANT_CONVERT_TO_STRING =
+         "ER_CANT_CONVERT_TO_STRING";
+  public static final String ER_NON_SNAPSHOT_TYPE = "ER_NON_SNAPSHOT_TYPE";
+  public static final String ER_WRONG_DOCUMENT = "ER_WRONG_DOCUMENT";
+  /* Note to translators:  The XPath expression cannot be evaluated with respect
+   * to this type of node.
+   */
+  /** Field ER_WRONG_NODETYPE                    */
+  public static final String ER_WRONG_NODETYPE = "ER_WRONG_NODETYPE";
+  public static final String ER_XPATH_ERROR = "ER_XPATH_ERROR";
+
+  //BEGIN: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
+  public static final String ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED = "ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED";
+  public static final String ER_RESOLVE_VARIABLE_RETURNS_NULL = "ER_RESOLVE_VARIABLE_RETURNS_NULL";
+  public static final String ER_UNSUPPORTED_RETURN_TYPE = "ER_UNSUPPORTED_RETURN_TYPE";
+  public static final String ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL = "ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL";
+  public static final String ER_ARG_CANNOT_BE_NULL = "ER_ARG_CANNOT_BE_NULL";
+
+  public static final String ER_OBJECT_MODEL_NULL = "ER_OBJECT_MODEL_NULL";
+  public static final String ER_OBJECT_MODEL_EMPTY = "ER_OBJECT_MODEL_EMPTY";
+  public static final String ER_FEATURE_NAME_NULL = "ER_FEATURE_NAME_NULL";
+  public static final String ER_FEATURE_UNKNOWN = "ER_FEATURE_UNKNOWN";
+  public static final String ER_GETTING_NULL_FEATURE = "ER_GETTING_NULL_FEATURE";
+  public static final String ER_GETTING_UNKNOWN_FEATURE = "ER_GETTING_UNKNOWN_FEATURE";
+  public static final String ER_NULL_XPATH_FUNCTION_RESOLVER = "ER_NULL_XPATH_FUNCTION_RESOLVER";
+  public static final String ER_NULL_XPATH_VARIABLE_RESOLVER = "ER_NULL_XPATH_VARIABLE_RESOLVER";
+  //END: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
+
+  public static final String WG_LOCALE_NAME_NOT_HANDLED =
+         "WG_LOCALE_NAME_NOT_HANDLED";
+  public static final String WG_PROPERTY_NOT_SUPPORTED =
+         "WG_PROPERTY_NOT_SUPPORTED";
+  public static final String WG_DONT_DO_ANYTHING_WITH_NS =
+         "WG_DONT_DO_ANYTHING_WITH_NS";
+  public static final String WG_SECURITY_EXCEPTION = "WG_SECURITY_EXCEPTION";
+  public static final String WG_QUO_NO_LONGER_DEFINED =
+         "WG_QUO_NO_LONGER_DEFINED";
+  public static final String WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST =
+         "WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST";
+  public static final String WG_FUNCTION_TOKEN_NOT_FOUND =
+         "WG_FUNCTION_TOKEN_NOT_FOUND";
+  public static final String WG_COULDNOT_FIND_FUNCTION =
+         "WG_COULDNOT_FIND_FUNCTION";
+  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
+  public static final String WG_EXPAND_ENTITIES_NOT_SUPPORTED =
+         "WG_EXPAND_ENTITIES_NOT_SUPPORTED";
+  public static final String WG_ILLEGAL_VARIABLE_REFERENCE =
+         "WG_ILLEGAL_VARIABLE_REFERENCE";
+  public static final String WG_UNSUPPORTED_ENCODING ="WG_UNSUPPORTED_ENCODING";
+
+  /**  detach() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+  /**  num() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+  /**  xstr() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+  /**  str() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+
+  // Error messages...
+
+
+  /**
+   * Get the association list.
+   *
+   * @return The association list.
+   */
+  public Object[][] getContents()
+  {
+    return new Object[][]{
+
+  { "ERROR0000" , "{0}" },
+
+  { ER_CURRENT_NOT_ALLOWED_IN_MATCH, "Funkcija current() v primerjalnem vzorcu ni dovoljena!" },
+
+  { ER_CURRENT_TAKES_NO_ARGS, "Funkcija current() ne sprejema argumentov!" },
+
+  { ER_DOCUMENT_REPLACED,
+      "Implementacija funkcije document() je bila nadome\u0161\u010dena z org.apache.xalan.xslt.FuncDocument!"},
+
+  { ER_CONTEXT_HAS_NO_OWNERDOC,
+      "Kontekst ne vsebuje lastni\u0161kega dokumenta!"},
+
+  { ER_LOCALNAME_HAS_TOO_MANY_ARGS,
+      "local-name() ima preve\u010d argumentov."},
+
+  { ER_NAMESPACEURI_HAS_TOO_MANY_ARGS,
+      "namespace-uri() ima preve\u010d argumentov."},
+
+  { ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS,
+      "normalize-space() ima preve\u010d argumentov."},
+
+  { ER_NUMBER_HAS_TOO_MANY_ARGS,
+      "number() ima preve\u010d argumentov."},
+
+  { ER_NAME_HAS_TOO_MANY_ARGS,
+     "name() ima preve\u010d argumentov."},
+
+  { ER_STRING_HAS_TOO_MANY_ARGS,
+      "string() ima preve\u010d argumentov."},
+
+  { ER_STRINGLENGTH_HAS_TOO_MANY_ARGS,
+      "string-length() ima preve\u010d argumentov."},
+
+  { ER_TRANSLATE_TAKES_3_ARGS,
+      "Funkcija translate() sprejme tri argumente!"},
+
+  { ER_UNPARSEDENTITYURI_TAKES_1_ARG,
+      "Funkcija unparsed-entity-uri bi morala vsebovati en argument!"},
+
+  { ER_NAMESPACEAXIS_NOT_IMPLEMENTED,
+      "Os imenskega prostora \u0161e ni implementirana!"},
+
+  { ER_UNKNOWN_AXIS,
+     "neznana os: {0}"},
+
+  { ER_UNKNOWN_MATCH_OPERATION,
+     "neznana operacija ujemanja!"},
+
+  { ER_INCORRECT_ARG_LENGTH,
+      "Dol\u017eina argumenta pri preskusu vozli\u0161\u010da s processing-instruction() ni pravilna!"},
+
+  { ER_CANT_CONVERT_TO_NUMBER,
+      "{0} ni mogo\u010de pretvoriti v \u0161tevilko"},
+
+  { ER_CANT_CONVERT_TO_NODELIST,
+      "{0} ni mogo\u010de pretvoriti v seznam vozli\u0161\u010d (NodeList)"},
+
+  { ER_CANT_CONVERT_TO_MUTABLENODELIST,
+      "{0} ni mogo\u010de pretvoriti v NodeSetDTM"},
+
+  { ER_CANT_CONVERT_TO_TYPE,
+      "{0} ni mogo\u010de pretvoriti v type#{1}"},
+
+  { ER_EXPECTED_MATCH_PATTERN,
+      "Pri\u010dakovan primerjalni vzorec v getMatchScore!"},
+
+  { ER_COULDNOT_GET_VAR_NAMED,
+      "Nisem na\u0161el predloge z imenom {0}"},
+
+  { ER_UNKNOWN_OPCODE,
+     "NAPAKA! Neznana op. koda: {0}"},
+
+  { ER_EXTRA_ILLEGAL_TOKENS,
+     "Dodatni neveljavni \u017eetoni: {0}"},
+
+
+  { ER_EXPECTED_DOUBLE_QUOTE,
+      "Napa\u010dno postavljena dobesedna navedba... pri\u010dakovani dvojni narekovaji!"},
+
+  { ER_EXPECTED_SINGLE_QUOTE,
+      "Napa\u010dno postavljena dobesedna navedba... pri\u010dakovani enojni narekovaji!"},
+
+  { ER_EMPTY_EXPRESSION,
+     "Prazen izraz!"},
+
+  { ER_EXPECTED_BUT_FOUND,
+     "Pri\u010dakovano {0}, najdeno: {1}"},
+
+  { ER_INCORRECT_PROGRAMMER_ASSERTION,
+      "Programerjeva predpostavka ni pravilna! - {0}"},
+
+  { ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL,
+      "Argument logi\u010dne vrednosti(...) ni ve\u010d izbiren z osnutkom 19990709 XPath."},
+
+  { ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG,
+      "Najdeno ',' vendar ni predhodnih argumentov!"},
+
+  { ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG,
+      "Najdeno ',' vendar ni slede\u010dih argumentov!"},
+
+  { ER_PREDICATE_ILLEGAL_SYNTAX,
+      "'..[predicate]' ali '.[predicate]' je neveljavna sintaksa.  Namesto tega uporabite 'self::node()[predicate]'."},
+
+  { ER_ILLEGAL_AXIS_NAME,
+     "Neveljavno ime osi: {0}"},
+
+  { ER_UNKNOWN_NODETYPE,
+     "Neveljavni tip vozli\u0161\u010da: {0}"},
+
+  { ER_PATTERN_LITERAL_NEEDS_BE_QUOTED,
+      "Navedek vzorca ({0}) mora biti v navednicah!"},
+
+  { ER_COULDNOT_BE_FORMATTED_TO_NUMBER,
+      "{0} ni mogo\u010de oblikovati v \u0161tevilko!"},
+
+  { ER_COULDNOT_CREATE_XMLPROCESSORLIAISON,
+      "Ne morem ustvariti zveze XML TransformerFactory: {0}"},
+
+  { ER_DIDNOT_FIND_XPATH_SELECT_EXP,
+      "Napaka! Ne najdem izbirnega izraza xpath (-select)."},
+
+  { ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH,
+      "NAPAKA! Ne najdem ENDOP po OP_LOCATIONPATH"},
+
+  { ER_ERROR_OCCURED,
+     "Pri\u0161lo je do napake!"},
+
+  { ER_ILLEGAL_VARIABLE_REFERENCE,
+      "Dani VariableReference je izven konteksta ali brez definicije!  Ime = {0}"},
+
+  { ER_AXES_NOT_ALLOWED,
+      "V primerjalnih vzorcih so dovoljene samo osi podrejenega:: in atributa::!  Sporne osi = {0}"},
+
+  { ER_KEY_HAS_TOO_MANY_ARGS,
+      "key()ima nepravilno \u0161tevilo argumentov."},
+
+  { ER_COUNT_TAKES_1_ARG,
+      "\u0160tevna funkcija zahteva en argument!"},
+
+  { ER_COULDNOT_FIND_FUNCTION,
+     "Ne najdem funkcije: {0}"},
+
+  { ER_UNSUPPORTED_ENCODING,
+     "Nepodprto kodiranje: {0}"},
+
+  { ER_PROBLEM_IN_DTM_NEXTSIBLING,
+      "Pri\u0161lo je do te\u017eave v DTM pri getNextSibling... poskus obnovitve"},
+
+  { ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL,
+      "Programerska napaka: pisanje v EmptyNodeList ni mogo\u010de."},
+
+  { ER_SETDOMFACTORY_NOT_SUPPORTED,
+      "setDOMFactory v XPathContext ni podprt!"},
+
+  { ER_PREFIX_MUST_RESOLVE,
+      "Predpona se mora razre\u0161iti v imenski prostor: {0}"},
+
+  { ER_PARSE_NOT_SUPPORTED,
+      "Raz\u010dlenitev (vir InputSource) v XPathContext ni podprta! Ne morem odpreti {0}"},
+
+  { ER_SAX_API_NOT_HANDLED,
+      "Znaki SAX API(znaka ch[]... ne obravnava DTM!"},
+
+  { ER_IGNORABLE_WHITESPACE_NOT_HANDLED,
+      "ignorableWhitespace(znaka ch[]... ne obravnava DTM!"},
+
+  { ER_DTM_CANNOT_HANDLE_NODES,
+      "DTMLiaison ne more upravljati z vozli\u0161\u010di tipa {0}"},
+
+  { ER_XERCES_CANNOT_HANDLE_NODES,
+      "DOM2Helper ne more upravljati z vozli\u0161\u010di tipa {0}"},
+
+  { ER_XERCES_PARSE_ERROR_DETAILS,
+      "Napaka DOM2Helper.parse: ID sistema - {0} vrstica - {1}"},
+
+  { ER_XERCES_PARSE_ERROR,
+     "Napaka DOM2Helper.parse"},
+
+  { ER_INVALID_UTF16_SURROGATE,
+      "Zaznan neveljaven nadomestek UTF-16: {0} ?"},
+
+  { ER_OIERROR,
+     "Napaka V/I"},
+
+  { ER_CANNOT_CREATE_URL,
+     "Ne morem ustvariti naslova URL za: {0}"},
+
+  { ER_XPATH_READOBJECT,
+     "V XPath.readObject: {0}"},
+
+  { ER_FUNCTION_TOKEN_NOT_FOUND,
+      "ne najdem \u017eetona funkcije."},
+
+  { ER_CANNOT_DEAL_XPATH_TYPE,
+       "Ne morem ravnati z tipom XPath: {0}"},
+
+  { ER_NODESET_NOT_MUTABLE,
+       "Ta NodeSet ni spremenljiv"},
+
+  { ER_NODESETDTM_NOT_MUTABLE,
+       "Ta NodeSetDTM ni spremenljiv"},
+
+  { ER_VAR_NOT_RESOLVABLE,
+        "Spremenljivka ni razre\u0161ljiva: {0}"},
+
+  { ER_NULL_ERROR_HANDLER,
+        "Program za obravnavo napak NULL"},
+
+  { ER_PROG_ASSERT_UNKNOWN_OPCODE,
+       "Programerjeva izjava: neznana opkoda: {0}"},
+
+  { ER_ZERO_OR_ONE,
+       "0 ali 1"},
+
+  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+       "XRTreeFragSelectWrapper ne podpira rtf()"},
+
+  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+       "XRTreeFragSelectWrapper ne podpira asNodeIterator()"},
+
+   { ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper ne podpira detach()"},
+
+   { ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper ne podpira num()"},
+
+   { ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper ne podpira xstr()"},
+
+   { ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper ne podpira str()"},
+
+  { ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS,
+       "fsb() ni podprt za XStringForChars"},
+
+  { ER_COULD_NOT_FIND_VAR,
+      "Spremenljivke z imenom {0} ni mogo\u010de najti"},
+
+  { ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING,
+      "XStringForChars ne more uporabiti niza za argument"},
+
+  { ER_FASTSTRINGBUFFER_CANNOT_BE_NULL,
+      "Argument FastStringBuffer ne more biti NULL"},
+
+  { ER_TWO_OR_THREE,
+       "2 ali 3"},
+
+  { ER_VARIABLE_ACCESSED_BEFORE_BIND,
+       "Spremenljivka uporabljena \u0161e pred njeno vezavo!"},
+
+  { ER_FSB_CANNOT_TAKE_STRING,
+       "XStringForFSB ne more uporabiti niza za argument!"},
+
+  { ER_SETTING_WALKER_ROOT_TO_NULL,
+       "\n !!!! Napaka! Koren sprehajalca nastavljam na NULL!!!"},
+
+  { ER_NODESETDTM_CANNOT_ITERATE,
+       "Tega NodeSetDTM ni mogo\u010de ponavljati do prej\u0161njega vozli\u0161\u010da!"},
+
+  { ER_NODESET_CANNOT_ITERATE,
+       "Tega NodeSet ni mogo\u010de ponavljati do prej\u0161njega vozli\u0161\u010da!"},
+
+  { ER_NODESETDTM_CANNOT_INDEX,
+       "Ta NodeSetDTM ne more opravljati funkcij priprave kazala ali \u0161tetja!"},
+
+  { ER_NODESET_CANNOT_INDEX,
+       "Ta NodeSet ne more opravljati funkcij priprave kazala ali \u0161tetja!"},
+
+  { ER_CANNOT_CALL_SETSHOULDCACHENODE,
+       "Za klicem nextNode klic setShouldCacheNodes ni mogo\u010d!"},
+
+  { ER_ONLY_ALLOWS,
+       "{0} dovoljuje samo argumente {1}"},
+
+  { ER_UNKNOWN_STEP,
+       "Programerjeva izjava v getNextStepPos: neznan stepType: {0}"},
+
+  //Note to translators:  A relative location path is a form of XPath expression.
+  // The message indicates that such an expression was expected following the
+  // characters '/' or '//', but was not found.
+  { ER_EXPECTED_REL_LOC_PATH,
+      "Za \u017eetonom '/' ali '//' je pri\u010dakovana relativna pot do mesta."},
+
+  // Note to translators:  A location path is a form of XPath expression.
+  // The message indicates that syntactically such an expression was expected,but
+  // the characters specified by the substitution text were encountered instead.
+  { ER_EXPECTED_LOC_PATH,
+       "Pri\u010dakovana pot do lokacije, na\u0161jden pa je naslednji \u017eeton\u003a  {0}"},
+
+  // Note to translators:  A location path is a form of XPath expression.
+  // The message indicates that syntactically such a subexpression was expected,
+  // but no more characters were found in the expression.
+  { ER_EXPECTED_LOC_PATH_AT_END_EXPR,
+       "Namesto pri\u010dakovane poti do lokacije je najden konec izraza XPath."},
+
+  // Note to translators:  A location step is part of an XPath expression.
+  // The message indicates that syntactically such an expression was expected
+  // following the specified characters.
+  { ER_EXPECTED_LOC_STEP,
+       "Za \u017eetonom '/' ali '//' je pri\u010dakovan korak mesta."},
+
+  // Note to translators:  A node test is part of an XPath expression that is
+  // used to test for particular kinds of nodes.  In this case, a node test that
+  // consists of an NCName followed by a colon and an asterisk or that consists
+  // of a QName was expected, but was not found.
+  { ER_EXPECTED_NODE_TEST,
+       "Pri\u010dakovan preskus vozli\u0161\u010da, ki ustreza NCImenu:* ali QImenu."},
+
+  // Note to translators:  A step pattern is part of an XPath expression.
+  // The message indicates that syntactically such an expression was expected,
+  // but the specified character was found in the expression instead.
+  { ER_EXPECTED_STEP_PATTERN,
+       "Pri\u010dakovan stopnjevalni vzorec, najden pa je '/'."},
+
+  // Note to translators: A relative path pattern is part of an XPath expression.
+  // The message indicates that syntactically such an expression was expected,
+  // but was not found.
+  { ER_EXPECTED_REL_PATH_PATTERN,
+       "Pri\u010dakovan vzorec z relativno potjo."},
+
+  // Note to translators:  The substitution text is the name of a data type.  The
+  // message indicates that a value of a particular type could not be converted
+  // to a value of type boolean.
+  { ER_CANT_CONVERT_TO_BOOLEAN,
+       "XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogoe\u010de pretvoriti v boolovo vrednost."},
+
+  // Note to translators: Do not translate ANY_UNORDERED_NODE_TYPE and
+  // FIRST_ORDERED_NODE_TYPE.
+  { ER_CANT_CONVERT_TO_SINGLENODE,
+       "XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de pretvoriti v eno vozli\u0161\u010de. Metoda getSingleNodeValue velja samo za tipa ANY_UNORDERED_NODE_TYPE in FIRST_ORDERED_NODE_TYPE."},
+
+  // Note to translators: Do not translate UNORDERED_NODE_SNAPSHOT_TYPE and
+  // ORDERED_NODE_SNAPSHOT_TYPE.
+  { ER_CANT_GET_SNAPSHOT_LENGTH,
+       "Metoda getSnapshotLength ne more biti priklicana za XPathResult izraza XPath ''{0}'', ker je tip XPathResultType {1}. Ta metoda se nana\u0161a samo na tipa UNORDERED_NODE_SNAPSHOT_TYPE in ORDERED_NODE_SNAPSHOT_TYPE."},
+
+  { ER_NON_ITERATOR_TYPE,
+       "Metoda iterateNext ne more biti priklicana za XPathResult izraza XPath ''{0}'', ker je tip XPathResultType {1}. Ta metoda se nana\u0161a samo na tipa UNORDERED_NODE_ITERATOR_TYPE in ORDERED_NODE_ITERATOR_TYPE."},
+
+  // Note to translators: This message indicates that the document being operated
+  // upon changed, so the iterator object that was being used to traverse the
+  // document has now become invalid.
+  { ER_DOC_MUTATED,
+       "Dokument se je spremenil po vrnitvi rezultatov. Iterator je neveljaven."},
+
+  { ER_INVALID_XPATH_TYPE,
+       "Neveljaven argument tipa XPath: {0}"},
+
+  { ER_EMPTY_XPATH_RESULT,
+       "Prazen objekt rezultatov XPath"},
+
+  { ER_INCOMPATIBLE_TYPES,
+       "Rezultat XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de prisiliti v dolo\u010den tip XPathResultType {2}."},
+
+  { ER_NULL_RESOLVER,
+       "Predpone ni bilo mogo\u010de razre\u0161iti z razre\u0161evalnikom predpon NULL."},
+
+  // Note to translators:  The substitution text is the name of a data type.  The
+  // message indicates that a value of a particular type could not be converted
+  // to a value of type string.
+  { ER_CANT_CONVERT_TO_STRING,
+       "Rezultat XPathResult izraza XPath''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de pretvoriti v niz."},
+
+  // Note to translators: Do not translate snapshotItem,
+  // UNORDERED_NODE_SNAPSHOT_TYPE and ORDERED_NODE_SNAPSHOT_TYPE.
+  { ER_NON_SNAPSHOT_TYPE,
+       "Metoda snapshotItem ne more biti priklicana za XPathResult izraza XPath ''{0}'', ker je tip XPathResultType {1}. Ta metoda se nana\u0161a samo na tipa UNORDERED_NODE_SNAPSHOT_TYPE in ORDERED_NODE_SNAPSHOT_TYPE."},
+
+  // Note to translators:  XPathEvaluator is a Java interface name.  An
+  // XPathEvaluator is created with respect to a particular XML document, and in
+  // this case the expression represented by this object was being evaluated with
+  // respect to a context node from a different document.
+  { ER_WRONG_DOCUMENT,
+       "Kontekstno vozli\u0161\u010de ne pripada dokumentu, povezanem s tem XPathEvaluator."},
+
+  // Note to translators:  The XPath expression cannot be evaluated with respect
+  // to this type of node.
+  { ER_WRONG_NODETYPE,
+       "Tip kontekstnega vozli\u0161\u010da ni podprt."},
+
+  { ER_XPATH_ERROR,
+       "Neznana napaka v XPath."},
+
+        { ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER,
+                "XPathResult izraza XPath ''{0}'' ima XPathResultType {1}, ki ga ni mogo\u010de pretvoriti v \u0161tevilko."},
+
+  //BEGIN:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
+
+  /** Field ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED                       */
+
+  { ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED,
+       "Raz\u0161iritvene funkcije: ''{0}'' ni mogo\u010de priklicati, kadar je zna\u010dilnost XMLConstants.FEATURE_SECURE_PROCESSING nastavljena na True."},
+
+  /** Field ER_RESOLVE_VARIABLE_RETURNS_NULL                       */
+
+  { ER_RESOLVE_VARIABLE_RETURNS_NULL,
+       "Funkcija resolveVariable za spremenljivko {0} vra\u010da rezultat ni\u010d"},
+
+  /** Field ER_UNSUPPORTED_RETURN_TYPE                       */
+
+  { ER_UNSUPPORTED_RETURN_TYPE,
+       "Nepodprt tip vrnitve : {0}"},
+
+  /** Field ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL                       */
+
+  { ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL,
+       "Vir in/ali Tip vrnitve ne moreta biti ni\u010d"},
+
+  /** Field ER_ARG_CANNOT_BE_NULL                       */
+
+  { ER_ARG_CANNOT_BE_NULL,
+       "Argument {0} ne more biti ni\u010d"},
+
+  /** Field ER_OBJECT_MODEL_NULL                       */
+
+  { ER_OBJECT_MODEL_NULL,
+       "Funkcije {0}#isObjectModelSupported( String objectModel ) ni mogo\u010de priklicati, kadar je objectModel == null"},
+
+  /** Field ER_OBJECT_MODEL_EMPTY                       */
+
+  { ER_OBJECT_MODEL_EMPTY,
+       "Funkcije {0}#isObjectModelSupported( String objectModel ) ni mogo\u010de priklicati, kadar je objectModel == \"\""},
+
+  /** Field ER_OBJECT_MODEL_EMPTY                       */
+
+  { ER_FEATURE_NAME_NULL,
+       "Poskus nastavitve funkcije brez imena (null name): {0}#setFeature( null, {1})"},
+
+  /** Field ER_FEATURE_UNKNOWN                       */
+
+  { ER_FEATURE_UNKNOWN,
+       "Poskus nastavitve neznane funkcije \"{0}\":{1}#setFeature({0},{2})"},
+
+  /** Field ER_GETTING_NULL_FEATURE                       */
+
+  { ER_GETTING_NULL_FEATURE,
+       "Poskus pridobitve funkcije brez imena (null name): {0}#getFeature(null)"},
+
+  /** Field ER_GETTING_NULL_FEATURE                       */
+
+  { ER_GETTING_UNKNOWN_FEATURE,
+       "Poskus pridobitve neznane funkcije \"{0}\":{1}#getFeature({0})"},
+
+  /** Field ER_NULL_XPATH_FUNCTION_RESOLVER                       */
+
+  { ER_NULL_XPATH_FUNCTION_RESOLVER,
+       "Poskus nastavitve XPathFunctionResolver na ni\u010d:{0}#setXPathFunctionResolver(null)"},
+
+  /** Field ER_NULL_XPATH_VARIABLE_RESOLVER                       */
+
+  { ER_NULL_XPATH_VARIABLE_RESOLVER,
+       "Poskus nastavitve funkcije XPathVariableResolver na ni\u010d:{0}#setXPathVariableResolver(null)"},
+
+  //END:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
+
+  // Warnings...
+
+  { WG_LOCALE_NAME_NOT_HANDLED,
+      "Podro\u010dno ime v funkciji za oblikovanje \u0161tevilk \u0161e ni podprto!"},
+
+  { WG_PROPERTY_NOT_SUPPORTED,
+      "Lastnost XSL ni podprta: {0}"},
+
+  { WG_DONT_DO_ANYTHING_WITH_NS,
+      "V tem trenutku ne po\u010dnite ni\u010desar z imenskim prostorom {0} v lastnosti: {1}"},
+
+  { WG_SECURITY_EXCEPTION,
+      "Pri\u0161lo je do SecurityException (varnostna izjema) pri poskusu dostopa do sistemske lastnosti XSL: {0}"},
+
+  { WG_QUO_NO_LONGER_DEFINED,
+      "Stara sintaksa: quo(...) v XPath ni ve\u010d definiran."},
+
+  { WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST,
+      "XPath potrebuje izpeljani objekt za implementacijo nodeTest!"},
+
+  { WG_FUNCTION_TOKEN_NOT_FOUND,
+      "ne najdem \u017eetona funkcije."},
+
+  { WG_COULDNOT_FIND_FUNCTION,
+      "Ne najdem funkcije: {0}"},
+
+  { WG_CANNOT_MAKE_URL_FROM,
+      "Ne morem narediti naslova URL iz: {0}"},
+
+  { WG_EXPAND_ENTITIES_NOT_SUPPORTED,
+      "Mo\u017enost -E za raz\u010dlenjevalnik DTM ni podprta."},
+
+  { WG_ILLEGAL_VARIABLE_REFERENCE,
+      "Dani VariableReference je izven konteksta ali brez definicije!  Ime = {0}"},
+
+  { WG_UNSUPPORTED_ENCODING,
+     "Nepodprto kodiranje: {0}"},
+
+
+
+  // Other miscellaneous text used inside the code...
+  { "ui_language", "sl"},
+  { "help_language", "sl"},
+  { "language", "sl"},
+  { "BAD_CODE", "Parameter za createMessage presega meje"},
+  { "FORMAT_FAILED", "Med klicem je messageFormat naletel na izjemo"},
+  { "version", ">>>>>>> Razli\u010dica Xalan "},
+  { "version2", "<<<<<<<"},
+  { "yes", "da"},
+  { "line", "Vrstica #"},
+  { "column", "Stolpec #"},
+  { "xsldone", "XSLProcessor: dokon\u010dano"},
+  { "xpath_option", "Mo\u017enosti xpath: "},
+  { "optionIN", "   [-in inputXMLURL]"},
+  { "optionSelect", "   [-select izraz xpath]"},
+  { "optionMatch", "   [-match primerjalni vzorec (za diagnostiko ujemanja)]"},
+  { "optionAnyExpr", "Ali pa bo samo izraz xpath izvedel diagnosti\u010dni izvoz podatkov"},
+  { "noParsermsg1", "Postopek XSL ni uspel."},
+  { "noParsermsg2", "** Nisem na\u0161el raz\u010dlenjevalnika **"},
+  { "noParsermsg3", "Preverite pot razreda."},
+  { "noParsermsg4", "\u010ce nimate IBM raz\u010dlenjevalnika za Javo, ga lahko prenesete iz"},
+  { "noParsermsg5", "IBM AlphaWorks: http://www.alphaworks.ibm.com/formula/xml"},
+  { "gtone", ">1" },
+  { "zero", "0" },
+  { "one", "1" },
+  { "two" , "2" },
+  { "three", "3" }
+
+  };
+  }
+
+
+  // ================= INFRASTRUCTURE ======================
+
+  /** Field BAD_CODE          */
+  public static final String BAD_CODE = "BAD_CODE";
+
+  /** Field FORMAT_FAILED          */
+  public static final String FORMAT_FAILED = "FORMAT_FAILED";
+
+  /** Field ERROR_RESOURCES          */
+  public static final String ERROR_RESOURCES =
+    "org.apache.xpath.res.XPATHErrorResources";
+
+  /** Field ERROR_STRING          */
+  public static final String ERROR_STRING = "#error";
+
+  /** Field ERROR_HEADER          */
+  public static final String ERROR_HEADER = "Napaka: ";
+
+  /** Field WARNING_HEADER          */
+  public static final String WARNING_HEADER = "Opozorilo: ";
+
+  /** Field XSL_HEADER          */
+  public static final String XSL_HEADER = "XSL ";
+
+  /** Field XML_HEADER          */
+  public static final String XML_HEADER = "XML ";
+
+  /** Field QUERY_HEADER          */
+  public static final String QUERY_HEADER = "VZOREC ";
+
+
+  /**
+   * Return a named ResourceBundle for a particular locale.  This method mimics the behavior
+   * of ResourceBundle.getBundle().
+   *
+   * @param className Name of local-specific subclass.
+   * @return the ResourceBundle
+   * @throws MissingResourceException
+   */
+  public static final XPATHErrorResources loadResourceBundle(String className)
+          throws MissingResourceException
+  {
+
+    Locale locale = Locale.getDefault();
+    String suffix = getResourceSuffix(locale);
+
+    try
+    {
+
+      // first try with the given locale
+      return (XPATHErrorResources) ResourceBundle.getBundle(className
+              + suffix, locale);
+    }
+    catch (MissingResourceException e)
+    {
+      try  // try to fall back to en_US if we can't load
+      {
+
+        // Since we can't find the localized property file,
+        // fall back to en_US.
+        return (XPATHErrorResources) ResourceBundle.getBundle(className,
+                new Locale("sl", "SL"));
+      }
+      catch (MissingResourceException e2)
+      {
+
+        // Now we are really in trouble.
+        // very bad, definitely very bad...not going to get very far
+        throw new MissingResourceException(
+          "Could not load any resource bundles.", className, "");
+      }
+    }
+  }
+
+  /**
+   * Return the resource file suffic for the indicated locale
+   * For most locales, this will be based the language code.  However
+   * for Chinese, we do distinguish between Taiwan and PRC
+   *
+   * @param locale the locale
+   * @return an String suffix which canbe appended to a resource name
+   */
+  private static final String getResourceSuffix(Locale locale)
+  {
+
+    String suffix = "_" + locale.getLanguage();
+    String country = locale.getCountry();
+
+    if (country.equals("TW"))
+      suffix += "_" + country;
+
+    return suffix;
+  }
+
+}
diff --git a/src/org/apache/xpath/res/XPATHErrorResources_zh.java b/src/org/apache/xpath/res/XPATHErrorResources_zh.java
old mode 100755
new mode 100644
index a6befb1..6a353f5
--- a/src/org/apache/xpath/res/XPATHErrorResources_zh.java
+++ b/src/org/apache/xpath/res/XPATHErrorResources_zh.java
@@ -1,991 +1,991 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: XPATHErrorResources_zh.java 338104 2005-01-23 01:39:54Z mcnamara $
- */
-package org.apache.xpath.res;
-
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Set up error messages.
- * We build a two dimensional array of message keys and
- * message strings. In order to add a new message here,
- * you need to first add a Static string constant for the
- * Key and update the contents array with Key, Value pair
-  * Also you need to  update the count of messages(MAX_CODE)or
- * the count of warnings(MAX_WARNING) [ Information purpose only]
- * @xsl.usage advanced
- */
-public class XPATHErrorResources_zh extends ListResourceBundle
-{
-
-/*
- * General notes to translators:
- *
- * This file contains error and warning messages related to XPath Error
- * Handling.
- *
- *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
- *     components.
- *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
- *     XSLTC is an acronym for XSLT Compiler.
- *
- *  2) A stylesheet is a description of how to transform an input XML document
- *     into a resultant XML document (or HTML document or text).  The
- *     stylesheet itself is described in the form of an XML document.
- *
- *  3) A template is a component of a stylesheet that is used to match a
- *     particular portion of an input document and specifies the form of the
- *     corresponding portion of the output document.
- *
- *  4) An element is a mark-up tag in an XML document; an attribute is a
- *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
- *     "elem" is an element name, "attr" and "attr2" are attribute names with
- *     the values "val" and "val2", respectively.
- *
- *  5) A namespace declaration is a special attribute that is used to associate
- *     a prefix with a URI (the namespace).  The meanings of element names and
- *     attribute names that use that prefix are defined with respect to that
- *     namespace.
- *
- *  6) "Translet" is an invented term that describes the class file that
- *     results from compiling an XML stylesheet into a Java class.
- *
- *  7) XPath is a specification that describes a notation for identifying
- *     nodes in a tree-structured representation of an XML document.  An
- *     instance of that notation is referred to as an XPath expression.
- *
- *  8) The context node is the node in the document with respect to which an
- *     XPath expression is being evaluated.
- *
- *  9) An iterator is an object that traverses nodes in the tree, one at a time.
- *
- *  10) NCName is an XML term used to describe a name that does not contain a
- *     colon (a "no-colon name").
- *
- *  11) QName is an XML term meaning "qualified name".
- */
-
-  /*
-   * static variables
-   */
-  public static final String ERROR0000 = "ERROR0000";
-  public static final String ER_CURRENT_NOT_ALLOWED_IN_MATCH =
-         "ER_CURRENT_NOT_ALLOWED_IN_MATCH";
-  public static final String ER_CURRENT_TAKES_NO_ARGS =
-         "ER_CURRENT_TAKES_NO_ARGS";
-  public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
-  public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
-         "ER_CONTEXT_HAS_NO_OWNERDOC";
-  public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
-         "ER_LOCALNAME_HAS_TOO_MANY_ARGS";
-  public static final String ER_NAMESPACEURI_HAS_TOO_MANY_ARGS =
-         "ER_NAMESPACEURI_HAS_TOO_MANY_ARGS";
-  public static final String ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS =
-         "ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS";
-  public static final String ER_NUMBER_HAS_TOO_MANY_ARGS =
-         "ER_NUMBER_HAS_TOO_MANY_ARGS";
-  public static final String ER_NAME_HAS_TOO_MANY_ARGS =
-         "ER_NAME_HAS_TOO_MANY_ARGS";
-  public static final String ER_STRING_HAS_TOO_MANY_ARGS =
-         "ER_STRING_HAS_TOO_MANY_ARGS";
-  public static final String ER_STRINGLENGTH_HAS_TOO_MANY_ARGS =
-         "ER_STRINGLENGTH_HAS_TOO_MANY_ARGS";
-  public static final String ER_TRANSLATE_TAKES_3_ARGS =
-         "ER_TRANSLATE_TAKES_3_ARGS";
-  public static final String ER_UNPARSEDENTITYURI_TAKES_1_ARG =
-         "ER_UNPARSEDENTITYURI_TAKES_1_ARG";
-  public static final String ER_NAMESPACEAXIS_NOT_IMPLEMENTED =
-         "ER_NAMESPACEAXIS_NOT_IMPLEMENTED";
-  public static final String ER_UNKNOWN_AXIS = "ER_UNKNOWN_AXIS";
-  public static final String ER_UNKNOWN_MATCH_OPERATION =
-         "ER_UNKNOWN_MATCH_OPERATION";
-  public static final String ER_INCORRECT_ARG_LENGTH ="ER_INCORRECT_ARG_LENGTH";
-  public static final String ER_CANT_CONVERT_TO_NUMBER =
-         "ER_CANT_CONVERT_TO_NUMBER";
-  public static final String ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER =
-           "ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER";
-  public static final String ER_CANT_CONVERT_TO_NODELIST =
-         "ER_CANT_CONVERT_TO_NODELIST";
-  public static final String ER_CANT_CONVERT_TO_MUTABLENODELIST =
-         "ER_CANT_CONVERT_TO_MUTABLENODELIST";
-  public static final String ER_CANT_CONVERT_TO_TYPE ="ER_CANT_CONVERT_TO_TYPE";
-  public static final String ER_EXPECTED_MATCH_PATTERN =
-         "ER_EXPECTED_MATCH_PATTERN";
-  public static final String ER_COULDNOT_GET_VAR_NAMED =
-         "ER_COULDNOT_GET_VAR_NAMED";
-  public static final String ER_UNKNOWN_OPCODE = "ER_UNKNOWN_OPCODE";
-  public static final String ER_EXTRA_ILLEGAL_TOKENS ="ER_EXTRA_ILLEGAL_TOKENS";
-  public static final String ER_EXPECTED_DOUBLE_QUOTE =
-         "ER_EXPECTED_DOUBLE_QUOTE";
-  public static final String ER_EXPECTED_SINGLE_QUOTE =
-         "ER_EXPECTED_SINGLE_QUOTE";
-  public static final String ER_EMPTY_EXPRESSION = "ER_EMPTY_EXPRESSION";
-  public static final String ER_EXPECTED_BUT_FOUND = "ER_EXPECTED_BUT_FOUND";
-  public static final String ER_INCORRECT_PROGRAMMER_ASSERTION =
-         "ER_INCORRECT_PROGRAMMER_ASSERTION";
-  public static final String ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL =
-         "ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL";
-  public static final String ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG =
-         "ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG";
-  public static final String ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG =
-         "ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG";
-  public static final String ER_PREDICATE_ILLEGAL_SYNTAX =
-         "ER_PREDICATE_ILLEGAL_SYNTAX";
-  public static final String ER_ILLEGAL_AXIS_NAME = "ER_ILLEGAL_AXIS_NAME";
-  public static final String ER_UNKNOWN_NODETYPE = "ER_UNKNOWN_NODETYPE";
-  public static final String ER_PATTERN_LITERAL_NEEDS_BE_QUOTED =
-         "ER_PATTERN_LITERAL_NEEDS_BE_QUOTED";
-  public static final String ER_COULDNOT_BE_FORMATTED_TO_NUMBER =
-         "ER_COULDNOT_BE_FORMATTED_TO_NUMBER";
-  public static final String ER_COULDNOT_CREATE_XMLPROCESSORLIAISON =
-         "ER_COULDNOT_CREATE_XMLPROCESSORLIAISON";
-  public static final String ER_DIDNOT_FIND_XPATH_SELECT_EXP =
-         "ER_DIDNOT_FIND_XPATH_SELECT_EXP";
-  public static final String ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH =
-         "ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH";
-  public static final String ER_ERROR_OCCURED = "ER_ERROR_OCCURED";
-  public static final String ER_ILLEGAL_VARIABLE_REFERENCE =
-         "ER_ILLEGAL_VARIABLE_REFERENCE";
-  public static final String ER_AXES_NOT_ALLOWED = "ER_AXES_NOT_ALLOWED";
-  public static final String ER_KEY_HAS_TOO_MANY_ARGS =
-         "ER_KEY_HAS_TOO_MANY_ARGS";
-  public static final String ER_COUNT_TAKES_1_ARG = "ER_COUNT_TAKES_1_ARG";
-  public static final String ER_COULDNOT_FIND_FUNCTION =
-         "ER_COULDNOT_FIND_FUNCTION";
-  public static final String ER_UNSUPPORTED_ENCODING ="ER_UNSUPPORTED_ENCODING";
-  public static final String ER_PROBLEM_IN_DTM_NEXTSIBLING =
-         "ER_PROBLEM_IN_DTM_NEXTSIBLING";
-  public static final String ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL =
-         "ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL";
-  public static final String ER_SETDOMFACTORY_NOT_SUPPORTED =
-         "ER_SETDOMFACTORY_NOT_SUPPORTED";
-  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
-  public static final String ER_PARSE_NOT_SUPPORTED = "ER_PARSE_NOT_SUPPORTED";
-  public static final String ER_SAX_API_NOT_HANDLED = "ER_SAX_API_NOT_HANDLED";
-public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
-         "ER_IGNORABLE_WHITESPACE_NOT_HANDLED";
-  public static final String ER_DTM_CANNOT_HANDLE_NODES =
-         "ER_DTM_CANNOT_HANDLE_NODES";
-  public static final String ER_XERCES_CANNOT_HANDLE_NODES =
-         "ER_XERCES_CANNOT_HANDLE_NODES";
-  public static final String ER_XERCES_PARSE_ERROR_DETAILS =
-         "ER_XERCES_PARSE_ERROR_DETAILS";
-  public static final String ER_XERCES_PARSE_ERROR = "ER_XERCES_PARSE_ERROR";
-  public static final String ER_INVALID_UTF16_SURROGATE =
-         "ER_INVALID_UTF16_SURROGATE";
-  public static final String ER_OIERROR = "ER_OIERROR";
-  public static final String ER_CANNOT_CREATE_URL = "ER_CANNOT_CREATE_URL";
-  public static final String ER_XPATH_READOBJECT = "ER_XPATH_READOBJECT";
- public static final String ER_FUNCTION_TOKEN_NOT_FOUND =
-         "ER_FUNCTION_TOKEN_NOT_FOUND";
-  public static final String ER_CANNOT_DEAL_XPATH_TYPE =
-         "ER_CANNOT_DEAL_XPATH_TYPE";
-  public static final String ER_NODESET_NOT_MUTABLE = "ER_NODESET_NOT_MUTABLE";
-  public static final String ER_NODESETDTM_NOT_MUTABLE =
-         "ER_NODESETDTM_NOT_MUTABLE";
-   /**  Variable not resolvable:   */
-  public static final String ER_VAR_NOT_RESOLVABLE = "ER_VAR_NOT_RESOLVABLE";
-   /** Null error handler  */
- public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
-   /**  Programmer's assertion: unknown opcode  */
-  public static final String ER_PROG_ASSERT_UNKNOWN_OPCODE =
-         "ER_PROG_ASSERT_UNKNOWN_OPCODE";
-   /**  0 or 1   */
-  public static final String ER_ZERO_OR_ONE = "ER_ZERO_OR_ONE";
-   /**  rtf() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-   /**  asNodeIterator() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER = "ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-   /**  fsb() not supported for XStringForChars   */
-  public static final String ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS =
-         "ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS";
-   /**  Could not find variable with the name of   */
- public static final String ER_COULD_NOT_FIND_VAR = "ER_COULD_NOT_FIND_VAR";
-   /**  XStringForChars can not take a string for an argument   */
- public static final String ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING =
-         "ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING";
-   /**  The FastStringBuffer argument can not be null   */
- public static final String ER_FASTSTRINGBUFFER_CANNOT_BE_NULL =
-         "ER_FASTSTRINGBUFFER_CANNOT_BE_NULL";
-   /**  2 or 3   */
-  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
-   /** Variable accessed before it is bound! */
-  public static final String ER_VARIABLE_ACCESSED_BEFORE_BIND =
-         "ER_VARIABLE_ACCESSED_BEFORE_BIND";
-   /** XStringForFSB can not take a string for an argument! */
- public static final String ER_FSB_CANNOT_TAKE_STRING =
-         "ER_FSB_CANNOT_TAKE_STRING";
-   /** Error! Setting the root of a walker to null! */
-  public static final String ER_SETTING_WALKER_ROOT_TO_NULL =
-         "ER_SETTING_WALKER_ROOT_TO_NULL";
-   /** This NodeSetDTM can not iterate to a previous node! */
-  public static final String ER_NODESETDTM_CANNOT_ITERATE =
-         "ER_NODESETDTM_CANNOT_ITERATE";
-  /** This NodeSet can not iterate to a previous node! */
- public static final String ER_NODESET_CANNOT_ITERATE =
-         "ER_NODESET_CANNOT_ITERATE";
-  /** This NodeSetDTM can not do indexing or counting functions! */
-  public static final String ER_NODESETDTM_CANNOT_INDEX =
-         "ER_NODESETDTM_CANNOT_INDEX";
-  /** This NodeSet can not do indexing or counting functions! */
-  public static final String ER_NODESET_CANNOT_INDEX =
-         "ER_NODESET_CANNOT_INDEX";
-  /** Can not call setShouldCacheNodes after nextNode has been called! */
-  public static final String ER_CANNOT_CALL_SETSHOULDCACHENODE =
-         "ER_CANNOT_CALL_SETSHOULDCACHENODE";
-  /** {0} only allows {1} arguments */
- public static final String ER_ONLY_ALLOWS = "ER_ONLY_ALLOWS";
-  /** Programmer's assertion in getNextStepPos: unknown stepType: {0} */
-  public static final String ER_UNKNOWN_STEP = "ER_UNKNOWN_STEP";
-  /** Problem with RelativeLocationPath */
-  public static final String ER_EXPECTED_REL_LOC_PATH =
-         "ER_EXPECTED_REL_LOC_PATH";
-  /** Problem with LocationPath */
-  public static final String ER_EXPECTED_LOC_PATH = "ER_EXPECTED_LOC_PATH";
-  public static final String ER_EXPECTED_LOC_PATH_AT_END_EXPR =
-                                        "ER_EXPECTED_LOC_PATH_AT_END_EXPR";
-  /** Problem with Step */
-  public static final String ER_EXPECTED_LOC_STEP = "ER_EXPECTED_LOC_STEP";
-  /** Problem with NodeTest */
-  public static final String ER_EXPECTED_NODE_TEST = "ER_EXPECTED_NODE_TEST";
-  /** Expected step pattern */
-  public static final String ER_EXPECTED_STEP_PATTERN =
-        "ER_EXPECTED_STEP_PATTERN";
-  /** Expected relative path pattern */
-  public static final String ER_EXPECTED_REL_PATH_PATTERN =
-         "ER_EXPECTED_REL_PATH_PATTERN";
-  /** ER_CANT_CONVERT_XPATHRESULTTYPE_TO_BOOLEAN          */
-  public static final String ER_CANT_CONVERT_TO_BOOLEAN =
-         "ER_CANT_CONVERT_TO_BOOLEAN";
-  /** Field ER_CANT_CONVERT_TO_SINGLENODE       */
-  public static final String ER_CANT_CONVERT_TO_SINGLENODE =
-         "ER_CANT_CONVERT_TO_SINGLENODE";
-  /** Field ER_CANT_GET_SNAPSHOT_LENGTH         */
-  public static final String ER_CANT_GET_SNAPSHOT_LENGTH =
-         "ER_CANT_GET_SNAPSHOT_LENGTH";
-  /** Field ER_NON_ITERATOR_TYPE                */
-  public static final String ER_NON_ITERATOR_TYPE = "ER_NON_ITERATOR_TYPE";
-  /** Field ER_DOC_MUTATED                      */
-  public static final String ER_DOC_MUTATED = "ER_DOC_MUTATED";
-  public static final String ER_INVALID_XPATH_TYPE = "ER_INVALID_XPATH_TYPE";
-  public static final String ER_EMPTY_XPATH_RESULT = "ER_EMPTY_XPATH_RESULT";
-  public static final String ER_INCOMPATIBLE_TYPES = "ER_INCOMPATIBLE_TYPES";
-  public static final String ER_NULL_RESOLVER = "ER_NULL_RESOLVER";
-  public static final String ER_CANT_CONVERT_TO_STRING =
-         "ER_CANT_CONVERT_TO_STRING";
-  public static final String ER_NON_SNAPSHOT_TYPE = "ER_NON_SNAPSHOT_TYPE";
-  public static final String ER_WRONG_DOCUMENT = "ER_WRONG_DOCUMENT";
-  /* Note to translators:  The XPath expression cannot be evaluated with respect
-   * to this type of node.
-   */
-  /** Field ER_WRONG_NODETYPE                    */
-  public static final String ER_WRONG_NODETYPE = "ER_WRONG_NODETYPE";
-  public static final String ER_XPATH_ERROR = "ER_XPATH_ERROR";
-
-  //BEGIN: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
-  public static final String ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED = "ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED";
-  public static final String ER_RESOLVE_VARIABLE_RETURNS_NULL = "ER_RESOLVE_VARIABLE_RETURNS_NULL";
-  public static final String ER_UNSUPPORTED_RETURN_TYPE = "ER_UNSUPPORTED_RETURN_TYPE";
-  public static final String ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL = "ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL";
-  public static final String ER_ARG_CANNOT_BE_NULL = "ER_ARG_CANNOT_BE_NULL";
-
-  public static final String ER_OBJECT_MODEL_NULL = "ER_OBJECT_MODEL_NULL";
-  public static final String ER_OBJECT_MODEL_EMPTY = "ER_OBJECT_MODEL_EMPTY";
-  public static final String ER_FEATURE_NAME_NULL = "ER_FEATURE_NAME_NULL";
-  public static final String ER_FEATURE_UNKNOWN = "ER_FEATURE_UNKNOWN";
-  public static final String ER_GETTING_NULL_FEATURE = "ER_GETTING_NULL_FEATURE";
-  public static final String ER_GETTING_UNKNOWN_FEATURE = "ER_GETTING_UNKNOWN_FEATURE";
-  public static final String ER_NULL_XPATH_FUNCTION_RESOLVER = "ER_NULL_XPATH_FUNCTION_RESOLVER";
-  public static final String ER_NULL_XPATH_VARIABLE_RESOLVER = "ER_NULL_XPATH_VARIABLE_RESOLVER";
-  //END: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
-
-  public static final String WG_LOCALE_NAME_NOT_HANDLED =
-         "WG_LOCALE_NAME_NOT_HANDLED";
-  public static final String WG_PROPERTY_NOT_SUPPORTED =
-         "WG_PROPERTY_NOT_SUPPORTED";
-  public static final String WG_DONT_DO_ANYTHING_WITH_NS =
-         "WG_DONT_DO_ANYTHING_WITH_NS";
-  public static final String WG_SECURITY_EXCEPTION = "WG_SECURITY_EXCEPTION";
-  public static final String WG_QUO_NO_LONGER_DEFINED =
-         "WG_QUO_NO_LONGER_DEFINED";
-  public static final String WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST =
-         "WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST";
-  public static final String WG_FUNCTION_TOKEN_NOT_FOUND =
-         "WG_FUNCTION_TOKEN_NOT_FOUND";
-  public static final String WG_COULDNOT_FIND_FUNCTION =
-         "WG_COULDNOT_FIND_FUNCTION";
-  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
-  public static final String WG_EXPAND_ENTITIES_NOT_SUPPORTED =
-         "WG_EXPAND_ENTITIES_NOT_SUPPORTED";
-  public static final String WG_ILLEGAL_VARIABLE_REFERENCE =
-         "WG_ILLEGAL_VARIABLE_REFERENCE";
-  public static final String WG_UNSUPPORTED_ENCODING ="WG_UNSUPPORTED_ENCODING";
-
-  /**  detach() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-  /**  num() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-  /**  xstr() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-  /**  str() not supported by XRTreeFragSelectWrapper   */
-  public static final String ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
-         "ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
-
-  // Error messages...
-
-
-  /**
-   * Get the association list.
-   *
-   * @return The association list.
-   */
-  public Object[][] getContents()
-  {
-    return new Object[][]{
-
-  { "ERROR0000" , "{0}" },
-
-  { ER_CURRENT_NOT_ALLOWED_IN_MATCH, "\u5339\u914d\u6a21\u5f0f\u4e2d\u4e0d\u5141\u8bb8\u6709 current() \u51fd\u6570\uff01" },
-
-  { ER_CURRENT_TAKES_NO_ARGS, "current() \u51fd\u6570\u4e0d\u63a5\u53d7\u53c2\u6570\uff01" },
-
-  { ER_DOCUMENT_REPLACED,
-      "document() \u51fd\u6570\u5b9e\u73b0\u5df2\u88ab org.apache.xalan.xslt.FuncDocument \u66ff\u6362\uff01"},
-
-  { ER_CONTEXT_HAS_NO_OWNERDOC,
-      "\u4e0a\u4e0b\u6587\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
-
-  { ER_LOCALNAME_HAS_TOO_MANY_ARGS,
-      "local-name() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_NAMESPACEURI_HAS_TOO_MANY_ARGS,
-      "namespace-uri() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS,
-      "normalize-space() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_NUMBER_HAS_TOO_MANY_ARGS,
-      "number() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_NAME_HAS_TOO_MANY_ARGS,
-     "name() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_STRING_HAS_TOO_MANY_ARGS,
-      "string() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_STRINGLENGTH_HAS_TOO_MANY_ARGS,
-      "string-length() \u7684\u53c2\u6570\u592a\u591a\u3002"},
-
-  { ER_TRANSLATE_TAKES_3_ARGS,
-      "translate() \u51fd\u6570\u6709\u4e09\u4e2a\u53c2\u6570\uff01"},
-
-  { ER_UNPARSEDENTITYURI_TAKES_1_ARG,
-      "unparsed-entity-uri \u51fd\u6570\u5e94\u6709\u4e00\u4e2a\u53c2\u6570\uff01"},
-
-  { ER_NAMESPACEAXIS_NOT_IMPLEMENTED,
-      "\u540d\u79f0\u7a7a\u95f4\u8f74\u5c1a\u672a\u5b9e\u73b0\uff01"},
-
-  { ER_UNKNOWN_AXIS,
-     "\u672a\u77e5\u8f74\uff1a{0}"},
-
-  { ER_UNKNOWN_MATCH_OPERATION,
-     "\u672a\u77e5\u7684\u5339\u914d\u64cd\u4f5c\uff01"},
-
-  { ER_INCORRECT_ARG_LENGTH,
-      "processing-instruction() \u8282\u70b9\u6d4b\u8bd5\u7684\u53c2\u6570\u957f\u5ea6\u4e0d\u6b63\u786e\uff01"},
-
-  { ER_CANT_CONVERT_TO_NUMBER,
-      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210\u6570\u5b57"},
-
-  { ER_CANT_CONVERT_TO_NODELIST,
-      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210 NodeList\uff01"},
-
-  { ER_CANT_CONVERT_TO_MUTABLENODELIST,
-      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210 NodeSetDTM\uff01"},
-
-  { ER_CANT_CONVERT_TO_TYPE,
-      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210 type#{1}"},
-
-  { ER_EXPECTED_MATCH_PATTERN,
-      "getMatchScore \u4e2d\u51fa\u73b0\u671f\u671b\u7684\u5339\u914d\u6a21\u5f0f\uff01"},
-
-  { ER_COULDNOT_GET_VAR_NAMED,
-      "\u65e0\u6cd5\u83b7\u53d6\u540d\u4e3a {0} \u7684\u53d8\u91cf"},
-
-  { ER_UNKNOWN_OPCODE,
-     "\u9519\u8bef\uff01\u672a\u77e5\u64cd\u4f5c\u7801\uff1a{0}"},
-
-  { ER_EXTRA_ILLEGAL_TOKENS,
-     "\u989d\u5916\u7684\u975e\u6cd5\u6807\u8bb0\uff1a{0}"},
-
-
-  { ER_EXPECTED_DOUBLE_QUOTE,
-      "\u9519\u8bef\u5f15\u7528\u7684\u6587\u5b57... \u5e94\u8be5\u4e3a\u53cc\u5f15\u53f7\uff01"},
-
-  { ER_EXPECTED_SINGLE_QUOTE,
-      "\u9519\u8bef\u5f15\u7528\u7684\u6587\u5b57... \u5e94\u8be5\u4e3a\u5355\u5f15\u53f7\uff01"},
-
-  { ER_EMPTY_EXPRESSION,
-     "\u7a7a\u8868\u8fbe\u5f0f\uff01"},
-
-  { ER_EXPECTED_BUT_FOUND,
-     "\u5e94\u8be5\u4e3a {0}\uff0c\u4f46\u53d1\u73b0\u7684\u662f\uff1a{1}"},
-
-  { ER_INCORRECT_PROGRAMMER_ASSERTION,
-      "\u7a0b\u5e8f\u5458\u7684\u65ad\u8a00\u4e0d\u6b63\u786e\uff01\uff0d {0}"},
-
-  { ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL,
-      "19990709 XPath \u8349\u7a3f\u4e2d\uff0cboolean(...) \u53c2\u6570\u4e0d\u518d\u53ef\u9009\u3002"},
-
-  { ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG,
-      "\u5df2\u627e\u5230\u201c,\u201d\uff0c\u4f46\u524d\u9762\u6ca1\u6709\u81ea\u53d8\u91cf\uff01"},
-
-  { ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG,
-      "\u5df2\u627e\u5230\u201c,\u201d\uff0c\u4f46\u540e\u9762\u6ca1\u6709\u8ddf\u81ea\u53d8\u91cf\uff01"},
-
-  { ER_PREDICATE_ILLEGAL_SYNTAX,
-      "\u201c..[predicate]\u201d\u6216\u201c.[predicate]\u201d\u662f\u975e\u6cd5\u7684\u8bed\u6cd5\u3002\u8bf7\u6539\u4e3a\u4f7f\u7528\u201cself::node()[predicate]\u201d\u3002"},
-
-  { ER_ILLEGAL_AXIS_NAME,
-     "\u975e\u6cd5\u7684\u8f74\u540d\u79f0\uff1a{0}"},
-
-  { ER_UNKNOWN_NODETYPE,
-     "\u672a\u77e5\u8282\u70b9\u7c7b\u578b\uff1a{0}"},
-
-  { ER_PATTERN_LITERAL_NEEDS_BE_QUOTED,
-      "\u9700\u8981\u5f15\u7528\u6a21\u5f0f\u6587\u5b57\uff08{0}\uff09\uff01"},
-
-  { ER_COULDNOT_BE_FORMATTED_TO_NUMBER,
-      "{0} \u65e0\u6cd5\u683c\u5f0f\u5316\u4e3a\u6570\u5b57\uff01"},
-
-  { ER_COULDNOT_CREATE_XMLPROCESSORLIAISON,
-      "\u65e0\u6cd5\u521b\u5efa XML TransformerFactory \u8054\u7cfb\uff1a{0}"},
-
-  { ER_DIDNOT_FIND_XPATH_SELECT_EXP,
-      "\u9519\u8bef\uff01\u627e\u4e0d\u5230 xpath \u9009\u62e9\u8868\u8fbe\u5f0f\uff08-select\uff09\u3002"},
-
-  { ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH,
-      "\u9519\u8bef\uff01\u5728 OP_LOCATIONPATH \u4e4b\u540e\u627e\u4e0d\u5230 ENDOP"},
-
-  { ER_ERROR_OCCURED,
-     "\u51fa\u73b0\u9519\u8bef\uff01"},
-
-  { ER_ILLEGAL_VARIABLE_REFERENCE,
-      "VariableReference \u8d4b\u7ed9\u4e86\u4e0a\u4e0b\u6587\u5916\u7684\u53d8\u91cf\u6216\u6ca1\u6709\u5b9a\u4e49\u7684\u53d8\u91cf\uff01\u540d\u79f0 = {0}"},
-
-  { ER_AXES_NOT_ALLOWED,
-      "\u5728\u5339\u914d\u6a21\u5f0f\u4e2d\u53ea\u5141\u8bb8\u51fa\u73b0 child:: \u548c attribute:: \u8f74\uff01\u8fdd\u53cd\u7684\u8f74 = {0}"},
-
-  { ER_KEY_HAS_TOO_MANY_ARGS,
-      "key() \u7684\u53c2\u6570\u4e2a\u6570\u4e0d\u6b63\u786e\u3002"},
-
-  { ER_COUNT_TAKES_1_ARG,
-      "count \u51fd\u6570\u5e94\u8be5\u6709\u4e00\u4e2a\u53c2\u6570\uff01"},
-
-  { ER_COULDNOT_FIND_FUNCTION,
-     "\u627e\u4e0d\u5230\u51fd\u6570\uff1a{0}"},
-
-  { ER_UNSUPPORTED_ENCODING,
-     "\u4e0d\u53d7\u652f\u6301\u7684\u7f16\u7801\uff1a{0}"},
-
-  { ER_PROBLEM_IN_DTM_NEXTSIBLING,
-      "getNextSibling \u8fc7\u7a0b\u4e2d\uff0cDTM \u4e2d\u51fa\u73b0\u95ee\u9898...\u6b63\u5728\u5c1d\u8bd5\u6062\u590d"},
-
-  { ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL,
-      "\u7a0b\u5e8f\u5458\u9519\u8bef\uff1a\u4e0d\u53ef\u5411 EmptyNodeList \u5199\u5165\u5185\u5bb9\u3002"},
-
-  { ER_SETDOMFACTORY_NOT_SUPPORTED,
-      "XPathContext \u4e0d\u652f\u6301 setDOMFactory\uff01"},
-
-  { ER_PREFIX_MUST_RESOLVE,
-      "\u524d\u7f00\u5fc5\u987b\u89e3\u6790\u4e3a\u540d\u79f0\u7a7a\u95f4\uff1a{0}"},
-
-  { ER_PARSE_NOT_SUPPORTED,
-      "XPathContext \u4e2d\u4e0d\u652f\u6301 parse (InputSource source)\uff01\u65e0\u6cd5\u6253\u5f00 {0}"},
-
-  { ER_SAX_API_NOT_HANDLED,
-      "DTM \u4e0d\u5904\u7406 SAX API characters(char ch[]...\uff01"},
-
-  { ER_IGNORABLE_WHITESPACE_NOT_HANDLED,
-      "DTM \u4e0d\u5904\u7406 ignorableWhitespace(char ch[]...\uff01"},
-
-  { ER_DTM_CANNOT_HANDLE_NODES,
-      "DTMLiaison \u4e0d\u80fd\u5904\u7406\u7c7b\u578b {0} \u7684\u8282\u70b9"},
-
-  { ER_XERCES_CANNOT_HANDLE_NODES,
-      "DOM2Helper \u4e0d\u80fd\u5904\u7406\u7c7b\u578b {0} \u7684\u8282\u70b9"},
-
-  { ER_XERCES_PARSE_ERROR_DETAILS,
-      "DOM2Helper.parse \u9519\u8bef\uff1aSystemID \uff0d \u7b2c {0} \u884c \uff0d {1}"},
-
-  { ER_XERCES_PARSE_ERROR,
-     "DOM2Helper.parse \u9519\u8bef"},
-
-  { ER_INVALID_UTF16_SURROGATE,
-      "\u68c0\u6d4b\u5230\u65e0\u6548\u7684 UTF-16 \u8d85\u5927\u5b57\u7b26\u96c6\uff1a{0}\uff1f"},
-
-  { ER_OIERROR,
-     "IO \u9519\u8bef"},
-
-  { ER_CANNOT_CREATE_URL,
-     "\u65e0\u6cd5\u4e3a {0} \u521b\u5efa URL"},
-
-  { ER_XPATH_READOBJECT,
-     "\u5728 XPath.readObject \u4e2d\uff1a{0}"},
-
-  { ER_FUNCTION_TOKEN_NOT_FOUND,
-      "\u627e\u4e0d\u5230\u51fd\u6570\u6807\u8bb0\u3002"},
-
-  { ER_CANNOT_DEAL_XPATH_TYPE,
-       "\u65e0\u6cd5\u5904\u7406 XPath \u7c7b\u578b\uff1a{0}"},
-
-  { ER_NODESET_NOT_MUTABLE,
-       "\u6b64 NodeSet \u662f\u4e0d\u6613\u53d8\u7684"},
-
-  { ER_NODESETDTM_NOT_MUTABLE,
-       "\u6b64 NodeSetDTM \u662f\u4e0d\u6613\u53d8\u7684"},
-
-  { ER_VAR_NOT_RESOLVABLE,
-        "\u53d8\u91cf\u4e0d\u53ef\u89e3\u6790\uff1a{0}"},
-
-  { ER_NULL_ERROR_HANDLER,
-        "\u9519\u8bef\u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
-
-  { ER_PROG_ASSERT_UNKNOWN_OPCODE,
-       "\u7a0b\u5e8f\u5458\u65ad\u8a00\uff1a\u672a\u77e5\u64cd\u4f5c\u7801\uff1a{0}"},
-
-  { ER_ZERO_OR_ONE,
-       "0 \u6216 1"},
-
-  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-       "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 rtf()"},
-
-  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-       "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 asNodeIterator()"},
-
-   { ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 detach()"},
-
-   { ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 num()"},
-
-   { ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 xstr()"},
-
-   { ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
-                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 str()"},
-
-  { ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS,
-       "XStringForChars \u4e0d\u652f\u6301 fsb()"},
-
-  { ER_COULD_NOT_FIND_VAR,
-      "\u627e\u4e0d\u5230\u540d\u4e3a {0} \u7684\u53d8\u91cf"},
-
-  { ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING,
-      "XStringForChars \u65e0\u6cd5\u5c06\u5b57\u7b26\u4e32\u4f5c\u4e3a\u81ea\u53d8\u91cf"},
-
-  { ER_FASTSTRINGBUFFER_CANNOT_BE_NULL,
-      "FastStringBuffer \u81ea\u53d8\u91cf\u4e0d\u80fd\u4e3a\u7a7a"},
-
-  { ER_TWO_OR_THREE,
-       "2 \u6216 3"},
-
-  { ER_VARIABLE_ACCESSED_BEFORE_BIND,
-       "\u5728\u7ed1\u5b9a\u524d\u5df2\u8bbf\u95ee\u53d8\u91cf\uff01"},
-
-  { ER_FSB_CANNOT_TAKE_STRING,
-       "XStringForFSB \u65e0\u6cd5\u5c06\u5b57\u7b26\u4e32\u4f5c\u4e3a\u81ea\u53d8\u91cf\uff01"},
-
-  { ER_SETTING_WALKER_ROOT_TO_NULL,
-       "\n \uff01\uff01\uff01\uff01\u9519\u8bef\uff01\u6b63\u5728\u5c06\u6b65\u884c\u7a0b\u5e8f\u7684\u6839\u8bbe\u7f6e\u4e3a\u7a7a\uff01\uff01\uff01"},
-
-  { ER_NODESETDTM_CANNOT_ITERATE,
-       "\u6b64 NodeSetDTM \u65e0\u6cd5\u8fed\u4ee3\u5230\u5148\u524d\u7684\u8282\u70b9\uff01"},
-
-  { ER_NODESET_CANNOT_ITERATE,
-       "\u6b64 NodeSet \u65e0\u6cd5\u8fed\u4ee3\u5230\u5148\u524d\u7684\u8282\u70b9\uff01"},
-
-  { ER_NODESETDTM_CANNOT_INDEX,
-       "\u6b64 NodeSetDTM \u65e0\u6cd5\u6267\u884c\u7d22\u5f15\u6216\u8ba1\u6570\u529f\u80fd\uff01"},
-
-  { ER_NODESET_CANNOT_INDEX,
-       "\u6b64 NodeSet \u65e0\u6cd5\u6267\u884c\u7d22\u5f15\u6216\u8ba1\u6570\u529f\u80fd\uff01"},
-
-  { ER_CANNOT_CALL_SETSHOULDCACHENODE,
-       "\u8c03\u7528 nextNode \u540e\u4e0d\u80fd\u8c03\u7528 setShouldCacheNode\uff01"},
-
-  { ER_ONLY_ALLOWS,
-       "{0} \u4ec5\u5141\u8bb8 {1} \u4e2a\u81ea\u53d8\u91cf"},
-
-  { ER_UNKNOWN_STEP,
-       "\u7a0b\u5e8f\u5458\u5728 getNextStepPos \u4e2d\u7684\u65ad\u8a00\uff1a\u672a\u77e5\u7684 stepType\uff1a{0}"},
-
-  //Note to translators:  A relative location path is a form of XPath expression.
-  // The message indicates that such an expression was expected following the
-  // characters '/' or '//', but was not found.
-  { ER_EXPECTED_REL_LOC_PATH,
-      "\u5728\u201c/\u201d\u6216\u201c//\u201d\u6807\u8bb0\u540e\u5e94\u8be5\u51fa\u73b0\u76f8\u5bf9\u4f4d\u7f6e\u8def\u5f84\u3002"},
-
-  // Note to translators:  A location path is a form of XPath expression.
-  // The message indicates that syntactically such an expression was expected,but
-  // the characters specified by the substitution text were encountered instead.
-  { ER_EXPECTED_LOC_PATH,
-       "\u5e94\u8be5\u51fa\u73b0\u4f4d\u7f6e\u8def\u5f84\uff0c\u4f46\u9047\u5230\u4ee5\u4e0b\u6807\u8bb0\u003a{0}"},
-
-  // Note to translators:  A location path is a form of XPath expression.
-  // The message indicates that syntactically such a subexpression was expected,
-  // but no more characters were found in the expression.
-  { ER_EXPECTED_LOC_PATH_AT_END_EXPR,
-       "\u5e94\u8be5\u51fa\u73b0\u4f4d\u7f6e\u8def\u5f84\uff0c\u4f46\u53d1\u73b0\u7684\u5374\u662f XPath \u8868\u8fbe\u5f0f\u7684\u7ed3\u5c3e\u3002"},
-
-  // Note to translators:  A location step is part of an XPath expression.
-  // The message indicates that syntactically such an expression was expected
-  // following the specified characters.
-  { ER_EXPECTED_LOC_STEP,
-       "\u201c/\u201d\u6216\u201c//\u201d\u6807\u8bb0\u540e\u5e94\u8be5\u51fa\u73b0\u4f4d\u7f6e\u6b65\u9aa4\u3002"},
-
-  // Note to translators:  A node test is part of an XPath expression that is
-  // used to test for particular kinds of nodes.  In this case, a node test that
-  // consists of an NCName followed by a colon and an asterisk or that consists
-  // of a QName was expected, but was not found.
-  { ER_EXPECTED_NODE_TEST,
-       "\u5e94\u8be5\u51fa\u73b0\u4e0e NCName:* \u6216 QName \u5339\u914d\u7684\u8282\u70b9\u6d4b\u8bd5\u3002"},
-
-  // Note to translators:  A step pattern is part of an XPath expression.
-  // The message indicates that syntactically such an expression was expected,
-  // but the specified character was found in the expression instead.
-  { ER_EXPECTED_STEP_PATTERN,
-       "\u5e94\u8be5\u51fa\u73b0\u6b65\u9aa4\u6a21\u5f0f\uff0c\u4f46\u9047\u5230\u4e86\u201c/\u201d\u3002"},
-
-  // Note to translators: A relative path pattern is part of an XPath expression.
-  // The message indicates that syntactically such an expression was expected,
-  // but was not found.
-  { ER_EXPECTED_REL_PATH_PATTERN,
-       "\u5e94\u8be5\u51fa\u73b0\u76f8\u5bf9\u8def\u5f84\u6a21\u5f0f\u3002"},
-
-  // Note to translators:  The substitution text is the name of a data type.  The
-  // message indicates that a value of a particular type could not be converted
-  // to a value of type boolean.
-  { ER_CANT_CONVERT_TO_BOOLEAN,
-       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u5e03\u5c14\u578b\u3002"},
-
-  // Note to translators: Do not translate ANY_UNORDERED_NODE_TYPE and
-  // FIRST_ORDERED_NODE_TYPE.
-  { ER_CANT_CONVERT_TO_SINGLENODE,
-       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u5355\u4e00\u8282\u70b9\u3002getSingleNodeValue \u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b ANY_UNORDERED_NODE_TYPE \u548c FIRST_ORDERED_NODE_TYPE\u3002"},
-
-  // Note to translators: Do not translate UNORDERED_NODE_SNAPSHOT_TYPE and
-  // ORDERED_NODE_SNAPSHOT_TYPE.
-  { ER_CANT_GET_SNAPSHOT_LENGTH,
-       "\u4e0d\u80fd\u5bf9 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u8c03\u7528 getSnapshotLength \u65b9\u6cd5\uff0c\u56e0\u4e3a\u8be5\u8868\u8fbe\u5f0f\u7684 XPathResult \u7684 XPathResultType \u4e3a {1}\u3002\u6b64\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b UNORDERED_NODE_SNAPSHOT_TYPE \u548c ORDERED_NODE_SNAPSHOT_TYPE\u3002"},
-
-  { ER_NON_ITERATOR_TYPE,
-       "\u4e0d\u80fd\u5bf9 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u8c03\u7528 iterateNext \u65b9\u6cd5\uff0c\u56e0\u4e3a\u8be5\u8868\u8fbe\u5f0f\u7684 XPathResult \u7684 XPathResultType \u4e3a {1}\u3002\u6b64\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b UNORDERED_NODE_ITERATOR_TYPE \u548c ORDERED_NODE_ITERATOR_TYPE\u3002"},
-
-  // Note to translators: This message indicates that the document being operated
-  // upon changed, so the iterator object that was being used to traverse the
-  // document has now become invalid.
-  { ER_DOC_MUTATED,
-       "\u8fd4\u56de\u7ed3\u679c\u540e\u6587\u6863\u53d1\u751f\u53d8\u5316\u3002\u8fed\u4ee3\u5668\u65e0\u6548\u3002"},
-
-  { ER_INVALID_XPATH_TYPE,
-       "\u65e0\u6548\u7684 XPath \u7c7b\u578b\u81ea\u53d8\u91cf\uff1a{0}"},
-
-  { ER_EMPTY_XPATH_RESULT,
-       "\u7a7a\u7684 XPath \u7ed3\u679c\u5bf9\u8c61"},
-
-  { ER_INCOMPATIBLE_TYPES,
-       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u5f3a\u5236\u8f6c\u6362\u4e3a\u6307\u5b9a\u7684 XPathResultType {2}\u3002"},
-
-  { ER_NULL_RESOLVER,
-       "\u65e0\u6cd5\u4f7f\u7528\u7a7a\u7684\u524d\u7f00\u89e3\u6790\u5668\u89e3\u6790\u524d\u7f00\u3002"},
-
-  // Note to translators:  The substitution text is the name of a data type.  The
-  // message indicates that a value of a particular type could not be converted
-  // to a value of type string.
-  { ER_CANT_CONVERT_TO_STRING,
-       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\u3002"},
-
-  // Note to translators: Do not translate snapshotItem,
-  // UNORDERED_NODE_SNAPSHOT_TYPE and ORDERED_NODE_SNAPSHOT_TYPE.
-  { ER_NON_SNAPSHOT_TYPE,
-       "\u4e0d\u80fd\u5bf9 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u8c03\u7528\u65b9\u6cd5 snapshotItem\uff0c\u56e0\u4e3a\u8be5\u8868\u8fbe\u5f0f\u7684 XPathResult \u7684 XPathResultType \u4e3a {1}\u3002\u6b64\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b UNORDERED_NODE_SNAPSHOT_TYPE \u548c ORDERED_NODE_SNAPSHOT_TYPE\u3002"},
-
-  // Note to translators:  XPathEvaluator is a Java interface name.  An
-  // XPathEvaluator is created with respect to a particular XML document, and in
-  // this case the expression represented by this object was being evaluated with
-  // respect to a context node from a different document.
-  { ER_WRONG_DOCUMENT,
-       "\u4e0a\u4e0b\u6587\u8282\u70b9\u4e0d\u5c5e\u4e8e\u7ed1\u5b9a\u5230\u6b64 XPathEvaluator \u7684\u6587\u6863\u3002"},
-
-  // Note to translators:  The XPath expression cannot be evaluated with respect
-  // to this type of node.
-  { ER_WRONG_NODETYPE,
-       "\u4e0d\u652f\u6301\u4e0a\u4e0b\u6587\u8282\u70b9\u7c7b\u578b\u3002"},
-
-  { ER_XPATH_ERROR,
-       "XPath \u4e2d\u51fa\u73b0\u672a\u77e5\u9519\u8bef"},
-
-        { ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER,
-                "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u6570\u5b57\u3002"},
-
-  //BEGIN:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
-
-  /** Field ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED                       */
-
-  { ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED,
-       "\u6269\u5c55\u51fd\u6570\uff1a\u5f53 XMLConstants.FEATURE_SECURE_PROCESSING \u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u65e0\u6cd5\u8c03\u7528\u201c{0}\u201d\u3002"},
-
-  /** Field ER_RESOLVE_VARIABLE_RETURNS_NULL                       */
-
-  { ER_RESOLVE_VARIABLE_RETURNS_NULL,
-       "\u53d8\u91cf {0} \u7684 resolveVariable \u6b63\u5728\u8fd4\u56de\u7a7a\u503c"},
-
-  /** Field ER_UNSUPPORTED_RETURN_TYPE                       */
-
-  { ER_UNSUPPORTED_RETURN_TYPE,
-       "\u4e0d\u53d7\u652f\u6301\u7684\u8fd4\u56de\u7c7b\u578b\uff1a{0}"},
-
-  /** Field ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL                       */
-
-  { ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL,
-       "\u6e90\u548c\uff0f\u6216\u8fd4\u56de\u7c7b\u578b\u4e0d\u80fd\u4e3a\u7a7a"},
-
-  /** Field ER_ARG_CANNOT_BE_NULL                       */
-
-  { ER_ARG_CANNOT_BE_NULL,
-       "{0} \u81ea\u53d8\u91cf\u4e0d\u80fd\u4e3a\u7a7a"},
-
-  /** Field ER_OBJECT_MODEL_NULL                       */
-
-  { ER_OBJECT_MODEL_NULL,
-       "{0}#isObjectModelSupported( String objectModel ) \u4e0d\u80fd\u88ab\u8c03\u7528\uff08\u5982\u679c objectModel == null\uff09"},
-
-  /** Field ER_OBJECT_MODEL_EMPTY                       */
-
-  { ER_OBJECT_MODEL_EMPTY,
-       "{0}#isObjectModelSupported( String objectModel ) \u4e0d\u80fd\u88ab\u8c03\u7528\uff08\u5982\u679c objectModel == \"\"\uff09"},
-
-  /** Field ER_OBJECT_MODEL_EMPTY                       */
-
-  { ER_FEATURE_NAME_NULL,
-       "\u6b63\u5728\u5c1d\u8bd5\u8bbe\u7f6e\u540d\u79f0\u4e3a\u7a7a\u7684\u7279\u5f81\uff1a{0}#setFeature( null, {1})"},
-
-  /** Field ER_FEATURE_UNKNOWN                       */
-
-  { ER_FEATURE_UNKNOWN,
-       "\u6b63\u5728\u5c1d\u8bd5\u8bbe\u7f6e\u672a\u77e5\u7279\u5f81\u201c{0}\u201d\uff1a{1}#setFeature({0},{2})"},
-
-  /** Field ER_GETTING_NULL_FEATURE                       */
-
-  { ER_GETTING_NULL_FEATURE,
-       "\u6b63\u5728\u5c1d\u8bd5\u83b7\u53d6\u540d\u79f0\u4e3a\u7a7a\u7684\u7279\u5f81\uff1a{0}#getFeature(null)"},
-
-  /** Field ER_GETTING_NULL_FEATURE                       */
-
-  { ER_GETTING_UNKNOWN_FEATURE,
-       "\u6b63\u5728\u5c1d\u8bd5\u83b7\u53d6\u672a\u77e5\u7279\u5f81\u201c{0}\u201d\uff1a{1}#getFeature({0})"},
-
-  /** Field ER_NULL_XPATH_FUNCTION_RESOLVER                       */
-
-  { ER_NULL_XPATH_FUNCTION_RESOLVER,
-       "\u6b63\u5728\u8bd5\u56fe\u8bbe\u7f6e\u7a7a\u7684 XPathFunctionResolver\uff1a{0}#setXPathFunctionResolver(null)"},
-
-  /** Field ER_NULL_XPATH_VARIABLE_RESOLVER                       */
-
-  { ER_NULL_XPATH_VARIABLE_RESOLVER,
-       "\u6b63\u5728\u8bd5\u56fe\u8bbe\u7f6e\u7a7a\u7684 XPathVariableResolver\uff1a{0}#setXPathVariableResolver(null)"},
-
-  //END:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
-
-  // Warnings...
-
-  { WG_LOCALE_NAME_NOT_HANDLED,
-      "\u5728\u672a\u5904\u7406\u8fc7\u7684 format-number \u51fd\u6570\u4e2d\u51fa\u73b0\u8bed\u8a00\u73af\u5883\u540d\uff01"},
-
-  { WG_PROPERTY_NOT_SUPPORTED,
-      "\u4e0d\u652f\u6301 XSL \u5c5e\u6027\uff1a{0}"},
-
-  { WG_DONT_DO_ANYTHING_WITH_NS,
-      "\u5f53\u524d\u4e0d\u8981\u5728\u5c5e\u6027 {1} \u4e2d\u5bf9\u540d\u79f0\u7a7a\u95f4 {0} \u8fdb\u884c\u4efb\u4f55\u5904\u7406"},
-
-  { WG_SECURITY_EXCEPTION,
-      "\u5728\u8bd5\u56fe\u8bbf\u95ee XSL \u7cfb\u7edf\u5c5e\u6027 {0} \u65f6\u53d1\u751f SecurityException"},
-
-  { WG_QUO_NO_LONGER_DEFINED,
-      "XPath \u4e2d\u4e0d\u518d\u5b9a\u4e49\u65e7\u8bed\u6cd5\uff1aquo(...)\u3002"},
-
-  { WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST,
-      "XPath \u9700\u8981\u4e00\u4e2a\u6d3e\u751f\u7684\u5bf9\u8c61\u4ee5\u5b9e\u73b0 nodeTest\uff01"},
-
-  { WG_FUNCTION_TOKEN_NOT_FOUND,
-      "\u627e\u4e0d\u5230\u51fd\u6570\u6807\u8bb0\u3002"},
-
-  { WG_COULDNOT_FIND_FUNCTION,
-      "\u627e\u4e0d\u5230\u51fd\u6570\uff1a{0}"},
-
-  { WG_CANNOT_MAKE_URL_FROM,
-      "\u65e0\u6cd5\u4ece {0} \u751f\u6210 URL"},
-
-  { WG_EXPAND_ENTITIES_NOT_SUPPORTED,
-      "DTM \u89e3\u6790\u5668\u4e0d\u652f\u6301 -E \u9009\u9879"},
-
-  { WG_ILLEGAL_VARIABLE_REFERENCE,
-      "VariableReference \u8d4b\u7ed9\u4e86\u4e0a\u4e0b\u6587\u5916\u7684\u53d8\u91cf\u6216\u6ca1\u6709\u5b9a\u4e49\u7684\u53d8\u91cf\uff01\u540d\u79f0 = {0}"},
-
-  { WG_UNSUPPORTED_ENCODING,
-     "\u4e0d\u53d7\u652f\u6301\u7684\u7f16\u7801\uff1a{0}"},
-
-
-
-  // Other miscellaneous text used inside the code...
-  { "ui_language", "zh"},
-  { "help_language", "zh"},
-  { "language", "zh"},
-  { "BAD_CODE", "createMessage \u7684\u53c2\u6570\u8d85\u51fa\u8303\u56f4"},
-  { "FORMAT_FAILED", "\u5728 messageFormat \u8c03\u7528\u8fc7\u7a0b\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38"},
-  { "version", ">>>>>>> Xalan \u7248\u672c"},
-  { "version2", "<<<<<<<"},
-  { "yes", "\u662f"},
-  { "line", "\u884c\u53f7"},
-  { "column", "\u5217\u53f7"},
-  { "xsldone", "XSLProcessor\uff1a\u5b8c\u6210"},
-  { "xpath_option", "xpath \u9009\u9879\uff1a"},
-  { "optionIN", "[-in inputXMLURL]"},
-  { "optionSelect", "[-select xpath \u8868\u8fbe\u5f0f]"},
-  { "optionMatch", "[-match \u5339\u914d\u6a21\u5f0f\uff08\u7528\u4e8e\u5339\u914d\u8bca\u65ad\uff09]"},
-  { "optionAnyExpr", "\u6216\u8005\u4ec5\u4e00\u4e2a xpath \u8868\u8fbe\u5f0f\u5c31\u5c06\u5b8c\u6210\u4e00\u4e2a\u8bca\u65ad\u8f6c\u50a8"},
-  { "noParsermsg1", "XSL \u5904\u7406\u4e0d\u6210\u529f\u3002"},
-  { "noParsermsg2", "** \u627e\u4e0d\u5230\u89e3\u6790\u5668 **"},
-  { "noParsermsg3", "\u8bf7\u68c0\u67e5\u60a8\u7684\u7c7b\u8def\u5f84\u3002"},
-  { "noParsermsg4", "\u5982\u679c\u6ca1\u6709 IBM \u7684 XML Parser for Java\uff0c\u60a8\u53ef\u4ee5\u4ece\u4ee5\u4e0b\u4f4d\u7f6e\u4e0b\u8f7d\u5b83\uff1a"},
-  { "noParsermsg5", "IBM \u7684 AlphaWorks\uff1ahttp://www.alphaworks.ibm.com/formula/xml"},
-  { "gtone", ">1" },
-  { "zero", "0" },
-  { "one", "1" },
-  { "two" , "2" },
-  { "three", "3" }
-
-  };
-  }
-
-
-  // ================= INFRASTRUCTURE ======================
-
-  /** Field BAD_CODE          */
-  public static final String BAD_CODE = "BAD_CODE";
-
-  /** Field FORMAT_FAILED          */
-  public static final String FORMAT_FAILED = "FORMAT_FAILED";
-
-  /** Field ERROR_RESOURCES          */
-  public static final String ERROR_RESOURCES =
-    "org.apache.xpath.res.XPATHErrorResources";
-
-  /** Field ERROR_STRING          */
-  public static final String ERROR_STRING = "#\u9519\u8bef";
-
-  /** Field ERROR_HEADER          */
-  public static final String ERROR_HEADER = "\u9519\u8bef\uff1a";
-
-  /** Field WARNING_HEADER          */
-  public static final String WARNING_HEADER = "\u8b66\u544a\uff1a";
-
-  /** Field XSL_HEADER          */
-  public static final String XSL_HEADER = "XSL";
-
-  /** Field XML_HEADER          */
-  public static final String XML_HEADER = "XML";
-
-  /** Field QUERY_HEADER          */
-  public static final String QUERY_HEADER = "PATTERN";
-
-
-  /**
-   * Return a named ResourceBundle for a particular locale.  This method mimics the behavior
-   * of ResourceBundle.getBundle().
-   *
-   * @param className Name of local-specific subclass.
-   * @return the ResourceBundle
-   * @throws MissingResourceException
-   */
-  public static final XPATHErrorResources loadResourceBundle(String className)
-          throws MissingResourceException
-  {
-
-    Locale locale = Locale.getDefault();
-    String suffix = getResourceSuffix(locale);
-
-    try
-    {
-
-      // first try with the given locale
-      return (XPATHErrorResources) ResourceBundle.getBundle(className
-              + suffix, locale);
-    }
-    catch (MissingResourceException e)
-    {
-      try  // try to fall back to en_US if we can't load
-      {
-
-        // Since we can't find the localized property file,
-        // fall back to en_US.
-        return (XPATHErrorResources) ResourceBundle.getBundle(className,
-                new Locale("zh", "CN"));
-      }
-      catch (MissingResourceException e2)
-      {
-
-        // Now we are really in trouble.
-        // very bad, definitely very bad...not going to get very far
-        throw new MissingResourceException(
-          "Could not load any resource bundles.", className, "");
-      }
-    }
-  }
-
-  /**
-   * Return the resource file suffic for the indicated locale
-   * For most locales, this will be based the language code.  However
-   * for Chinese, we do distinguish between Taiwan and PRC
-   *
-   * @param locale the locale
-   * @return an String suffix which canbe appended to a resource name
-   */
-  private static final String getResourceSuffix(Locale locale)
-  {
-
-    String suffix = "_" + locale.getLanguage();
-    String country = locale.getCountry();
-
-    if (country.equals("TW"))
-      suffix += "_" + country;
-
-    return suffix;
-  }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the  "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id$
+ */
+package org.apache.xpath.res;
+
+import java.util.ListResourceBundle;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Set up error messages.
+ * We build a two dimensional array of message keys and
+ * message strings. In order to add a new message here,
+ * you need to first add a Static string constant for the
+ * Key and update the contents array with Key, Value pair
+  * Also you need to  update the count of messages(MAX_CODE)or
+ * the count of warnings(MAX_WARNING) [ Information purpose only]
+ * @xsl.usage advanced
+ */
+public class XPATHErrorResources_zh extends ListResourceBundle
+{
+
+/*
+ * General notes to translators:
+ *
+ * This file contains error and warning messages related to XPath Error
+ * Handling.
+ *
+ *  1) Xalan (or more properly, Xalan-interpretive) and XSLTC are names of
+ *     components.
+ *     XSLT is an acronym for "XML Stylesheet Language: Transformations".
+ *     XSLTC is an acronym for XSLT Compiler.
+ *
+ *  2) A stylesheet is a description of how to transform an input XML document
+ *     into a resultant XML document (or HTML document or text).  The
+ *     stylesheet itself is described in the form of an XML document.
+ *
+ *  3) A template is a component of a stylesheet that is used to match a
+ *     particular portion of an input document and specifies the form of the
+ *     corresponding portion of the output document.
+ *
+ *  4) An element is a mark-up tag in an XML document; an attribute is a
+ *     modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
+ *     "elem" is an element name, "attr" and "attr2" are attribute names with
+ *     the values "val" and "val2", respectively.
+ *
+ *  5) A namespace declaration is a special attribute that is used to associate
+ *     a prefix with a URI (the namespace).  The meanings of element names and
+ *     attribute names that use that prefix are defined with respect to that
+ *     namespace.
+ *
+ *  6) "Translet" is an invented term that describes the class file that
+ *     results from compiling an XML stylesheet into a Java class.
+ *
+ *  7) XPath is a specification that describes a notation for identifying
+ *     nodes in a tree-structured representation of an XML document.  An
+ *     instance of that notation is referred to as an XPath expression.
+ *
+ *  8) The context node is the node in the document with respect to which an
+ *     XPath expression is being evaluated.
+ *
+ *  9) An iterator is an object that traverses nodes in the tree, one at a time.
+ *
+ *  10) NCName is an XML term used to describe a name that does not contain a
+ *     colon (a "no-colon name").
+ *
+ *  11) QName is an XML term meaning "qualified name".
+ */
+
+  /*
+   * static variables
+   */
+  public static final String ERROR0000 = "ERROR0000";
+  public static final String ER_CURRENT_NOT_ALLOWED_IN_MATCH =
+         "ER_CURRENT_NOT_ALLOWED_IN_MATCH";
+  public static final String ER_CURRENT_TAKES_NO_ARGS =
+         "ER_CURRENT_TAKES_NO_ARGS";
+  public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
+  public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
+         "ER_CONTEXT_HAS_NO_OWNERDOC";
+  public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
+         "ER_LOCALNAME_HAS_TOO_MANY_ARGS";
+  public static final String ER_NAMESPACEURI_HAS_TOO_MANY_ARGS =
+         "ER_NAMESPACEURI_HAS_TOO_MANY_ARGS";
+  public static final String ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS =
+         "ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS";
+  public static final String ER_NUMBER_HAS_TOO_MANY_ARGS =
+         "ER_NUMBER_HAS_TOO_MANY_ARGS";
+  public static final String ER_NAME_HAS_TOO_MANY_ARGS =
+         "ER_NAME_HAS_TOO_MANY_ARGS";
+  public static final String ER_STRING_HAS_TOO_MANY_ARGS =
+         "ER_STRING_HAS_TOO_MANY_ARGS";
+  public static final String ER_STRINGLENGTH_HAS_TOO_MANY_ARGS =
+         "ER_STRINGLENGTH_HAS_TOO_MANY_ARGS";
+  public static final String ER_TRANSLATE_TAKES_3_ARGS =
+         "ER_TRANSLATE_TAKES_3_ARGS";
+  public static final String ER_UNPARSEDENTITYURI_TAKES_1_ARG =
+         "ER_UNPARSEDENTITYURI_TAKES_1_ARG";
+  public static final String ER_NAMESPACEAXIS_NOT_IMPLEMENTED =
+         "ER_NAMESPACEAXIS_NOT_IMPLEMENTED";
+  public static final String ER_UNKNOWN_AXIS = "ER_UNKNOWN_AXIS";
+  public static final String ER_UNKNOWN_MATCH_OPERATION =
+         "ER_UNKNOWN_MATCH_OPERATION";
+  public static final String ER_INCORRECT_ARG_LENGTH ="ER_INCORRECT_ARG_LENGTH";
+  public static final String ER_CANT_CONVERT_TO_NUMBER =
+         "ER_CANT_CONVERT_TO_NUMBER";
+  public static final String ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER =
+           "ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER";
+  public static final String ER_CANT_CONVERT_TO_NODELIST =
+         "ER_CANT_CONVERT_TO_NODELIST";
+  public static final String ER_CANT_CONVERT_TO_MUTABLENODELIST =
+         "ER_CANT_CONVERT_TO_MUTABLENODELIST";
+  public static final String ER_CANT_CONVERT_TO_TYPE ="ER_CANT_CONVERT_TO_TYPE";
+  public static final String ER_EXPECTED_MATCH_PATTERN =
+         "ER_EXPECTED_MATCH_PATTERN";
+  public static final String ER_COULDNOT_GET_VAR_NAMED =
+         "ER_COULDNOT_GET_VAR_NAMED";
+  public static final String ER_UNKNOWN_OPCODE = "ER_UNKNOWN_OPCODE";
+  public static final String ER_EXTRA_ILLEGAL_TOKENS ="ER_EXTRA_ILLEGAL_TOKENS";
+  public static final String ER_EXPECTED_DOUBLE_QUOTE =
+         "ER_EXPECTED_DOUBLE_QUOTE";
+  public static final String ER_EXPECTED_SINGLE_QUOTE =
+         "ER_EXPECTED_SINGLE_QUOTE";
+  public static final String ER_EMPTY_EXPRESSION = "ER_EMPTY_EXPRESSION";
+  public static final String ER_EXPECTED_BUT_FOUND = "ER_EXPECTED_BUT_FOUND";
+  public static final String ER_INCORRECT_PROGRAMMER_ASSERTION =
+         "ER_INCORRECT_PROGRAMMER_ASSERTION";
+  public static final String ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL =
+         "ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL";
+  public static final String ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG =
+         "ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG";
+  public static final String ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG =
+         "ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG";
+  public static final String ER_PREDICATE_ILLEGAL_SYNTAX =
+         "ER_PREDICATE_ILLEGAL_SYNTAX";
+  public static final String ER_ILLEGAL_AXIS_NAME = "ER_ILLEGAL_AXIS_NAME";
+  public static final String ER_UNKNOWN_NODETYPE = "ER_UNKNOWN_NODETYPE";
+  public static final String ER_PATTERN_LITERAL_NEEDS_BE_QUOTED =
+         "ER_PATTERN_LITERAL_NEEDS_BE_QUOTED";
+  public static final String ER_COULDNOT_BE_FORMATTED_TO_NUMBER =
+         "ER_COULDNOT_BE_FORMATTED_TO_NUMBER";
+  public static final String ER_COULDNOT_CREATE_XMLPROCESSORLIAISON =
+         "ER_COULDNOT_CREATE_XMLPROCESSORLIAISON";
+  public static final String ER_DIDNOT_FIND_XPATH_SELECT_EXP =
+         "ER_DIDNOT_FIND_XPATH_SELECT_EXP";
+  public static final String ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH =
+         "ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH";
+  public static final String ER_ERROR_OCCURED = "ER_ERROR_OCCURED";
+  public static final String ER_ILLEGAL_VARIABLE_REFERENCE =
+         "ER_ILLEGAL_VARIABLE_REFERENCE";
+  public static final String ER_AXES_NOT_ALLOWED = "ER_AXES_NOT_ALLOWED";
+  public static final String ER_KEY_HAS_TOO_MANY_ARGS =
+         "ER_KEY_HAS_TOO_MANY_ARGS";
+  public static final String ER_COUNT_TAKES_1_ARG = "ER_COUNT_TAKES_1_ARG";
+  public static final String ER_COULDNOT_FIND_FUNCTION =
+         "ER_COULDNOT_FIND_FUNCTION";
+  public static final String ER_UNSUPPORTED_ENCODING ="ER_UNSUPPORTED_ENCODING";
+  public static final String ER_PROBLEM_IN_DTM_NEXTSIBLING =
+         "ER_PROBLEM_IN_DTM_NEXTSIBLING";
+  public static final String ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL =
+         "ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL";
+  public static final String ER_SETDOMFACTORY_NOT_SUPPORTED =
+         "ER_SETDOMFACTORY_NOT_SUPPORTED";
+  public static final String ER_PREFIX_MUST_RESOLVE = "ER_PREFIX_MUST_RESOLVE";
+  public static final String ER_PARSE_NOT_SUPPORTED = "ER_PARSE_NOT_SUPPORTED";
+  public static final String ER_SAX_API_NOT_HANDLED = "ER_SAX_API_NOT_HANDLED";
+public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
+         "ER_IGNORABLE_WHITESPACE_NOT_HANDLED";
+  public static final String ER_DTM_CANNOT_HANDLE_NODES =
+         "ER_DTM_CANNOT_HANDLE_NODES";
+  public static final String ER_XERCES_CANNOT_HANDLE_NODES =
+         "ER_XERCES_CANNOT_HANDLE_NODES";
+  public static final String ER_XERCES_PARSE_ERROR_DETAILS =
+         "ER_XERCES_PARSE_ERROR_DETAILS";
+  public static final String ER_XERCES_PARSE_ERROR = "ER_XERCES_PARSE_ERROR";
+  public static final String ER_INVALID_UTF16_SURROGATE =
+         "ER_INVALID_UTF16_SURROGATE";
+  public static final String ER_OIERROR = "ER_OIERROR";
+  public static final String ER_CANNOT_CREATE_URL = "ER_CANNOT_CREATE_URL";
+  public static final String ER_XPATH_READOBJECT = "ER_XPATH_READOBJECT";
+ public static final String ER_FUNCTION_TOKEN_NOT_FOUND =
+         "ER_FUNCTION_TOKEN_NOT_FOUND";
+  public static final String ER_CANNOT_DEAL_XPATH_TYPE =
+         "ER_CANNOT_DEAL_XPATH_TYPE";
+  public static final String ER_NODESET_NOT_MUTABLE = "ER_NODESET_NOT_MUTABLE";
+  public static final String ER_NODESETDTM_NOT_MUTABLE =
+         "ER_NODESETDTM_NOT_MUTABLE";
+   /**  Variable not resolvable:   */
+  public static final String ER_VAR_NOT_RESOLVABLE = "ER_VAR_NOT_RESOLVABLE";
+   /** Null error handler  */
+ public static final String ER_NULL_ERROR_HANDLER = "ER_NULL_ERROR_HANDLER";
+   /**  Programmer's assertion: unknown opcode  */
+  public static final String ER_PROG_ASSERT_UNKNOWN_OPCODE =
+         "ER_PROG_ASSERT_UNKNOWN_OPCODE";
+   /**  0 or 1   */
+  public static final String ER_ZERO_OR_ONE = "ER_ZERO_OR_ONE";
+   /**  rtf() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+   /**  asNodeIterator() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER = "ER_ASNODEITERATOR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+   /**  fsb() not supported for XStringForChars   */
+  public static final String ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS =
+         "ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS";
+   /**  Could not find variable with the name of   */
+ public static final String ER_COULD_NOT_FIND_VAR = "ER_COULD_NOT_FIND_VAR";
+   /**  XStringForChars can not take a string for an argument   */
+ public static final String ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING =
+         "ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING";
+   /**  The FastStringBuffer argument can not be null   */
+ public static final String ER_FASTSTRINGBUFFER_CANNOT_BE_NULL =
+         "ER_FASTSTRINGBUFFER_CANNOT_BE_NULL";
+   /**  2 or 3   */
+  public static final String ER_TWO_OR_THREE = "ER_TWO_OR_THREE";
+   /** Variable accessed before it is bound! */
+  public static final String ER_VARIABLE_ACCESSED_BEFORE_BIND =
+         "ER_VARIABLE_ACCESSED_BEFORE_BIND";
+   /** XStringForFSB can not take a string for an argument! */
+ public static final String ER_FSB_CANNOT_TAKE_STRING =
+         "ER_FSB_CANNOT_TAKE_STRING";
+   /** Error! Setting the root of a walker to null! */
+  public static final String ER_SETTING_WALKER_ROOT_TO_NULL =
+         "ER_SETTING_WALKER_ROOT_TO_NULL";
+   /** This NodeSetDTM can not iterate to a previous node! */
+  public static final String ER_NODESETDTM_CANNOT_ITERATE =
+         "ER_NODESETDTM_CANNOT_ITERATE";
+  /** This NodeSet can not iterate to a previous node! */
+ public static final String ER_NODESET_CANNOT_ITERATE =
+         "ER_NODESET_CANNOT_ITERATE";
+  /** This NodeSetDTM can not do indexing or counting functions! */
+  public static final String ER_NODESETDTM_CANNOT_INDEX =
+         "ER_NODESETDTM_CANNOT_INDEX";
+  /** This NodeSet can not do indexing or counting functions! */
+  public static final String ER_NODESET_CANNOT_INDEX =
+         "ER_NODESET_CANNOT_INDEX";
+  /** Can not call setShouldCacheNodes after nextNode has been called! */
+  public static final String ER_CANNOT_CALL_SETSHOULDCACHENODE =
+         "ER_CANNOT_CALL_SETSHOULDCACHENODE";
+  /** {0} only allows {1} arguments */
+ public static final String ER_ONLY_ALLOWS = "ER_ONLY_ALLOWS";
+  /** Programmer's assertion in getNextStepPos: unknown stepType: {0} */
+  public static final String ER_UNKNOWN_STEP = "ER_UNKNOWN_STEP";
+  /** Problem with RelativeLocationPath */
+  public static final String ER_EXPECTED_REL_LOC_PATH =
+         "ER_EXPECTED_REL_LOC_PATH";
+  /** Problem with LocationPath */
+  public static final String ER_EXPECTED_LOC_PATH = "ER_EXPECTED_LOC_PATH";
+  public static final String ER_EXPECTED_LOC_PATH_AT_END_EXPR =
+                                        "ER_EXPECTED_LOC_PATH_AT_END_EXPR";
+  /** Problem with Step */
+  public static final String ER_EXPECTED_LOC_STEP = "ER_EXPECTED_LOC_STEP";
+  /** Problem with NodeTest */
+  public static final String ER_EXPECTED_NODE_TEST = "ER_EXPECTED_NODE_TEST";
+  /** Expected step pattern */
+  public static final String ER_EXPECTED_STEP_PATTERN =
+        "ER_EXPECTED_STEP_PATTERN";
+  /** Expected relative path pattern */
+  public static final String ER_EXPECTED_REL_PATH_PATTERN =
+         "ER_EXPECTED_REL_PATH_PATTERN";
+  /** ER_CANT_CONVERT_XPATHRESULTTYPE_TO_BOOLEAN          */
+  public static final String ER_CANT_CONVERT_TO_BOOLEAN =
+         "ER_CANT_CONVERT_TO_BOOLEAN";
+  /** Field ER_CANT_CONVERT_TO_SINGLENODE       */
+  public static final String ER_CANT_CONVERT_TO_SINGLENODE =
+         "ER_CANT_CONVERT_TO_SINGLENODE";
+  /** Field ER_CANT_GET_SNAPSHOT_LENGTH         */
+  public static final String ER_CANT_GET_SNAPSHOT_LENGTH =
+         "ER_CANT_GET_SNAPSHOT_LENGTH";
+  /** Field ER_NON_ITERATOR_TYPE                */
+  public static final String ER_NON_ITERATOR_TYPE = "ER_NON_ITERATOR_TYPE";
+  /** Field ER_DOC_MUTATED                      */
+  public static final String ER_DOC_MUTATED = "ER_DOC_MUTATED";
+  public static final String ER_INVALID_XPATH_TYPE = "ER_INVALID_XPATH_TYPE";
+  public static final String ER_EMPTY_XPATH_RESULT = "ER_EMPTY_XPATH_RESULT";
+  public static final String ER_INCOMPATIBLE_TYPES = "ER_INCOMPATIBLE_TYPES";
+  public static final String ER_NULL_RESOLVER = "ER_NULL_RESOLVER";
+  public static final String ER_CANT_CONVERT_TO_STRING =
+         "ER_CANT_CONVERT_TO_STRING";
+  public static final String ER_NON_SNAPSHOT_TYPE = "ER_NON_SNAPSHOT_TYPE";
+  public static final String ER_WRONG_DOCUMENT = "ER_WRONG_DOCUMENT";
+  /* Note to translators:  The XPath expression cannot be evaluated with respect
+   * to this type of node.
+   */
+  /** Field ER_WRONG_NODETYPE                    */
+  public static final String ER_WRONG_NODETYPE = "ER_WRONG_NODETYPE";
+  public static final String ER_XPATH_ERROR = "ER_XPATH_ERROR";
+
+  //BEGIN: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
+  public static final String ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED = "ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED";
+  public static final String ER_RESOLVE_VARIABLE_RETURNS_NULL = "ER_RESOLVE_VARIABLE_RETURNS_NULL";
+  public static final String ER_UNSUPPORTED_RETURN_TYPE = "ER_UNSUPPORTED_RETURN_TYPE";
+  public static final String ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL = "ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL";
+  public static final String ER_ARG_CANNOT_BE_NULL = "ER_ARG_CANNOT_BE_NULL";
+
+  public static final String ER_OBJECT_MODEL_NULL = "ER_OBJECT_MODEL_NULL";
+  public static final String ER_OBJECT_MODEL_EMPTY = "ER_OBJECT_MODEL_EMPTY";
+  public static final String ER_FEATURE_NAME_NULL = "ER_FEATURE_NAME_NULL";
+  public static final String ER_FEATURE_UNKNOWN = "ER_FEATURE_UNKNOWN";
+  public static final String ER_GETTING_NULL_FEATURE = "ER_GETTING_NULL_FEATURE";
+  public static final String ER_GETTING_UNKNOWN_FEATURE = "ER_GETTING_UNKNOWN_FEATURE";
+  public static final String ER_NULL_XPATH_FUNCTION_RESOLVER = "ER_NULL_XPATH_FUNCTION_RESOLVER";
+  public static final String ER_NULL_XPATH_VARIABLE_RESOLVER = "ER_NULL_XPATH_VARIABLE_RESOLVER";
+  //END: Keys needed for exception messages of  JAXP 1.3 XPath API implementation
+
+  public static final String WG_LOCALE_NAME_NOT_HANDLED =
+         "WG_LOCALE_NAME_NOT_HANDLED";
+  public static final String WG_PROPERTY_NOT_SUPPORTED =
+         "WG_PROPERTY_NOT_SUPPORTED";
+  public static final String WG_DONT_DO_ANYTHING_WITH_NS =
+         "WG_DONT_DO_ANYTHING_WITH_NS";
+  public static final String WG_SECURITY_EXCEPTION = "WG_SECURITY_EXCEPTION";
+  public static final String WG_QUO_NO_LONGER_DEFINED =
+         "WG_QUO_NO_LONGER_DEFINED";
+  public static final String WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST =
+         "WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST";
+  public static final String WG_FUNCTION_TOKEN_NOT_FOUND =
+         "WG_FUNCTION_TOKEN_NOT_FOUND";
+  public static final String WG_COULDNOT_FIND_FUNCTION =
+         "WG_COULDNOT_FIND_FUNCTION";
+  public static final String WG_CANNOT_MAKE_URL_FROM ="WG_CANNOT_MAKE_URL_FROM";
+  public static final String WG_EXPAND_ENTITIES_NOT_SUPPORTED =
+         "WG_EXPAND_ENTITIES_NOT_SUPPORTED";
+  public static final String WG_ILLEGAL_VARIABLE_REFERENCE =
+         "WG_ILLEGAL_VARIABLE_REFERENCE";
+  public static final String WG_UNSUPPORTED_ENCODING ="WG_UNSUPPORTED_ENCODING";
+
+  /**  detach() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+  /**  num() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+  /**  xstr() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+  /**  str() not supported by XRTreeFragSelectWrapper   */
+  public static final String ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER =
+         "ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER";
+
+  // Error messages...
+
+
+  /**
+   * Get the association list.
+   *
+   * @return The association list.
+   */
+  public Object[][] getContents()
+  {
+    return new Object[][]{
+
+  { "ERROR0000" , "{0}" },
+
+  { ER_CURRENT_NOT_ALLOWED_IN_MATCH, "\u5339\u914d\u6a21\u5f0f\u4e2d\u4e0d\u5141\u8bb8\u6709 current() \u51fd\u6570\uff01" },
+
+  { ER_CURRENT_TAKES_NO_ARGS, "current() \u51fd\u6570\u4e0d\u63a5\u53d7\u53c2\u6570\uff01" },
+
+  { ER_DOCUMENT_REPLACED,
+      "document() \u51fd\u6570\u5b9e\u73b0\u5df2\u88ab org.apache.xalan.xslt.FuncDocument \u66ff\u6362\uff01"},
+
+  { ER_CONTEXT_HAS_NO_OWNERDOC,
+      "\u4e0a\u4e0b\u6587\u6ca1\u6709\u6240\u6709\u8005\u6587\u6863\uff01"},
+
+  { ER_LOCALNAME_HAS_TOO_MANY_ARGS,
+      "local-name() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_NAMESPACEURI_HAS_TOO_MANY_ARGS,
+      "namespace-uri() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_NORMALIZESPACE_HAS_TOO_MANY_ARGS,
+      "normalize-space() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_NUMBER_HAS_TOO_MANY_ARGS,
+      "number() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_NAME_HAS_TOO_MANY_ARGS,
+     "name() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_STRING_HAS_TOO_MANY_ARGS,
+      "string() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_STRINGLENGTH_HAS_TOO_MANY_ARGS,
+      "string-length() \u7684\u53c2\u6570\u592a\u591a\u3002"},
+
+  { ER_TRANSLATE_TAKES_3_ARGS,
+      "translate() \u51fd\u6570\u6709\u4e09\u4e2a\u53c2\u6570\uff01"},
+
+  { ER_UNPARSEDENTITYURI_TAKES_1_ARG,
+      "unparsed-entity-uri \u51fd\u6570\u5e94\u6709\u4e00\u4e2a\u53c2\u6570\uff01"},
+
+  { ER_NAMESPACEAXIS_NOT_IMPLEMENTED,
+      "\u540d\u79f0\u7a7a\u95f4\u8f74\u5c1a\u672a\u5b9e\u73b0\uff01"},
+
+  { ER_UNKNOWN_AXIS,
+     "\u672a\u77e5\u8f74\uff1a{0}"},
+
+  { ER_UNKNOWN_MATCH_OPERATION,
+     "\u672a\u77e5\u7684\u5339\u914d\u64cd\u4f5c\uff01"},
+
+  { ER_INCORRECT_ARG_LENGTH,
+      "processing-instruction() \u8282\u70b9\u6d4b\u8bd5\u7684\u53c2\u6570\u957f\u5ea6\u4e0d\u6b63\u786e\uff01"},
+
+  { ER_CANT_CONVERT_TO_NUMBER,
+      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210\u6570\u5b57"},
+
+  { ER_CANT_CONVERT_TO_NODELIST,
+      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210 NodeList\uff01"},
+
+  { ER_CANT_CONVERT_TO_MUTABLENODELIST,
+      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210 NodeSetDTM\uff01"},
+
+  { ER_CANT_CONVERT_TO_TYPE,
+      "\u65e0\u6cd5\u5c06 {0} \u8f6c\u6362\u6210 type#{1}"},
+
+  { ER_EXPECTED_MATCH_PATTERN,
+      "getMatchScore \u4e2d\u51fa\u73b0\u671f\u671b\u7684\u5339\u914d\u6a21\u5f0f\uff01"},
+
+  { ER_COULDNOT_GET_VAR_NAMED,
+      "\u65e0\u6cd5\u83b7\u53d6\u540d\u4e3a {0} \u7684\u53d8\u91cf"},
+
+  { ER_UNKNOWN_OPCODE,
+     "\u9519\u8bef\uff01\u672a\u77e5\u64cd\u4f5c\u7801\uff1a{0}"},
+
+  { ER_EXTRA_ILLEGAL_TOKENS,
+     "\u989d\u5916\u7684\u975e\u6cd5\u6807\u8bb0\uff1a{0}"},
+
+
+  { ER_EXPECTED_DOUBLE_QUOTE,
+      "\u9519\u8bef\u5f15\u7528\u7684\u6587\u5b57... \u5e94\u8be5\u4e3a\u53cc\u5f15\u53f7\uff01"},
+
+  { ER_EXPECTED_SINGLE_QUOTE,
+      "\u9519\u8bef\u5f15\u7528\u7684\u6587\u5b57... \u5e94\u8be5\u4e3a\u5355\u5f15\u53f7\uff01"},
+
+  { ER_EMPTY_EXPRESSION,
+     "\u7a7a\u8868\u8fbe\u5f0f\uff01"},
+
+  { ER_EXPECTED_BUT_FOUND,
+     "\u5e94\u8be5\u4e3a {0}\uff0c\u4f46\u53d1\u73b0\u7684\u662f\uff1a{1}"},
+
+  { ER_INCORRECT_PROGRAMMER_ASSERTION,
+      "\u7a0b\u5e8f\u5458\u7684\u65ad\u8a00\u4e0d\u6b63\u786e\uff01\uff0d {0}"},
+
+  { ER_BOOLEAN_ARG_NO_LONGER_OPTIONAL,
+      "19990709 XPath \u8349\u7a3f\u4e2d\uff0cboolean(...) \u53c2\u6570\u4e0d\u518d\u53ef\u9009\u3002"},
+
+  { ER_FOUND_COMMA_BUT_NO_PRECEDING_ARG,
+      "\u5df2\u627e\u5230\u201c,\u201d\uff0c\u4f46\u524d\u9762\u6ca1\u6709\u81ea\u53d8\u91cf\uff01"},
+
+  { ER_FOUND_COMMA_BUT_NO_FOLLOWING_ARG,
+      "\u5df2\u627e\u5230\u201c,\u201d\uff0c\u4f46\u540e\u9762\u6ca1\u6709\u8ddf\u81ea\u53d8\u91cf\uff01"},
+
+  { ER_PREDICATE_ILLEGAL_SYNTAX,
+      "\u201c..[predicate]\u201d\u6216\u201c.[predicate]\u201d\u662f\u975e\u6cd5\u7684\u8bed\u6cd5\u3002\u8bf7\u6539\u4e3a\u4f7f\u7528\u201cself::node()[predicate]\u201d\u3002"},
+
+  { ER_ILLEGAL_AXIS_NAME,
+     "\u975e\u6cd5\u7684\u8f74\u540d\u79f0\uff1a{0}"},
+
+  { ER_UNKNOWN_NODETYPE,
+     "\u672a\u77e5\u8282\u70b9\u7c7b\u578b\uff1a{0}"},
+
+  { ER_PATTERN_LITERAL_NEEDS_BE_QUOTED,
+      "\u9700\u8981\u5f15\u7528\u6a21\u5f0f\u6587\u5b57\uff08{0}\uff09\uff01"},
+
+  { ER_COULDNOT_BE_FORMATTED_TO_NUMBER,
+      "{0} \u65e0\u6cd5\u683c\u5f0f\u5316\u4e3a\u6570\u5b57\uff01"},
+
+  { ER_COULDNOT_CREATE_XMLPROCESSORLIAISON,
+      "\u65e0\u6cd5\u521b\u5efa XML TransformerFactory \u8054\u7cfb\uff1a{0}"},
+
+  { ER_DIDNOT_FIND_XPATH_SELECT_EXP,
+      "\u9519\u8bef\uff01\u627e\u4e0d\u5230 xpath \u9009\u62e9\u8868\u8fbe\u5f0f\uff08-select\uff09\u3002"},
+
+  { ER_COULDNOT_FIND_ENDOP_AFTER_OPLOCATIONPATH,
+      "\u9519\u8bef\uff01\u5728 OP_LOCATIONPATH \u4e4b\u540e\u627e\u4e0d\u5230 ENDOP"},
+
+  { ER_ERROR_OCCURED,
+     "\u51fa\u73b0\u9519\u8bef\uff01"},
+
+  { ER_ILLEGAL_VARIABLE_REFERENCE,
+      "VariableReference \u8d4b\u7ed9\u4e86\u4e0a\u4e0b\u6587\u5916\u7684\u53d8\u91cf\u6216\u6ca1\u6709\u5b9a\u4e49\u7684\u53d8\u91cf\uff01\u540d\u79f0 = {0}"},
+
+  { ER_AXES_NOT_ALLOWED,
+      "\u5728\u5339\u914d\u6a21\u5f0f\u4e2d\u53ea\u5141\u8bb8\u51fa\u73b0 child:: \u548c attribute:: \u8f74\uff01\u8fdd\u53cd\u7684\u8f74 = {0}"},
+
+  { ER_KEY_HAS_TOO_MANY_ARGS,
+      "key() \u7684\u53c2\u6570\u4e2a\u6570\u4e0d\u6b63\u786e\u3002"},
+
+  { ER_COUNT_TAKES_1_ARG,
+      "count \u51fd\u6570\u5e94\u8be5\u6709\u4e00\u4e2a\u53c2\u6570\uff01"},
+
+  { ER_COULDNOT_FIND_FUNCTION,
+     "\u627e\u4e0d\u5230\u51fd\u6570\uff1a{0}"},
+
+  { ER_UNSUPPORTED_ENCODING,
+     "\u4e0d\u53d7\u652f\u6301\u7684\u7f16\u7801\uff1a{0}"},
+
+  { ER_PROBLEM_IN_DTM_NEXTSIBLING,
+      "getNextSibling \u8fc7\u7a0b\u4e2d\uff0cDTM \u4e2d\u51fa\u73b0\u95ee\u9898...\u6b63\u5728\u5c1d\u8bd5\u6062\u590d"},
+
+  { ER_CANNOT_WRITE_TO_EMPTYNODELISTIMPL,
+      "\u7a0b\u5e8f\u5458\u9519\u8bef\uff1a\u4e0d\u53ef\u5411 EmptyNodeList \u5199\u5165\u5185\u5bb9\u3002"},
+
+  { ER_SETDOMFACTORY_NOT_SUPPORTED,
+      "XPathContext \u4e0d\u652f\u6301 setDOMFactory\uff01"},
+
+  { ER_PREFIX_MUST_RESOLVE,
+      "\u524d\u7f00\u5fc5\u987b\u89e3\u6790\u4e3a\u540d\u79f0\u7a7a\u95f4\uff1a{0}"},
+
+  { ER_PARSE_NOT_SUPPORTED,
+      "XPathContext \u4e2d\u4e0d\u652f\u6301 parse (InputSource source)\uff01\u65e0\u6cd5\u6253\u5f00 {0}"},
+
+  { ER_SAX_API_NOT_HANDLED,
+      "DTM \u4e0d\u5904\u7406 SAX API characters(char ch[]...\uff01"},
+
+  { ER_IGNORABLE_WHITESPACE_NOT_HANDLED,
+      "DTM \u4e0d\u5904\u7406 ignorableWhitespace(char ch[]...\uff01"},
+
+  { ER_DTM_CANNOT_HANDLE_NODES,
+      "DTMLiaison \u4e0d\u80fd\u5904\u7406\u7c7b\u578b {0} \u7684\u8282\u70b9"},
+
+  { ER_XERCES_CANNOT_HANDLE_NODES,
+      "DOM2Helper \u4e0d\u80fd\u5904\u7406\u7c7b\u578b {0} \u7684\u8282\u70b9"},
+
+  { ER_XERCES_PARSE_ERROR_DETAILS,
+      "DOM2Helper.parse \u9519\u8bef\uff1aSystemID \uff0d \u7b2c {0} \u884c \uff0d {1}"},
+
+  { ER_XERCES_PARSE_ERROR,
+     "DOM2Helper.parse \u9519\u8bef"},
+
+  { ER_INVALID_UTF16_SURROGATE,
+      "\u68c0\u6d4b\u5230\u65e0\u6548\u7684 UTF-16 \u8d85\u5927\u5b57\u7b26\u96c6\uff1a{0}\uff1f"},
+
+  { ER_OIERROR,
+     "IO \u9519\u8bef"},
+
+  { ER_CANNOT_CREATE_URL,
+     "\u65e0\u6cd5\u4e3a {0} \u521b\u5efa URL"},
+
+  { ER_XPATH_READOBJECT,
+     "\u5728 XPath.readObject \u4e2d\uff1a{0}"},
+
+  { ER_FUNCTION_TOKEN_NOT_FOUND,
+      "\u627e\u4e0d\u5230\u51fd\u6570\u6807\u8bb0\u3002"},
+
+  { ER_CANNOT_DEAL_XPATH_TYPE,
+       "\u65e0\u6cd5\u5904\u7406 XPath \u7c7b\u578b\uff1a{0}"},
+
+  { ER_NODESET_NOT_MUTABLE,
+       "\u6b64 NodeSet \u662f\u4e0d\u6613\u53d8\u7684"},
+
+  { ER_NODESETDTM_NOT_MUTABLE,
+       "\u6b64 NodeSetDTM \u662f\u4e0d\u6613\u53d8\u7684"},
+
+  { ER_VAR_NOT_RESOLVABLE,
+        "\u53d8\u91cf\u4e0d\u53ef\u89e3\u6790\uff1a{0}"},
+
+  { ER_NULL_ERROR_HANDLER,
+        "\u9519\u8bef\u5904\u7406\u7a0b\u5e8f\u4e3a\u7a7a"},
+
+  { ER_PROG_ASSERT_UNKNOWN_OPCODE,
+       "\u7a0b\u5e8f\u5458\u65ad\u8a00\uff1a\u672a\u77e5\u64cd\u4f5c\u7801\uff1a{0}"},
+
+  { ER_ZERO_OR_ONE,
+       "0 \u6216 1"},
+
+  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+       "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 rtf()"},
+
+  { ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+       "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 asNodeIterator()"},
+
+   { ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 detach()"},
+
+   { ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 num()"},
+
+   { ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 xstr()"},
+
+   { ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER,
+                "XRTreeFragSelectWrapper \u4e0d\u652f\u6301 str()"},
+
+  { ER_FSB_NOT_SUPPORTED_XSTRINGFORCHARS,
+       "XStringForChars \u4e0d\u652f\u6301 fsb()"},
+
+  { ER_COULD_NOT_FIND_VAR,
+      "\u627e\u4e0d\u5230\u540d\u4e3a {0} \u7684\u53d8\u91cf"},
+
+  { ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING,
+      "XStringForChars \u65e0\u6cd5\u5c06\u5b57\u7b26\u4e32\u4f5c\u4e3a\u81ea\u53d8\u91cf"},
+
+  { ER_FASTSTRINGBUFFER_CANNOT_BE_NULL,
+      "FastStringBuffer \u81ea\u53d8\u91cf\u4e0d\u80fd\u4e3a\u7a7a"},
+
+  { ER_TWO_OR_THREE,
+       "2 \u6216 3"},
+
+  { ER_VARIABLE_ACCESSED_BEFORE_BIND,
+       "\u5728\u7ed1\u5b9a\u524d\u5df2\u8bbf\u95ee\u53d8\u91cf\uff01"},
+
+  { ER_FSB_CANNOT_TAKE_STRING,
+       "XStringForFSB \u65e0\u6cd5\u5c06\u5b57\u7b26\u4e32\u4f5c\u4e3a\u81ea\u53d8\u91cf\uff01"},
+
+  { ER_SETTING_WALKER_ROOT_TO_NULL,
+       "\n \uff01\uff01\uff01\uff01\u9519\u8bef\uff01\u6b63\u5728\u5c06\u6b65\u884c\u7a0b\u5e8f\u7684\u6839\u8bbe\u7f6e\u4e3a\u7a7a\uff01\uff01\uff01"},
+
+  { ER_NODESETDTM_CANNOT_ITERATE,
+       "\u6b64 NodeSetDTM \u65e0\u6cd5\u8fed\u4ee3\u5230\u5148\u524d\u7684\u8282\u70b9\uff01"},
+
+  { ER_NODESET_CANNOT_ITERATE,
+       "\u6b64 NodeSet \u65e0\u6cd5\u8fed\u4ee3\u5230\u5148\u524d\u7684\u8282\u70b9\uff01"},
+
+  { ER_NODESETDTM_CANNOT_INDEX,
+       "\u6b64 NodeSetDTM \u65e0\u6cd5\u6267\u884c\u7d22\u5f15\u6216\u8ba1\u6570\u529f\u80fd\uff01"},
+
+  { ER_NODESET_CANNOT_INDEX,
+       "\u6b64 NodeSet \u65e0\u6cd5\u6267\u884c\u7d22\u5f15\u6216\u8ba1\u6570\u529f\u80fd\uff01"},
+
+  { ER_CANNOT_CALL_SETSHOULDCACHENODE,
+       "\u8c03\u7528 nextNode \u540e\u4e0d\u80fd\u8c03\u7528 setShouldCacheNode\uff01"},
+
+  { ER_ONLY_ALLOWS,
+       "{0} \u4ec5\u5141\u8bb8 {1} \u4e2a\u81ea\u53d8\u91cf"},
+
+  { ER_UNKNOWN_STEP,
+       "\u7a0b\u5e8f\u5458\u5728 getNextStepPos \u4e2d\u7684\u65ad\u8a00\uff1a\u672a\u77e5\u7684 stepType\uff1a{0}"},
+
+  //Note to translators:  A relative location path is a form of XPath expression.
+  // The message indicates that such an expression was expected following the
+  // characters '/' or '//', but was not found.
+  { ER_EXPECTED_REL_LOC_PATH,
+      "\u5728\u201c/\u201d\u6216\u201c//\u201d\u6807\u8bb0\u540e\u5e94\u8be5\u51fa\u73b0\u76f8\u5bf9\u4f4d\u7f6e\u8def\u5f84\u3002"},
+
+  // Note to translators:  A location path is a form of XPath expression.
+  // The message indicates that syntactically such an expression was expected,but
+  // the characters specified by the substitution text were encountered instead.
+  { ER_EXPECTED_LOC_PATH,
+       "\u5e94\u8be5\u51fa\u73b0\u4f4d\u7f6e\u8def\u5f84\uff0c\u4f46\u9047\u5230\u4ee5\u4e0b\u6807\u8bb0\u003a{0}"},
+
+  // Note to translators:  A location path is a form of XPath expression.
+  // The message indicates that syntactically such a subexpression was expected,
+  // but no more characters were found in the expression.
+  { ER_EXPECTED_LOC_PATH_AT_END_EXPR,
+       "\u5e94\u8be5\u51fa\u73b0\u4f4d\u7f6e\u8def\u5f84\uff0c\u4f46\u53d1\u73b0\u7684\u5374\u662f XPath \u8868\u8fbe\u5f0f\u7684\u7ed3\u5c3e\u3002"},
+
+  // Note to translators:  A location step is part of an XPath expression.
+  // The message indicates that syntactically such an expression was expected
+  // following the specified characters.
+  { ER_EXPECTED_LOC_STEP,
+       "\u201c/\u201d\u6216\u201c//\u201d\u6807\u8bb0\u540e\u5e94\u8be5\u51fa\u73b0\u4f4d\u7f6e\u6b65\u9aa4\u3002"},
+
+  // Note to translators:  A node test is part of an XPath expression that is
+  // used to test for particular kinds of nodes.  In this case, a node test that
+  // consists of an NCName followed by a colon and an asterisk or that consists
+  // of a QName was expected, but was not found.
+  { ER_EXPECTED_NODE_TEST,
+       "\u5e94\u8be5\u51fa\u73b0\u4e0e NCName:* \u6216 QName \u5339\u914d\u7684\u8282\u70b9\u6d4b\u8bd5\u3002"},
+
+  // Note to translators:  A step pattern is part of an XPath expression.
+  // The message indicates that syntactically such an expression was expected,
+  // but the specified character was found in the expression instead.
+  { ER_EXPECTED_STEP_PATTERN,
+       "\u5e94\u8be5\u51fa\u73b0\u6b65\u9aa4\u6a21\u5f0f\uff0c\u4f46\u9047\u5230\u4e86\u201c/\u201d\u3002"},
+
+  // Note to translators: A relative path pattern is part of an XPath expression.
+  // The message indicates that syntactically such an expression was expected,
+  // but was not found.
+  { ER_EXPECTED_REL_PATH_PATTERN,
+       "\u5e94\u8be5\u51fa\u73b0\u76f8\u5bf9\u8def\u5f84\u6a21\u5f0f\u3002"},
+
+  // Note to translators:  The substitution text is the name of a data type.  The
+  // message indicates that a value of a particular type could not be converted
+  // to a value of type boolean.
+  { ER_CANT_CONVERT_TO_BOOLEAN,
+       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u5e03\u5c14\u578b\u3002"},
+
+  // Note to translators: Do not translate ANY_UNORDERED_NODE_TYPE and
+  // FIRST_ORDERED_NODE_TYPE.
+  { ER_CANT_CONVERT_TO_SINGLENODE,
+       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u5355\u4e00\u8282\u70b9\u3002getSingleNodeValue \u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b ANY_UNORDERED_NODE_TYPE \u548c FIRST_ORDERED_NODE_TYPE\u3002"},
+
+  // Note to translators: Do not translate UNORDERED_NODE_SNAPSHOT_TYPE and
+  // ORDERED_NODE_SNAPSHOT_TYPE.
+  { ER_CANT_GET_SNAPSHOT_LENGTH,
+       "\u4e0d\u80fd\u5bf9 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u8c03\u7528 getSnapshotLength \u65b9\u6cd5\uff0c\u56e0\u4e3a\u8be5\u8868\u8fbe\u5f0f\u7684 XPathResult \u7684 XPathResultType \u4e3a {1}\u3002\u6b64\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b UNORDERED_NODE_SNAPSHOT_TYPE \u548c ORDERED_NODE_SNAPSHOT_TYPE\u3002"},
+
+  { ER_NON_ITERATOR_TYPE,
+       "\u4e0d\u80fd\u5bf9 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u8c03\u7528 iterateNext \u65b9\u6cd5\uff0c\u56e0\u4e3a\u8be5\u8868\u8fbe\u5f0f\u7684 XPathResult \u7684 XPathResultType \u4e3a {1}\u3002\u6b64\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b UNORDERED_NODE_ITERATOR_TYPE \u548c ORDERED_NODE_ITERATOR_TYPE\u3002"},
+
+  // Note to translators: This message indicates that the document being operated
+  // upon changed, so the iterator object that was being used to traverse the
+  // document has now become invalid.
+  { ER_DOC_MUTATED,
+       "\u8fd4\u56de\u7ed3\u679c\u540e\u6587\u6863\u53d1\u751f\u53d8\u5316\u3002\u8fed\u4ee3\u5668\u65e0\u6548\u3002"},
+
+  { ER_INVALID_XPATH_TYPE,
+       "\u65e0\u6548\u7684 XPath \u7c7b\u578b\u81ea\u53d8\u91cf\uff1a{0}"},
+
+  { ER_EMPTY_XPATH_RESULT,
+       "\u7a7a\u7684 XPath \u7ed3\u679c\u5bf9\u8c61"},
+
+  { ER_INCOMPATIBLE_TYPES,
+       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u5f3a\u5236\u8f6c\u6362\u4e3a\u6307\u5b9a\u7684 XPathResultType {2}\u3002"},
+
+  { ER_NULL_RESOLVER,
+       "\u65e0\u6cd5\u4f7f\u7528\u7a7a\u7684\u524d\u7f00\u89e3\u6790\u5668\u89e3\u6790\u524d\u7f00\u3002"},
+
+  // Note to translators:  The substitution text is the name of a data type.  The
+  // message indicates that a value of a particular type could not be converted
+  // to a value of type string.
+  { ER_CANT_CONVERT_TO_STRING,
+       "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\u3002"},
+
+  // Note to translators: Do not translate snapshotItem,
+  // UNORDERED_NODE_SNAPSHOT_TYPE and ORDERED_NODE_SNAPSHOT_TYPE.
+  { ER_NON_SNAPSHOT_TYPE,
+       "\u4e0d\u80fd\u5bf9 XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u8c03\u7528\u65b9\u6cd5 snapshotItem\uff0c\u56e0\u4e3a\u8be5\u8868\u8fbe\u5f0f\u7684 XPathResult \u7684 XPathResultType \u4e3a {1}\u3002\u6b64\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8e\u7c7b\u578b UNORDERED_NODE_SNAPSHOT_TYPE \u548c ORDERED_NODE_SNAPSHOT_TYPE\u3002"},
+
+  // Note to translators:  XPathEvaluator is a Java interface name.  An
+  // XPathEvaluator is created with respect to a particular XML document, and in
+  // this case the expression represented by this object was being evaluated with
+  // respect to a context node from a different document.
+  { ER_WRONG_DOCUMENT,
+       "\u4e0a\u4e0b\u6587\u8282\u70b9\u4e0d\u5c5e\u4e8e\u7ed1\u5b9a\u5230\u6b64 XPathEvaluator \u7684\u6587\u6863\u3002"},
+
+  // Note to translators:  The XPath expression cannot be evaluated with respect
+  // to this type of node.
+  { ER_WRONG_NODETYPE,
+       "\u4e0d\u652f\u6301\u4e0a\u4e0b\u6587\u8282\u70b9\u7c7b\u578b\u3002"},
+
+  { ER_XPATH_ERROR,
+       "XPath \u4e2d\u51fa\u73b0\u672a\u77e5\u9519\u8bef"},
+
+        { ER_CANT_CONVERT_XPATHRESULTTYPE_TO_NUMBER,
+                "XPath \u8868\u8fbe\u5f0f\u201c{0}\u201d\u7684 XPathResult \u5177\u6709 XPathResultType {1}\uff0c\u8be5\u7c7b\u578b\u4e0d\u80fd\u8f6c\u6362\u4e3a\u6570\u5b57\u3002"},
+
+  //BEGIN:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
+
+  /** Field ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED                       */
+
+  { ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED,
+       "\u6269\u5c55\u51fd\u6570\uff1a\u5f53 XMLConstants.FEATURE_SECURE_PROCESSING \u529f\u80fd\u8bbe\u7f6e\u4e3a true \u65f6\uff0c\u65e0\u6cd5\u8c03\u7528\u201c{0}\u201d\u3002"},
+
+  /** Field ER_RESOLVE_VARIABLE_RETURNS_NULL                       */
+
+  { ER_RESOLVE_VARIABLE_RETURNS_NULL,
+       "\u53d8\u91cf {0} \u7684 resolveVariable \u6b63\u5728\u8fd4\u56de\u7a7a\u503c"},
+
+  /** Field ER_UNSUPPORTED_RETURN_TYPE                       */
+
+  { ER_UNSUPPORTED_RETURN_TYPE,
+       "\u4e0d\u53d7\u652f\u6301\u7684\u8fd4\u56de\u7c7b\u578b\uff1a{0}"},
+
+  /** Field ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL                       */
+
+  { ER_SOURCE_RETURN_TYPE_CANNOT_BE_NULL,
+       "\u6e90\u548c\uff0f\u6216\u8fd4\u56de\u7c7b\u578b\u4e0d\u80fd\u4e3a\u7a7a"},
+
+  /** Field ER_ARG_CANNOT_BE_NULL                       */
+
+  { ER_ARG_CANNOT_BE_NULL,
+       "{0} \u81ea\u53d8\u91cf\u4e0d\u80fd\u4e3a\u7a7a"},
+
+  /** Field ER_OBJECT_MODEL_NULL                       */
+
+  { ER_OBJECT_MODEL_NULL,
+       "{0}#isObjectModelSupported( String objectModel ) \u4e0d\u80fd\u88ab\u8c03\u7528\uff08\u5982\u679c objectModel == null\uff09"},
+
+  /** Field ER_OBJECT_MODEL_EMPTY                       */
+
+  { ER_OBJECT_MODEL_EMPTY,
+       "{0}#isObjectModelSupported( String objectModel ) \u4e0d\u80fd\u88ab\u8c03\u7528\uff08\u5982\u679c objectModel == \"\"\uff09"},
+
+  /** Field ER_OBJECT_MODEL_EMPTY                       */
+
+  { ER_FEATURE_NAME_NULL,
+       "\u6b63\u5728\u5c1d\u8bd5\u8bbe\u7f6e\u540d\u79f0\u4e3a\u7a7a\u7684\u7279\u5f81\uff1a{0}#setFeature( null, {1})"},
+
+  /** Field ER_FEATURE_UNKNOWN                       */
+
+  { ER_FEATURE_UNKNOWN,
+       "\u6b63\u5728\u5c1d\u8bd5\u8bbe\u7f6e\u672a\u77e5\u7279\u5f81\u201c{0}\u201d\uff1a{1}#setFeature({0},{2})"},
+
+  /** Field ER_GETTING_NULL_FEATURE                       */
+
+  { ER_GETTING_NULL_FEATURE,
+       "\u6b63\u5728\u5c1d\u8bd5\u83b7\u53d6\u540d\u79f0\u4e3a\u7a7a\u7684\u7279\u5f81\uff1a{0}#getFeature(null)"},
+
+  /** Field ER_GETTING_NULL_FEATURE                       */
+
+  { ER_GETTING_UNKNOWN_FEATURE,
+       "\u6b63\u5728\u5c1d\u8bd5\u83b7\u53d6\u672a\u77e5\u7279\u5f81\u201c{0}\u201d\uff1a{1}#getFeature({0})"},
+
+  /** Field ER_NULL_XPATH_FUNCTION_RESOLVER                       */
+
+  { ER_NULL_XPATH_FUNCTION_RESOLVER,
+       "\u6b63\u5728\u8bd5\u56fe\u8bbe\u7f6e\u7a7a\u7684 XPathFunctionResolver\uff1a{0}#setXPathFunctionResolver(null)"},
+
+  /** Field ER_NULL_XPATH_VARIABLE_RESOLVER                       */
+
+  { ER_NULL_XPATH_VARIABLE_RESOLVER,
+       "\u6b63\u5728\u8bd5\u56fe\u8bbe\u7f6e\u7a7a\u7684 XPathVariableResolver\uff1a{0}#setXPathVariableResolver(null)"},
+
+  //END:  Definitions of error keys used  in exception messages of  JAXP 1.3 XPath API implementation
+
+  // Warnings...
+
+  { WG_LOCALE_NAME_NOT_HANDLED,
+      "\u5728\u672a\u5904\u7406\u8fc7\u7684 format-number \u51fd\u6570\u4e2d\u51fa\u73b0\u8bed\u8a00\u73af\u5883\u540d\uff01"},
+
+  { WG_PROPERTY_NOT_SUPPORTED,
+      "\u4e0d\u652f\u6301 XSL \u5c5e\u6027\uff1a{0}"},
+
+  { WG_DONT_DO_ANYTHING_WITH_NS,
+      "\u5f53\u524d\u4e0d\u8981\u5728\u5c5e\u6027 {1} \u4e2d\u5bf9\u540d\u79f0\u7a7a\u95f4 {0} \u8fdb\u884c\u4efb\u4f55\u5904\u7406"},
+
+  { WG_SECURITY_EXCEPTION,
+      "\u5728\u8bd5\u56fe\u8bbf\u95ee XSL \u7cfb\u7edf\u5c5e\u6027 {0} \u65f6\u53d1\u751f SecurityException"},
+
+  { WG_QUO_NO_LONGER_DEFINED,
+      "XPath \u4e2d\u4e0d\u518d\u5b9a\u4e49\u65e7\u8bed\u6cd5\uff1aquo(...)\u3002"},
+
+  { WG_NEED_DERIVED_OBJECT_TO_IMPLEMENT_NODETEST,
+      "XPath \u9700\u8981\u4e00\u4e2a\u6d3e\u751f\u7684\u5bf9\u8c61\u4ee5\u5b9e\u73b0 nodeTest\uff01"},
+
+  { WG_FUNCTION_TOKEN_NOT_FOUND,
+      "\u627e\u4e0d\u5230\u51fd\u6570\u6807\u8bb0\u3002"},
+
+  { WG_COULDNOT_FIND_FUNCTION,
+      "\u627e\u4e0d\u5230\u51fd\u6570\uff1a{0}"},
+
+  { WG_CANNOT_MAKE_URL_FROM,
+      "\u65e0\u6cd5\u4ece {0} \u751f\u6210 URL"},
+
+  { WG_EXPAND_ENTITIES_NOT_SUPPORTED,
+      "DTM \u89e3\u6790\u5668\u4e0d\u652f\u6301 -E \u9009\u9879"},
+
+  { WG_ILLEGAL_VARIABLE_REFERENCE,
+      "VariableReference \u8d4b\u7ed9\u4e86\u4e0a\u4e0b\u6587\u5916\u7684\u53d8\u91cf\u6216\u6ca1\u6709\u5b9a\u4e49\u7684\u53d8\u91cf\uff01\u540d\u79f0 = {0}"},
+
+  { WG_UNSUPPORTED_ENCODING,
+     "\u4e0d\u53d7\u652f\u6301\u7684\u7f16\u7801\uff1a{0}"},
+
+
+
+  // Other miscellaneous text used inside the code...
+  { "ui_language", "zh"},
+  { "help_language", "zh"},
+  { "language", "zh"},
+  { "BAD_CODE", "createMessage \u7684\u53c2\u6570\u8d85\u51fa\u8303\u56f4"},
+  { "FORMAT_FAILED", "\u5728 messageFormat \u8c03\u7528\u8fc7\u7a0b\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38"},
+  { "version", ">>>>>>> Xalan \u7248\u672c"},
+  { "version2", "<<<<<<<"},
+  { "yes", "\u662f"},
+  { "line", "\u884c\u53f7"},
+  { "column", "\u5217\u53f7"},
+  { "xsldone", "XSLProcessor\uff1a\u5b8c\u6210"},
+  { "xpath_option", "xpath \u9009\u9879\uff1a"},
+  { "optionIN", "[-in inputXMLURL]"},
+  { "optionSelect", "[-select xpath \u8868\u8fbe\u5f0f]"},
+  { "optionMatch", "[-match \u5339\u914d\u6a21\u5f0f\uff08\u7528\u4e8e\u5339\u914d\u8bca\u65ad\uff09]"},
+  { "optionAnyExpr", "\u6216\u8005\u4ec5\u4e00\u4e2a xpath \u8868\u8fbe\u5f0f\u5c31\u5c06\u5b8c\u6210\u4e00\u4e2a\u8bca\u65ad\u8f6c\u50a8"},
+  { "noParsermsg1", "XSL \u5904\u7406\u4e0d\u6210\u529f\u3002"},
+  { "noParsermsg2", "** \u627e\u4e0d\u5230\u89e3\u6790\u5668 **"},
+  { "noParsermsg3", "\u8bf7\u68c0\u67e5\u60a8\u7684\u7c7b\u8def\u5f84\u3002"},
+  { "noParsermsg4", "\u5982\u679c\u6ca1\u6709 IBM \u7684 XML Parser for Java\uff0c\u60a8\u53ef\u4ee5\u4ece\u4ee5\u4e0b\u4f4d\u7f6e\u4e0b\u8f7d\u5b83\uff1a"},
+  { "noParsermsg5", "IBM \u7684 AlphaWorks\uff1ahttp://www.alphaworks.ibm.com/formula/xml"},
+  { "gtone", ">1" },
+  { "zero", "0" },
+  { "one", "1" },
+  { "two" , "2" },
+  { "three", "3" }
+
+  };
+  }
+
+
+  // ================= INFRASTRUCTURE ======================
+
+  /** Field BAD_CODE          */
+  public static final String BAD_CODE = "BAD_CODE";
+
+  /** Field FORMAT_FAILED          */
+  public static final String FORMAT_FAILED = "FORMAT_FAILED";
+
+  /** Field ERROR_RESOURCES          */
+  public static final String ERROR_RESOURCES =
+    "org.apache.xpath.res.XPATHErrorResources";
+
+  /** Field ERROR_STRING          */
+  public static final String ERROR_STRING = "#\u9519\u8bef";
+
+  /** Field ERROR_HEADER          */
+  public static final String ERROR_HEADER = "\u9519\u8bef\uff1a";
+
+  /** Field WARNING_HEADER          */
+  public static final String WARNING_HEADER = "\u8b66\u544a\uff1a";
+
+  /** Field XSL_HEADER          */
+  public static final String XSL_HEADER = "XSL";
+
+  /** Field XML_HEADER          */
+  public static final String XML_HEADER = "XML";
+
+  /** Field QUERY_HEADER          */
+  public static final String QUERY_HEADER = "PATTERN";
+
+
+  /**
+   * Return a named ResourceBundle for a particular locale.  This method mimics the behavior
+   * of ResourceBundle.getBundle().
+   *
+   * @param className Name of local-specific subclass.
+   * @return the ResourceBundle
+   * @throws MissingResourceException
+   */
+  public static final XPATHErrorResources loadResourceBundle(String className)
+          throws MissingResourceException
+  {
+
+    Locale locale = Locale.getDefault();
+    String suffix = getResourceSuffix(locale);
+
+    try
+    {
+
+      // first try with the given locale
+      return (XPATHErrorResources) ResourceBundle.getBundle(className
+              + suffix, locale);
+    }
+    catch (MissingResourceException e)
+    {
+      try  // try to fall back to en_US if we can't load
+      {
+
+        // Since we can't find the localized property file,
+        // fall back to en_US.
+        return (XPATHErrorResources) ResourceBundle.getBundle(className,
+                new Locale("zh", "CN"));
+      }
+      catch (MissingResourceException e2)
+      {
+
+        // Now we are really in trouble.
+        // very bad, definitely very bad...not going to get very far
+        throw new MissingResourceException(
+          "Could not load any resource bundles.", className, "");
+      }
+    }
+  }
+
+  /**
+   * Return the resource file suffic for the indicated locale
+   * For most locales, this will be based the language code.  However
+   * for Chinese, we do distinguish between Taiwan and PRC
+   *
+   * @param locale the locale
+   * @return an String suffix which canbe appended to a resource name
+   */
+  private static final String getResourceSuffix(Locale locale)
+  {
+
+    String suffix = "_" + locale.getLanguage();
+    String country = locale.getCountry();
+
+    if (country.equals("TW"))
+      suffix += "_" + country;
+
+    return suffix;
+  }
+
+}
