diff --git a/src/xercesc/framework/psvi/PSVIAttribute.cpp b/src/xercesc/framework/psvi/PSVIAttribute.cpp
index 544f51fd8f021a7b3a508d3f1e981f3ac6d78c43..51fd3b58af31d044955ae43d9b13a4b1a3656191 100644
--- a/src/xercesc/framework/psvi/PSVIAttribute.cpp
+++ b/src/xercesc/framework/psvi/PSVIAttribute.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2003/11/28 20:20:54  neilg
+ * make use of canonical representation in PSVIAttribute implementation
+ *
  * Revision 1.3  2003/11/27 06:10:32  neilg
  * PSVIAttribute implementation
  *
@@ -86,8 +89,8 @@ void PSVIAttribute::reset(
             , XSSimpleTypeDefinition *  memberType
             , const XMLCh * const       defaultValue
             , const bool                isSpecified
-            , const XMLCh * const       canonicalValue
             , XSAttributeDeclaration *  attrDecl
+            , DatatypeValidator *dv
         )
 {
     fValidationContext = valContext;
@@ -98,7 +101,11 @@ void PSVIAttribute::reset(
     fMemberType = memberType;
     fDefaultValue = defaultValue;
     fIsSpecified = isSpecified;
-    fCanonicalValue = canonicalValue;
+    fMemoryManager->deallocate((void *)fCanonicalValue);
+    if(normalizedValue && dv)
+        fCanonicalValue = dv->getCanonicalRepresentation(normalizedValue, fMemoryManager);
+    else
+        fCanonicalValue = 0;
     fAttributeDecl = attrDecl;
 }
 
diff --git a/src/xercesc/framework/psvi/PSVIAttribute.hpp b/src/xercesc/framework/psvi/PSVIAttribute.hpp
index dd1d32bd029e52c06d70df75c4476c348599cc9a..10765146dd36ddf1c86e755d115e1c38161f7f19 100644
--- a/src/xercesc/framework/psvi/PSVIAttribute.hpp
+++ b/src/xercesc/framework/psvi/PSVIAttribute.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/11/28 20:20:54  neilg
+ * make use of canonical representation in PSVIAttribute implementation
+ *
  * Revision 1.4  2003/11/27 06:10:32  neilg
  * PSVIAttribute implementation
  *
@@ -75,6 +78,7 @@
 
 #include <xercesc/framework/psvi/PSVIItem.hpp>
 #include <xercesc/framework/psvi/XSSimpleTypeDefinition.hpp>
+#include <xercesc/validators/datatype/DatatypeValidator.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -162,8 +166,8 @@ public:
             , XSSimpleTypeDefinition *  memberType
             , const XMLCh * const       defaultValue
             , const bool                isSpecified
-            , const XMLCh * const       canonicalValue
             , XSAttributeDeclaration *  attrDecl
+            , DatatypeValidator *       dv
         );
 
     /**
@@ -190,7 +194,10 @@ private:
     //      attribute declaration component that validated this attribute 
     XSAttributeDeclaration *    fAttributeDecl;
 };
-inline PSVIAttribute::~PSVIAttribute() {}
+inline PSVIAttribute::~PSVIAttribute() 
+{
+    fMemoryManager->deallocate((void *)fCanonicalValue);
+}
 
 inline XSAttributeDeclaration *PSVIAttribute::getAttributeDeclaration() 
 {
diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index ae8d67e781a5df3e758e14757b93ad79429d21be..adfe6fdf8cf6b0022ae5af673e05baa3790406de 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -580,7 +580,8 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                actualAttDef = (SchemaAttDef *)attDefForWildCard;
 	            XSAttributeDeclaration *attrDecl = (XSAttributeDeclaration *)fModel->getXSObject(actualAttDef);
 	            PSVIAttribute *toFill = fPSVIAttrList->getPSVIAttributeToFill(); 
-	            XSSimpleTypeDefinition *validatingType = (XSSimpleTypeDefinition *)fModel->getXSObject(actualAttDef->getDatatypeValidator());
+                DatatypeValidator * attrDataType = actualAttDef->getDatatypeValidator();
+	            XSSimpleTypeDefinition *validatingType = (XSSimpleTypeDefinition *)fModel->getXSObject(attrDataType);
 	            if(attrValid != PSVIItem::VALIDITY_VALID)
 	            {
 	                toFill->reset(
@@ -592,8 +593,8 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                    , 0
 	                    , actualAttDef->getValue()
 	                    , false
-	                    , 0
 	                    , attrDecl
+                        , 0
 	                );
 	            }
 	            else
@@ -610,8 +611,8 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                    , memberType
 	                    , actualAttDef->getValue()
 	                    , false
-	                    , 0
 	                    , attrDecl
+                        , (memberType)?attrValidator:attrDataType
 	                );
 	            }
 	        }
@@ -646,7 +647,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                , 0
                     , false
 	                , 0
-	                , 0
+                    , attrValidator
                 );
             }
         }
@@ -821,8 +822,9 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                     {
                         PSVIAttribute *defAttrToFill = fPSVIAttrList->getPSVIAttributeToFill();
                         XSAttributeDeclaration *defAttrDecl = (XSAttributeDeclaration *)fModel->getXSObject((void *)curDef);
+                        DatatypeValidator * attrDataType = ((SchemaAttDef *)curDef)->getDatatypeValidator();
                         XSSimpleTypeDefinition *defAttrType = 
-                            (XSSimpleTypeDefinition*)fModel->getXSObject(((SchemaAttDef *)curDef)->getDatatypeValidator());
+                            (XSSimpleTypeDefinition*)fModel->getXSObject(attrDataType);
                         // would have occurred during validation of default value
                         if(((SchemaValidator *)fValidator)->getErrorOccurred())
                         {
@@ -835,8 +837,8 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                                 , 0
                                 , curDef->getValue()
                                 , true 
-                                , 0
                                 , defAttrDecl
+                                , 0
                             );
                         }
                         else
@@ -858,8 +860,8 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                                 , defAttrMemberType
                                 , curDef->getValue()
                                 , true
-                                , 0
                                 , defAttrDecl
+                                , (defAttrMemberType)?((SchemaValidator *)fValidator)->getMostRecentAttrValidator():attrDataType
                             );
                         }
                     }
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index b57bc78636c888627c938038eaadcd3754ad8792..0ce25c927a3bda43aad9c92408d999b3305d9c83 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -2586,7 +2586,8 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                actualAttDef = (SchemaAttDef *)attDefForWildCard;
 	            XSAttributeDeclaration *attrDecl = (XSAttributeDeclaration *)fModel->getXSObject(actualAttDef);
 	            PSVIAttribute *toFill = fPSVIAttrList->getPSVIAttributeToFill(); 
-	            XSSimpleTypeDefinition *validatingType = (XSSimpleTypeDefinition *)fModel->getXSObject(actualAttDef->getDatatypeValidator());
+                DatatypeValidator * attrDataType = actualAttDef->getDatatypeValidator();
+	            XSSimpleTypeDefinition *validatingType = (XSSimpleTypeDefinition *)fModel->getXSObject(attrDataType);
 	            if(attrValid != PSVIItem::VALIDITY_VALID)
 	            {
 	                toFill->reset(
@@ -2598,8 +2599,8 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                    , 0
 	                    , actualAttDef->getValue()
 	                    , false
-	                    , 0
 	                    , attrDecl
+                        , 0
 	                );
 	            }
 	            else
@@ -2616,8 +2617,8 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                    , memberType
 	                    , actualAttDef->getValue()
 	                    , false
-	                    , 0
 	                    , attrDecl
+                        , (memberType)?attrValidator:attrDataType
 	                );
 	            }
 	        }
@@ -2637,7 +2638,7 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                 attrValidator = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYURI);
             if(getPSVIHandler())
             {
-	            PSVIAttribute *toFill = fPSVIAttrList->getPSVIAttributeToFill(); 
+                PSVIAttribute *toFill = fPSVIAttrList->getPSVIAttributeToFill();
 	            XSSimpleTypeDefinition *validatingType = (attrValidator)
                             ? (XSSimpleTypeDefinition *)fModel->getXSObject(attrValidator)
                             : 0;
@@ -2652,7 +2653,7 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
 	                , 0
                     , false
 	                , 0
-	                , 0
+                    , attrValidator
                 );
             }
         }
@@ -2789,8 +2790,9 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                     {
                         PSVIAttribute *defAttrToFill = fPSVIAttrList->getPSVIAttributeToFill();
                         XSAttributeDeclaration *defAttrDecl = (XSAttributeDeclaration *)fModel->getXSObject((void *)curDef);
+                        DatatypeValidator * attrDataType = ((SchemaAttDef *)curDef)->getDatatypeValidator();
                         XSSimpleTypeDefinition *defAttrType = 
-                            (XSSimpleTypeDefinition*)fModel->getXSObject(((SchemaAttDef *)curDef)->getDatatypeValidator());
+                            (XSSimpleTypeDefinition*)fModel->getXSObject(attrDataType);
                         // would have occurred during validation of default value
                         if(((SchemaValidator *)fValidator)->getErrorOccurred())
                         {
@@ -2803,8 +2805,8 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                                 , 0
                                 , curDef->getValue()
                                 , true 
-                                , 0
                                 , defAttrDecl
+                                , 0
                             );
                         }
                         else
@@ -2826,8 +2828,8 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                                 , defAttrMemberType
                                 , curDef->getValue()
                                 , true
-                                , 0
                                 , defAttrDecl
+                                , (defAttrMemberType)?((SchemaValidator *)fValidator)->getMostRecentAttrValidator():attrDataType
                             );
                         }
                     }