Transformação de arquivo XML com XSLT usando PHP

16/12/2005 09:45:00

Autor: Rondinely S. de Almeida


Serviços para Webmasters

O mesmo sistema é usado para o elemento '<preco>'.

Para o elemento '<quantidade>' vamos fazer uso de um outro tipo de laço da linguagem XSL para podermos mudar a cor da fonte caso o estoque esteja abaixo da quantidade mínima.

<xsl:choose>
<xsl:when test="quantidade &lt; 3">
<td align="center" style="color:red"><xsl:value-of select="quantidade"/></td>
</xsl:when>
<xsl:otherwise>
<td align="center"><xsl:value-of select="quantidade"/></td>
</xsl:otherwise>
</xsl:choose>

A instrução '<xsl:choose>' funciona como um laço 'if' comum nas liguagens derivadas do 'C', dentro dela temos instruções '<xsl:when>' e '<xsl:otherwise>' que testam condições para imprimir ou não um certo bloco de código HTML.

<xsl:when test="quantidade &lt; 3"> testa se o valor do elemento '<quantidade>' é menor que '3', se verdadeiro imprime o valor de '<quantidade>' na cor vermelha, caso contrário executa a alternativa padrão '<xls:otherwise>' que imprime a quantidade na cor normal. Perceba que como operador de comparação utilizamos '&lt;' no lugar de '<', isto acontece por uma caracteristica da linguagem XSL, use sempre notações HTML no lugar de '>' ou '<' que tudo dará certo :)

<xsl:choose>
<xsl:when test="legenda='português'">
<td align="center">x</td>
</xsl:when>
<xsl:otherwise>
<td></td>
</xsl:otherwise>
</xsl:choose>

A próxima condição será feita no primeiro elemento de '<legenda>', se tiver o valor 'português' será marcado um 'X' na cédula da tabela, caso contrário será deixada em branco. Este procedimento requer algumas premissas para funcionar perfeitamente: o documento XML pode conter apenas três tipos de legenda e devem estar necessariamente nesta ordem: português, inglês e espanhol. Só podemos ter legendas em inglês se tivermos uma em português, e só podemos ter legenda em espanhol se tivermos antes uma em inglês e em português. No nosso documento XML seguimos rigorosamente esta regra e é por isto que a conversão para HTML funcionou perfeitamente.

Fazemos o mesmo teste para as possíveis legendas em 'inglês' e 'espanhol', no caso de uma das legendas ou ambas não estarem presentes o XSL irá ignorar estas condições.

 </tr>
</xsl:for-each>
</table>
<p>Total de DVDs em estoque: <xsl:value-of select="sum(//quantidade)"/></p>
</body>

Terminada as condições de legenda fechamos o laço '</xsl:for-each>' e lançamos mão de um último recurso XSL para obter o total de DVDs em estoque na locadora: '<xsl:value-of select="sum(//quantidade)"/>'. Este recurso lembra muito um consulta a banco de dados, onde no SELECT colocamos uma campo (field) como parâmetro para uma função de soma (sum, por exemplo). Neste caso o campo seria 'quantidade' que representou a quantidade de cada filme no documento XML. Para referenciarmos ele na função 'sum' do XSL usamos '//quantidade' (com as duas barras antes da denominação dos elementos quantidades).

Ok, agora temos o documento locadora.xml e o documento locadora-tudo.xsl (demos este nome porque no documento não existe nenhum filtro que limite os filmes que serão listados). Estes dois arquivos já seriam o suficiente para convertermos o documento XML para HTML, bastaria para isto acrescentar a seguinte linha ao arquivo locadora.xml:

Não deixe de ver também:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="locadora-tudo.xsl"?> //Esta linha aqui.
<locadora>
<DVD>

Esta linha '<?xml-stylesheet type="text/xsl" href="locadora-tudo.xsl"?>' indica que o documento XML tem uma folha de estilos do tipo 'text/xsl' que se encontra no documento 'locadora-tudo.xsl', se o seu navegador suporta XML e XSL ele usará os dois arquivos para mostrar uma saída HTML como podemos ver no exemplo 'locadora.xml' do início do artigo.

Podemos dizer que houve uma conversão ou transformação 'client-side', ou seja, do lado do cliente. Como tudo que fazermos do lado do cliente depende da versão do navegador corremos o sério risco de que o usuário não veja o resultado desejado.

A solução para este problema é fazermos uma transformação 'server-side', ou seja, ainda no servidor. Isto evitará uma série de transtornos para nós. A seguir vamos ver como fazer isto utilizando-se de PHP Script.

locadora.php

<?php
if (PHP_VERSION >= 5) { // Emula funções xslt antigas caso a versão do PHP seja igual ou superior a 5.
function xslt_create() {
return new XsltProcessor();
}
function xslt_process($xsltproc,
$xml_arg,
$xsl_arg,
$xslcontainer = null,
$args = null,
$params = null) {
// Prepara os argumentos para a nova versão do PHP $xml_arg = str_replace('arg:', '', $xml_arg);
$xsl_arg = str_replace('arg:', '', $xsl_arg);
// Cria instancas da classe DomDocument $xml = new DomDocument;
$xsl = new DomDocument; // Carrega os documentos XML.
$xml->loadXML($args[$xml_arg]);
$xsl->loadXML($args[$xsl_arg]);

// Carrega a folha de estilo no processador.
$xsltproc->importStyleSheet($xsl);
// Atribui parametros quando definidos.
if ($params) {
foreach ($params as $param => $value) {
$xsltproc->setParameter("", $param, $value);
}
}
// Inicia a transformação
$processed = $xsltproc->transformToXML($xml);
// Coloca um resultado no arquivo quando especificado.
if ($xslcontainer) {
return @file_put_contents($xslcontainer, $processed);
} else {
return $processed;
}
}
// libera o processador XSL. function xslt_free($xsltproc) {
unset($xsltproc);
}
}
// Se for encontrada a função 'domxml_xslt_stylesheet_file' consideramos
// que estamos lidando com uma versão inferior a 5 do PHP e executamos
// o código abaixo.
if (function_exists('domxml_xslt_stylesheet_file')) {
//Cria um objeto DOM XML.
$xml = domxml_open_file("locadora.xml");
//Cria um objeto DOM XML com a folha de estilos XSL.
$xsl = domxml_xslt_stylesheet_file('locadora-tudo.xsl');
//Processa o documento XML e salva o resultado.
$html = $xsl->process($xml);
//A partir do resultado imprime o documento convertido.
print $xsl->result_dump_mem($html);
} else { //Monta o array de argumentos com o conteúdo dos arquivos XML e XSL. $arguments = array(
'/_xml' => file_get_contents("locadora.xml"),
'/_xsl' => file_get_contents("locadora-tudo.xsl")
);
//Cria um novo processador XSLT $xsltproc = xslt_create();
//Processa o documento XML com base nos padrões do arquivo XSL e armazena o resultado. $html = xslt_process(
$xsltproc, 'arg:/_xml', 'arg:/_xsl', null, $arguments
);
//libera o processador XSLT da memória. xslt_free($xsltproc); //Imprime o arquivo convertido em HTML na saída padrão.
print $html; }
?>

Artigos relacionados

>> Inicio <<
© Copyright hospedia.com.br - 2005
Todos os direitos reservados.
Seu Ponto de Partida na Internet
Receitas de Bolos
Lyrics
centro-top