Here are some code snippets to use the gorgeous X2V microformats XSLT files from Brian Suda with PHP 5 and libxslt (PHP 5 includes the XSL extension by default).
hCard to vCard:
To parse a XML or XHTML document, it has to be valid. To tidy the XML file, you can use a service from the W3C:
$xml_string_tidy = file_get_contents("http://cgi.w3.org/cgi-bin/tidy?docAddr=".urlencode($uri));
Then you have to create the HTML DOM…
@$document = new DOMDocument();
@$document->loadHTML($xml_string_tidy);
and the XSLT DOM…
$stylesheet = new DOMDocument();
$stylesheet->load('hcard2vcard.xsl');
Create a new XSLT Processor, load the Stylesheet…
$processor = new XsltProcessor();
$processor->importStylesheet($stylesheet);
and run the transformation.
$result = $processor->transformToDoc($document);
$str = $result->saveXML();
Now $str contains the transformed code.
To send the vCard header with PHP, try
header("Content-Disposition: attachment; filename=contact.vcf");
header("Content-Type: text/x-vcard; charset=UTF-8 name=contact.vcf");
echo $str;
If you want to use the vCard extension .vcf instead of .php you have to add something like that to your .htaccess file
RewriteEngine On
RewriteBase /
RewriteRule ^contact.vcf /hcard2vcard.php [L,QSA]
I hope it works
Is there any way to make this work with PHP 4? The intranet I’m working on only has PHP 4… Grr!
Yes, it also works with PHP 4, but its a bit more code. Brian Suda uses PHP 4 for his Online Service: http://suda.co.uk/projects/X2V/ perhaps you could write him a mail…
Thank you for this post. It has been so helpful to me:) Through following your code, I have made X2V work on static pages on my own server.
Q. By referring your own copy of Brian Suda’s X2V to a URI on your own server, will it look for an actual file with that name or will it ask the server to retrieve the document?
Hi!
I actually just asked Brian for his PHP-code (before I found this), and he gave me this link: http://hg.microformats.org/x2v?cmd=manifest;manifest=3187422518eba12ad0c36c48b098439fea03b0dd;path=/;style=gitweb
So it’s available from an older revision in the repo.
cheers, Simon