From ddebdfb3ff9fe5f2e2a9e977d09126efef39aadf Mon Sep 17 00:00:00 2001
From: Khaled Noaman <knoaman@apache.org>
Date: Thu, 7 Feb 2002 16:41:29 +0000
Subject: [PATCH] Fix for xsi:type.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173489 13f79535-47bb-0310-9956-ffa450edef68
---
 .../validators/schema/SchemaValidator.cpp     | 41 +++++++++++++++++--
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index 090fad9db..130ff7f9a 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -56,8 +56,11 @@
 
 /*
  * $Log$
- * 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 @@ void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
             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 {
-- 
GitLab