Как получить доступ к файлу в текущей папке URL или _layouts?
Вопрос
Мой код за кодом с веб-страницы aspx использует преобразовать.xsl чтобы выполнить какое-то пользовательское преобразование xslt.
Сценарий 1:Попробуйте получить файл из папки _layouts.
SPWeb web = SPContext.Current.Web;
SPFile file = web.GetFile(@"/layouts/MyFeature/transform.xsl");
Примечание :Доступ к файлу доступен по этому URL-адресу http://mysite:8080/_layouts/MyFeature/transform.xsl при использовании браузера.
Сценарий 2:Постарайтесь, чтобы получить файл из текущего (http://mysite:8080/MyFeature/MyPage.aspx) URL-адрес.
SPWeb web = SPContext.Current.Web;
SPFile file = web.GetFile(@"transform.xsl");
или
SPFile file = web.GetFile(@"MyFeature/transform.xsl");
или
SPFile file = web.GetFile(@"/MyFeature/transform.xsl");
Все сценарии терпят неудачу, как это решить?
Решение
'transform.xsl' теперь находится по адресу 'MyFeature/transform.xsl', и я последовал совету Андерса Раска, и теперь мой код выглядит примерно так:
SPWeb web = SPContext.Current.Web;
XslCompiledTransform transformer = new XslCompiledTransform();
XsltSettings settings = new XsltSettings(true, true);
string xslLocation = web.Url + "/FormWrapper/transform.xsl";
transformer.Load(xslLocation, settings, GetResolverWithDefaultCredentials());
// Do XSLT transform...
Решение
Я почти уверен, что SPWeb.GetFile() возвращает страницы вашего сайта, как default.aspx.Также ваш файл XSLT не является SPF-файлом, если он расположен в папке _LAYOUTS.
Вместо этого попробуйте что-то похожее на приведенный ниже код (обратите внимание на шаблонный код, поэтому следует добавить обработку ошибок и т.д.)
// fetch xsl processor
XslCompiledTransform processor = GetXslt(@"/layouts/MyFeature/transform.xsl");
StringWriter writer = new StringWriter(CultureInfo.CurrentCulture);
// Transform XSLT code here
private static XslCompiledTransform GetXslt(string xsltUrl)
{
XslCompiledTransform processor = new XslCompiledTransform(false);
bool enableDocumentFunctions = true;
bool enableScript = true;
XsltSettings settings = new XsltSettings(enableDocumentFunctions, enableScript);
// add error handling here
processor.Load(xsltUrl, settings, GetResolverWithDefaultCredentials());
return processor;
}
// use resolver to avoid getting security exceptions
private static XmlUrlResolver GetResolverWithDefaultCredentials()
{
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
return resolver;
}
Другие советы
Вы можете написать функцию модуля, которая «загружает» ваше Transform.xsl в библиотеку документов (например, библиотека стилей), которая позволяет вам получить доступ к файлу в качестве SPFILE.