El objetivo de este artículo es mostrar cómo se puede crear un formulario HTML dinámicamente a partir de un archivo XML con la ayuda de un XSL.
Primero que todo iniciemos con la definición formal.
XSL (siglas de Extensible Stylesheet Language, expresión inglesa traducible como "lenguaje extensible de hojas de estilo")
Ahora la no formal.
Lenguaje basado en el estándar XML que permite dar un formato o estilo a un archivo XML, una analogía seria un XSL es al XML como un CSS es aun HTML.
Y ahora al grano.
Voy a hacer un ejemplo muy sencillo para entender el concepto.
Digamos que requerimos mostrar un formulario, menú, lista etc. partiendo de una fuente de datos XML, ojo con esto porque es lo más importante ya que significa que puede venir de otro sistema, podría ser la definición fija de un formato o simplemente un estándar manejado en una compañía.
Para el ejemplo vamos a crear una evaluación la cual está conformada por preguntas con 5 opciones y una única respuesta, las cuales reposan en un XML.
<?
xml version="1.0" encoding="utf-8" ?>
<
Area Titulo="Evaluacin anual">
<
Preguntas Titulo="Preguntas de unica seleccin">
<
Pregunta Titulo="Cree que este ao fue productivo" Descripcion="Desde el punto de vista de objetivos cumplidos">
<
Opcion Titulo="Exelente" Descripcion="Se cumplieron con todos los objetivos de forma satisfactoria"/>
<
Opcion Titulo="Bueno" Descripcion="Se cumplieron la mayoria de los objetivos"/>
<
Opcion Titulo="Regular" Descripcion="Se cumplieron con algunos objetivos"/>
<
Opcion Titulo="Malo" Descripcion="Se cumplieron con muy pocos objetivos"/>
</
Pregunta>
<
Pregunta Titulo="Como le parecio el entorno de trabajo" Descripcion="Espacio y comodidad">
<
Opcion Titulo="Exelente" Descripcion="Las instalaciones son perfectas en espacio y comodidad"/>
<
Opcion Titulo="Bueno" Descripcion="Las instalaciones permiten mi desempeo"/>
<
Opcion Titulo="Regular" Descripcion="En algunas ocaciones mi trabajo se ve afectado"/>
<
Opcion Titulo="Malo" Descripcion="Mi trabajo se ve afectado constantemente"/>
</
Pregunta>
<
Pregunta Titulo="Pregunta nueva" Descripcion="Compaeros, espacio ">
<
Opcion Titulo="Exelente" Descripcion="Cumple con todo y mas"/>
<
Opcion Titulo="Bueno" Descripcion="Cumple"/>
<
Opcion Titulo="Regular" Descripcion="Aveces cumple"/>
<
Opcion Titulo="Malo" Descripcion="no cumple con nada"/>
</
Pregunta>
</
Preguntas>
</
Area>
Ahora crearemos un archivo XSL que permita darle un formato al anterior archivo.
<?
xml version="1.0" encoding="utf-8"?>
<
xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
Variables por parametros -->
<
xsl:param name="Fecha" ></xsl:param>
<
xsl:template match="/">
<
table border="1">
<
tr>
<
td colspan="5">
<
h1>
<
xsl:value-of select="Area/@Titulo"/>
</
h1>
<
xsl:value-of select="$Fecha"/>
</
td>
</
tr>
<
tr>
<
td colspan="5">
<
h2>
<
xsl:value-of select="Area/Preguntas/@Titulo"/>
</
h2>
</
td>
</
tr>
<
xsl:for-each select="Area/Preguntas/Pregunta">
<
tr>
<
td >
<
h5>
<
xsl:value-of select="@Titulo"/>
</
h5>
<
h6>
<
xsl:value-of select="@Descripcion"/>
</
h6>
</
td>
<
xsl:for-each select="Opcion">
<
td>
<
xsl:value-of select="@Titulo"/>
<
input id="Radio1" checked="checked" name="R1" type="checkbox" value="@Titulo" />
</
td>
</
xsl:for-each>
</
tr>
</
xsl:for-each>
</
table>
</
xsl:template>
</
xsl:stylesheet>
Como pueden observar XSL permite el envió de parámetros creación de sentencias for para recorrer nodo y esto no es nada tiene muchísimo más como agregar javascript .
Acá les agrego una buena referencia.
Bueno y finalmente lo mejor el código en C# que permite leer el XML y aplicarle la transformación con el envio del parámetro fecha.
XslCompiledTransform
xslTrans = new XslCompiledTransform();
xslTrans.Load(Server.MapPath(
"~/Preguntas.xsl"));
XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddParam(
"Fecha", "", DateTime.Now.ToString());
// Se realiza la transformacin
StringWriter sw = new StringWriter();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(
"~/Fuente.xml"));
xslTrans.Transform(xmlDoc, xslArg, sw);
string strControls = sw.ToString();
// Se pintan los controles en la pgina
Control ctrl = Page.ParseControl(strControls);
this.PlaceHolder1.Controls.Add(ctrl);
Y de no olvidar los namespace
using System.Xml.Xsl;
using System.Xml;
using System.IO;
Y agregar un PlaceHolder del toolbox a nuestra pagina o control.

Es muy claro que esto se podría hacer en un control de usuario o algo por el estilo y leer la preguntas de una base de datos, pero y que pasa si se requiere agregar una nueva pregunta o una nueva opción o simplemente cambiar el radiobutton por un check.
Posiblemente sea necesario crear un administrador de preguntas con conexión a la base de datos y seguramente modificar el control de usuario.
Pues en este escenario es muy útil el XSL ya que solo cambiamos type="radio" por type="checkbox" en el archivo XSL sin necesidad de compilar o abrir Visual Studio

De igual forma si queremos agregar otra pregunta solo la agregamos en el XML.
Espero que les sea útil.