0

XslCompiledTransform.Loadサーバー パスを取得する方法がわかりません。私はグーグルで検索し、次のようなことをする必要があることを発見しました:

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

HttpContextしかし、 null であるというエラーが返されました。

私も試しました:

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

また、非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要であるというエラーが返されましたSystem.Web.HttpServerUtility.MapPath(string)

xslPath には、Sharepoint Web の xsl ファイルを指すパスがあります。XslCompiledTransform に、サーバー パスを含む xsl ファイルをロードしてもらいたいだけです。出来ますか?もしそうなら、それを行う適切な方法またはハックな方法は何ですか?

編集: xsl ファイルへのパスを含む SPWeb オブジェクトにアクセスできます。しかし、ServerRelativeUrl を確認すると、"/MyTree/xsl.xsl" とだけ表示されます。ここでの問題は、SharePoint リストからファイルをロードするための XslCompiledTransform.Load を取得できなかったことです。

ありがとう。

4

2 に答える 2

2

リクエストの処理中、現在の HttpContext は HttpContext.Current です。Page/UserControl/WebPart では、これはプロパティでもありますContext

HttpContext.Context.Server.MapPath(xslPath)

リクエストの処理中にメソッドが呼び出されない場合、HttpContext.Current は null になります。この場合、パスを手動でマップできます。

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 );
于 2010-03-03T13:46:03.520 に答える
1

最終的にわかったことは、ローカル パスに似ていない URL を渡すと、XslCompiledTransform クラスが自動的に別のモードに切り替わり、パスを URL として読み取ることです。

ファイルの名前だけを含む文字列を渡すと、XslCompiledTransform はローカル ハード ディスク内のファイルを探します。/myFolder/myXsl.xsl のようなものを渡す場合も同様です。

ただし、web.ParentWeb.Url + NameOfFile などの共有ポイント URL を渡すと、共有ポイント URL から読み取られます。

自動切り替えが行われる理由は 100% わかりませんが、少なくとも上記の方法でうまくいきました。

于 2010-04-07T09:36:54.293 に答える