xmlDocPtr XSLStyleSheet::locateStylesheetSubResource(xmlDocPtr parentDoc, const xmlChar* uri) { bool matchedParent = (parentDoc == document()); for (unsigned i = 0; i < m_children.size(); ++i) { XSLImportRule* import = m_children.at(i).get(); XSLStyleSheet* child = import->styleSheet(); if (!child) continue; if (matchedParent) { if (child->processed()) continue; // libxslt has been given this sheet already. // Check the URI of the child stylesheet against the doc URI. // In order to ensure that libxml canonicalized both URLs, we get the original href // string from the import rule and canonicalize it using libxml before comparing it // with the URI argument. CString importHref = import->href().utf8(); xmlChar* base = xmlNodeGetBase(parentDoc, (xmlNodePtr)parentDoc); xmlChar* childURI = xmlBuildURI((const xmlChar*)importHref.data(), base); bool equalURIs = xmlStrEqual(uri, childURI); xmlFree(base); xmlFree(childURI); if (equalURIs) { child->markAsProcessed(); return child->document(); } continue; } xmlDocPtr result = import->styleSheet()->locateStylesheetSubResource(parentDoc, uri); if (result) return result; } return 0; }
void XSLStyleSheet::clearDocuments() { m_stylesheetDoc = 0; for (unsigned i = 0; i < m_children.size(); ++i) { XSLImportRule* import = m_children.at(i).get(); if (import->styleSheet()) import->styleSheet()->clearDocuments(); } }
void XSLStyleSheet::clearDocuments() { m_stylesheetDoc = 0; unsigned len = length(); for (unsigned i = 0; i < len; ++i) { StyleBase* rule = item(i); if (rule->isImportRule()) { XSLImportRule* import = static_cast<XSLImportRule*>(rule); if (import->styleSheet()) import->styleSheet()->clearDocuments(); } } }