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 Two

« Pip Pyle, Steve Irwin, RIP | Main | The Equifax Opt-Out Clause »

Google Goes To Web Standardsville, Part Two

The Google Search Appliance uses an XML-based stylesheet (an XSLT) to spin search data (XML) into web pages (HTML). This stylesheet has been revised and improved by Google countless times over the years and has its roots, of course, in Google.com.

I love that the GSA uses XSLT, but there’s one major gotcha lurking within: Content and presentation are commingled. For example, if you were to disable all style/CSS on a standard-issue Google search, advanced search, or results page, you’d find it looks mostly the same. That’s because aspects of the design are embedded within the page’s DNA. What you see truly is what you get.

Is that such a bad thing? Well … suppose you’re a Google Enterprise client with a business opportunity, but your search experience must support mobile web browsers, or you must provide a text-only UI. Perhaps you need to change things up for search printouts. Then there’s my personal favorite - you absolutely must apply that yearly corporate site design makeover. Every. Single. Year.

What are your options? You might a) do nothing and lose the opportunity, b) rework the Google XSLT, or c) write an entirely new XSLT. That goes for every Google Enterprise client in a similar quandary.

I’ve known many a company - big and small - to practice this “web redesign means rewrite pages from scratch” ritual on a yearly basis like it’s business as usual, even when using a Content Management System (which can end up managing web pages or fragments instead of actual content). So all that revised content and presentation ends up commingled yet again! It’s a vicious cycle that can waste time and money ad nauseam.

To be fair, Google is not alone when it comes to such mashups. In September 2005, Molly Holzschlag published a “comparative analysis of markup practices at several major search engines.”

… it’s curious to think that many search engines and portals, which tend to be highly trafficked, haven’t been exposed to the benefits of Web standards.

With a standards-based approach, you focus on organization first, putting “everything in its right place.” Markup (HTML) imbues content with meaning, while style (CSS) takes care of all presentation. They’re maintained separately, yet they still work famously together. It takes a lot more effort up front, but it also affords a whole lotta design (and bandwidth) leverage, not just the first time, but every time.

It’s with this in mind that I approached the folks at Google Enterprise and threw down the gauntlet: “Look, we know most search engines aren’t web standards friendly. What if I could help set an example using the Google Search Appliance?”

They took me up on the offer.

My first pass was a mobile-compatible stylesheet - the proverbial one trick pony.

That was just a warm-up. This time around, Google Enterprise customers are about to get some major exposure to web standards.

I’m very pleased to introduce the Google Search Appliance XHTML Stylesheet! <Insert Python-esque fanfare here.>

This XSLT defines a user interface for the Google Search Appliance that conforms to modern web standards including XHTML 1.0 Strict, XHTML Mobile Profile (XHTML-MP) and CSS 2.1. It generates well-formed, valid, semantically sane markup and is accessible in a variety of browsers and presentation modes.

Here’s a sampling of various pages and presentation media:

A style sampler.

One XSLT. One collection of XHTML. Any number of presentations.

Here are some notable features and benefits:

  • 12% size reduction from original XSLT
  • 28-68% reduction from original markup (using optional style library)
  • Generated XHTML is well formed, valid, and separate from presentation
  • Screen, print, and handheld media support for the most common presentation modes
  • Pages are readable and accessible even with style disabled
  • Numeric accesskey navigation of search results (optional)
  • Screen and handheld presentation consistent with existing Google design
  • Print style only displays content necessary for printing
  • Embedded search results style is minimized depending on presentation
  • Handheld-exclusive mode minimizes markup and style even further (optional)
  • Linked style library for improved bandwidth usage (optional)

It has also been road-tested and tire-kicked in a bunch of user agents including Camino, Firefox, Internet Explorer, JAWS, Lynx, Netscape, Opera, Opera Mini and Safari.

Now I realize not everyone has a Google Search Appliance at their disposal and can’t try the XSLT in real time, so I’ve included some extra features to help out. (Just like on a DVD - only different!) There are screenshots and example pages galore. To aid further study, the example markup has been pre-processed through HTML Tidy, plus there’s a CSS rosetta stone of sorts, defining each class/id and cross-referencing back to the XSLT.

All of this - topped off with an Apache open source license - means anyone so inclined can help make this revised XSLT and the resultant markup/style even better (hint-hint).

Constructive discussion and feedback are, as always, encouraged. Find a bug or have a wishlist request? Just enter a new issue over at Google Code.

Developing this second add-on has been, to put it mildly, intense - and I mean that in a good way. The number of steps and decision points in systematically taking apart a 3,200-plus line XSLT and putting it back together with bells on, hopefully better (and shorter) than one found it, is dizzying in hindsight. I’d also do it again in a heartbeat.

I expect some of the under-the-hood choices may be met with surprise - the “You did what? Are you nuts?!” variety. Believe me, there is method to the madness in every nook and cranny. If there’s sufficient interest, I would be happy to offer an in-depth look at the transformation from start to finish. (It wouldn’t be the first time.)

There’s plenty of opportunity for improvement when it comes to enterprise web site development, especially in Corporate America (where I hailed from until recently). Call it far fetched but I sincerely hope this can evolve to be a catalyst for change in how business sites are conceived and delivered.

For their generosity, advisement, and support, my thanks to the Google Enterprise team (Matt Glotzbach, Jeff Ragusa, Kristin Shevis, and Kevin Smith), Jesse Gardner, Roger Johansson, Vincent Murphy, The Web Standards Group Discussion List, and anyone who ever wrote a book or article about standards-based web development or accessibility. (You know who you are.)

Update - 26 September 2006: I can appreciate both sides of the ongoing XHTML-vs-HTML debate. (Really.) With that, I’m working toward the XSLT generating your choice of XHTML or HTML instead of just XHTML. Follow the link to monitor progress!

TrackBack

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

Comments

F-I-N-A-L-L-Y.

I look forward to seeing how far this goes. Good work, Joe!

Hi. This seems to be a promising move, and I hope the main google search results will also use standards in the future. I had a VERY quick look at your XSLs, and would recommend that the variable values you set not be set as content of the xsl:variable element. Instead use select and use the correct types. E.g.

Instead of <xsl:variable name="mynumber">12345</xsl:variable>

Use <xsl:variable name="mynumber" select="number(12345)" />

Instead of <xsl:variable name="mybool">0</xsl:variable>

Use <xsl:variable name="mybool" select="false()" />

Instead of <xsl:variable name="mystring">Hello there!</xsl:variable>

Use <xsl:variable name="mybool" select="string('Hello there!')" />

(I have been a bit more verbose above than needed, for illustrative purpose, because, I believe doing select="'hello there!'" is same as doing select="string('hello there!')")

This is apparently better performance for a few reasons: 1) Some xslt parsers evaluate each variable when that variable has content inside it; 2) When using select and identifying the basic native types of string, number and boolean, the XSLT parser can cache these values internally, rather than re-evaluate each time they are accessed; 3) When using code such as xsl:if to test values, you reduce some string testing and can instead use boolean and number testing which can be a bit more performant.

I think if you are caching your xslt processor for repeated use, these performance benefits multiply…

Hope that helps.

Jesse: Thanks!

Anup: Excellent observation about xsl:variable! That’s a holdout from the original XSLT - can’t believe I missed it. (Yes, things are being cached on the GSA end.) I’ll add this to the issues list, most definitely.

This is huge! Does this work on the Google Mini or only the GSA? Technically, it should, right? [Crosses Fingers]

Ian: If I understand correctly the Mini is what used to be the GB-1001 (or entry-level Search Appliance), so I’m going to make an educated guess and say yes. By all means give it a shot and let me know what you find!

I’ve just got this working with a Mini, although I had to remove the line <xsl:include href=”customer-onebox.xsl”/> from the top of the xsl. Thanks!

This is really cutting edge stuff will be looking at being able to aply this to the mini. Great work!!

Is there a way to get the bottom navigation with link to the top of the results?

Like 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Next

Brad, interesting idea there! No, there’s no way to do that … yet. :)

That’s largely because there was no way to do it in the original XSLT. The paged-based nav was always a bottom-of-the-page deal.

Comment

Post a comment