domingo, 27 de março de 2011

Trabalhando com XML e XSL no PHP 5 - Filtro, Ordenação e muito mais



O XML esta na moda, seja por sua flexibilidade, adaptabilidade, escalabilidade, portabilidade, ou seja lá o que for! Ele já está a um bom tempo na boca de muitos, mas trabalhar com arquivos XML e tentar trabalha-lo com PHP é desnecessariamente muito complicado, este artigo visa apresentar a quem ainda não conhece a melhor maneira de criar templates e trabalhar os arquivos XML e é usando XSL/XSLT.

Primeiramente devo avisar que para cada versão do PHP há uma forma de suporte ao XSL, aqui usarei o PHP 5.3

Então vamos ativa a extensão que permite ao PHP trabalhar com estes tipos de arquivos. No arquivo php.ini descomente a linha ;extension=php_xsl.dll (retirando o ';' do inicio da linha), reinicie o serviço do Apache. Pronto o suporte a XSL esta ativo no PHP, agora vamos colocar a mão na massa.

Primeiro vamos criar um arquivo XML:


arquivo.xml
<?xml version="1.0"?>
<agenda>
<contato>
<id>1</id>
<nome>Julio Cesar Martini</nome>
<email>baphp@imasters.com.br</email>
</contato>

<contato>
<id>2</id>
<nome>Fulano de Tal</nome>
<email>fulanodetal@imasters.com.br</email>
</contato>

<contato>
<id>3</id>
<nome>Ciclano de Tal</nome>
<email>ciclanodetal@imasters.com.br</email>
</contato>
</agenda>


Agora vamos ao XSL:


template.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Agenda</title>
</head>
<body>
<h2>Agenda</h2>

<xsl:for-each select="agenda/contato">
<xsl:sort select="nome"/>
<b>ID: </b><xsl:value-of select="id" /><br/>
<b>Nome: </b><xsl:value-of select="nome" /><br/>
<b>TAG: </b><xsl:value-of select="email" /><br/>
<hr/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


Por último o arquivo PHP:


agenda.php
<?php
// indica o arquivo XML
$xml = new DomDocument();
$xml->load("arquivo.xml");


// indica o arquivo XSLT
$xsl = new DomDocument();
$xsl->load("template.xsl");


// cria o processador XSLT, carrega stylesheet e transforma o XML
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
print $proc->transformToXML($xml);
?>


Como vocês podem perceber selecionei o elemento que eu queria (<xsl:for-each select="agenda/contato">), ordenei pelo nome (<xsl:sort select="nome"/>) e o imprimi utilizando o laço for-each. Existem muitas outras funções para ser usado como condicionais xsl:choose e outras, mas gostaria de chamar atenção pela facilidade de se manipular o XML (Filtrar, Ordenar e Etc).

Para valorizar ainda mais este tipo de programação, vamos imaginar que eu quisesse manipular o XML, só utilizando o PHP. Teria que armazenalo em um array, para ordená-lo, depois de ordená-lo teria que criar uma estrutura de repetição e imprimir o XML. Pode até parecer fácil, mas é trabalhoso, e muito!

Por isso é válido investir um pouco de seu tempo estudando o XSL, para contruir trabalhos de excelência sem muita gambiarra. Se há algo já criado e homologado, não há sentido em recriar a roda!

Algumas idéias: você se quiser pode criar seus arquivos XML extraídos do banco de dados e exibir usando templates em XSL, e caso necessite pode usar funções PHP dentro do arquivo XSL, mas estude antes de usá-las...

Espero que tenha ajudado, caso tenha dúvida ou sugestão deixe seu comentário.

Fonte: http://eustaquiorangel.com/posts/34