From d70b056de9141824ebae85e74e9da5f8be6accf9 Mon Sep 17 00:00:00 2001 From: Alberto Massari <amassari@apache.org> Date: Wed, 23 Aug 2006 21:13:31 +0000 Subject: [PATCH] Default or fixed attribute values should be whitespace normalized, if the datatype requires it, before being validated git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@434184 13f79535-47bb-0310-9956-ffa450edef68 --- .../validators/schema/TraverseSchema.cpp | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 4deaebb18..4b77d8d9c 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, -- GitLab