You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2002/02/07 17:41:29 UTC
cvs commit: xml-xerces/c/src/xercesc/validators/schema SchemaValidator.cpp
knoaman 02/02/07 08:41:29
Modified: c/src/xercesc/validators/schema SchemaValidator.cpp
Log:
Fix for xsi:type.
Revision Changes Path
1.2 +35 -2 xml-xerces/c/src/xercesc/validators/schema/SchemaValidator.cpp
Index: SchemaValidator.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaValidator.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SchemaValidator.cpp 1 Feb 2002 22:22:47 -0000 1.1
+++ SchemaValidator.cpp 7 Feb 2002 16:41:29 -0000 1.2
@@ -56,8 +56,11 @@
/*
* $Log: SchemaValidator.cpp,v $
- * Revision 1.1 2002/02/01 22:22:47 peiyongz
- * Initial revision
+ * Revision 1.2 2002/02/07 16:41:29 knoaman
+ * Fix for xsi:type.
+ *
+ * Revision 1.1.1.1 2002/02/01 22:22:47 peiyongz
+ * sane_include
*
* Revision 1.26 2001/11/21 18:05:09 tng
* Schema Fix: Check both XMLAttDef::Fixed and XMLAttDef::Required_And_Fixed for default values.
@@ -484,8 +487,38 @@
const XMLCh* uriStr = getScanner()->getURIText(uri);
SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(uriStr);
- if (!sGrammar || sGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
- // Grammar not found
+ if (!sGrammar) {
+
+ // Check built-in simple types
+ if (!XMLString::compareString(uriStr, SchemaSymbols::fgURI_SCHEMAFORSCHEMA)) {
+
+ fXsiTypeValidator = fGrammarResolver->getDatatypeRegistry()->getDatatypeValidator(localPart);
+
+ if (!fXsiTypeValidator)
+ emitError(XMLValid::BadXsiType, fXsiType->getRawName());
+ else {
+ DatatypeValidator* ancestorValidator = ((SchemaElementDecl*)elemDef)->getDatatypeValidator();
+ if (ancestorValidator && !ancestorValidator->isSubstitutableBy(fXsiTypeValidator)) {
+ // the type is not derived from ancestor
+ emitError(XMLValid::NonDerivedXsiType, fXsiType->getRawName(), elemDef->getFullName());
+ }
+ else {
+ // the type is derived from ancestor
+ if (((SchemaElementDecl*)elemDef)->getBlockSet() == SchemaSymbols::RESTRICTION)
+ emitError(XMLValid::NoSubforBlock, fXsiType->getRawName(), elemDef->getFullName());
+ if (elemDef->hasAttDefs()) {
+ // if we have an attribute but xsi:type's type is simple, we have a problem...
+ emitError(XMLValid::NonDerivedXsiType, fXsiType->getRawName(), elemDef->getFullName());
+ }
+ }
+ }
+ }
+ else {
+ // Grammar not found
+ emitError(XMLValid::GrammarNotFound, uriStr);
+ }
+ }
+ else if (sGrammar->getGrammarType() != Grammar::SchemaGrammarType) {
emitError(XMLValid::GrammarNotFound, uriStr);
}
else {
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org