internal XPathNavigator GetNavigator(Uri ruri) {
XPathNavigator result = null;
if (documentCache != null) {
result = documentCache[ruri] as XPathNavigator;
if (result != null) {
return result.Clone();
}
}
else {
documentCache = new Hashtable();
}
Object input = resolver.GetEntity(ruri, null, null);
if (input is Stream) {
XmlTextReaderImpl tr = new XmlTextReaderImpl(ruri.ToString(), (Stream) input); {
tr.XmlResolver = this.resolver;
}
// reader is closed by Compiler.LoadDocument()
result = ((IXPathNavigable)Compiler.LoadDocument(tr)).CreateNavigator();
}
else if (input is XPathNavigator){
result = (XPathNavigator) input;
}
else {
throw XsltException.Create(Res.Xslt_CantResolve, ruri.ToString());
}
documentCache[ruri] = result.Clone();
return result;
}