Desarrollo de un libro de visitas usando XML y ASP

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 al 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="[email protected]">

  <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>

Deja un comentario