Acabo de construir un sitio que transforma XML en HTML para su visualización en MVC3. Usé la segunda técnica, donde el controlador determina los archivos XML y XSLT a usar, y los pasa en el modelo. Un ayudante de HTML en la vista realmente realiza la transformación.
En este caso estoy haciendo un programa de conferencias, así que eso es lo que se refiere a Program
a continuación. Los parámetros se pueden suministrar a la hoja de estilo; a continuación, estoy suministrando una URL base como parámetro que se convertirá en enlaces en el HTML generado.
El modelo:
public class ProgramModel
{
public string ProgramFilename { get; set; }
public string StylesheetFilename { get; set; }
public Dictionary<string, string> Parameters { get; protected set; }
public ProgramModel()
{
Parameters = new Dictionary<string, string>();
}
}
El controlador:
[OutputCache(Duration=1000)]
public ActionResult Index()
{
string xmlFile = Server.MapPath("~/Program.xml");
string xsltFile = Server.MapPath("~/Program-index.xslt");
Response.AddCacheDependency(new CacheDependency(xmlFile), new CacheDependency(xsltFile));
ProgramModel model = new ProgramModel();
model.ProgramFilename = xmlFile;
model.StylesheetFilename = xsltFile;
model.Parameters["baseDayUrl"] = Url.Action("Day");
return View(model);
}
El ayudante:
public static class HtmlHelperXmlExtensions
{
/// <summary>
/// Applies an XSL transformation to an XML document.
/// </summary>
public static HtmlString RenderXml(this HtmlHelper helper, string xmlPath, string xsltPath, IDictionary<string,string> parameters)
{
XsltArgumentList args = new XsltArgumentList();
if (parameters != null)
foreach (string key in parameters.Keys)
args.AddParam(key, "", parameters[key]);
XslCompiledTransform t = new XslCompiledTransform();
t.Load(xsltPath);
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
using (XmlReader reader = XmlReader.Create(xmlPath, settings))
{
StringWriter writer = new StringWriter();
t.Transform(reader, args, writer);
return new HtmlString(writer.ToString());
}
}
}
La vista:
<div data-role="content">
@Html.RenderXml(Model.ProgramFilename, Model.StylesheetFilename, Model.Parameters)
</div>
¿Has encontrado una solución para esto? ¿Qué terminaste haciendo? – XtremeBytes