diff options
Diffstat (limited to 'src/xmlpatterns')
-rw-r--r-- | src/xmlpatterns/schema/qxsdschemaparser.cpp | 48 | ||||
-rw-r--r-- | src/xmlpatterns/schema/qxsdschemaparser_p.h | 22 |
2 files changed, 64 insertions, 6 deletions
diff --git a/src/xmlpatterns/schema/qxsdschemaparser.cpp b/src/xmlpatterns/schema/qxsdschemaparser.cpp index 6ed28af..fd0b95c 100644 --- a/src/xmlpatterns/schema/qxsdschemaparser.cpp +++ b/src/xmlpatterns/schema/qxsdschemaparser.cpp @@ -264,16 +264,31 @@ XsdSchemaParser::XsdSchemaParser(const XsdSchemaContext::Ptr &context, const Xsd setupBuiltinTypeNames(); } +void XsdSchemaParser::addIncludedSchemas(const NamespaceSet &schemas) +{ + m_includedSchemas += schemas; +} + void XsdSchemaParser::setIncludedSchemas(const NamespaceSet &schemas) { m_includedSchemas = schemas; } +void XsdSchemaParser::addImportedSchemas(const NamespaceSet &schemas) +{ + m_importedSchemas += schemas; +} + void XsdSchemaParser::setImportedSchemas(const NamespaceSet &schemas) { m_importedSchemas = schemas; } +void XsdSchemaParser::addRedefinedSchemas(const NamespaceSet &schemas) +{ + m_redefinedSchemas += schemas; +} + void XsdSchemaParser::setRedefinedSchemas(const NamespaceSet &schemas) { m_redefinedSchemas = schemas; @@ -297,6 +312,7 @@ void XsdSchemaParser::setDocumentURI(const QUrl &uri) // prevent to get included/imported/redefined twice m_includedSchemas.insert(uri); m_importedSchemas.insert(uri); + m_redefinedSchemas.insert(uri); } QUrl XsdSchemaParser::documentURI() const @@ -594,8 +610,14 @@ void XsdSchemaParser::parseInclude() parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::IncludeParser)) + if (!parser.parse(XsdSchemaParser::IncludeParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } } } @@ -684,8 +706,14 @@ void XsdSchemaParser::parseImport() parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::ImportParser)) + if (!parser.parse(XsdSchemaParser::ImportParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } } } } else { @@ -702,8 +730,14 @@ void XsdSchemaParser::parseImport() parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::ImportParser)) + if (!parser.parse(XsdSchemaParser::ImportParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } } } } else { @@ -839,8 +873,14 @@ void XsdSchemaParser::parseRedefine() parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::RedefineParser)) + if (!parser.parse(XsdSchemaParser::RedefineParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } delete reply; } diff --git a/src/xmlpatterns/schema/qxsdschemaparser_p.h b/src/xmlpatterns/schema/qxsdschemaparser_p.h index ad5e9ce..80d44a5 100644 --- a/src/xmlpatterns/schema/qxsdschemaparser_p.h +++ b/src/xmlpatterns/schema/qxsdschemaparser_p.h @@ -120,20 +120,38 @@ namespace QPatternist typedef QSet<QUrl> NamespaceSet; /** + * Adds @p schemas to the list of already included schemas, so the parser + * can detect multiple includes of the same schema. + */ + void addIncludedSchemas(const NamespaceSet &schemas); + + /** * Sets which @p schemas have been included already, so the parser - * can detect circular includes. + * can detect multiple includes of the same schema. */ void setIncludedSchemas(const NamespaceSet &schemas); /** + * Adds @p schemas to the list of already imported schemas, so the parser + * can detect multiple imports of the same schema. + */ + void addImportedSchemas(const NamespaceSet &schemas); + + /** * Sets which @p schemas have been imported already, so the parser * can detect circular imports. */ void setImportedSchemas(const NamespaceSet &schemas); /** + * Adds @p schemas to the list of already redefined schemas, so the parser + * can detect multiple redefines of the same schema. + */ + void addRedefinedSchemas(const NamespaceSet &schemas); + + /** * Sets which @p schemas have been redefined already, so the parser - * can detect circular redefines. + * can detect multiple redefines of the same schema. */ void setRedefinedSchemas(const NamespaceSet &schemas); |