diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index 694c482ae066152bd791be5f3fcc2984e2089b24..7d2133156923c55fafe4606552a53aac1d08ddf6 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -271,6 +271,8 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (fValidate && attrValidator && ValueValidate) { + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(attrValidator, normBuf.getRawBuffer(), normBuf, true); + ValidationContext* const theContext = getValidationContext(); @@ -548,7 +550,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate) { @@ -590,7 +592,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate && !skipThisOne) { normBuf.set(xsNormalized); @@ -1716,13 +1718,24 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString); - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { - fXsiType.set(valuePtr); - } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL) - && fValidator && fValidator->handlesSchema() - && XMLString::equals(valuePtr, SchemaSymbols::fgATTVAL_TRUE)) { + if( fValidator && fValidator->handlesSchema() ) + { + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) + { + // normalize the attribute according to schema whitespace facet + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); + } + else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) + { + // normalize the attribute according to schema whitespace facet + XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) ((SchemaValidator*)fValidator)->setNillable(true); + fBufMgr.releaseBuffer(fXsiNil); + } } } } diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index 0b7070fc40ad12101c5236af3c1309df27959fcf..4155466de1c42f19b42dbc735633fb042ded8520 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -2308,6 +2308,8 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (fValidate && attrValidator && ValueValidate) { + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(attrValidator, normBuf.getRawBuffer(), normBuf, true); + ValidationContext* const theContext = getValidationContext(); @@ -2551,7 +2553,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate) { normBuf.set(xsNormalized); @@ -2592,7 +2594,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs if (tempDV && tempDV->getWSFacet() != DatatypeValidator::PRESERVE) { // normalize the attribute according to schema whitespace facet - ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf, true); xsNormalized = fWSNormalizeBuf.getRawBuffer(); if (fNormalizeData && fValidate && !skipThisOne) { normBuf.set(xsNormalized); @@ -3602,13 +3604,24 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString); - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { - fXsiType.set(valuePtr); - } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL) - && fValidator && fValidator->handlesSchema() - && XMLString::equals(valuePtr, SchemaSymbols::fgATTVAL_TRUE)) { + if( fValidator && fValidator->handlesSchema() ) + { + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) + { + // normalize the attribute according to schema whitespace facet + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); + } + else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) + { + // normalize the attribute according to schema whitespace facet + XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) ((SchemaValidator*)fValidator)->setNillable(true); + fBufMgr.releaseBuffer(fXsiNil); + } } } } diff --git a/src/xercesc/internal/XSAXMLScanner.cpp b/src/xercesc/internal/XSAXMLScanner.cpp index 95fc54dd431972b3e666d7b95ad593166d0ad5ff..18baf134c1ab11692026297cff817241761b13ec 100644 --- a/src/xercesc/internal/XSAXMLScanner.cpp +++ b/src/xercesc/internal/XSAXMLScanner.cpp @@ -661,12 +661,21 @@ void XSAXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) const XMLCh* valuePtr = curPair->getValue(); const XMLCh* suffPtr = attName.getLocalPart(); - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { - fXsiType.set(valuePtr); + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) + { + // normalize the attribute according to schema whitespace facet + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true); } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL) - && XMLString::equals(valuePtr, SchemaSymbols::fgATTVAL_TRUE)) { - ((SchemaValidator*)fValidator)->setNillable(true); + else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)) + { + // normalize the attribute according to schema whitespace facet + XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer(); + DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN); + ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true); + if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE)) + ((SchemaValidator*)fValidator)->setNillable(true); + fBufMgr.releaseBuffer(fXsiNil); } } } diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp index cf8c7b9bf5c03b5c150511e19ba9c9bd02999bee..755168309a69b4f22508ba783a72f082ebad6190 100644 --- a/src/xercesc/validators/schema/SchemaValidator.cpp +++ b/src/xercesc/validators/schema/SchemaValidator.cpp @@ -962,16 +962,19 @@ void SchemaValidator::postParseValidation() // contiguous sequences of #x20s are collapsed to a single #x20, // and initial and/or final #x20s are deleted. // -void SchemaValidator::normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill) +void SchemaValidator::normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill, bool bStandalone /*= false*/) { - short wsFacet = dV->getWSFacet(); - toFill.reset(); //empty string if (!*value) return; + if(bStandalone) + fTrailing = fSeenNonWhiteSpace = false; + + short wsFacet = dV->getWSFacet(); + // Loop through the chars of the source value and normalize it // according to the whitespace facet XMLCh nextCh; @@ -1028,6 +1031,8 @@ void SchemaValidator::normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* co else fTrailing = false; } + if(bStandalone) + fTrailing = fSeenNonWhiteSpace = false; } diff --git a/src/xercesc/validators/schema/SchemaValidator.hpp b/src/xercesc/validators/schema/SchemaValidator.hpp index af8a2ea4fce64dbb8a9353887fd8c2d228d63fc3..27df0edea965386064fbb926b59046b47655cae2 100644 --- a/src/xercesc/validators/schema/SchemaValidator.hpp +++ b/src/xercesc/validators/schema/SchemaValidator.hpp @@ -109,7 +109,7 @@ public: // ----------------------------------------------------------------------- // Schema Validator methods // ----------------------------------------------------------------------- - void normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill); + void normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill, bool bStandalone = false); // ----------------------------------------------------------------------- // Setter methods