diff --git a/src/xercesc/framework/ValidationContext.hpp b/src/xercesc/framework/ValidationContext.hpp index 856f08c091bf11c2b5b2ec5dd4eb2118bf102545..edb32316a778ab0e60940dc8f07113b1167d93f0 100644 --- a/src/xercesc/framework/ValidationContext.hpp +++ b/src/xercesc/framework/ValidationContext.hpp @@ -33,6 +33,7 @@ class XMLRefInfo; class DTDEntityDecl; class DatatypeValidator; class ElemStack; +class NamespaceScope; class XMLScanner; class XMLPARSER_EXPORT ValidationContext : public XMemory @@ -97,6 +98,7 @@ public : virtual void setElemStack(ElemStack* /* elemStack */) {}; virtual const XMLCh* getURIForPrefix(XMLCh* /*prefix */) { return 0; }; virtual void setScanner(XMLScanner* /* scanner */) { }; + virtual void setNamespaceScope(NamespaceScope* /* nsStack */) { }; //@} diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp index f5cb5dbf93493f03d08696f5c1d0d2569c4a1c3b..9daec7a26f219280691d9dc3918a30700e7358db 100644 --- a/src/xercesc/internal/IGXMLScanner.cpp +++ b/src/xercesc/internal/IGXMLScanner.cpp @@ -1957,7 +1957,7 @@ bool IGXMLScanner::scanStartTag(bool& gotData) { // N.B.: this assumes DTD validation. XMLAttDefList& attDefList = elemDecl->getAttDefList(); - for(unsigned int i=0; i<attDefList.getAttDefCount(); i++) + for(XMLSize_t i=0; i<attDefList.getAttDefCount(); i++) { // Get the current att def, for convenience and its def type const XMLAttDef& curDef = attDefList.getAttDef(i); @@ -2221,7 +2221,7 @@ bool IGXMLScanner::scanStartTagNS(bool& gotData) if (elemDecl) { if (elemDecl->hasAttDefs()) { XMLAttDefList& attDefList = elemDecl->getAttDefList(); - for(unsigned int i=0; i<attDefList.getAttDefCount(); i++) + for(XMLSize_t i=0; i<attDefList.getAttDefCount(); i++) { // Get the current att def, for convenience and its def type const XMLAttDef& curDef = attDefList.getAttDef(i); diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index cf7406490965a472c1fa09b8a8faf18b124f17a2..e3a1fb477d48d31950431da1033361607498e6a8 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -791,7 +791,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs XMLAttDefList &attDefList = getAttDefList(fGrammarType == Grammar::SchemaGrammarType, currType, elemDecl); - for(unsigned int i=0; i<attDefList.getAttDefCount(); i++) + for(XMLSize_t i=0; i<attDefList.getAttDefCount(); i++) { // Get the current att def, for convenience and its def type const XMLAttDef *curDef = &attDefList.getAttDef(i); diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index 33e2d554ec8d4c84e1fde8d1f2d2303630e91b67..95ab0f4f7f821ca5c3efc7bc81df0305bfb81f2e 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -2741,7 +2741,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs XMLAttDefList& attDefList = getAttDefList(currType, elemDecl); - for(unsigned int i=0; i<attDefList.getAttDefCount(); i++) + for(XMLSize_t i=0; i<attDefList.getAttDefCount(); i++) { // Get the current att def, for convenience and its def type XMLAttDef *curDef = &attDefList.getAttDef(i); diff --git a/src/xercesc/internal/ValidationContextImpl.cpp b/src/xercesc/internal/ValidationContextImpl.cpp index c9704e714fe76e70fe7e3e027824cc49111f0e65..11ce5cb65283a2a36746730eb25b84a4b7ba3419 100644 --- a/src/xercesc/internal/ValidationContextImpl.cpp +++ b/src/xercesc/internal/ValidationContextImpl.cpp @@ -27,6 +27,7 @@ #include <xercesc/framework/XMLRefInfo.hpp> #include <xercesc/validators/DTD/DTDEntityDecl.hpp> #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp> +#include <xercesc/validators/schema/NamespaceScope.hpp> #include <xercesc/internal/ElemStack.hpp> #include <xercesc/internal/XMLScanner.hpp> @@ -50,6 +51,7 @@ ValidationContextImpl::ValidationContextImpl(MemoryManager* const manager) ,fValidatingMemberType(0) ,fElemStack(0) ,fScanner(0) +,fNamespaceScope(0) { fIdRefList = new (fMemoryManager) RefHashTableOf<XMLRefInfo>(109, fMemoryManager); } @@ -188,17 +190,23 @@ bool ValidationContextImpl::isPrefixUnknown(XMLCh* prefix) { return true; } else if (!XMLString::equals(prefix, XMLUni::fgXMLString)) { - fElemStack->mapPrefixToURI(prefix, (ElemStack::MapModes) ElemStack::Mode_Element, unknown); + if(fElemStack && !fElemStack->isEmpty()) + fElemStack->mapPrefixToURI(prefix, (ElemStack::MapModes) ElemStack::Mode_Element, unknown); + else if(fNamespaceScope) + unknown = (fNamespaceScope->getNamespaceForPrefix(prefix)==fNamespaceScope->getEmptyNamespaceId()); } return unknown; } const XMLCh* ValidationContextImpl::getURIForPrefix(XMLCh* prefix) { bool unknown = false; - unsigned int uriId = fElemStack->mapPrefixToURI(prefix, (ElemStack::MapModes) ElemStack::Mode_Element, unknown); - if (!unknown) { + unsigned int uriId; + if(fElemStack) + uriId = fElemStack->mapPrefixToURI(prefix, (ElemStack::MapModes) ElemStack::Mode_Element, unknown); + else if(fNamespaceScope) + unknown = ((uriId = fNamespaceScope->getNamespaceForPrefix(prefix))==fNamespaceScope->getEmptyNamespaceId()); + if (!unknown) return fScanner->getURIText(uriId); - } return XMLUni::fgZeroLenString; } diff --git a/src/xercesc/internal/ValidationContextImpl.hpp b/src/xercesc/internal/ValidationContextImpl.hpp index cefd8941d3ccddc1f9891fcfe152fec28d6bf22c..3cdc0d88ec031d36214978069434a0b00bd899c4 100644 --- a/src/xercesc/internal/ValidationContextImpl.hpp +++ b/src/xercesc/internal/ValidationContextImpl.hpp @@ -26,6 +26,7 @@ XERCES_CPP_NAMESPACE_BEGIN class ElemStack; +class NamespaceScope; class XMLPARSER_EXPORT ValidationContextImpl : public ValidationContext { @@ -93,6 +94,7 @@ public : virtual void setElemStack(ElemStack* elemStack); virtual const XMLCh* getURIForPrefix(XMLCh* prefix); virtual void setScanner(XMLScanner* scanner); + virtual void setNamespaceScope(NamespaceScope* nsStack); //@} @@ -126,16 +128,18 @@ private: // will not be accurate unless the type of the most recently-validated // element/attribute is in fact a union datatype. // fElemStack - // Need access to elemstack to look up URI's that are inscope. + // Need access to elemstack to look up URI's that are inscope (while validating an XML). + // fNamespaceScope + // Need access to namespace scope to look up URI's that are inscope (while loading a schema). // ----------------------------------------------------------------------- RefHashTableOf<XMLRefInfo>* fIdRefList; const NameIdPool<DTDEntityDecl>* fEntityDeclPool; bool fToCheckIdRefList; DatatypeValidator * fValidatingMemberType; - ElemStack* fElemStack; - XMLScanner* fScanner; - + ElemStack* fElemStack; + XMLScanner* fScanner; + NamespaceScope* fNamespaceScope; }; @@ -159,6 +163,10 @@ inline void ValidationContextImpl::setScanner(XMLScanner* scanner) { fScanner = scanner; } +inline void ValidationContextImpl::setNamespaceScope(NamespaceScope* nsStack) { + fNamespaceScope = nsStack; +} + XERCES_CPP_NAMESPACE_END #endif diff --git a/src/xercesc/validators/DTD/DTDValidator.cpp b/src/xercesc/validators/DTD/DTDValidator.cpp index 72b19d3cf631bf2dc8402bd40ad12c4763384fd9..7f81b25002c0e113745fe70dee9a98385c670afd 100644 --- a/src/xercesc/validators/DTD/DTDValidator.cpp +++ b/src/xercesc/validators/DTD/DTDValidator.cpp @@ -478,7 +478,7 @@ void DTDValidator::preContentValidation(bool bool seenNOTATION = false; bool elemEmpty = (curElem.getModelType() == DTDElementDecl::Empty); - for(unsigned int i=0; i<attDefList.getAttDefCount(); i++) + for(XMLSize_t i=0; i<attDefList.getAttDefCount(); i++) { const XMLAttDef& curAttDef = attDefList.getAttDef(i); diff --git a/src/xercesc/validators/schema/GeneralAttributeCheck.cpp b/src/xercesc/validators/schema/GeneralAttributeCheck.cpp index 444de5a60b825384214613b2f0049d729ef01252..657526f2ae3ea9e4d297107e1a9ed475ce7d1dbe 100644 --- a/src/xercesc/validators/schema/GeneralAttributeCheck.cpp +++ b/src/xercesc/validators/schema/GeneralAttributeCheck.cpp @@ -152,7 +152,6 @@ void GeneralAttributeCheck::initialize() // --------------------------------------------------------------------------- GeneralAttributeCheck::GeneralAttributeCheck(MemoryManager* const manager) : fMemoryManager(manager) - , fValidationContext(0) , fIDValidator(manager) { } @@ -302,7 +301,7 @@ void GeneralAttributeCheck::validate(const DOMElement* const elem, bool isInvalid = false; DatatypeValidator* dv = 0; - fValidationContext = schema->fSchemaInfo->getValidationContext(); + ValidationContext* fValidationContext = schema->fSchemaInfo->getValidationContext(); switch (dvIndex) { case DV_Form: if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_QUALIFIED) diff --git a/src/xercesc/validators/schema/GeneralAttributeCheck.hpp b/src/xercesc/validators/schema/GeneralAttributeCheck.hpp index 8cfa5e3026854258ffcaff075579968c7f52193b..b98b64a101b1755209378f319f0e20cc12bf10a7 100644 --- a/src/xercesc/validators/schema/GeneralAttributeCheck.hpp +++ b/src/xercesc/validators/schema/GeneralAttributeCheck.hpp @@ -187,12 +187,6 @@ public: // ----------------------------------------------------------------------- unsigned short getFacetId(const XMLCh* const facetName, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); - // ----------------------------------------------------------------------- - // Setter methods - // ----------------------------------------------------------------------- - - inline void setValidationContext(ValidationContext* const); - // ----------------------------------------------------------------------- // Validation methods // ----------------------------------------------------------------------- @@ -236,7 +230,6 @@ private: static unsigned short fgElemAttTable[E_Count][A_Count]; static const XMLCh* fAttNames[A_Count]; MemoryManager* fMemoryManager; - ValidationContext* fValidationContext; IDDatatypeValidator fIDValidator; private: @@ -255,14 +248,6 @@ GeneralAttributeCheck::getFacetId(const XMLCh* const facetName, MemoryManager* c return fFacetsMap->get(facetName, manager); } -// --------------------------------------------------------------------------- -// GeneralAttributeCheck: Setter methods -// --------------------------------------------------------------------------- -inline void GeneralAttributeCheck::setValidationContext(ValidationContext* const newValidationContext) -{ - fValidationContext = newValidationContext; -} - XERCES_CPP_NAMESPACE_END #endif diff --git a/src/xercesc/validators/schema/NamespaceScope.cpp b/src/xercesc/validators/schema/NamespaceScope.cpp index 73197b39891fa8c24dcaa1abd97a028a7c5bc534..0e9703f46b9edf942fecbff85d5266e1b1409529 100644 --- a/src/xercesc/validators/schema/NamespaceScope.cpp +++ b/src/xercesc/validators/schema/NamespaceScope.cpp @@ -67,11 +67,10 @@ NamespaceScope::NamespaceScope(const NamespaceScope* const initialize, MemoryMan reset(initialize->fEmptyNamespaceId); // copy the existing bindings - int startAt = initialize->fStackTop-1; - for (int index = startAt; index >= 0; index--) + for (unsigned int index = initialize->fStackTop; index > 0; index--) { // Get a convenience pointer to the current element - StackElem* curRow = initialize->fStack[index]; + StackElem* curRow = initialize->fStack[index-1]; // If no prefixes mapped at this level, then go the next one if (!curRow->fMapCount) @@ -208,11 +207,10 @@ NamespaceScope::getNamespaceForPrefix(const XMLCh* const prefixToMap) const { // Start at the stack top and work backwards until we come to some // element that mapped this prefix. // - int startAt = fStackTop-1; - for (int index = startAt; index >= 0; index--) + for (unsigned int index = fStackTop; index > 0; index--) { // Get a convenience pointer to the current element - StackElem* curRow = fStack[index]; + StackElem* curRow = fStack[index-1]; // If no prefixes mapped at this level, then go the next one if (!curRow->fMapCount) diff --git a/src/xercesc/validators/schema/NamespaceScope.hpp b/src/xercesc/validators/schema/NamespaceScope.hpp index 13f40de77c8047e6269cab804016d986548b552e..ecd9b5b95e43e1112747ba3240fbd2e31f8fcd2a 100644 --- a/src/xercesc/validators/schema/NamespaceScope.hpp +++ b/src/xercesc/validators/schema/NamespaceScope.hpp @@ -100,6 +100,7 @@ public : // ----------------------------------------------------------------------- bool isEmpty() const; void reset(const unsigned int emptyId); + unsigned int getEmptyNamespaceId() const; private : @@ -152,6 +153,12 @@ inline bool NamespaceScope::isEmpty() const return (fStackTop == 0); } +inline unsigned int NamespaceScope::getEmptyNamespaceId() const +{ + return fEmptyNamespaceId; +} + + XERCES_CPP_NAMESPACE_END #endif diff --git a/src/xercesc/validators/schema/SchemaGrammar.hpp b/src/xercesc/validators/schema/SchemaGrammar.hpp index 190dc2233eeca7d9fd559ebef8e44423b507358f..bce6d2e6607b23b36ac07c66de35fc639a0ae3d6 100644 --- a/src/xercesc/validators/schema/SchemaGrammar.hpp +++ b/src/xercesc/validators/schema/SchemaGrammar.hpp @@ -170,6 +170,7 @@ public: DatatypeValidatorFactory* getDatatypeRegistry(); RefHash2KeysTableOf<ElemVector>* getValidSubstitutionGroups() const; + // @deprecated ValidationContext* getValidationContext() const; // ----------------------------------------------------------------------- @@ -317,6 +318,7 @@ private: RefHashTableOf<XercesGroupInfo>* fGroupInfoRegistry; RefHashTableOf<XercesAttGroupInfo>* fAttGroupInfoRegistry; RefHash2KeysTableOf<ElemVector>* fValidSubstitutionGroups; + // @deprecated ValidationContext* fValidationContext; MemoryManager* fMemoryManager; XMLSchemaDescription* fGramDesc; @@ -376,6 +378,7 @@ SchemaGrammar::getValidSubstitutionGroups() const { return fValidSubstitutionGroups; } +// @deprecated inline ValidationContext* SchemaGrammar::getValidationContext() const { return fValidationContext; diff --git a/src/xercesc/validators/schema/SchemaInfo.cpp b/src/xercesc/validators/schema/SchemaInfo.cpp index 02ee3892a33e9e1c091361cbe8fcdca88f3c8545..d6bddeecde34fcb50f5b1ec9a6a8522e810392e7 100644 --- a/src/xercesc/validators/schema/SchemaInfo.cpp +++ b/src/xercesc/validators/schema/SchemaInfo.cpp @@ -80,6 +80,8 @@ SchemaInfo::SchemaInfo(const unsigned short elemAttrDefaultQualified, fNamespaceScope = new (fMemoryManager) NamespaceScope(currNamespaceScope, fMemoryManager); fCurrentSchemaURL = XMLString::replicate(schemaURL, fMemoryManager); fTargetNSURIString = XMLString::replicate(targetNSURIString, fMemoryManager); + + fValidationContext->setNamespaceScope(fNamespaceScope); } diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp index 918d66a04bca0bc2b5c55b3d2c81225ec63d9d01..7d743ef6b43c31d7e75350f9c34b5fb4cc0f55a5 100644 --- a/src/xercesc/validators/schema/SchemaValidator.cpp +++ b/src/xercesc/validators/schema/SchemaValidator.cpp @@ -810,7 +810,7 @@ void SchemaValidator::preContentValidation(bool, XMLAttDefList& attDefList = curElem.getAttDefList(); bool seenId = false; - for(unsigned int i=0; i<attDefList.getAttDefCount(); i++) + for(XMLSize_t i=0; i<attDefList.getAttDefCount(); i++) { const XMLAttDef& curAttDef = attDefList.getAttDef(i); diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index a756df61df862c445f68b0ffc8cd74b4db9abe4d..e9ecd0b13e30f53303c51849fb494bb58c7eb5e8 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -382,8 +382,6 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot, fTargetNSURI = fURIStringPool->addOrFind(fTargetNSURIString); } - fAttributeCheck.setValidationContext(fSchemaGrammar->getValidationContext()); - SchemaInfo* currInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount, fSchemaInfo?fSchemaInfo->getNamespaceScope():NULL, schemaURL, @@ -2059,7 +2057,7 @@ TraverseSchema::traverseAny(const DOMElement* const elem) { else { try { anyURIDV->validate(tokenElem - , fSchemaGrammar->getValidationContext() + , fSchemaInfo->getValidationContext() , fMemoryManager); } catch(const XMLException& excep) { @@ -2516,7 +2514,7 @@ void TraverseSchema::traverseAttributeDecl(const DOMElement* const elem, } try { dv->validate(valueToCheck - , fSchemaGrammar->getValidationContext() + , fSchemaInfo->getValidationContext() , fMemoryManager); } catch (const XMLException& excep) { @@ -4247,7 +4245,7 @@ SchemaAttDef* TraverseSchema::traverseAnyAttribute(const DOMElement* const elem) try { anyURIDV->validate(token - , fSchemaGrammar->getValidationContext() + , fSchemaInfo->getValidationContext() , fMemoryManager); } catch(const XMLException& excep) { @@ -5147,7 +5145,7 @@ TraverseSchema::findDTValidator(const DOMElement* const elem, const XMLCh* TraverseSchema::resolvePrefixToURI(const DOMElement* const elem, const XMLCh* const prefix) { - int nameSpaceIndex = fSchemaInfo->getNamespaceScope()->getNamespaceForPrefix(prefix); + unsigned int nameSpaceIndex = fSchemaInfo->getNamespaceScope()->getNamespaceForPrefix(prefix); const XMLCh* uriStr = fURIStringPool->getValueForId(nameSpaceIndex); if ((!uriStr || !*uriStr) && (prefix && *prefix)) { @@ -6026,7 +6024,7 @@ void TraverseSchema::processAttributeDeclRef(const DOMElement* const elem, else { try { attDV->validate(valueConstraint - , fSchemaGrammar->getValidationContext() + , fSchemaInfo->getValidationContext() , fMemoryManager); } catch(const XMLException& excep) { @@ -6826,7 +6824,7 @@ void TraverseSchema::processAttributes(const DOMElement* const elem, SchemaAttDefList& baseAttList = (SchemaAttDefList&) baseTypeInfo->getAttDefList(); - for (unsigned int i=0; i<baseAttList.getAttDefCount(); i++) { + for (XMLSize_t i=0; i<baseAttList.getAttDefCount(); i++) { SchemaAttDef& attDef = (SchemaAttDef&) baseAttList.getAttDef(i); QName* attName = attDef.getAttName(); @@ -6962,7 +6960,6 @@ void TraverseSchema::restoreSchemaInfo(SchemaInfo* const toRestore, fAttributeDeclRegistry = fSchemaGrammar->getAttributeDeclRegistry(); fComplexTypeRegistry = fSchemaGrammar->getComplexTypeRegistry(); fValidSubstitutionGroups = fSchemaGrammar->getValidSubstitutionGroups(); - fAttributeCheck.setValidationContext(fSchemaGrammar->getValidationContext()); } @@ -7892,7 +7889,7 @@ void TraverseSchema::checkAttDerivationOK(const DOMElement* const elem, SchemaAttDefList& childAttList = (SchemaAttDefList&) childTypeInfo->getAttDefList(); const SchemaAttDef* baseAttWildCard = baseTypeInfo->getAttWildCard(); - for (unsigned int i=0; i<childAttList.getAttDefCount(); i++) { + for (XMLSize_t i=0; i<childAttList.getAttDefCount(); i++) { SchemaAttDef& childAttDef = (SchemaAttDef&) childAttList.getAttDef(i); QName* childAttName = childAttDef.getAttName(); diff --git a/src/xercesc/validators/schema/XSDDOMParser.cpp b/src/xercesc/validators/schema/XSDDOMParser.cpp index 08efc1cdacfaadd20393b2aa7205e2b3ec3700bc..71c0d8623795bb1dd7e29e8e6908c6abe4cf467a 100644 --- a/src/xercesc/validators/schema/XSDDOMParser.cpp +++ b/src/xercesc/validators/schema/XSDDOMParser.cpp @@ -276,7 +276,7 @@ void XSDDOMParser::startElement( const XMLElementDecl& elemDecl } DOMElementImpl *elemImpl = (DOMElementImpl *) elem; - for (unsigned int index = 0; index < attrCount; ++index) + for (XMLSize_t index = 0; index < attrCount; ++index) { const XMLAttr* oneAttrib = attrList.elementAt(index); unsigned int attrURIId = oneAttrib->getURIId(); @@ -319,7 +319,7 @@ void XSDDOMParser::startElement( const XMLElementDecl& elemDecl XMLAttDef* attr = 0; DOMAttrImpl * insertAttr = 0; - for (unsigned int i=0; i<defAttrs->getAttDefCount(); i++) + for (XMLSize_t i=0; i<defAttrs->getAttDefCount(); i++) { attr = &defAttrs->getAttDef(i); diff --git a/tests/src/XSTSHarness/regression/XERCESC-1825/test.xml b/tests/src/XSTSHarness/regression/XERCESC-1825/test.xml new file mode 100644 index 0000000000000000000000000000000000000000..759181fa9c4d95c9e8737b9251d9f7d5475e5b4e --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1825/test.xml @@ -0,0 +1,7 @@ +<t:root xmlns:t="test" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="test test.xsd"> + + <qname y="t:y"><a></a></qname> + +</t:root> diff --git a/tests/src/XSTSHarness/regression/XERCESC-1825/test.xsd b/tests/src/XSTSHarness/regression/XERCESC-1825/test.xsd new file mode 100644 index 0000000000000000000000000000000000000000..332adef2d2ca89661a8329c772e3ca3282030ea6 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1825/test.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + + <complexType name="qname"> + <sequence> + <element name="a" type="QName" xmlns:z="test" default="z:a"/> + </sequence> + <attribute name="x" type="QName" default="t:x"/> + <attribute name="y" type="QName" fixed="t:y" use="required"/> + </complexType> + + <complexType name="type"> + <sequence> + <element name="qname" type="t:qname"/> + </sequence> + </complexType> + + <element name="root" type="t:type"/> + +</schema> diff --git a/tests/src/XSTSHarness/regression/XERCESC-1825/test2.xsd b/tests/src/XSTSHarness/regression/XERCESC-1825/test2.xsd new file mode 100644 index 0000000000000000000000000000000000000000..161ca91db23c08774b7597ecb07f11d5363d58c5 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1825/test2.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + + <complexType name="qname"> + <sequence> + <element name="a" type="QName" default="x:a"/> + </sequence> + <attribute name="x" type="QName" default="x:x"/> + <attribute name="y" type="QName" fixed="x:y" use="required"/> + </complexType> + + <complexType name="type"> + <sequence> + <element name="qname" type="t:qname"/> + </sequence> + </complexType> + + <element name="root" type="t:type"/> + +</schema> diff --git a/tests/src/XSTSHarness/regression/Xerces.testSet b/tests/src/XSTSHarness/regression/Xerces.testSet index bc03417096ff48b8a78ae00bd07b60abaad99d63..260332110787026544b387c74d7085c4e0d258e2 100644 --- a/tests/src/XSTSHarness/regression/Xerces.testSet +++ b/tests/src/XSTSHarness/regression/Xerces.testSet @@ -568,6 +568,33 @@ <current status="accepted" date="2008-07-17"/> </instanceTest> </testGroup> + <testGroup name="XERCESC-1825-1"> + <annotation> + <documentation>Default value of QName type with non-empty prefix causes segfault</documentation> + </annotation> + <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-1825"/> + <schemaTest name="XERCESC-1825-1-1"> + <schemaDocument xlink:href="./XERCESC-1825/test.xsd"/> + <expected validity="valid"/> + <current status="accepted" date="2008-12-29"/> + </schemaTest> + <instanceTest name="XERCESC-1825-1-2"> + <instanceDocument xlink:href="./XERCESC-1825/test.xml"/> + <expected validity="valid"/> + <current status="accepted" date="2008-12-29"/> + </instanceTest> + </testGroup> + <testGroup name="XERCESC-1825-2"> + <annotation> + <documentation>Default value of QName type with non-empty prefix causes segfault</documentation> + </annotation> + <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-1825"/> + <schemaTest name="XERCESC-1825-2-1"> + <schemaDocument xlink:href="./XERCESC-1825/test2.xsd"/> + <expected validity="invalid"/> + <current status="accepted" date="2008-12-29"/> + </schemaTest> + </testGroup> <testGroup name="XERCESC-1832"> <annotation> <documentation>Namespace definitions attached to xs:extension/xs:restriction are not processed</documentation>