Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 183

Deprecated: Assigning the return value of new by reference is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/lib/mtdb_base.php on line 36

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 258

Deprecated: Function ereg() is deprecated in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 258

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/mt-random.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/archiveyear.zip/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/SimpleComments.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/mt-cache.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/blackliststats.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/acronym.db/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/TinyTuring.pl.disabled/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/sql.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/technorati.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/validable.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/MTTemplate.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/mt-linksmentioned.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/keyvalues.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/MTGrid.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/roundrobin.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/projecthoneypot.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/mt-list.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/archiveyear.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/authors.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/SimpleComments.txt/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/ifempty.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/SimpleComments.pl.orig/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/CatEntries2.8.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/mt-relatedentries.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/MTCloseComments.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/switch.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/acronym.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/regex.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/CheckLinks.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/beautifier.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/perlscript.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/macros.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/MTFastInclude.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/MTIncludePlus.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/category.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(/nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/plugins/mt-rssfeed.pl/php) is not within the allowed path(s): (/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in /nfs/c01/h16/mnt/4710/domains/joesapt.net/html/mt/php/mt.php on line 110
Joe's Apt.: Google Goes To Web Standardsville, Part One

« Gig Alert: Peter Pan | Main | $25 for One Year of BrowserCam »

Google Goes To Web Standardsville, Part One

GSA Mobile UI as viewed in Opera Mini.

While at AT&T in 2003, I had the opportunity to help bring the Google Search Appliance to the corporate web. Talk about your breaths of fresh air. This was a marked and welcome contrast to all the former search engines I had helped deploy, care and feed. The GSA is the Honda and MacOS of enterprise search. It not only sells itself, it just works.

Through the years, Google has made numerous improvements, and they’ve never failed to impress. However, there’s one thing I always wished for but never quite got: full-tilt standards compliant, semantically-rich markup.

To be fair, I’m sure their wish list is a mile long! Besides, there’s no shortage of goodies to be found in all of their GSA offerings. It’s not like they’re sitting still, but this standards thing - well, that’s one itch I just had to scratch. Partly to see if I could do it, and partly because I believed it would be useful and worthwhile.

In June, fresh out of T, I appealed directly to the folks at Google Enterprise. Perhaps I could help make this particular wish come true? Pretty please?

Answer: Yes!

Now, I’m pleased to announce the first of two new add-ons for Google Enterprise customers: the Google Search Appliance Mobile Stylesheet. It consists of:

  • An XHTML Mobile Profile (XHTML-MP) compliant and handheld-friendly user interface (XSLT).
  • A handheld-friendly OneBox template (XML/XSLT).

The user interface preserves Google Search Appliance features relevant to enterprise search while also honoring many of the paradigms set forth by Google Mobile Search.

“But wait - there’s more!” You also get well-formed, valid, semantically sane markup in less than half the size of the default XSLT (of course - we’re talking mobile here!). The XSLTs have been road-tested on the inimitable Opera Mini browser and the resultant XHTML makes the W3C Validator plenty happy.

Of course, there’s always room for improvement. For instance, not all handheld browsers understand XHTML-MP (WAP 2.0) just yet. Many only work with WML (WAP 1.0), and we had to pick just one for starters - so we went with 2.0. I’m hopeful we can integrate some automagic detection of handheld devices in the future, perhaps using something like WURFL, and generate device-appropriate markup. We also can’t ensure validity of cached content/markup … yet. All in good time.

So - Google Enterprise customers, enjoy! I look forward to hearing feedback, ideas and suggestions. Please note that Google Enterprise is the official steward of this. It’s my open-source contribution to their code base. Still, I’m eager to hear what folks do with it, what snags they hit, and what they’d like to see in the future.

Last but not least, stupendously huge thanks to Jeff, Kevin, Kristin, Matt and everyone else at Google who helped shepherd this along. I had a blast working on it.

(Wait - what’s that? The second add-on? Oh! Yes, of course. That’s on deck and still under wraps. Stay tuned. Update: Read part two.)

TrackBack

TrackBack URL for this entry:
http://www.joesapt.net/mt/mt-tb.cgi/99

Comments

Now if we could only get them to make it look pretty… One step at a time, I suppose. Mr. Bowman, you may be our only hope.

Congrats for helping them see the light!

Is there any particular reason for creating the DOCTYPE using <xsl:text> with the disable-output-escaping attribute, rather than using the <xsl:output> doctype-public and doctype-system attributes?

Nick: Yes! The reason is … I completely forgot there was such an attribute. Thanks for noticing that - I’ll adjust for the next go-round. In fact, let’s try it out right now:

<xsl:output method="xml" omit-xml-declaration="no" indent="no"
 doctype-system="http://www.wapforum.org/DTD/xhtml-mobile10.dtd"
 doctype-public="-//WAPFORUM//DTD XHTML Mobile 1.0//EN"/>

Since meta is the first true-blue element in the result tree, we have to be careful, because at this point the XSLT will create a DOCTYPE using meta as the root element! (Slaps knee. “I knew I shouldn’t have hardcoded those elements inside xsl:text! That’ll teach me.”)

No biggie though. This change only makes the markup clearer. While we’re at it, let’s move the also-hardcoded html and head start/end tags to more appropriate places in the XSLT and … ahh! Much better:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
 "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head xmlns="">
...
</head>
<body xmlns="">
...

As for why there were hardcoded head tags in the first place, this was in the original (and mobile) XSLT:

“Utility functions for generating head elements so that the XSLT processor won’t add a meta tag to the output, since it may specify the wrong encoding (utf8) in the meta tag.”

Hmm. I’m not seeing a wrong encoding per se, but I wouldn’t mind losing those two new/empty xmlns attributes on head and body. Ahh, we need to add one more thing to <xsl:stylesheet>:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns="http://www.w3.org/1999/xhtml" version="1.0">

Now we have a default namespace. Ta-dah. All’s well, and the XHTML still validates.

» Google Accessible Search rewards accessibility from 456 Berea Street
Google Accessible Search is designed to prioritise search results that are more usable to blind and visually impaired people. [Read More]

Joe, this is such great news! Using your powers for good instead of banality.