You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2006/09/26 02:48:38 UTC

svn commit: r449875 - /xerces/c/trunk/src/xercesc/validators/schema/SchemaValidator.cpp

Author: amassari
Date: Mon Sep 25 17:48:38 2006
New Revision: 449875

URL: http://svn.apache.org/viewvc?view=rev&rev=449875
Log:
When checking for a valid restriction, take into account substitution groups (jira#1281)

Modified:
    xerces/c/trunk/src/xercesc/validators/schema/SchemaValidator.cpp

Modified: xerces/c/trunk/src/xercesc/validators/schema/SchemaValidator.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/validators/schema/SchemaValidator.cpp?view=diff&rev=449875&r1=449874&r2=449875
==============================================================================
--- xerces/c/trunk/src/xercesc/validators/schema/SchemaValidator.cpp (original)
+++ xerces/c/trunk/src/xercesc/validators/schema/SchemaValidator.cpp Mon Sep 25 17:48:38 2006
@@ -1421,20 +1421,6 @@
     const XMLCh* derivedName = derivedSpecNode->getElement()->getLocalPart();
     const XMLCh* baseName = baseSpecNode->getElement()->getLocalPart();
 
-    if (!XMLString::equals(derivedName, baseName) || derivedURI != baseURI) {
-        ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_NameTypeOK1, fMemoryManager);
-    }
-
-	// case of mixed complex types with attributes only
-    if (derivedURI == XMLElementDecl::fgPCDataElemId) {
-        return;
-    }
-
-    if (!isOccurrenceRangeOK(derivedSpecNode->getMinOccurs(), derivedSpecNode->getMaxOccurs(),
-                             baseSpecNode->getMinOccurs(), baseSpecNode->getMaxOccurs())) {
-        ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::PD_OccurRangeE, derivedName, fMemoryManager);
-    }
-
     SchemaGrammar* aGrammar = currentGrammar;
     const XMLCh* schemaURI = fGrammarResolver->getStringPool()->getValueForId(derivedURI);
 
@@ -1452,6 +1438,36 @@
         return;
     }
 
+    bool subsGroup = false;
+
+    if (!XMLString::equals(derivedName, baseName) || derivedURI != baseURI) {
+        // Check if derived is substitutable for base.
+        //
+        SchemaElementDecl* e = derivedElemDecl->getSubstitutionGroupElem ();
+
+        for (; e != 0; e = e->getSubstitutionGroupElem ()) {
+            if (XMLString::equals(e->getBaseName (), baseName) && e->getURI () == baseURI) {
+                break;
+            }
+        }
+
+        if (e == 0) {
+            ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::PD_NameTypeOK1, fMemoryManager);
+        }
+
+        subsGroup = true;
+    }
+
+    // case of mixed complex types with attributes only
+    if (derivedURI == XMLElementDecl::fgPCDataElemId) {
+        return;
+    }
+
+    if (!isOccurrenceRangeOK(derivedSpecNode->getMinOccurs(), derivedSpecNode->getMaxOccurs(),
+                             baseSpecNode->getMinOccurs(), baseSpecNode->getMaxOccurs())) {
+        ThrowXMLwithMemMgr1(RuntimeException, XMLExcepts::PD_OccurRangeE, derivedName, fMemoryManager);
+    }
+
     SchemaElementDecl* baseElemDecl =
         findElement(baseScope, baseURI, baseName, aGrammar, baseInfo);
 
@@ -1487,7 +1503,8 @@
     checkICRestriction(derivedElemDecl, baseElemDecl, derivedName, baseName);
 
     // check that the derived element's type is derived from the base's.
-    checkTypesOK(derivedElemDecl, baseElemDecl, derivedName);
+    if (!subsGroup)
+        checkTypesOK(derivedElemDecl, baseElemDecl, derivedName);
 }
 
 SchemaElementDecl*



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org