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