diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 4deaebb18cbc30e3090f75216aac56db66f4f9f4..4b77d8d9c801b1b8de7681b33a46446c80b47a0a 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -2426,6 +2426,18 @@ void TraverseSchema::traverseAttributeDecl(const DOMElement* const elem, if (attType == XMLAttDef::Simple && dv && valueToCheck) { + short wsFacet = dv->getWSFacet(); + if((wsFacet == DatatypeValidator::REPLACE && !XMLString::isWSReplaced(valueToCheck)) || + (wsFacet == DatatypeValidator::COLLAPSE && !XMLString::isWSCollapsed(valueToCheck))) + { + XMLCh* normalizedValue=XMLString::replicate(valueToCheck, fMemoryManager); + ArrayJanitor<XMLCh> tempURIName(normalizedValue, fMemoryManager); + if(wsFacet == DatatypeValidator::REPLACE) + XMLString::replaceWS(normalizedValue, fMemoryManager); + else if(wsFacet == DatatypeValidator::COLLAPSE) + XMLString::collapseWS(normalizedValue, fMemoryManager); + valueToCheck=fStringPool->getValueForId(fStringPool->addOrFind(normalizedValue)); + } try { dv->validate(valueToCheck , fSchemaGrammar->getValidationContext() @@ -2442,6 +2454,14 @@ void TraverseSchema::traverseAttributeDecl(const DOMElement* const elem, reportSchemaError(elem, XMLUni::fgValidityDomain, XMLValid::DatatypeValidationFailure, valueToCheck); } } + else if((attType == XMLAttDef::NmTokens || attType==XMLAttDef::IDRefs || attType==XMLAttDef::Entities) && + valueToCheck && !XMLString::isWSCollapsed(valueToCheck)) + { + XMLCh* normalizedValue=XMLString::replicate(valueToCheck, fMemoryManager); + ArrayJanitor<XMLCh> tempURIName(normalizedValue, fMemoryManager); + XMLString::collapseWS(normalizedValue, fMemoryManager); + valueToCheck=fStringPool->getValueForId(fStringPool->addOrFind(normalizedValue)); + } if (ofTypeID && valueToCheck) { reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::AttDeclPropCorrect3,