Pregunta

Mi código detrás de código de la página web aspx utiliza un transform.xsl que hacer alguna transformación XSLT personalizado.

Escenario 1 . Trate de obtener el archivo de la carpeta _layouts

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

Nota: El archivo es accesible en esta url http: // mysite: 8080 / _layouts / MyFeature /transform.xsl cuando se utiliza el navegador.

Escenario 2 : Trata de conseguir el archivo de la corriente (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");


Todos los escenarios fallan, la forma de resolver esto?

Solución
El 'transform.xsl' se encuentra ahora en 'MyFeature / transform.xsl' y he seguido la punta de Anders Rask, y mis código es el siguiente ahora:

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...
¿Fue útil?

Solución

Estoy bastante seguro de SPWeb.GetFile () devuelve páginas de su sitio, como default.aspx. También su archivo XSLT tampoco un SPFile si se encuentra ubicado en la carpeta _layouts.

En lugar de intentar algo similar al siguiente código (código repetitivo nota por lo hay que añadir el control de errores, etc)

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

Otros consejos

Se puede escribir una función Módulo de que "subidas" de su transform.xsl en una biblioteca de documentos (biblioteca de estilos, por ejemplo), que le permite acceder el archivo como un SPFile.

Licenciado bajo: CC-BY-SA con atribución
scroll top