QUrl AccelTree::baseUri(const QXmlNodeModelIndex &ni) const { switch(kind(toPreNumber(ni))) { case QXmlNodeModelIndex::Document: return baseUri(); case QXmlNodeModelIndex::Element: { const QXmlNodeModelIndex::Iterator::Ptr it(iterate(ni, QXmlNodeModelIndex::AxisAttribute)); QXmlNodeModelIndex next(it->next()); while(!next.isNull()) { if(next.name() == QXmlName(StandardNamespaces::xml, StandardLocalNames::base)) { const QUrl candidate(next.stringValue()); // TODO. The xml:base spec says to do URI escaping here. if(!candidate.isValid()) return QUrl(); else if(candidate.isRelative()) { const QXmlNodeModelIndex par(parent(ni)); if(par.isNull()) return baseUri().resolved(candidate); else return par.baseUri().resolved(candidate); } else return candidate; } next = it->next(); } /* We have no xml:base-attribute. Can any parent supply us a base URI? */ const QXmlNodeModelIndex par(parent(ni)); if(par.isNull()) return baseUri(); else return par.baseUri(); } case QXmlNodeModelIndex::ProcessingInstruction: /* Fallthrough. */ case QXmlNodeModelIndex::Comment: /* Fallthrough. */ case QXmlNodeModelIndex::Attribute: /* Fallthrough. */ case QXmlNodeModelIndex::Text: { const QXmlNodeModelIndex par(ni.iterate(QXmlNodeModelIndex::AxisParent)->next()); if(par.isNull()) return QUrl(); else return par.baseUri(); } case QXmlNodeModelIndex::Namespace: return QUrl(); } Q_ASSERT_X(false, Q_FUNC_INFO, "This line is never supposed to be reached."); return QUrl(); }