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