Relatórios com PHP e XSLT - Conceitos iniciais e utilização básica
Autor: Everton da Rosa | Publicado: 2015-08-04T10:59:00-03:00



INTRODUÇÃO
Quem trabalha com&nbsp;PHP, invariavelmente acaba trabalhando com bancos de dados e, em algum momento, precisará criar relatórios dos dados armazenados.&nbsp;O caminho normal, e em um primeiro momento o mais fácil também, é mesclar código PHP com código HTML para criar a exibição do relatório, porém, essa alternativa acaba se mostrando pouco produtiva quando nos deparamos com a necessidade de alteração na estrutura dos dados, ou no leiaute dos relatórios.&nbsp;É claro que existem várias ferramentas que podem ser utilizadas para a criação de relatórios, porém, nem sempre elas estão disponíveis ou atendem plenamente às necessidades do projeto, então, acabamos nos voltando para fazer os relatórios "na mão".&nbsp;Contudo, como geralmente acontece com a maioria de nossas necessidades, em termos de desenvolvimento de sistemas, alguém já encontrou a solução, bastando para nós, apenas encontrá-la e aprender a utilizar. Para o caso de relatórios, felizmente, existe oXML/XSLT, como veremos neste texto.&nbsp;
XML E XSLT
XML&nbsp;(eXtensible Markup Language) é uma recomendação do&nbsp;World Wide Web Consortium&nbsp;(W3C) para gerar linguagens de marcação para necessidades especiais. (1)&nbsp;É um dos subtipos da SGML (acrônimo de:&nbsp;Standard Generalized Markup Language, ou: Linguagem Padronizada de Marcação Genérica), capaz de descrever diversos tipos de dados. Seu propósito principal, é a facilidade de compartilhamento de informações através da internet. (2)&nbsp;Em meados da década de 1990, o W3C começou a trabalhar em uma linguagem de marcação que combinasse a flexibilidade da SGML com a simplicidade da HTML. O princípio do projeto era criar uma linguagem que pudesse ser lida por software e integrar-se com as demais linguagens.&nbsp;Sua filosofia seria incorporada por vários princípios importantes: (2)
Separação entre conteúdo e formatação;
Simplicidade e legibilidade, tanto para humanos quanto para computadores;
Possibilidade de criação de tags sem limitação;
Criação de arquivos para validação de estrutura (chamados DTDs);
Interligação de bancos de dados distintos;
Concentração na estrutura da informação, e não na sua aparência.

O XML é um formato para a criação de documentos com dados organizados de forma hierárquica, como se vê, frequentemente, em documentos de texto formatados, imagens vetoriais ou bancos de dados. (2)&nbsp;Por sua vez, o XSL Transformations, ou XSLT (eXtensible Stylesheet Language for Transformation - linguagem extensível para folhas de estilo de transformações), é uma linguagem de marcação XML usada para criar documentos XSL que, por sua vez, definem a apresentação dos documentos XML nos browsers e outros aplicativos que a suportem. (3)&nbsp;É importante observar que o documento XSL não altera o documento XML original, ou seja, não cria outro documento. Neste sentido, ele (o documento XSL) atua como as folhas de estilos CSS: apenas determina como o browser apresenta o documento XML, ao qual está associado ou anexado (de uma forma bem parecida à usada para associar uma folha de estilos CSS a um documento (X)HTML). O browser recebe o documento XML original, na íntegra, como ele foi criado e apresenta-o como o documento XSL determina. (3)&nbsp;Mas há uma diferença importante entre XSLT e CSS: o documento XSL pode adicionar conteúdo à apresentação do documento XML no browser e também, pode esconder conteúdo do XML apresentado no browser. Portanto, XSLT possibilita transformações mais potentes do que as folhas de estilo CSS. (3)&nbsp;XSLT é parte da especificação XSL (as outras partes sendo XSL-FO e XPath). Como a XML e a HTML, a especificação XSLT é uma recomendação desenvolvida pelo W3C. (3)&nbsp;Pela sua portabilidade, já que é um formato que não depende das plataformas de hardware ou de software, um banco de dados pode, através de uma aplicação, escrever em um arquivo XML, e um outro banco distinto pode ler, então, estes mesmos dados. (3)&nbsp;Como podemos ver, ao combinarmos PHP, XML e XSLT, podemos criar relatórios que podem ser facilmente modificados porque, se quisermos modificar a aparência dos relatórios, basta mudar os arquivos XSL, se quisermos modificar a estrutura do banco de dados, basta alterarmos o código PHP que gera os dados em XML (veremos isso adiante). Podemos, inclusive, disponibilizar vários leiautes de relatórios a partir dos mesmos dados, apenas com um XSL diferente para cada leiaute.&nbsp;
PASSOS PARA CRIAR RELATÓRIOS COM PHP, XML E XSLT
Vamos ao decorrer deste texto, mostrar de forma simples e mais didática possível, como utilizar PHP, XML e XSLT para criar relatórios. Para isso, utilizaremos um exemplo de um relatório simples que exibe uma lista de produtos, descrição e valor.&nbsp;Abordaremos o tema em cinco passos, começando pela definição dos dados a serem exibidos, criação do XML, do XSL e do processador XSLT e a transformação do XML em HTML.&nbsp;


DEFININDO OS PASSOS / FUNÇÃO CREATEXML()



PRIMEIRO PASSO: DEFINIÇÃO DOS DADOS A SEREM EXIBIDOS
Evidentemente, não é o propósito deste texto ensinar a obter dados para trabalhar com PHP. Para isso, existem milhares de tutoriais que ensinam isso, além do que, existe uma enorme diversidade de fontes desses dados, podendo ser softwares de gerenciamento de bancos de dados, arquivos de texto simples, arquivos de planilha eletrônica e, até mesmo, arquivos XML.&nbsp;Para fins didáticos, utilizaremos o arquivo&nbsp;data.php, onde definimos um array multidimensional nominado de&nbsp;$data. Cada item desse array, corresponde a uma linha de dados e é formado por outro array que armazena, então, os campos: "produto", "valor" e "descrição".

É importante lembrar que esta forma é apenas didática. No mundo real, os dados provavelmente, virão de um banco de dados, tal como o MySQL ou o PostgreSQL.&nbsp;
SEGUNDO PASSO: CRIANDO O XML NECESSÁRIO
Tendo os dados, precisaremos transformar esses dados em XML. Para isso criaremos a função&nbsp;createXML(), constante no arquivoxslt.php.&nbsp;Evidentemente que num caso real, provavelmente, você utilizará a orientação a objetos, criando uma classe para a geração dos relatórios, com diversos métodos. Provavelmente, você preferirá, dentro da classe, desmembrar a função&nbsp;createXML()&nbsp;em diversos métodos mais específicos.&nbsp;A função&nbsp;createXML()&nbsp;possui dois argumentos:
$data&nbsp;:: que recebe o array com os dados provenientes de "data.php";
$xlsfile&nbsp;:: que recebe uma string com o caminho/nome do arquivo XSL a ser utilizado.



Vamos, então, depurar a função&nbsp;createXML()&nbsp;para entender as etapas necessárias para o processamento dos dados, do XML e do XSL. Mas, antes disso, precisamos explicar que todo o processamento do XML é feito através das funções de manipulação de XML do PHP presentes na extensão&nbsp;DOM.&nbsp;Segundo o manual do PHP, a extensão DOM permite operar em documentos XML através da API DOM com PHP 5. (4)&nbsp;Também utilizaremos a extensão XLS do&nbsp;PHP, que implementa o padrão XSL, executando transformações XSLT usando a biblioteca&nbsp;libxslt. (4)&nbsp;Feitas essas considerações, vamos à depuração do código, como prometido.&nbsp;Como nossos dados estão armazenados em um array na variável&nbsp;$data, precisaremos transformá-los em XML. Isso é feito através da classe&nbsp;DOMDocument.

Nas linhas 30 a 36, é criada uma instância de um objeto DOMDocument (linha 30), configurado o objeto para remover espaços em branco extras (linha 33) e para que a saída seja bem formatada, com recuos, tabulações e espaços (linha 36).&nbsp;Depois disso, o objeto XML (ou DOMDocumento, que representa um objeto XML) está pronto para receber nós (ou tag XML). Isso é feito nas linhas 39 a 54.&nbsp;Esse processo irá variar de acordo com a estrutura dos dados e demandará uma boa dose de estudo da estrutura de dados existente e de quais dados serão apresentados nos relatórios.&nbsp;No nosso caso, a estrutura é bem simples, demonstrando apenas três campos e dois totalizadores: um para contar os produtos e outro para somar o valor total dos produtos.

Todo arquivo XML precisa possuir um nó principal (root) e é isso que fazemos na linha 39 com o método&nbsp;createElement()&nbsp;deDOMDocument. Esse método cria um nó no documento XML, que no nosso caso será chamado de&nbsp;products.

Nas linhas 42 e 43, são definidas duas propriedades para o nó principal (root)&nbsp;products:
A primeira é&nbsp;count&nbsp;e armazena o total de produtos;
A segunda propriedade é&nbsp;sum, que recebe o valor total dos produtos obtido com a função auxiliar&nbsp;sumProducts(), definida nas linhas 76 a 82.

Para definir propriedades (ou atributos) em um nó, utilizamos o método de&nbsp;DOMDocument&nbsp;chamado&nbsp;setAttribute(), herdado indiretamente de DOMAttr.

Dentro do nó principal&nbsp;products, serão colocados nós representando cada produto. Esses nós serão chamados de&nbsp;product&nbsp;e terão duas propriedades: "produto" e "valor". A descrição dos produtos será colocada como conteúdo do nó.

Observe que é utilizado o método&nbsp;appendChild()&nbsp;para incluir cada nó&nbsp;product&nbsp;dentro do nó principal&nbsp;products&nbsp;(linha 51). Esse mesmo método é utilizado para colocar o nó principal dentro do documento XML (linha 55).

Após isso, teremos a seguinte estrutura do arquivo XML:

É importante observar que, até agora, quando falamos de "arquivo XML", não estamos nos referindo a um arquivo propriamente dito, mas sim num objeto XML criado com&nbsp;DOMDocument.&nbsp;
TERCEIRO PASSO: CRIANDO O ARQUIVO XSL
Agora que conhecemos a estrutura dos dados XML, poderemos nos dedicar à criação do arquivo XSL que será utilizado. Um excelente tutorial sobre XSLT, pode ser encontrado no&nbsp;W3School.&nbsp;O arquivo XSL utilizado, é chamado neste exemplo de&nbsp;report.xsl. Basicamente, ele é um arquivo XML que tem mesclado nele HTML.report.xsl&nbsp;inicia com um cabeçalho básico, como na figura abaixo:

A primeira linha especifica que é um arquivo XML, enquanto que na linha 11, é especificado que se trata de um arquivo de regras XSLT. Nas linhas 12 e 13, são especificados o formato de saída e o formato decimal (usado nas linhas 42 e 51, como será mostrado).

Nessa figura, demonstramos o cabeçalho da saída em HTML que será gerada (linhas 19 a 30). Como se pode ver, não tem nada de especial. Mostra apenas o início de um documento HTML, com HEAD, BODY e o cabeçalho da tabela que exibirá os dados.&nbsp;É a partir da linha 33 que temos algo de interessante para mostrar. Desse ponto em diante, é que é definido como cada produto será exibido na tabela. Fizemos isso através da instrução XSL&nbsp;for-each.

Note que essa instrução, nada mais é do que um loop por todos os elementos&nbsp;product&nbsp;(linha 33). Dentro dessa instrução, colocamos uma mescla de HTML (TR e TD) e&nbsp;XPath&nbsp;(linhas 36, 39 e 42). Na linha 36, instruímos o processador XSL a buscar o valor do atributo "produto" de cada nó&nbsp;product.

Na linha 39, através da instrução XSL&nbsp;current(), buscamos o valor interno de cada nó&nbsp;product.

Na linha 42, através da instrução XSL&nbsp;format-number(), é buscado e formatado de acordo com o definido na linha 13, o valor de cada produto.

Por fim, montamos o rodapé da tabela e finalizamos o arquivo.

Note que nas linhas 50 e 51, utilizamos o XPath das propriedades&nbsp;count&nbsp;e&nbsp;sum&nbsp;do nó principal&nbsp;products&nbsp;para exibir a quantidade de produtos e o valor total deles.&nbsp;É importante ressaltar que não é objetivo deste texto, detalhar as instruções XSLT e XPath utilizadas. Um material excelente para quem quiser aprender mais, está disponível em&nbsp;W3Schools.com.&nbsp;
QUARTO PASSO: CRIANDO UM PROCESSADOR XSLT
Agora que temos o XML e o XSL, precisamos criar um processador XSLT que fará a transformação do XML em HTML. Criamos, então, um objeto XSLTProcessor, do PHP.

Na linha 62, é criado uma instância de&nbsp;XSLTProcessor&nbsp;enquanto que na linha 64, é criado um novo&nbsp;DOMDocument, que receberá o arquivoreport.xsl&nbsp;(linhas 64 e 65).&nbsp;Não esquecemos que o arquivo XSL é também um arquivo XML. Por fim, na linha 66, fazemos a importação do arquivo XSL para o processador XSLT.&nbsp;
QUINTO PASSO: TRANSFORMANDO XML EM HTML
Por fim, resta apenas uma última etapa, que é transformar o XML em HTML de acordo com as regras definidas no XSL. Vale lembrar que não será criado um arquivo HTML no disco, mas apenas o navegador irá exibir o código HTML dinâmico criado.

O método&nbsp;XSLTProcessor::transformToXml(), transforma o node para uma string aplicando o&nbsp;stylesheet&nbsp;dado pelo métodoxsltprocessor::importStylesheet(). (4)&nbsp;
EXEMPLO DE COMO UTILIZAR A FUNÇÃO CREATEXML()
Depois de tudo isso feito, será necessário, obviamente, termos uma forma de fazer com que tudo isso funcione. Para isso, neste exemplo temos o arquivo&nbsp;index.php, que por si só, é autoexplicativo.

Ao executar esse código no navegador, o que você deverá ver é uma tabela HTML com os produtos, descrições e valores. Se você olhar o código-fonte da página, verá que lá está o código HTML gerado pelo processador XSLT.&nbsp;


CONCLUSÃO


Bem, após os cinco passos apresentados, esperamos que você leitor tenha gostado da solução apresentada. É evidente que não se deve utilizar na vida real o código tal qual como mostrado neste texto.&nbsp;É necessária a adaptação do código, pois o que foi mostrado aqui tem fins didáticos, entretanto, é suficiente para demonstrar a utilização do XML/XSLT em conjunto com o PHP para a criação de relatórios (mas também, não só isso) que sejam fáceis de desenvolver e de manter.&nbsp;Um bom exemplo de aplicação desses princípios, é o&nbsp;PHPReports, um interessante framework que utiliza PHP, XML e XSLT para criar relatórios.&nbsp;

REFERÊNCIAS

W3C. Extensible Markup Language (XML) 1.0 (Fifth Edition). World Wide Web Consortium. [Online] 26 de nov. de 2008. [Citado em: 22 de ago. de 2014.]&nbsp;Extensible Markup Language (XML) 1.0 (Fifth Edition)

XML. Wikipédia. [Online] [Citado em: 22 de ago. de 2014.]&nbsp;XML – Wikipédia, a enciclopédia livre&nbsp;

XSLT. Wikipédia. [Online] [Citado em: 22 de ago. de 2014.]&nbsp;XSLT – Wikipédia, a enciclopédia livre

PHP.net. Manual do PHP. PHP.net. [Online] [Citado em: 29 de ago. de 2014.]&nbsp;PHP: Manual do PHP - Manual