Domanda

Il mio codice dietro il codice dalla pagina web aspx utilizza un transform.xsl per fare un po 'XSLT personalizzato trasformazione.

Scenario 1 :. Cercare di ottenere il file dalla cartella _layouts

SPWeb web = SPContext.Current.Web;
SPFile file = web.GetFile(@"/layouts/MyFeature/transform.xsl");

Nota: il file è accessibile su questo url http: // mysite: 8080 / _layouts / MyFeature /transform.xsl quando si utilizza il browser .

Scenario 2 : cercare di ottenere il file dal corrente (http: // mysite: 8080 / MyFeature / MyPage.aspx). Url

SPWeb web = SPContext.Current.Web;
SPFile file = web.GetFile(@"transform.xsl");

o

SPFile file = web.GetFile(@"MyFeature/transform.xsl");

o

SPFile file = web.GetFile(@"/MyFeature/transform.xsl");


Tutti gli scenari non riescono, come risolvere questo?

Soluzione
Il 'transform.xsl' si trova ora a 'MyFeature / transform.xsl' e ho seguito il suggerimento di Anders Rask, e il mio aspetto codice come questo ora:

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...
È stato utile?

Soluzione

Sono abbastanza sicuro SPWeb.GetFile () restituisce le pagine del sito, come default.aspx. Anche il file XSLT è neanche uno SPFile se si trova nella cartella _layouts.

Invece provare qualcosa di simile al di sotto del codice (nota codice standard in modo da dovrebbe essere aggiunto la gestione degli errori, ecc)

// 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;
}

Altri suggerimenti

Si potrebbe scrivere una funzionalità di modulo che "arrivi" il vostro transform.xsl in una libreria di documenti (libreria di stili, per esempio), che permette di accedere il file come uno SPFile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top