private XPathNavigator ConstructDocument(object dataSource, string uriRelative, Uri uriResolved) {
Debug.Assert(dataSource != null, "GetType() below assumes dataSource is not null");
Stream stream = dataSource as Stream;
if (stream != null) {
// Create document from stream
XmlReader reader = readerSettings.CreateReader(stream, uriResolved != null ? uriResolved.ToString() : null);
try {
// Create WhitespaceRuleReader if whitespace should be stripped
return new XPathDocument(WhitespaceRuleReader.CreateReader(reader, this.wsRules), XmlSpace.Preserve).CreateNavigator();
}
finally {
// Always close reader that was opened here
reader.Close();
}
}
else if (dataSource is XmlReader) {
// Create document from reader
// Create WhitespaceRuleReader if whitespace should be stripped
return new XPathDocument(WhitespaceRuleReader.CreateReader(dataSource as XmlReader, this.wsRules), XmlSpace.Preserve).CreateNavigator();
}
else if (dataSource is IXPathNavigable) {
if (this.wsRules != null)
throw new XslTransformException(Res.XmlIl_CantStripNav, string.Empty);
return (dataSource as IXPathNavigable).CreateNavigator();
}
Debug.Assert(uriRelative != null, "Relative URI should not be null");
throw new XslTransformException(Res.XmlIl_CantResolveEntity, uriRelative, dataSource.GetType().ToString());
}