diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index ba2b21d9002dba14f3f9e355b0f5921f21b08dad..9d441eb96431ab2b4c83e07f0c13bfc8ce0ac368 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -384,11 +384,13 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 
                 // Save the type for later use
                 attType = attDefForWildCard->getType();
-
-
-                if(fGrammarType == Grammar::SchemaGrammarType)
+                if(fGrammarType == Grammar::SchemaGrammarType) {
                     ((SchemaElementDecl *)(elemDecl))->updateValidityFromAttribute((SchemaAttDef *)attDef);
 
+                    DatatypeValidator* tempDV = ((SchemaAttDef*) attDefForWildCard)->getDatatypeValidator();
+                    if(tempDV && tempDV->getType() == DatatypeValidator::Union)
+                        ((SchemaAttDef*)attDef)->setMembertypeValidator(((UnionDatatypeValidator *)tempDV)->getMemberTypeValidator());
+                }
             }
             else {
                 normalizeAttValue
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index 741c96584f518f9e25c4e4257828f765445e2f83..be64e03e6b89d87eabc1e89024332d13fc5a852f 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -2190,12 +2190,14 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                         , elemDecl
                     );
                 }
-
                 // Save the type for later use
                 attType = attDefForWildCard->getType();
 
                 ((SchemaElementDecl *)(elemDecl))->updateValidityFromAttribute((SchemaAttDef *)attDef);
 
+                DatatypeValidator* tempDV = ((SchemaAttDef*) attDefForWildCard)->getDatatypeValidator();
+                if(tempDV && tempDV->getType() == DatatypeValidator::Union)
+                    ((SchemaAttDef*)attDef)->setMembertypeValidator(((UnionDatatypeValidator *)tempDV)->getMemberTypeValidator());
             }
             else {
                 normalizeAttValue
diff --git a/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp b/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp
index 6e046d8cf65ac8a70f37a44d0540a4c9ab2e9dfe..aab7c162f89c0220f6b6b729e6ebb70d9a13dbf2 100644
--- a/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp
+++ b/src/xercesc/validators/datatype/UnionDatatypeValidator.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.8  2003/02/06 13:51:55  gareth
+ * fixed bug with multiple attributes being validated by the same union type.
+ *
  * Revision 1.7  2003/01/29 19:53:35  gareth
  * we now store information about which validator was used to validate.
  *
@@ -310,7 +313,7 @@ void UnionDatatypeValidator::checkContent(const XMLCh* const content, bool asBas
                 fMemberTypeValidators->elementAt(i)->validate(content);
                 memTypeValid = true;
                 
-                //set the name of the type actually used to validate the content
+                //set the validator of the type actually used to validate the content
                 DatatypeValidator *dtv = fMemberTypeValidators->elementAt(i);
                 fValidatedDatatype = dtv;
             }
diff --git a/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp b/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp
index 360221068205cf96d8956cfc394fc102e7b39a34..27154a110b42cf4b99443974bf2f379dc260902e 100644
--- a/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/UnionDatatypeValidator.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.8  2003/02/06 13:51:55  gareth
+ * fixed bug with multiple attributes being validated by the same union type.
+ *
  * Revision 1.7  2003/01/29 19:55:19  gareth
  * updated to deal with null pointer issue with fValidatedDatatype.
  *
@@ -241,6 +244,13 @@ public:
      */
     bool getMemberTypeAnonymous() const;
 
+
+    /**
+     * Returns the member DatatypeValidator used to validate the content the last time validate 
+     * was called
+     */
+    const DatatypeValidator* getMemberTypeValidator() const;
+
     /**
      * Called inbetween uses of this validator to reset PSVI information
      */
@@ -398,6 +408,10 @@ inline bool UnionDatatypeValidator::getMemberTypeAnonymous() const {
     return 0;
 }
 
+inline const DatatypeValidator* UnionDatatypeValidator::getMemberTypeValidator() const {
+    return fValidatedDatatype;
+}
+
 inline void UnionDatatypeValidator::reset() {
     fValidatedDatatype = 0;
 }
diff --git a/src/xercesc/validators/schema/SchemaAttDef.cpp b/src/xercesc/validators/schema/SchemaAttDef.cpp
index b4a95c7fc897ba401e52c43e746c6a200bcf6e8c..81e7ec39a3ab951e6419c36a9f44a7c0dd399751 100644
--- a/src/xercesc/validators/schema/SchemaAttDef.cpp
+++ b/src/xercesc/validators/schema/SchemaAttDef.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/02/06 13:51:55  gareth
+ * fixed bug with multiple attributes being validated by the same union type.
+ *
  * Revision 1.3  2003/01/29 19:47:16  gareth
  * added DOMTypeInfo and some PSVI methods
  *
@@ -104,6 +107,7 @@ SchemaAttDef::SchemaAttDef() :
     , fAttName(0)
     , fDatatypeValidator(0)
     , fAnyDatatypeValidator(0)
+    , fMemberTypeValidator(0)
     , fNamespaceList(0)
     , fValidity(PSVIDefs::UNKNOWN)
     , fValidation(PSVIDefs::NONE)
@@ -118,6 +122,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const                     prefix
     XMLAttDef(type, defType)
     , fElemId(XMLElementDecl::fgInvalidElemId)
     , fDatatypeValidator(0)
+    , fMemberTypeValidator(0)
     , fAnyDatatypeValidator(0)
     , fNamespaceList(0)
     , fValidity(PSVIDefs::UNKNOWN)
@@ -138,6 +143,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const                     prefix
     , fElemId(XMLElementDecl::fgInvalidElemId)
     , fDatatypeValidator(0)
     , fAnyDatatypeValidator(0)
+    , fMemberTypeValidator(0)
     , fNamespaceList(0)
     , fValidity(PSVIDefs::UNKNOWN)
     , fValidation(PSVIDefs::NONE)
@@ -153,6 +159,7 @@ SchemaAttDef::SchemaAttDef(const SchemaAttDef* other) :
     , fAttName(0)
     , fDatatypeValidator(other->fDatatypeValidator)
     , fAnyDatatypeValidator(other->fAnyDatatypeValidator)
+    , fMemberTypeValidator(other->fMemberTypeValidator)
     , fNamespaceList(0)
     , fValidity(other->fValidity)
     , fValidation(other->fValidation)
diff --git a/src/xercesc/validators/schema/SchemaAttDef.hpp b/src/xercesc/validators/schema/SchemaAttDef.hpp
index ca3bd450eb5bfa5ecf515f830c52d2ff83c6c3f9..c1de9d104db7537c36017b6acef55c397d9b9aac 100644
--- a/src/xercesc/validators/schema/SchemaAttDef.hpp
+++ b/src/xercesc/validators/schema/SchemaAttDef.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/02/06 13:51:55  gareth
+ * fixed bug with multiple attributes being validated by the same union type.
+ *
  * Revision 1.3  2003/01/29 19:47:16  gareth
  * added DOMTypeInfo and some PSVI methods
  *
@@ -93,7 +96,6 @@
 #include <xercesc/validators/datatype/DatatypeValidator.hpp>
 #include <xercesc/validators/datatype/UnionDatatypeValidator.hpp>
 #include <xercesc/validators/schema/PSVIDefs.hpp>
-
 XERCES_CPP_NAMESPACE_BEGIN
 
 class DatatypeValidator;
@@ -236,6 +238,7 @@ public :
     );
     void setDatatypeValidator(DatatypeValidator* newDatatypeValidator);
     void setAnyDatatypeValidator(DatatypeValidator* newDatatypeValidator);
+    void setMembertypeValidator(const DatatypeValidator* newDatatypeValidator);
     void setNamespaceList(const ValueVectorOf<unsigned int>* const toSet);
     void resetNamespaceList();
     void setValidity(PSVIDefs::Validity valid);
@@ -257,9 +260,13 @@ private :
     //  fDatatypeValidator
     //      The DatatypeValidator used to validate this attribute type.
     //
-    // fAnyDatatypeValidator
+    //  fAnyDatatypeValidator
     //      Tempory storage for the DatatypeValidator used to validate an any
     //
+    //  fMemberTypeValidator
+    //      Tempory storage used when the validator being used is of union type.
+    //      This stores the actual member validator used to validate.
+    //
     //  fNamespaceList
     //      The list of namespace values for a wildcard attribute
     //
@@ -274,6 +281,7 @@ private :
     QName*                       fAttName;
     DatatypeValidator*           fDatatypeValidator;
     DatatypeValidator*           fAnyDatatypeValidator;
+    const DatatypeValidator*     fMemberTypeValidator;
     ValueVectorOf<unsigned int>* fNamespaceList;
     PSVIDefs::Validity           fValidity;
     PSVIDefs::Validation         fValidation;
@@ -341,18 +349,14 @@ inline const XMLCh* SchemaAttDef::getTypeUri() const {
 
 
 inline const XMLCh* SchemaAttDef::getMemberTypeName() const {
-    if(fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union)
-        return ((UnionDatatypeValidator*)fAnyDatatypeValidator)->getMemberTypeName();
-    else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
-        return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeName();
+    if(fMemberTypeValidator) 
+        return fMemberTypeValidator->getTypeLocalName();
     return 0;
 }
 
 inline const XMLCh* SchemaAttDef::getMemberTypeUri() const {
-    if(fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union)
-        return ((UnionDatatypeValidator*)fAnyDatatypeValidator)->getMemberTypeUri();
-    else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
-        return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeUri();
+    if(fMemberTypeValidator) 
+        return fMemberTypeValidator->getTypeUri();
     return 0;
 }
 
@@ -369,11 +373,9 @@ inline const XMLCh* SchemaAttDef::getDOMTypeInfoName() const {
         return SchemaSymbols::fgDT_ANYSIMPLETYPE;
     if(getTypeAnonymous() || getMemberTypeAnonymous())
         return 0;
-
-    if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union ||
-       fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union) {
+    if(fMemberTypeValidator)
         return getMemberTypeName();
-    }
+
     return getTypeName();
 }
 
@@ -382,8 +384,7 @@ inline const XMLCh* SchemaAttDef::getDOMTypeInfoUri() const {
         return SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
     if(getTypeAnonymous() || getMemberTypeAnonymous())
         return 0;
-    if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union ||
-       fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union)
+    if(fMemberTypeValidator)
         return getMemberTypeUri();
     return getTypeUri();
 }
@@ -398,10 +399,9 @@ inline bool SchemaAttDef::getTypeAnonymous() const {
 }
 
 inline bool SchemaAttDef::getMemberTypeAnonymous() const {
-    if(fAnyDatatypeValidator && fAnyDatatypeValidator->getType() == DatatypeValidator::Union)
-        return ((UnionDatatypeValidator*)fAnyDatatypeValidator)->getMemberTypeAnonymous();
-    else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
-        return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeAnonymous();
+    if(fMemberTypeValidator) 
+        return fMemberTypeValidator->getAnonymous();
+
     return false;
 }
 
@@ -436,6 +436,11 @@ inline void SchemaAttDef::setAnyDatatypeValidator(DatatypeValidator* newDatatype
     fAnyDatatypeValidator = newDatatypeValidator;
 }
 
+inline void SchemaAttDef::setMembertypeValidator(const DatatypeValidator* newDatatypeValidator)
+{
+    fMemberTypeValidator = newDatatypeValidator;
+}
+
 inline void SchemaAttDef::resetNamespaceList() {
 
     if (fNamespaceList && fNamespaceList->size()) {
@@ -464,8 +469,8 @@ inline void SchemaAttDef::reset() {
         ((UnionDatatypeValidator *)fAnyDatatypeValidator)->reset();
     else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
         ((UnionDatatypeValidator *)fDatatypeValidator)->reset();
-
     fAnyDatatypeValidator = 0;
+    fMemberTypeValidator = 0;
     fValidity = PSVIDefs::UNKNOWN;
     fValidation = PSVIDefs::NONE;    
 }
diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index 4fd55f8778929d433a0b113f2d49bf65194037c5..7883ceb43f483ed744c529279b3dcdd12a416bf6 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.28  2003/02/06 13:51:55  gareth
+ * fixed bug with multiple attributes being validated by the same union type.
+ *
  * Revision 1.27  2003/01/29 20:01:20  gareth
  * We now detect when elements/attributes are validated and the result of the validation is stored.
  *
@@ -731,16 +734,17 @@ void SchemaValidator::validateAttrValue (const XMLAttDef*      attDef
         catch (...) {
             emitError(XMLValid::GenericError);
             ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
-            ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
+            ((SchemaAttDef *)attDef)->setValidity(PSVIDefs::INVALID);
             throw;
         }
     }
 
     if(!valid) {
         ((SchemaElementDecl *)(elemDecl))->setValidity(PSVIDefs::INVALID);
-        ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
+        ((SchemaAttDef *)attDef)->setValidity(PSVIDefs::INVALID);
     }
-    
+    else if(attDefDV && attDefDV->getType() == DatatypeValidator::Union) 
+        ((SchemaAttDef *)attDef)->setMembertypeValidator(((UnionDatatypeValidator *)attDefDV)->getMemberTypeValidator());
     fTrailing = false;