Negociação de conteúdo via PHP para servir documentos XHTML como aplicação XML

Publicado em: 07/07/2005

Autor: Mathias Bynens
URL do original: http://mathibus.com/archive/2005/04/php-xhtml-content-negotiation
Título original: XHTML content negotiation through PHP
Adaptado com autorização expressa do autor

Introdução

Mathias publicou no seu site um excelente artigo mostrando um meio de servir um documento XHTML como XML via PHP.

Usei o script de Mathias no meu site acresentando alguns outros comandos simples de PHP para escrever o código conforme o documento seja servido.
Para constatar o resultado do script ao servir o documento e escrever o código, visualize o código fonte desta página do meu site em um navegador com suporte para XML (Firefox por exemplo) e em outro sem suporte (Internet Explorer :-( por exemplo) e compare os códigos fonte desde o início do documento até a seção HEAD .

O template do site

A título de ilustração considere um template como o abaixo mostrado:

<?php include('/includes/doctype.inc'); ?>
<head>
<title>Page Title</title>
<?php include('/includes/metastyle.inc'); ?>
</head>
<body id="index">
................

Os scripts

doctype.inc
Início do script de Mathias
<?php
$mime = 'text/html';
if(strstr($_SERVER['HTTP_USER_AGENT'], 
'W3C_Validator') || 
strstr($_SERVER['HTTP_USER_AGENT'], 
'WDG_SiteValidator') ||
strstr($_SERVER['HTTP_USER_AGENT'], 
'W3C-checklink') ||
strstr($_SERVER['HTTP_USER_AGENT'], 
'Web-Sniffer') ||
strstr($_SERVER['HTTP_USER_AGENT'], 
'FeedValidator') ||
strstr($_SERVER['HTTP_USER_AGENT'], 
'Poodle predictor') ||
strstr($_SERVER['HTTP_USER_AGENT'], 
'Leknor.com gzip tester')) {
$mime = 'application/xhtml+xml';
} else {
if(stristr($_SERVER['HTTP_ACCEPT'], 
'application/xhtml+xml')) {
if(preg_match("/application\/xhtml\+xml;
q=([01]|0\.\d{1,3}|1\.0)
/i", $_SERVER['HTTP_ACCEPT'], $matches)) 
{$xhtml_q = $matches[1];
if(preg_match("/text\/html;
q=q=([01]|0\.\d{1,3}|1\.0)/i", 
$_SERVER['HTTP_ACCEPT'], $matches)) 
{$html_q = $matches[1];
if((float)$xhtml_q >= (float)$html_q) {
$mime = 'application/xhtml+xml';
}
}
} else {
$mime = 'application/xhtml+xml'; 
}
}
}
header('Content-Type: ' . $mime . ';charset=utf-8'); 
header('Vary: Accept');
//Fim do script de Mathias

// Escrevendo o prólogo XML 
//e os links para as folhas de estilos quando 
//o documento for servido como uma aplicação  XML 
if ('application/xhtml+xml' == $mime) 
		{ 
echo '<?xml version="1.0" encoding="utf-8"?>'."\n";
echo '<?xml-stylesheet type="text/css" 
href="/estilos/main.css" 
media="screen"?>'."\n"; 
echo '<?xml-stylesheet type="text/css" 
href="/estilos/print.css"
media="print"?>'."\n";
echo '<?xml-stylesheet type="text/css" 
href="/estilos/handheld.css" 
media="handheld"?>'."\n";
		}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "
http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
xml:lang="pt-br">
metastyle.inc
<meta name="keywords" content=" " />
<meta name="description" content=" " />
<meta name="author" content="Mauricio Samy Silva" />
<meta.......
// Escrevendo meta tag's. 
//Escrevendo os links para as folhas de estilos quando 
//o documento for servido como text/html 
<?php
if ( 'application/xhtml+xml' == $mime) 
		{
echo '<meta http-equiv="Content-Type" 
content="application/xhtml+xml;
charset=utf-8" />'."\n";
		}else{
echo '<meta http-equiv="Content-Type" 
content="text/html; charset=utf-8" />'."\n";
echo '<style type="text/css" media="screen">'."\n";
echo "@import url("/estilos/main.css");'."\n";
echo '</style>'."\n";
echo '<link rel="stylesheet" type="text/css" 
media="print" href="/estilos/print.css" />'."\n";
echo '<link rel="stylesheet" type="text/css" 
media="handheld" href="/estilos/handheld.css" />'."\n";
		}
?>

Thanks Mathias for your kindness comments and suggestions on my extra code.