Artículo cedido por La página de Alfredo Reino.
El fichero de datos
El objeto de este mini-tutorial es desarrollar una aplicación práctica sencilla utilizando XML (eXtended Mark-up Language) y ASP (Active Server Pages). Para saber un poco más de XML, visita la "Introducción a XML en castellano" o cualquiera de las miles de páginas que existen en la red sobre el tema.
Para almacenar las firmas de los visitantes a nuestro website vamos a utilizar un documento XML de la siguiente forma:
<?xml version="1.0" encoding="ISO-8859-1"?> <guestbook> <item> <author>Andres</author> <email>[email protected]</email> <datetime order="200005161603">16-5-2000 (16:03)</datetime> <ip>197.50.123.14</ip> <text>Hola, me gusta tu tutorial</texto> </item> <item> <author>Juan</author> <email>[email protected]</email> <datetime order="200005171413">17-5-2000 (14:13)</datetime> <ip>195.2.170.174</ip> <text>Saludos desde Albacete</text> </item> </guestbook>
Este documento XML contiene un elemento guestbook, que a su vez contiene elementos item. Un DTD para este documento sería el siguiente;
<!ELEMENT guestbook (item*)> <!ELEMENT item (author, email, datetime, ip, text)> <!ELEMENT author (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT ip (#PCDATA)> <!ELEMENT text (#PCDATA)> <!ELEMENT datetime (#PCDATA)> <!ATTLIST datetime order CDATA #REQUIRED>
La razón de almacenar la fecha y hora de dos maneras diferentes en el elemento datetime es tener un formato para visualización (dd-mm-aaaa hh:mm) y otro para ordenación (yyyymmddhhmm) sin tener que hacer cambios de formato de fecha.
La transformación a HTML
La transformación de XML a HTML la realizamos en el servidor, para asegurarnos una compatibilidad 100% con cualquier navegador web, utilizando el parser MSXML de Microsoft.
El documento XSLT que va a realizar la transformación es el siguiente (utilizando la implementación inicial de Microsoft para XSL)
<?xml version='1.0' encoding='UTF-7'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="guestbook/item" order-by="-datetime/@order"> <P><B><xsl:value-of select="author"/></B><BR/> <A> <xsl:attribute name="href">mailto:<xsl:value-of select="email"/> </xsl:attribute> <xsl:value-of select="email"/> </A> <BR/> <xsl:value-of select="text"/> <I><xsl:value-of select="datetime"/></I> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Es fácil ver que lo que hacemos es iterar a través de todos los elementos item contenidos en guestbook, y presentarlos como un documento HTML.
El código ASP
Por último, necesitamos dos rutinas escritas en VBScript (o JSCript) para realizar la transformación XML a HTML, y para añadir elementos item al documento XML a partir de un formulario en HTML.
El código para realizar la transformación es muy simple usando el parser de Microsoft.
xmlDoc = "data.xml" xslDoc = "gbook.xsl" Set xmlObj = CreateObject("Microsoft.XMLDOM") xmlObj.Async = False xmlObj.Load(Server.MapPath(xmlDoc)) Set xslObj = CreateObject("Microsoft.XMLDOM") xslObj.Async = False xslObj.Load(Server.MapPath(xslDoc)) Response.Write(xmlObj.transformNode(xslObj)) Set xmlObj = nothing Set xslObj = nothing
El código para añadir un elemento item al documento XML, se basa en crear el nodo item en una cadena de texto, cargar la cadena de texto en una instancia del parser, y utilizar el método appendChild del DOM para añadirlo al documento XML que almacena nuestros datos.
stringNuevo = vbCrLf & "<item>" & vbCrLf & _ "<author>" & nombre & "</author>" & vbCrLf & _ "<email>" & email & "</email>" & vbCrLf & _ "<datetime order=""" & orden & """>" & fecha & "</datetime>" & vbCrLf & _ "<ip>" & ip & "</ip>" & vbCrLf & _ "<text>" & text & "</text>" & vbCrLf & _ "</item>" & vbCrLf & vbCrLf Set xmlObj = CreateObject("Microsoft.XMLDOM") xmlObj.Async = False xmlObj.Load(Server.MapPath("data.xml")) Set xmlObj2 = CreateObject("Microsoft.XMLDOM") xmlObj2.Async = False xmlObj2.LoadXML(stringNuevo) Set root = xmlObj.documentElement Set root2 = xmlObj2.documentElement root.appendChild(root2) xmlObj.Save(Server.MapPath("data.xml")) Set xmlObj = nothing Set xmlObj2 = nothing
Por fin, integrando este código en un solo fichero .ASP, y haciendo que el formulario se llame a si mismo:
<% If Len(Trim(nombre))=0 Then okay = False mensaje = mensaje & "El nombre es obligatorio. " End If If Len(Trim(texto))=0 Then okay = False mensaje = mensaje & "El texto es obligatorio. " End If ip = Request.ServerVariables("REMOTE_HOST") fecha = Day(Now) & "-" & Month(Now) & "-" & Year(Now) fecha = fecha & " (" & Hour(Now) & ":" If Minute(Now)<10 Then fecha=fecha & "0" fecha = fecha & Minute(Now) & ")" orden = Year(Now) If Month(Now)<10 Then orden=orden & "0" orden = orden & Month(Now) If Day(Now)<10 Then orden=orden & "0" orden = orden & Day(Now) If Hour(Now)<10 Then orden=orden & "0" orden = orden & Hour(Now) If Minute(Now)<10 Then orden=orden & "0" orden = orden & Minute(Now) stringNuevo = vbCrLf & "<item>" & vbCrLf & _ "<author>" & nombre & "</author>" & vbCrLf & _ "<email>" & email & "</email>" & vbCrLf & _ "<datetime order=""" & orden & """>" & fecha & "</datetime>" & vbCrLf & _ "<ip>" & ip & "</ip>" & vbCrLf & _ "<texto>" & texto & "</texto>" & vbCrLf & _ "</item>" & vbCrLf & vbCrLf If okay Then Set xmlObj = CreateObject("Microsoft.XMLDOM") Set xmlObj2 = CreateObject("Microsoft.XMLDOM") xmlObj.Async = False xmlObj.Load(Server.MapPath("data.xml")) xmlObj2.Async = False xmlObj2.LoadXML(stringNuevo) Set root = xmlObj.documentElement Set root2 = xmlObj2.documentElement root.appendChild(root2) xmlObj.Save(Server.MapPath("data.xml")) Set xmlObj = nothing Set xmlObj2 = nothing nombre = "" email = "" texto = "" End If Else nombre = "" email = "" texto = "" End If xmlDoc = "data.xml" xslDoc = "gbook.xsl" Set xmlObj = CreateObject("Microsoft.XMLDOM") xmlObj.Async = False xmlObj.Load(Server.MapPath(xmlDoc)) Set xslObj = CreateObject("Microsoft.XMLDOM") xslObj.Async = False xslObj.Load(Server.MapPath(xslDoc)) Response.Write(xmlObj.transformNode(xslObj)) Set xmlObj = nothing Set xslObj = nothing %> <br> <form action="gbook.asp" method="POST"> <input type="Hidden" name="x" value="x"> <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center" class="col"> <tr> <td width="100">Nombre</td> <td> <input type="text" name="nombre" value="<%= nombre %>"> </td> </tr> <tr> <td width="100">Email</td> <td> <input type="text" name="email" value="<%= email %>"> </td> </tr> <tr> <td width="100">Texto:</td> <td rowspan="2"> <textarea rows="5" name="texto"><%= texto %></textarea> </td> </tr> <tr> <td width="100" align="left" valign="bottom"> <input type="submit" name="Submit" value=" Enviar "> </td> </tr> </table> </form> <p align="center"><font color="red"><%= mensaje %></font></p> </body>