GeneralAttributeCheck.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:40k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: GeneralAttributeCheck.cpp,v $
  58.  * Revision 1.13  2003/05/15 18:57:27  knoaman
  59.  * Partial implementation of the configurable memory manager.
  60.  *
  61.  * Revision 1.12  2003/01/17 15:35:57  knoaman
  62.  * Fix for attribute checking of schema declarations.
  63.  *
  64.  * Revision 1.11  2003/01/15 18:33:11  knoaman
  65.  * Make sure that the namespace of schema declarations is the schema namespace.
  66.  *
  67.  * Revision 1.10  2002/12/10 16:58:22  knoaman
  68.  * Schema Errata E1-16.
  69.  *
  70.  * Revision 1.9  2002/11/04 14:49:41  tng
  71.  * C++ Namespace Support.
  72.  *
  73.  * Revision 1.8  2002/09/27 13:22:52  tng
  74.  * [Bug 13073] GeneralAttributeCheck.cpp : compilation fails with Sun C++ 4.2 on Solaris2.7 system.
  75.  *
  76.  * Revision 1.7  2002/09/26 21:08:14  tng
  77.  * [Bug12849] comparison is always false warning.  Patch from Gareth Reakes
  78.  *
  79.  * Revision 1.6  2002/09/24 20:18:14  tng
  80.  * Performance: use XMLString::equals instead of XMLString::compareString
  81.  * and check for null string directly isntead of calling XMLString::stringLen
  82.  *
  83.  * Revision 1.5  2002/05/27 19:54:33  knoaman
  84.  * Performance: use pre-built element-attribute map table.
  85.  *
  86.  * Revision 1.4  2002/05/21 19:30:10  tng
  87.  * DOM Reorganization: modify to use the new DOM interface.
  88.  *
  89.  * Revision 1.3  2002/03/21 15:34:40  knoaman
  90.  * Add support for reporting line/column numbers of schema errors.
  91.  *
  92.  * Revision 1.2  2002/02/06 22:21:49  knoaman
  93.  * Use IDOM for schema processing.
  94.  *
  95.  * Revision 1.1.1.1  2002/02/01 22:22:45  peiyongz
  96.  * sane_include
  97.  *
  98.  * Revision 1.16  2002/01/02 19:50:34  knoaman
  99.  * Fix for error message when checking for attributes with a namespace prefix.
  100.  *
  101.  * Revision 1.15  2001/12/13 18:08:39  knoaman
  102.  * Fix for bug 5410.
  103.  *
  104.  * Revision 1.14  2001/11/19 18:26:31  knoaman
  105.  * no message
  106.  *
  107.  * Revision 1.13  2001/11/19 17:37:55  knoaman
  108.  * Use the instance of ID datatye validator directly.
  109.  *
  110.  * Revision 1.12  2001/11/16 15:03:37  knoaman
  111.  * Design change: GeneralAttributeCheck is not longer a singleton class.
  112.  *
  113.  * Revision 1.11  2001/11/02 14:13:45  knoaman
  114.  * Add support for identity constraints.
  115.  *
  116.  * Revision 1.10  2001/10/25 15:07:46  tng
  117.  * Thread safe the static instance.
  118.  *
  119.  * Revision 1.9  2001/10/23 23:14:55  peiyongz
  120.  * [Bug#880] patch to PlatformUtils:init()/term() and related. from Mark Weaver
  121.  *
  122.  * Revision 1.8  2001/10/16 17:01:58  knoaman
  123.  * Extra constraint checking.
  124.  *
  125.  * Revision 1.7  2001/10/15 19:29:26  knoaman
  126.  * Add support for <notation> declaration.
  127.  *
  128.  * Revision 1.6  2001/09/18 14:41:56  knoaman
  129.  * Add support for <annotation>.
  130.  *
  131.  * Revision 1.5  2001/08/27 20:14:42  knoaman
  132.  * Validate attributes in <all>, <redefine>, <group> and <attributeGroup> declarations.
  133.  * Misc. fixes.
  134.  *
  135.  * Revision 1.4  2001/06/06 13:09:02  knoaman
  136.  * Use BooleanDatatypeValidator to validate values.
  137.  *
  138.  * Revision 1.3  2001/05/18 20:05:30  knoaman
  139.  * Modified wording of error messages.
  140.  *
  141.  * Revision 1.2  2001/05/17 18:11:15  knoaman
  142.  * More constraint and attribute checking.
  143.  *
  144.  * Revision 1.1  2001/05/15 21:59:31  knoaman
  145.  * TraverseSchema: add attribute checking + some fixes + more error messages.
  146.  * More attribute cheking to come.
  147.  *
  148.  */
  149. // ---------------------------------------------------------------------------
  150. //  Includes
  151. // ---------------------------------------------------------------------------
  152. #include <xercesc/validators/schema/GeneralAttributeCheck.hpp>
  153. #include <xercesc/validators/schema/SchemaSymbols.hpp>
  154. #include <xercesc/util/XMLString.hpp>
  155. #include <xercesc/util/XMLUniDefs.hpp>
  156. #include <xercesc/util/Janitor.hpp>
  157. #include <xercesc/dom/DOMNamedNodeMap.hpp>
  158. #include <xercesc/framework/XMLErrorCodes.hpp>
  159. #include <xercesc/validators/schema/TraverseSchema.hpp>
  160. #include <xercesc/util/PlatformUtils.hpp>
  161. #include <xercesc/util/XMLRegisterCleanup.hpp>
  162. #include <xercesc/validators/datatype/DatatypeValidatorFactory.hpp>
  163. XERCES_CPP_NAMESPACE_BEGIN
  164. // ---------------------------------------------------------------------------
  165. //  Local const data
  166. // ---------------------------------------------------------------------------
  167. const XMLCh fgValueZero[] =
  168. {
  169.     chDigit_0, chNull
  170. };
  171. const XMLCh fgValueOne[] =
  172. {
  173.     chDigit_1, chNull
  174. };
  175. const XMLCh fgUnbounded[] =
  176. {
  177.     chLatin_u, chLatin_n, chLatin_b, chLatin_o, chLatin_u, chLatin_n, chLatin_d,
  178.     chLatin_e, chLatin_d, chNull
  179. };
  180. const XMLCh fgLocal[] =
  181. {
  182.     chLatin_l, chLatin_o, chLatin_c, chLatin_a, chLatin_l, chNull
  183. };
  184. const XMLCh fgGlobal[] =
  185. {
  186.     chLatin_g, chLatin_l, chLatin_o, chLatin_b, chLatin_a, chLatin_l, chNull
  187. };
  188. // ---------------------------------------------------------------------------
  189. //  Static member data initialization
  190. // ---------------------------------------------------------------------------
  191. ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fAttMap = 0;
  192. ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fFacetsMap = 0;
  193. DatatypeValidator*                GeneralAttributeCheck::fNonNegIntDV = 0;
  194. DatatypeValidator*                GeneralAttributeCheck::fBooleanDV = 0;
  195. DatatypeValidator*                GeneralAttributeCheck::fAnyURIDV = 0;
  196. // ---------------------------------------------------------------------------
  197. //  Static local data
  198. // ---------------------------------------------------------------------------
  199. static XMLMutex* sGeneralAttCheckMutex = 0;
  200. static XMLRegisterCleanup GeneralAttCheckCleanup;
  201. // ---------------------------------------------------------------------------
  202. //  GeneralAttributeCheck: Constructors and Destructor
  203. // ---------------------------------------------------------------------------
  204. GeneralAttributeCheck::GeneralAttributeCheck(MemoryManager* const manager)
  205.     : fMemoryManager(manager)
  206.     , fIDRefList(0)
  207.     , fIDValidator(manager)
  208. {
  209.     mapElements();
  210. }
  211. GeneralAttributeCheck::~GeneralAttributeCheck()
  212. {
  213. }
  214. // ---------------------------------------------------------------------------
  215. //  GeneralAttributeCheck: Setup methods
  216. // ---------------------------------------------------------------------------
  217. void GeneralAttributeCheck::setUpValidators() {
  218.     DatatypeValidatorFactory dvFactory(fMemoryManager);
  219.     dvFactory.expandRegistryToFullSchemaSet();
  220.     fNonNegIntDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER);
  221.     fBooleanDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_BOOLEAN);
  222.     fAnyURIDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_ANYURI);
  223.     // TO DO - add remaining valdiators
  224. }
  225. void GeneralAttributeCheck::mapElements() {
  226.     if (!sGeneralAttCheckMutex)
  227.     {
  228.         XMLMutex* tmpMutex = new XMLMutex;
  229.         if (XMLPlatformUtils::compareAndSwap((void**)&sGeneralAttCheckMutex, tmpMutex, 0))
  230.         {
  231.             // Some other thread beat us to it, so let's clean up ours.
  232.             delete tmpMutex;
  233.         }
  234.         else
  235.         {
  236.             //
  237.             // the thread who creates the mutex succesfully, to
  238.             // initialize the followings
  239.             //
  240.             setUpValidators();
  241.             mapAttributes();
  242.             // This is the real mutex.  Register it for cleanup at Termination.
  243.             GeneralAttCheckCleanup.registerCleanup(reinitGeneralAttCheck);
  244.         }
  245.     }
  246. }
  247. void GeneralAttributeCheck::mapAttributes() {
  248.     fAttMap = new ValueHashTableOf<unsigned short>(A_Count);
  249.     fAttMap->put((void*)SchemaSymbols::fgATT_ABSTRACT, A_Abstract);
  250.     fAttMap->put((void*)SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT, A_AttributeFormDefault);
  251.     fAttMap->put((void*)SchemaSymbols::fgATT_BASE, A_Base);
  252.     fAttMap->put((void*)SchemaSymbols::fgATT_BLOCK, A_Block);
  253.     fAttMap->put((void*)SchemaSymbols::fgATT_BLOCKDEFAULT, A_BlockDefault);
  254.     fAttMap->put((void*)SchemaSymbols::fgATT_DEFAULT, A_Default);
  255.     fAttMap->put((void*)SchemaSymbols::fgATT_ELEMENTFORMDEFAULT, A_ElementFormDefault);
  256.     fAttMap->put((void*)SchemaSymbols::fgATT_FINAL, A_Final);
  257.     fAttMap->put((void*)SchemaSymbols::fgATT_FINALDEFAULT, A_FinalDefault);
  258.     fAttMap->put((void*)SchemaSymbols::fgATT_FIXED, A_Fixed);
  259.     fAttMap->put((void*)SchemaSymbols::fgATT_FORM, A_Form);
  260.     fAttMap->put((void*)SchemaSymbols::fgATT_ID, A_ID);
  261.     fAttMap->put((void*)SchemaSymbols::fgATT_ITEMTYPE, A_ItemType);
  262.     fAttMap->put((void*)SchemaSymbols::fgATT_MAXOCCURS, A_MaxOccurs);
  263.     fAttMap->put((void*)SchemaSymbols::fgATT_MEMBERTYPES, A_MemberTypes);
  264.     fAttMap->put((void*)SchemaSymbols::fgATT_MINOCCURS, A_MinOccurs);
  265.     fAttMap->put((void*)SchemaSymbols::fgATT_MIXED, A_Mixed);
  266.     fAttMap->put((void*)SchemaSymbols::fgATT_NAME, A_Name);
  267.     fAttMap->put((void*)SchemaSymbols::fgATT_NAMESPACE, A_Namespace);
  268.     fAttMap->put((void*)SchemaSymbols::fgATT_NILLABLE, A_Nillable);
  269.     fAttMap->put((void*)SchemaSymbols::fgATT_PROCESSCONTENTS, A_ProcessContents);
  270.     fAttMap->put((void*)SchemaSymbols::fgATT_PUBLIC, A_Public);
  271.     fAttMap->put((void*)SchemaSymbols::fgATT_REF, A_Ref);
  272.     fAttMap->put((void*)SchemaSymbols::fgATT_REFER, A_Refer);
  273.     fAttMap->put((void*)SchemaSymbols::fgATT_SCHEMALOCATION, A_SchemaLocation);
  274.     fAttMap->put((void*)SchemaSymbols::fgATT_SOURCE, A_Source);
  275.     fAttMap->put((void*)SchemaSymbols::fgATT_SUBSTITUTIONGROUP, A_SubstitutionGroup);
  276.     fAttMap->put((void*)SchemaSymbols::fgATT_SYSTEM, A_System);
  277.     fAttMap->put((void*)SchemaSymbols::fgATT_TARGETNAMESPACE, A_TargetNamespace);
  278.     fAttMap->put((void*)SchemaSymbols::fgATT_TYPE, A_Type);
  279.     fAttMap->put((void*)SchemaSymbols::fgATT_USE, A_Use);
  280.     fAttMap->put((void*)SchemaSymbols::fgATT_VALUE, A_Value);
  281.     fAttMap->put((void*)SchemaSymbols::fgATT_VERSION, A_Version);
  282.     fAttMap->put((void*)SchemaSymbols::fgATT_XPATH, A_XPath);
  283.     fFacetsMap = new ValueHashTableOf<unsigned short>(13);
  284.     fFacetsMap->put((void*) SchemaSymbols::fgELT_MINEXCLUSIVE, E_MinExclusive);
  285.     fFacetsMap->put((void*) SchemaSymbols::fgELT_MININCLUSIVE, E_MinInclusive);
  286.     fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXEXCLUSIVE, E_MaxExclusive);
  287.     fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE, E_MaxInclusive);
  288.     fFacetsMap->put((void*) SchemaSymbols::fgELT_TOTALDIGITS, E_TotalDigits);
  289.     fFacetsMap->put((void*) SchemaSymbols::fgELT_FRACTIONDIGITS, E_FractionDigits);
  290.     fFacetsMap->put((void*) SchemaSymbols::fgELT_LENGTH, E_Length);
  291.     fFacetsMap->put((void*) SchemaSymbols::fgELT_MINLENGTH, E_MinLength);
  292.     fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXLENGTH, E_MaxLength);
  293.     fFacetsMap->put((void*) SchemaSymbols::fgELT_ENUMERATION, E_Enumeration);
  294.     fFacetsMap->put((void*) SchemaSymbols::fgELT_WHITESPACE, E_WhiteSpace);
  295.     fFacetsMap->put((void*) SchemaSymbols::fgELT_PATTERN, E_Pattern);
  296. }
  297. // -----------------------------------------------------------------------
  298. //  Notification that lazy data has been deleted
  299. // -----------------------------------------------------------------------
  300. void
  301. GeneralAttributeCheck::reinitGeneralAttCheck() {
  302.     delete sGeneralAttCheckMutex;
  303.     sGeneralAttCheckMutex = 0;
  304.     delete fAttMap;
  305.     delete fFacetsMap;
  306.     fAttMap = fFacetsMap = 0;
  307.     fNonNegIntDV = fBooleanDV = fAnyURIDV = 0;
  308. }
  309. // ---------------------------------------------------------------------------
  310. //  GeneralAttributeCheck: Validation methods
  311. // ---------------------------------------------------------------------------
  312. void
  313. GeneralAttributeCheck::checkAttributes(const DOMElement* const elem,
  314.                                        const unsigned short elemContext,
  315.                                        TraverseSchema* const schema,
  316.                                        const bool isTopLevel) {
  317.     if (elem == 0 || !fAttMap || elemContext>=E_Count) {
  318.         return;
  319.     }
  320.     const XMLCh* elemName = elem->getLocalName();
  321.     if (!XMLString::equals(SchemaSymbols::fgURI_SCHEMAFORSCHEMA, elem->getNamespaceURI())) {
  322.         schema->reportSchemaError
  323.         (
  324.             elem
  325.             , XMLUni::fgXMLErrDomain
  326.             , XMLErrs::ELTSchemaNS
  327.             , elemName
  328.         );
  329.     }
  330.     const XMLCh*     contextStr = (isTopLevel) ? fgGlobal : fgLocal;
  331.     DOMNamedNodeMap* eltAttrs = elem->getAttributes();
  332.     int              attrCount = eltAttrs->getLength();
  333.     XMLByte          attList[A_Count];
  334.     memset(attList, 0, sizeof(attList));
  335.     for (int i = 0; i < attrCount; i++) {
  336.         DOMNode*     attribute = eltAttrs->item(i);
  337.         const XMLCh* attName = attribute->getNodeName();
  338.         // Bypass attributes that start with xml
  339.         if ((*attName == chLatin_X || *attName == chLatin_x)
  340.            && (*(attName+1) == chLatin_M || *(attName+1) == chLatin_m)
  341.            && (*(attName+2) == chLatin_L || *(attName+2) == chLatin_l)) {
  342.             continue;
  343.         }
  344.         // for attributes with namespace prefix
  345.         const XMLCh* attrURI = attribute->getNamespaceURI();
  346.         if (attrURI != 0 && *attrURI) {
  347.             // attributes with schema namespace are not allowed
  348.             // and not allowed on "documentation" and "appInfo"
  349.             if (XMLString::equals(attrURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) ||
  350.                 XMLString::equals(elemName, SchemaSymbols::fgELT_APPINFO) ||
  351.                 XMLString::equals(elemName, SchemaSymbols::fgELT_DOCUMENTATION)) {
  352.                 schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
  353.                     XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
  354.             } else {
  355.                 // Try for a "lax" validation
  356.                 DatatypeValidator* dv = schema->getDatatypeValidator(attrURI, attribute->getLocalName());
  357.                 if (dv) {
  358.                     const XMLCh* attrVal = attribute->getNodeValue();
  359.                     try {
  360.                         dv->validate(attrVal);
  361.                     }
  362.                     catch(const XMLException& excep) {
  363.                         schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::DisplayErrorMessage, excep.getMessage());
  364.                     }
  365.                     catch(...) {
  366.                         schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue, attrVal, attName);
  367.                     }
  368.                 }
  369.                 // REVISIT:
  370.                 // If no dv found, store attribute info for a "lax" validation
  371.                 // after schema traversal ?? - KN
  372.             }
  373.             continue;
  374.         }
  375.         int attNameId = A_Invalid;
  376.         attName = attribute->getLocalName();
  377.         try {
  378.             attNameId= fAttMap->get(attName);
  379.         }
  380.         catch(...) {
  381.             schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
  382.                 XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
  383.             continue;
  384.         }
  385.         if (fgElemAttTable[elemContext][attNameId] & Att_Mask) {
  386.             attList[attNameId] = 1;
  387.             validate
  388.             (
  389.                 elem
  390.                 , attName
  391.                 , attribute->getNodeValue()
  392.                 , fgElemAttTable[elemContext][attNameId] & DV_Mask
  393.                 , schema
  394.             );
  395.         }
  396.         else {
  397.             schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
  398.                 XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
  399.         }
  400.     }
  401.     // ------------------------------------------------------------------
  402.     // Check for required attributes
  403.     // ------------------------------------------------------------------
  404.     for (unsigned int j=0; j < A_Count; j++) {
  405.         if ((fgElemAttTable[elemContext][j] & Att_Required) && attList[j] == 0) {
  406.             schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::AttributeRequired,
  407.                                       fAttNames[j], contextStr, elemName);
  408.         }
  409.     }
  410. }
  411. void GeneralAttributeCheck::validate(const DOMElement* const elem,
  412.                                      const XMLCh* const attName,
  413.                                      const XMLCh* const attValue,
  414.                                      const short dvIndex,
  415.                                      TraverseSchema* const schema)
  416. {
  417.     bool isInvalid = false;
  418.     DatatypeValidator* dv = 0;
  419.     switch (dvIndex) {
  420.     case DV_Form:
  421.         if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_QUALIFIED)
  422.             && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_UNQUALIFIED)) {
  423.             isInvalid = true;
  424.         }
  425.         break;
  426.     case DV_MaxOccurs:
  427.             // maxOccurs = (nonNegativeInteger | unbounded)
  428.         if (!XMLString::equals(attValue, fgUnbounded)) {
  429.             dv = fNonNegIntDV;
  430.         }
  431.         break;
  432.     case DV_MaxOccurs1:
  433.         if (!XMLString::equals(attValue, fgValueOne)) {
  434.             isInvalid = true;
  435.         }
  436.         break;
  437.     case DV_MinOccurs1:
  438.         if (!XMLString::equals(attValue, fgValueZero)
  439.             && !XMLString::equals(attValue, fgValueOne)) {
  440.             isInvalid = true;
  441.         }
  442.         break;
  443.     case DV_ProcessContents:
  444.         if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_SKIP)
  445.             && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_LAX)
  446.             && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_STRICT)) {
  447.             isInvalid = true;
  448.         }
  449.         break;
  450.     case DV_Use:
  451.         if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_OPTIONAL)
  452.             && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_PROHIBITED)
  453.             && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_REQUIRED)) {
  454.             isInvalid = true;
  455.         }
  456.         break;
  457.     case DV_WhiteSpace:
  458.         if (!XMLString::equals(attValue, SchemaSymbols::fgWS_PRESERVE)
  459.             && !XMLString::equals(attValue, SchemaSymbols::fgWS_REPLACE)
  460.             && !XMLString::equals(attValue, SchemaSymbols::fgWS_COLLAPSE)) {
  461.             isInvalid = true;
  462.         }
  463.         break;
  464.     case DV_Boolean:
  465.         dv = fBooleanDV;
  466.         break;
  467.     case DV_NonNegInt:
  468.         dv = fNonNegIntDV;
  469.         break;
  470.     case DV_AnyURI:
  471.         dv = fAnyURIDV;
  472.         break;
  473.     case DV_ID:
  474.         if (fIDRefList) {
  475.             dv = &fIDValidator;
  476.             ((IDDatatypeValidator*) dv)->setIDRefList(fIDRefList);
  477.         }
  478.         break;
  479.     }
  480.     if (dv) {
  481.         try {
  482.             dv->validate(attValue);
  483.         }
  484.         catch(const XMLException& excep) {
  485.             schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::DisplayErrorMessage, excep.getMessage());
  486.         }
  487.         catch(...) {
  488.             isInvalid = true;
  489.         }
  490.     }
  491.     if (isInvalid) {
  492.         schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue,
  493.                                   attValue, attName);
  494.     }
  495. }
  496. // ---------------------------------------------------------------------------
  497. //  Conditional methods for building the table
  498. // ---------------------------------------------------------------------------
  499. //
  500. //  This code will set up the character flags table. Its defined out since
  501. //  this table is now written out and hard coded (at the bottom of this
  502. //  file) into the code itself. This code is retained in case there is
  503. //  any need to recreate it later.
  504. //
  505. #if defined(NEED_TO_GEN_ELEM_ATT_MAP_TABLE)
  506. #include <stdio.h>
  507. void GeneralAttributeCheck::initCharFlagTable()
  508. {
  509.     unsigned short attList[E_Count][A_Count];
  510.     for (unsigned int i=0; i < E_Count; i++) {
  511.         for (unsigned int j=0; j < A_Count; j++) {
  512.             attList[i][j] = 0;
  513.         }
  514.     }
  515.     //
  516.     //  Write it out to a temp file to be read back into this source later.
  517.     //
  518.     FILE* outFl = fopen("ea_table.out", "wt+");
  519.     fprintf(outFl, "unsigned short GeneralAttributeCheck::fgElemAttTable[E_Count][A_Count] =n{n    {");
  520.     //"all"
  521.     attList[E_All][A_ID] = Att_Optional | DV_ID;
  522.     attList[E_All][A_MaxOccurs] = Att_Optional | DV_MaxOccurs1;
  523.     attList[E_All][A_MinOccurs] = Att_Optional | DV_MinOccurs1;
  524.     // "annotation"
  525.     attList[E_Annotation][A_ID] = Att_Optional | DV_ID;
  526.     // "any"
  527.     attList[E_Any][A_ID] = Att_Optional | DV_ID;
  528.     attList[E_Any][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
  529.     attList[E_Any][A_MinOccurs] = Att_Optional | DV_NonNegInt;
  530.     attList[E_Any][A_Namespace] = Att_Optional;
  531.     attList[E_Any][A_ProcessContents] = Att_Optional | DV_ProcessContents;
  532.     // "anyAttribute"
  533.     attList[E_AnyAttribute][A_ID] = Att_Optional | DV_ID;
  534.     attList[E_AnyAttribute][A_Namespace] = Att_Optional;
  535.     attList[E_AnyAttribute][A_ProcessContents] = Att_Optional | DV_ProcessContents;
  536.     // "appinfo"
  537.     attList[E_Appinfo][A_Source]= Att_Optional | DV_AnyURI;
  538.     // attribute - global"
  539.     attList[E_AttributeGlobal][A_Default] = Att_Optional;
  540.     attList[E_AttributeGlobal][A_Fixed] = Att_Optional;
  541.     attList[E_AttributeGlobal][A_ID] = Att_Optional | DV_ID;
  542.     attList[E_AttributeGlobal][A_Name] = Att_Required;
  543.     attList[E_AttributeGlobal][A_Type] = Att_Optional;
  544.     // "attribute - local"
  545.     attList[E_AttributeLocal][A_Default] = Att_Optional;
  546.     attList[E_AttributeLocal][A_Fixed] = Att_Optional;
  547.     attList[E_AttributeLocal][A_Form]= Att_Optional | DV_Form;
  548.     attList[E_AttributeLocal][A_ID] = Att_Optional | DV_ID;
  549.     attList[E_AttributeLocal][A_Name] = Att_Required;
  550.     attList[E_AttributeLocal][A_Type] = Att_Optional;
  551.     attList[E_AttributeLocal][A_Use] = Att_Optional | DV_Use;
  552.     // "attribute - ref"
  553.     attList[E_AttributeRef][A_Default] = Att_Optional;
  554.     attList[E_AttributeRef][A_Fixed] = Att_Optional;
  555.     attList[E_AttributeRef][A_ID] = Att_Optional | DV_ID;
  556.     attList[E_AttributeRef][A_Ref]= Att_Required;
  557.     attList[E_AttributeRef][A_Use] = Att_Optional | DV_Use;
  558.     // "attributeGroup - global"
  559.     attList[E_AttributeGroupGlobal][A_ID] = Att_Optional | DV_ID;
  560.     attList[E_AttributeGroupGlobal][A_Name] = Att_Required;
  561.     // "attributeGroup - ref"
  562.     attList[E_AttributeGroupRef][A_ID] = Att_Optional | DV_ID;
  563.     attList[E_AttributeGroupRef][A_Ref]= Att_Required;
  564.     // "choice"
  565.     attList[E_Choice][A_ID] = Att_Optional | DV_ID;
  566.     attList[E_Choice][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
  567.     attList[E_Choice][A_MinOccurs] = Att_Optional | DV_NonNegInt;
  568.     // "complexContent"
  569.     attList[E_ComplexContent][A_ID] = Att_Optional | DV_ID;
  570.     attList[E_ComplexContent][A_Mixed] = Att_Optional | DV_Boolean;
  571.     // "complexType - global"
  572.     attList[E_ComplexTypeGlobal][A_Abstract] = Att_Optional | DV_Boolean;
  573.     attList[E_ComplexTypeGlobal][A_Block] = Att_Optional;
  574.     attList[E_ComplexTypeGlobal][A_Final] = Att_Optional;
  575.     attList[E_ComplexTypeGlobal][A_ID] = Att_Optional | DV_ID;
  576.     attList[E_ComplexTypeGlobal][A_Mixed] = Att_Optional | DV_Boolean;
  577.     attList[E_ComplexTypeGlobal][A_Name] = Att_Required;
  578.     // "complexType - local"
  579.     attList[E_ComplexTypeLocal][A_ID] = Att_Optional | DV_ID;
  580.     attList[E_ComplexTypeLocal][A_Mixed] = Att_Optional | DV_Boolean;
  581.     // "documentation"
  582.     attList[E_Documentation][A_Source] = Att_Optional | DV_AnyURI;
  583.     // "element - global"
  584.     attList[E_ElementGlobal][A_Abstract] = Att_Optional | DV_Boolean;
  585.     attList[E_ElementGlobal][A_Block] = Att_Optional;
  586.     attList[E_ElementGlobal][A_Default] = Att_Optional;
  587.     attList[E_ElementGlobal][A_Final] = Att_Optional;
  588.     attList[E_ElementGlobal][A_Fixed] = Att_Optional;
  589.     attList[E_ElementGlobal][A_ID] = Att_Optional | DV_ID;;
  590.     attList[E_ElementGlobal][A_Name] = Att_Required;
  591.     attList[E_ElementGlobal][A_Nillable] = Att_Optional | DV_Boolean;
  592.     attList[E_ElementGlobal][A_SubstitutionGroup] = Att_Optional;
  593.     attList[E_ElementGlobal][A_Type] = Att_Optional;
  594.     // "element - local"
  595.     attList[E_ElementLocal][A_Block]= Att_Optional;
  596.     attList[E_ElementLocal][A_Default] = Att_Optional;
  597.     attList[E_ElementLocal][A_Fixed] = Att_Optional;
  598.     attList[E_ElementLocal][A_Form] = Att_Optional | DV_Form;
  599.     attList[E_ElementLocal][A_ID] = Att_Optional | DV_ID;
  600.     attList[E_ElementLocal][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
  601.     attList[E_ElementLocal][A_MinOccurs] = Att_Optional | DV_NonNegInt;
  602.     attList[E_ElementLocal][A_Name] = Att_Required;
  603.     attList[E_ElementLocal][A_Nillable] = Att_Optional | DV_Boolean;
  604.     attList[E_ElementLocal][A_Type] = Att_Optional;
  605.     //"element - ref"
  606.     attList[E_ElementRef][A_ID] = Att_Optional | DV_ID;
  607.     attList[E_ElementRef][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
  608.     attList[E_ElementRef][A_MinOccurs] = Att_Optional | DV_NonNegInt;
  609.     attList[E_ElementRef][A_Ref] = Att_Required;
  610.     // "enumeration"
  611.     attList[E_Enumeration][A_ID] = Att_Optional | DV_ID;
  612.     attList[E_Enumeration][A_Value] = Att_Optional;
  613.     // "extension"
  614.     attList[E_Extension][A_Base] = Att_Required;
  615.     attList[E_Extension][A_ID] = Att_Optional | DV_ID;
  616.     //"field"
  617.     attList[E_Field][A_ID] = Att_Optional | DV_ID;
  618.     attList[E_Field][A_XPath] = Att_Required;
  619.     // "fractionDigits"
  620.     attList[E_FractionDigits][A_ID] = Att_Optional | DV_ID;
  621.     attList[E_FractionDigits][A_Value] = Att_Optional | DV_NonNegInt;
  622.     attList[E_FractionDigits][A_Fixed] = Att_Optional | DV_Boolean;
  623.     // "group - global"
  624.     attList[E_GroupGlobal][A_ID] = Att_Optional | DV_ID;
  625.     attList[E_GroupGlobal][A_Name] = Att_Required;
  626.     // "group - ref"
  627.     attList[E_GroupRef][A_ID] = Att_Optional | DV_ID;
  628.     attList[E_GroupRef][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
  629.     attList[E_GroupRef][A_MinOccurs] = Att_Optional | DV_NonNegInt;
  630.     attList[E_GroupRef][A_Ref] = Att_Required;
  631.     // "import"
  632.     attList[E_Import][A_ID] = Att_Optional | DV_ID;
  633.     attList[E_Import][A_Namespace] = Att_Optional;
  634.     attList[E_Import][A_SchemaLocation] = Att_Optional;
  635.     // "include"
  636.     attList[E_Include][A_ID] = Att_Optional | DV_ID;
  637.     attList[E_Include][A_SchemaLocation] = Att_Required;
  638.     // "key"
  639.     attList[E_Key][A_ID] = Att_Optional | DV_ID;
  640.     attList[E_Key][A_Name] = Att_Required;
  641.     // "keyref"
  642.     attList[E_KeyRef][A_ID] = Att_Optional | DV_ID;
  643.     attList[E_KeyRef][A_Name] = Att_Required;
  644.     attList[E_KeyRef][A_Refer] = Att_Required;
  645.     // "length"
  646.     attList[E_Length][A_ID] = Att_Optional | DV_ID;
  647.     attList[E_Length][A_Value] = Att_Optional | DV_NonNegInt;
  648.     attList[E_Length][A_Fixed] = Att_Optional | DV_Boolean;
  649.     // "list"
  650.     attList[E_List][A_ID] = Att_Optional | DV_ID;
  651.     attList[E_List][A_ItemType] = Att_Optional;
  652.     // "maxExclusive"
  653.     attList[E_MaxExclusive][A_ID] = Att_Optional | DV_ID;
  654.     attList[E_MaxExclusive][A_Value] = Att_Optional;
  655.     attList[E_MaxExclusive][A_Fixed] = Att_Optional | DV_Boolean;
  656.     // "maxInclusive"
  657.     attList[E_MaxInclusive][A_ID] = Att_Optional | DV_ID;
  658.     attList[E_MaxInclusive][A_Value] = Att_Optional;
  659.     attList[E_MaxInclusive][A_Fixed] = Att_Optional | DV_Boolean;
  660.     // "maxLength"
  661.     attList[E_MaxLength][A_ID] = Att_Optional | DV_ID;
  662.     attList[E_MaxLength][A_Value] = Att_Optional | DV_NonNegInt;
  663.     attList[E_MaxLength][A_Fixed] = Att_Optional | DV_Boolean;
  664.     // "minExclusive"
  665.     attList[E_MinExclusive][A_ID] = Att_Optional | DV_ID;
  666.     attList[E_MinExclusive][A_Value] = Att_Optional;
  667.     attList[E_MinExclusive][A_Fixed] = Att_Optional | DV_Boolean;
  668.     // "minInclusive"
  669.     attList[E_MinInclusive][A_ID] = Att_Optional | DV_ID;
  670.     attList[E_MinInclusive][A_Value] = Att_Optional;
  671.     attList[E_MinInclusive][A_Fixed] = Att_Optional | DV_Boolean;
  672.     // "minLength"
  673.     attList[E_MinLength][A_ID] = Att_Optional | DV_ID;
  674.     attList[E_MinLength][A_Value] = Att_Optional | DV_NonNegInt;
  675.     attList[E_MinLength][A_Fixed] = Att_Optional | DV_Boolean;
  676.     // "notation"
  677.     attList[E_Notation][A_ID] = Att_Optional | DV_ID;
  678.     attList[E_Notation][A_Name] = Att_Required;
  679.     attList[E_Notation][A_Public] = Att_Optional;
  680.     attList[E_Notation][A_System] = Att_Optional | DV_AnyURI;
  681.     // "pattern"
  682.     attList[E_Pattern][A_ID] = Att_Optional;
  683.     attList[E_Pattern][A_Value] = Att_Optional;
  684.     // "redefine"
  685.     attList[E_Redefine][A_ID] = Att_Optional | DV_ID;
  686.     attList[E_Redefine][A_SchemaLocation] = Att_Required;
  687.     // "restriction"
  688.     attList[E_Restriction][A_Base] = Att_Optional;
  689.     attList[E_Restriction][A_ID] = Att_Optional | DV_ID;
  690.     // "schema"
  691.     attList[E_Schema][A_AttributeFormDefault] = Att_Optional | DV_Form;
  692.     attList[E_Schema][A_BlockDefault] = Att_Optional;
  693.     attList[E_Schema][A_ElementFormDefault] = Att_Optional | DV_Form;
  694.     attList[E_Schema][A_FinalDefault] = Att_Optional;
  695.     attList[E_Schema][A_ID] = Att_Optional | DV_ID;
  696.     attList[E_Schema][A_TargetNamespace] = Att_Optional;
  697.     attList[E_Schema][A_Version] = Att_Optional;
  698.     // "selector"
  699.     attList[E_Selector][A_ID] = Att_Optional | DV_ID;
  700.     attList[E_Selector][A_XPath] = Att_Required;
  701.     // "sequence"
  702.     attList[E_Sequence][A_ID] = Att_Optional | DV_ID;
  703.     attList[E_Sequence][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
  704.     attList[E_Sequence][A_MinOccurs] = Att_Optional | DV_NonNegInt;
  705.     // "simpleContent"
  706.     attList[E_SimpleContent][A_ID] = Att_Optional | DV_ID;
  707.     // "simpleType - global"
  708.     attList[E_SimpleTypeGlobal][A_Final] = Att_Optional;
  709.     attList[E_SimpleTypeGlobal][A_ID] = Att_Optional | DV_ID;
  710.     attList[E_SimpleTypeGlobal][A_Name] = Att_Required;
  711.     // "simpleType - local"
  712.     attList[E_SimpleTypeLocal][A_Final] = Att_Optional;
  713.     attList[E_SimpleTypeLocal][A_ID] = Att_Optional | DV_ID;
  714.     // "totalDigits"
  715.     attList[E_TotalDigits][A_ID] = Att_Optional | DV_ID;
  716.     attList[E_TotalDigits][A_Value] = Att_Optional | DV_NonNegInt;
  717.     attList[E_TotalDigits][A_Fixed] = Att_Optional | DV_Boolean;
  718.     // "union"
  719.     attList[E_Union][A_ID] = Att_Optional | DV_ID;
  720.     attList[E_Union][A_MemberTypes] = Att_Optional;
  721.     // "unique"
  722.     attList[E_Unique][A_ID] = Att_Optional | DV_ID;
  723.     attList[E_Unique][A_Name] = Att_Required;
  724.     // "whitespace"
  725.     attList[E_WhiteSpace][A_ID] = Att_Optional | DV_ID;
  726.     attList[E_WhiteSpace][A_Value] = Att_Optional | DV_WhiteSpace;
  727.     attList[E_WhiteSpace][A_Fixed] = Att_Optional | DV_Boolean;
  728.     for (unsigned int j=0; j < E_Count; j++) {
  729.         for (unsigned int index = 0; index < A_Count-1; index++)
  730.         {
  731.             fprintf(outFl, " %d,", attList[j][index]);
  732.         }
  733.         fprintf(outFl, " %d", attList[j][A_Count - 1]);
  734.         if (j + 1 == E_Count)
  735.             fprintf(outFl, "}n};");
  736.         else
  737.             fprintf(outFl, "},n    {");
  738.     }
  739.     fclose(outFl);
  740. }
  741. #endif
  742. unsigned short GeneralAttributeCheck::fgElemAttTable[GeneralAttributeCheck::E_Count][GeneralAttributeCheck::A_Count] =
  743. {
  744.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 258, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  745.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  746.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 2, 0, 1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  747.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 2, 0, 1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  748.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0},
  749.   { 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
  750.   { 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 66, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2050, 0, 0, 0},
  751.   { 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2050, 0, 0, 0},
  752.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  753.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  754.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  755.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  756.   { 18, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  757.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  758.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0},
  759.   { 18, 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 34, 0, 0, 0, 0, 0, 1, 0, 18, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
  760.   { 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 66, 34, 0, 130, 0, 10, 0, 1, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
  761.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  762.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
  763.   { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  764.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  765.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
  766.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  767.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  768.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  769.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  770.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  771.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  772.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
  773.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  774.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
  775.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
  776.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
  777.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
  778.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
  779.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
  780.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0},
  781.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
  782.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  783.   { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  784.   { 0, 66, 0, 0, 2, 0, 66, 0, 2, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0},
  785.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  786.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  787.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  788.   { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  789.   { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  790.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
  791.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  792.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  793.   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4098, 0, 0}
  794. };
  795. const XMLCh* GeneralAttributeCheck::fAttNames[A_Count] =
  796. {
  797.     SchemaSymbols::fgATT_ABSTRACT,
  798.     SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT,
  799.     SchemaSymbols::fgATT_BASE,
  800.     SchemaSymbols::fgATT_BLOCK,
  801.     SchemaSymbols::fgATT_BLOCKDEFAULT,
  802.     SchemaSymbols::fgATT_DEFAULT,
  803.     SchemaSymbols::fgATT_ELEMENTFORMDEFAULT,
  804.     SchemaSymbols::fgATT_FINAL,
  805.     SchemaSymbols::fgATT_FINALDEFAULT,
  806.     SchemaSymbols::fgATT_FIXED,
  807.     SchemaSymbols::fgATT_FORM,
  808.     SchemaSymbols::fgATT_ID,
  809.     SchemaSymbols::fgATT_ITEMTYPE,
  810.     SchemaSymbols::fgATT_MAXOCCURS,
  811.     SchemaSymbols::fgATT_MEMBERTYPES,
  812.     SchemaSymbols::fgATT_MINOCCURS,
  813.     SchemaSymbols::fgATT_MIXED,
  814.     SchemaSymbols::fgATT_NAME,
  815.     SchemaSymbols::fgATT_NAMESPACE,
  816.     SchemaSymbols::fgATT_NILLABLE,
  817.     SchemaSymbols::fgATT_PROCESSCONTENTS,
  818.     SchemaSymbols::fgATT_PUBLIC,
  819.     SchemaSymbols::fgATT_REF,
  820.     SchemaSymbols::fgATT_REFER,
  821.     SchemaSymbols::fgATT_SCHEMALOCATION,
  822.     SchemaSymbols::fgATT_SOURCE,
  823.     SchemaSymbols::fgATT_SUBSTITUTIONGROUP,
  824.     SchemaSymbols::fgATT_SYSTEM,
  825.     SchemaSymbols::fgATT_TARGETNAMESPACE,
  826.     SchemaSymbols::fgATT_TYPE,
  827.     SchemaSymbols::fgATT_USE,
  828.     SchemaSymbols::fgATT_VALUE,
  829.     SchemaSymbols::fgATT_VERSION,
  830.     SchemaSymbols::fgATT_XPATH,
  831. };
  832. XERCES_CPP_NAMESPACE_END
  833. /**
  834.   * End of file GeneralAttributeCheck.cpp
  835.   */