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" lblmsg.Text = "Abrindo banco de dados e gerando dataset" conn.Open() Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(sql,
conn) Try ds.Tables(0).TableName = "Lancamentos" Try |
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> <table
border="0" bgcolor="white"> </table> </xsl:template> |
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 ' Transforma o arquivo xml em html usando o xsl Try 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.