/** * This method is used by the isUPAConform method to check whether @p term and @p otherTerm * are the same resp. match each other. */ static bool termMatches(const XsdTerm::Ptr &term, const XsdTerm::Ptr &otherTerm, const NamePool::Ptr &namePool) { if (term->isElement()) { const XsdElement::Ptr element(term); if (otherTerm->isElement()) { // both, the term and the other term are elements const XsdElement::Ptr otherElement(otherTerm); // if they have the same name they match if (element->name(namePool) == otherElement->name(namePool)) return true; } else if (otherTerm->isWildcard()) { // the term is an element and the other term a wildcard const XsdWildcard::Ptr wildcard(otherTerm); // wildcards using XsdWildcard::absentNamespace, so we have to fix that here QXmlName name = element->name(namePool); if (name.namespaceURI() == StandardNamespaces::empty) name.setNamespaceURI(namePool->allocateNamespace(XsdWildcard::absentNamespace())); // if the wildcards namespace constraint allows the elements name, they match if (XsdSchemaHelper::wildcardAllowsExpandedName(name, wildcard, namePool)) return true; } } else if (term->isWildcard()) { const XsdWildcard::Ptr wildcard(term); if (otherTerm->isElement()) { // the term is a wildcard and the other term an element const XsdElement::Ptr otherElement(otherTerm); // wildcards using XsdWildcard::absentNamespace, so we have to fix that here QXmlName name = otherElement->name(namePool); if (name.namespaceURI() == StandardNamespaces::empty) name.setNamespaceURI(namePool->allocateNamespace(XsdWildcard::absentNamespace())); // if the wildcards namespace constraint allows the elements name, they match if (XsdSchemaHelper::wildcardAllowsExpandedName(name, wildcard, namePool)) return true; } else if (otherTerm->isWildcard()) { // both, the term and the other term are wildcards const XsdWildcard::Ptr otherWildcard(otherTerm); // check if the range of the wildcard overlaps. const XsdWildcard::Ptr intersectionWildcard = XsdSchemaHelper::wildcardIntersection(wildcard, otherWildcard); if (!intersectionWildcard || (intersectionWildcard && !(intersectionWildcard->namespaceConstraint()->variety() != XsdWildcard::NamespaceConstraint::Not && intersectionWildcard->namespaceConstraint()->namespaces().isEmpty()))) return true; } } return false; }
void XsdSchemaDebugger::dumpWildcard(const XsdWildcard::Ptr &wildcard) { QVector<QString> varietyNames; varietyNames.append(QLatin1String("Any")); varietyNames.append(QLatin1String("Enumeration")); varietyNames.append(QLatin1String("Not")); QVector<QString> processContentsNames; processContentsNames.append(QLatin1String("Strict")); processContentsNames.append(QLatin1String("Lax")); processContentsNames.append(QLatin1String("Skip")); qDebug(" processContents: %s", qPrintable(processContentsNames.at((int)wildcard->processContents()))); const XsdWildcard::NamespaceConstraint::Ptr constraint = wildcard->namespaceConstraint(); qDebug(" variety: %s", qPrintable(varietyNames.at((int)constraint->variety()))); if (constraint->variety() != XsdWildcard::NamespaceConstraint::Any) qDebug() << " namespaces:" << constraint->namespaces(); }