Получение XslCompiledTransform.Load для загрузки файла в списке SharePoint - PullRequest
0 голосов
/ 03 марта 2010

У меня проблемы с получением XslCompiledTransform.Load метода для выбора пути к серверу. Я погуглил и обнаружил, что мне нужно сделать что-то вроде:

xslt.Load(System.Web.HttpContext.Server.MapPath(xslPath),
           XsltSettings.Default, new XmlUrlResolver());

Но он вернул ошибку, сообщающую, что HttpContext равно нулю.

Я тоже пробовал:

xslt.Load(System.Web.HttpServerUtility.MapPath(xslPath), 
           XsltSettings.Default, new XmlUrlResolver());

Это также вернуло ошибку, сказав, что ссылка на объект требуется для нестатического поля, метода или свойства System.Web.HttpServerUtility.MapPath(string)

xslPath имеет путь, который указывает на файл xsl в Sharepoint Web. Я просто хочу, чтобы XslCompiledTransform загружал файл xsl с указанием пути к серверу. Является ли это возможным? Если так, то каков правильный или хакерский способ сделать это?

РЕДАКТИРОВАТЬ: у меня есть доступ к объекту SPWeb, который содержит путь к файлу xsl. Однако, когда я проверяю ServerRelativeUrl, он просто говорит "/MyTree/xsl.xsl". Проблема в том, что мне не удалось заставить XslCompiledTransform.Load загрузить файл из списка SharePoint.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Во время обработки запроса текущим HttpContext является HttpContext.Current. В Page / UserControl / WebPart это также свойство Context.

HttpContext.Context.Server.MapPath(xslPath)

Если ваш метод не вызывается во время обработки запроса, HttpContext.Current будет нулевым. В этом случае вы можете отобразить путь вручную.

public string MapPath(string path)
{
    if (HttpContext.Current != null)
        return HttpContext.Current.Server.MapPath(path);

    path = path.Replace("/", @"\");
    if (path.StartsWith(@"~\")) {
        path = path.Substring( 2 );
    } else if (path.StartsWith(@"\")) {
        path = path.Substring( 1 );
    }
    // a non-prefixed path is already relative to your web server root

    return Path.Combine( HttpRuntime.AppDomainAppPath, path );
}

Выше приведено для отображения путей к дискам в ASP.NET в целом.

Если файл содержится в вашем SPWeb объекте, вы должны использовать SPWeb.GetFile

SpWeb web;

SPFile file = web.GetFile( path );

XmlReader r = XmlReader.Create( file.OpenBinaryStream() );
xslt.Load( r );
1 голос
/ 07 апреля 2010

В конце концов я обнаружил, что если я передам URL, который не похож на локальный путь, класс XslCompiledTransform автоматически переключится в другой режим для чтения пути в виде URL.

Если я передам строку, содержащую только имя файла, XslCompiledTransform будет искать файл на моем локальном жестком диске. Аналогично, если я передам что-то вроде /myFolder/myXsl.xsl.

Однако, если я передам URL-адрес sharepoint, например, web.ParentWeb.Url + NameOfFile, после чего он прочтет его с URL-адреса Sharepoint.

Я не уверен на 100%, почему он выполняет автоматическое переключение, но по крайней мере вышеупомянутое сработало для меня.

...