VB.NET - Gerando HTML a partir de XML usando XSL


A sopa de letras do título do artigo pode deixar confuso que ainda não esta familiarizado com XML mas não exige nenhum conhecimento extraordinário.

Este artigo tem como objetivo mostrar como gerar arquivos HTML a partir de arquivos XML gerados a partir de uma tabela de um banco de dados Access usando arquivos XSL.

Para saber mais sobre os assuntos abordados neste artigo leia os seguintes artigos do site:

XML - eXtensible Markup Language - Introdução
XML - Usando DTD - Documento Type Definition

Para poder acompanhar este artigo você vai precisar :

- Visual Studio NET 2003 (você pode usar a versão anterior mas houve alterações no método Transform)
- Um editor XML (não é obrigatório mas ajuda basta a edição e criação do arquivo XSL. Um bem simples é o XMLWriter. O XMLSpy é o melhor)

Vamos então ao que interessa:

Suponha que você tenha um banco de dados qualquer com uma tabela com a seguinte estrutura:

Nota: Para este artigo o banco de dados que estarei usando chama-se banco.mdb e a tabela Extrato.

A sua tarefa é obter um arquivo HTML a partir da tabela extrato acima indicada. O arquivo extato.html gerado deverá ter o seguinte formato:

O layout da tabela para o arquivo HTML ao lado é muito simples afim de tornar o artigo mais claro para os iniciantes.

Nada impede entranto que você incremente o formato do arquivo Html gerado.

Você deverá realizar os seguintes passos para resolver o problema:

1- Acessar o banco de dados e a tabela e a partir dos dados gerar um arquivo XML
2- Criar um arquivo XSL que servirá de modelo de formatação para o arquivo HTML a ser gerado
3- Gerar o arquivo HTML usando os arquivos XML e XSL

Felizmente você pode fazer realizar estas tarefas de maneira muito fácil usando o VB.NET. O VB.NET fornece as classes do namespace System.XML que facilitam muito a vida do programador.

1- Inicie um novo projeto no VS.NET e no formulário principal inclua dois botões de comando.

2- Defina os namespaces que deverão ser importados no seu projeto conforme abaixo:

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Xml
Imports System.Xml.Xsl
Imports System.Xml.XPath

3- No evento Click do primeiro botão inclua o código abaixo:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim source As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\banco.mdb"
Dim sql As String = "SELECT * FROM extrato"
Dim conn As OleDbConnection = New OleDbConnection(source)

lblmsg.Text = "Abrindo banco de dados e gerando dataset"

conn.Open()

Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(sql, conn)
Dim ds As DataSet = New DataSet

Try
    adapter.Fill(ds)
Catch ex As Exception
    MsgBox(ex.Message)
Finally
    conn.Close()
End Try

ds.Tables(0).TableName = "Lancamentos"
ds.DataSetName = "Extrato"

Try
    ds.WriteXml("d:\vbnet\xml\extrato.xml")
    lblmsg.Text = "Arquivo XML gerado com sucesso em = d:\vbnet\xml\extrato.xml"
Catch ex As Exception
     MsgBox(ex.Message)
End Try
End Sub

Vale destacar no código acima os seguintes aspectos:

- A utilização do método WriteXML para gerar um arquivo no formato XML

- Note o nome da tabela e o nome do DataSet. Eles irão compor o nó raiz (Extrato) e o elemento(Lancamentos) do XML . Veja abaixo o arquivo extrato.xml gerado:

<?xml version="1.0" standalone="yes"?>
<Extrato>
   <Lancamentos>
      <data>20/2/2005</data>
      <historico>Recebimento de honorários</historico>
      <Valor>12500.00</Valor>
      <dc>C</dc>
   </Lancamentos>
   <Lancamentos>
      <data>21/2/2005</data>
      <historico>Pagamento de mensalidade clube</historico>
      <Valor>500.00</Valor>
      <dc>D</dc>
   </Lancamentos>
   <Lancamentos>
       <data>23/2/2005</data>
       <historico>Pagamento de água</historico>
       <Valor>123.50</Valor>
       <dc>D</dc>
    </Lancamentos>
    <Lancamentos>
       <data>24/2/2005</data>
       <historico>Despesa com alimentação - almoço</historico>
       <Valor>30.00</Valor>
       <dc>D</dc>
   </Lancamentos>
   <Lancamentos>
       <data>25/2/2005</data>
       <historico>Pagamento prestação financiamento</historico>
       <Valor>620.00</Valor>
       <dc>D</dc>
   </Lancamentos>
   <Lancamentos>
       <data>25/2/2005</data>
       <historico>Recebimento de vendas de produtos</historico>
       <Valor>478.00</Valor>
       <dc>C</dc>
   </Lancamentos>
   <Lancamentos>
       <data>26/2/2005</data>
       <historico>Pagamento aluguel mensal</historico>
       <Valor>1200.00</Valor>
       <dc>D</dc>
   </Lancamentos>
   <Lancamentos>
       <data>26/2/2005</data>
       <historico>Pagamento financiamento automóvel</historico>
       <Valor>2580.00</Valor>
       <dc>D</dc>
   </Lancamentos>
   <Lancamentos>
       <data>27/2/2005</data>
       <historico>Despesa com supermercado semanal</historico>
       <Valor>160.50</Valor>
       <dc>D</dc>
   </Lancamentos>
   <Lancamentos>
      <data>1/3/2005</data>
     <historico>Despesa com condomínio</historico>
     <Valor>370.00</Valor>
     <dc>D</dc>
   </Lancamentos>
</Extrato>

Estamos no meio do caminho para completá-lo só falta gerar o HTML a partir do XML. Para isto você deverá criar o arquivo XSL que será usado como o modelo de formatação do HTML a ser gerado.

Usamos um arquivo XSL para definir as regras de tradução para qualquer formato texto tais como: XML , HTML , TXT e RTF. O processamento é feito pelo processador XSLT ele recebe como entrada um docmento XML e gera na saída um outro documento com formato texto.

A transformação é especificada em um style-sheet que é formado de regras template nas quais as transformações são executadas.

Eu usei o editor XML XMLWriter 2.5 para criar o arquivo XSL abaixo. Após criar o arquivo devemos verificar se ele esta bem formado e , usando o editor, podemos visualizar o arquivo HTML através dos recursos do editor XML.

O arquivo XSL extrato_bancario.xsl que eu usei tem o seu código exibo a seguir:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>

<xsl:template match="/">

<html>
<body>

<table border="0" bgcolor="white">
<tr>
       <th colspan="3"><b>Extrato Bancario - Lancamentos consolidados</b></th>
</tr>
<tr>
     <th>Data</th>
     <th>Historico</th>
     <th>Valor</th>
</tr>

<xsl:for-each select="/Extrato/Lancamentos">
     <tr bgcolor="#F0F0F0">
         <td><xsl:value-of select="data"/></td>
         <td><xsl:value-of select="historico"/></td>
         <td><div align="right">
               <xsl:choose>
                   <xsl:when test="dc='D'">

                       <font color="red">
                            <xsl:value-of select="Valor"/>
                       </font>
               </xsl:when>
               <xsl:otherwise>
                        <font color="blue">
                             <xsl:value-of select="Valor"/>
                          </font>
               </xsl:otherwise>
               </xsl:choose>
               </div>
         </td>
        </tr>
         </xsl:for-each>

</table>
</body>
</html>

</xsl:template>
</xsl:stylesheet>

Neste código é importante salientar que :

- <xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>

A linha de código declarativa do arquivo define a saída(output method="html") html e o enconding usado (ISO-8859-1) permite que usemos caracteres acentuados no arquivo.

- Estou usando o elemento for-each para percorrer um nó , no caso Lancamentos

- Estou usando comandos condicionais if e choose para efetuar decisões

Nota: As declarações são case-sensitive. Assim /Extrato/Lancamentos é diferente de /extrato/lancamentos

Agora vamos a segunda parte do código onde usaremos o arquivo XML gerado e o arquivo XSL criado para gerar o HTML.

No evento Click do botão de comando inclua o seguinte código :

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim writer As XmlTextWriter
Dim doc As XmlDocument = New XmlDocument
doc.Load("d:\vbnet\xml\extrato.xml")

lblmsg.Text = "Transformando XML gerado no arquivo extrato.html"

' Creia um XPathNavigator para usar na transformação
Dim root As XmlElement = doc.DocumentElement
Dim nav As XPathNavigator = root.CreateNavigator()

' Transforma o arquivo xml em html usando o xsl
Dim xslt As XslTransform = New XslTransform
Try
    xslt.Load("d:\vbnet\xml\extrato_bancario.xsl")
Catch ex As Exception
     MsgBox(ex.Message)
End Try

Try
    writer = New XmlTextWriter("d:\vbnet\xml\extrato.html", Nothing)
Catch ex As Exception
    MsgBox(ex.Message())
End Try

Try
    xslt.Transform(nav, Nothing, writer, Nothing)
    lblmsg.Text = "Arquivo HTML gerado com sucesso !"
Catch ex As Exception
    MsgBox(ex.Message)
Finally
   writer.Close()
End Try

End Sub

O código acim irá gerar o arquivo extrato.html na pasta d:\vbnet\xml. Para efetuar o serviço estou usando o método Transform do namespace System.XML. Para saber mais sobre o método e sobre a classe XlsTransform acesse os links abaixo:

O método Transform : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlxslxsltransformclasstransformtopic.asp

Classe XslTransform : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlxslxsltransformclasstopic.asp

Pegue os arquivos usados no projeto aqui : ExtratoXML.zip

Aguarde mais artigos com VB.NET e XML.


José Carlos Macoratti