<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: xslt</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/xslt.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-11-05T22:24:57+00:00</updated><author><name>Simon Willison</name></author><entry><title>Removing XSLT for a more secure browser</title><link href="https://simonwillison.net/2025/Nov/5/removing-xslt/#atom-tag" rel="alternate"/><published>2025-11-05T22:24:57+00:00</published><updated>2025-11-05T22:24:57+00:00</updated><id>https://simonwillison.net/2025/Nov/5/removing-xslt/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.chrome.com/docs/web-platform/deprecating-xslt"&gt;Removing XSLT for a more secure browser&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Previously discussed &lt;a href="https://simonwillison.net/2025/Aug/19/xslt/"&gt;back in August&lt;/a&gt;, it looks like it's now official:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chrome intends to deprecate and remove XSLT from the browser. [...] We intend to remove support from version 155 (November 17, 2026). The &lt;a href="https://github.com/mozilla/standards-positions/issues/1287#issuecomment-3227145793"&gt;Firefox&lt;/a&gt; and &lt;a href="https://github.com/whatwg/html/issues/11523#issuecomment-3149280766"&gt;WebKit&lt;/a&gt; projects have also indicated plans to remove XSLT from their browser engines. [...]&lt;/p&gt;
&lt;p&gt;The continued inclusion of XSLT 1.0 in web browsers presents a significant and unnecessary security risk. The underlying libraries that process these transformations, such as &lt;a href="https://github.com/GNOME/libxslt"&gt;libxslt&lt;/a&gt; (used by Chromium browsers), are complex, aging C/C++ codebases. This type of code is notoriously susceptible to memory safety vulnerabilities like buffer overflows, which can lead to arbitrary code execution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I mostly encounter XSLT on people's Atom/RSS feeds, converting those to a more readable format in case someone should navigate directly to that link. Jake Archibald &lt;a href="https://jakearchibald.com/2025/making-xml-human-readable-without-xslt/"&gt;shared an alternative solution to that&lt;/a&gt; back in September.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=45823059"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chrome"&gt;chrome&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jake-archibald"&gt;jake-archibald&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="chrome"/><category term="security"/><category term="web-standards"/><category term="xml"/><category term="xslt"/><category term="jake-archibald"/></entry><entry><title>Making XML human-readable without XSLT</title><link href="https://simonwillison.net/2025/Sep/2/making-xml-human-readable-without-xslt/#atom-tag" rel="alternate"/><published>2025-09-02T19:32:57+00:00</published><updated>2025-09-02T19:32:57+00:00</updated><id>https://simonwillison.net/2025/Sep/2/making-xml-human-readable-without-xslt/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://jakearchibald.com/2025/making-xml-human-readable-without-xslt/"&gt;Making XML human-readable without XSLT&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
In response to the &lt;a href="https://simonwillison.net/2025/Aug/19/xslt/"&gt;recent discourse&lt;/a&gt; about XSLT support in browsers, Jake Archibald shares a new-to-me alternative trick for making an XML document readable in a browser: adding the following element near the top of the XML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script
  xmlns="http://www.w3.org/1999/xhtml"
  src="script.js" defer="" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &lt;code&gt;script.js&lt;/code&gt; will then be executed by the browser, and can swap out the XML with HTML by creating new elements using the correct namespace:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const htmlEl = document.createElementNS(
  'http://www.w3.org/1999/xhtml',
  'html',
);
document.documentElement.replaceWith(htmlEl);
// Now populate the new DOM
&lt;/code&gt;&lt;/pre&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jake-archibald"&gt;jake-archibald&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="javascript"/><category term="rss"/><category term="xml"/><category term="xslt"/><category term="jake-archibald"/></entry><entry><title>XSLT on congress.gov</title><link href="https://simonwillison.net/2025/Aug/19/xslt/#atom-tag" rel="alternate"/><published>2025-08-19T20:40:50+00:00</published><updated>2025-08-19T20:40:50+00:00</updated><id>https://simonwillison.net/2025/Aug/19/xslt/#atom-tag</id><summary type="html">
    &lt;p&gt;Today I learned - via &lt;a href="https://github.com/whatwg/html/pull/11563"&gt;a proposal to remove mentions of XSLT from the HTML spec&lt;/a&gt; - that &lt;code&gt;congress.gov&lt;/code&gt; uses XSLT to serve XML bills as XHTML - here's &lt;a href="https://www.congress.gov/117/bills/hr3617/BILLS-117hr3617ih.xml"&gt;H. R. 3617 117th CONGRESS 1st Session&lt;/a&gt; for example.&lt;/p&gt;
&lt;p&gt;View source on that page and it starts like this:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?&lt;span class="pl-ent"&gt;xml&lt;/span&gt;&lt;span class="pl-e"&gt; version&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;1.0&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;?&amp;gt;
&amp;lt;?&lt;span class="pl-ent"&gt;xml-stylesheet&lt;/span&gt;&lt;span class="pl-e"&gt; type&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;text/xsl&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-e"&gt; href&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;billres.xsl&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;?&amp;gt;
&amp;lt;!&lt;span class="pl-ent"&gt;DOCTYPE&lt;/span&gt; &lt;span class="pl-e"&gt;bill&lt;/span&gt; PUBLIC "-//US Congress//DTDs/bill.dtd//EN" "bill.dtd"&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;bill&lt;/span&gt; &lt;span class="pl-e"&gt;bill-stage&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Introduced-in-House&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-e"&gt;dms-id&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;H5BD50AB7712141319B352D46135AAC2B&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-e"&gt;public-private&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;public&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-e"&gt;key&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;H&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-e"&gt;bill-type&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;olc&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;gt; 
&amp;lt;&lt;span class="pl-ent"&gt;metadata&lt;/span&gt; &lt;span class="pl-e"&gt;xmlns&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;dc&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://purl.org/dc/elements/1.1/&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dublinCore&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;title&lt;/span&gt;&amp;gt;117 HR 3617 IH: Marijuana Opportunity Reinvestment and Expungement Act of 2021&amp;lt;/&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;title&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;publisher&lt;/span&gt;&amp;gt;U.S. House of Representatives&amp;lt;/&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;publisher&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;date&lt;/span&gt;&amp;gt;2021-05-28&amp;lt;/&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;date&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;format&lt;/span&gt;&amp;gt;text/xml&amp;lt;/&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;format&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;language&lt;/span&gt;&amp;gt;EN&amp;lt;/&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;language&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;rights&lt;/span&gt;&amp;gt;Pursuant to Title 17 Section 105 of the United States Code, this file is not subject to copyright protection and is in the public domain.&amp;lt;/&lt;span class="pl-ent"&gt;dc&lt;/span&gt;&lt;span class="pl-ent"&gt;:&lt;/span&gt;&lt;span class="pl-ent"&gt;rights&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span class="pl-ent"&gt;dublinCore&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span class="pl-ent"&gt;metadata&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;form&lt;/span&gt;&amp;gt;
&amp;lt;&lt;span class="pl-ent"&gt;distribution-code&lt;/span&gt; &lt;span class="pl-e"&gt;display&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;yes&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;gt;I&amp;lt;/&lt;span class="pl-ent"&gt;distribution-code&lt;/span&gt;&amp;gt; 
&amp;lt;&lt;span class="pl-ent"&gt;congress&lt;/span&gt; &lt;span class="pl-e"&gt;display&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;yes&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;gt;117th CONGRESS&amp;lt;/&lt;span class="pl-ent"&gt;congress&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="pl-ent"&gt;session&lt;/span&gt; &lt;span class="pl-e"&gt;display&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;yes&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;gt;1st Session&amp;lt;/&lt;span class="pl-ent"&gt;session&lt;/span&gt;&amp;gt; 
&amp;lt;&lt;span class="pl-ent"&gt;legis-num&lt;/span&gt; &lt;span class="pl-e"&gt;display&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;yes&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;gt;H. R. 3617&amp;lt;/&lt;span class="pl-ent"&gt;legis-num&lt;/span&gt;&amp;gt; 
&amp;lt;&lt;span class="pl-ent"&gt;current-chamber&lt;/span&gt;&amp;gt;IN THE HOUSE OF REPRESENTATIVES&amp;lt;/&lt;span class="pl-ent"&gt;current-chamber&lt;/span&gt;&amp;gt;&lt;/pre&gt;

&lt;p&gt;Digging into those XSLT stylesheets leads to &lt;code&gt;billres-details.xsl&lt;/code&gt; - &lt;a href="https://gist.github.com/simonw/64c9f172533203c09acbcf13a0bb67c4"&gt;gist copy here&lt;/a&gt; - which starts with a huge changelog comment with notes dating all the way back to 2004!&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/political-hacking"&gt;political-hacking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="html"/><category term="political-hacking"/><category term="web-standards"/><category term="xslt"/></entry><entry><title>Matt Webb's Colophon</title><link href="https://simonwillison.net/2024/Oct/29/matt-webbs-colophon/#atom-tag" rel="alternate"/><published>2024-10-29T04:59:47+00:00</published><updated>2024-10-29T04:59:47+00:00</updated><id>https://simonwillison.net/2024/Oct/29/matt-webbs-colophon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://interconnected.org/home/2024/10/28/colophon"&gt;Matt Webb&amp;#x27;s Colophon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I love a good colophon (&lt;a href="https://simonwillison.net/about/#about-site"&gt;here's mine&lt;/a&gt;, I should really expand it). Matt Webb has been publishing his thoughts online for 24 years, so his colophon is a delightful accumulation of ideas and principles.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So following the principles of web longevity, what matters is the data, i.e. the posts, and simplicity. I want to minimise maintenance, not panic if a post gets popular, and be able to add new features without thinking too hard. [...]&lt;/p&gt;
&lt;p&gt;I don’t deliberately &lt;a href="https://boringtechnology.club/"&gt;choose boring technology&lt;/a&gt; but I think a lot about &lt;a href="https://interconnected.org/home/2017/08/17/upsideclown"&gt;longevity on the web&lt;/a&gt; &lt;em&gt;(that’s me writing about it in 2017)&lt;/em&gt; and boring technology is a consequence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm tempted to adopt Matt's &lt;a href="https://github.com/genmon/aboutfeeds/blob/main/tools/pretty-feed-v3.xsl"&gt;XSL template&lt;/a&gt; that he uses to style &lt;a href="https://interconnected.org/home/feed"&gt;his RSS feed&lt;/a&gt; for my own sites.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/blogging"&gt;blogging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matt-webb"&gt;matt-webb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/boring-technology"&gt;boring-technology&lt;/a&gt;&lt;/p&gt;



</summary><category term="blogging"/><category term="matt-webb"/><category term="rss"/><category term="xslt"/><category term="boring-technology"/></entry><entry><title>XSL Flickr</title><link href="https://simonwillison.net/2006/Dec/1/xsl/#atom-tag" rel="alternate"/><published>2006-12-01T12:20:21+00:00</published><updated>2006-12-01T12:20:21+00:00</updated><id>https://simonwillison.net/2006/Dec/1/xsl/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://norman.walsh.name/2005/projects/xslflickr"&gt;XSL Flickr&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
An XSL interface to the Flickr API. It even does auth!


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/flickr"&gt;flickr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="flickr"/><category term="xslt"/></entry><entry><title>[xsl] Replace newline characters(\n) with &lt;br&gt;</title><link href="https://simonwillison.net/2006/Aug/18/xsl/#atom-tag" rel="alternate"/><published>2006-08-18T10:26:38+00:00</published><updated>2006-08-18T10:26:38+00:00</updated><id>https://simonwillison.net/2006/Aug/18/xsl/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.xslt.com/html/xsl-list/2002-03/msg01000.html"&gt;[xsl] Replace newline characters(\n) with &amp;lt;br&amp;gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This is why I’m not a fan of XSLT for templating.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="xslt"/></entry><entry><title>Microsummaries in Firefox 2</title><link href="https://simonwillison.net/2006/May/13/microsummaries/#atom-tag" rel="alternate"/><published>2006-05-13T10:18:50+00:00</published><updated>2006-05-13T10:18:50+00:00</updated><id>https://simonwillison.net/2006/May/13/microsummaries/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://wiki.mozilla.org/Microsummaries"&gt;Microsummaries in Firefox 2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Neat new feature: short summaries of pages extracted using XSLT.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="firefox"/><category term="xslt"/></entry><entry><title>X2V</title><link href="https://simonwillison.net/2005/Jul/10/xv/#atom-tag" rel="alternate"/><published>2005-07-10T03:21:25+00:00</published><updated>2005-07-10T03:21:25+00:00</updated><id>https://simonwillison.net/2005/Jul/10/xv/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://suda.co.uk/projects/X2V/"&gt;X2V&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
XSLT to change hCalendar and hCard in to iCalendar and vCard.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="xslt"/></entry><entry><title>Safari 1.3 is out (via Software Update)</title><link href="https://simonwillison.net/2005/Apr/16/safari/#atom-tag" rel="alternate"/><published>2005-04-16T15:51:54+00:00</published><updated>2005-04-16T15:51:54+00:00</updated><id>https://simonwillison.net/2005/Apr/16/safari/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://weblogs.mozillazine.org/hyatt/archives/2005_04.html#007962"&gt;Safari 1.3 is out (via Software Update)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New features include contenteditable support, XSLT and a major performance improvements.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/contenteditable"&gt;contenteditable&lt;/a&gt;&lt;/p&gt;



</summary><category term="safari"/><category term="xslt"/><category term="contenteditable"/></entry><entry><title>Google Maps and XSL</title><link href="https://simonwillison.net/2005/Feb/8/maps/#atom-tag" rel="alternate"/><published>2005-02-08T14:19:37+00:00</published><updated>2005-02-08T14:19:37+00:00</updated><id>https://simonwillison.net/2005/Feb/8/maps/#atom-tag</id><summary type="html">
    &lt;p id="p-0"&gt;I'll probably write more on this later, but it seems that &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt; is using &lt;acronym title="eXtensible Stylesheet Language"&gt;XSL&lt;/acronym&gt;. I spotted it loading the following pages while sniffing its activity with &lt;a href="http://livehttpheaders.mozdev.org/"&gt;LiveHTTPHeaders&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="http://maps.google.com/mapfiles/homepanel.xsl"&gt;homepanel.xsl&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://maps.google.com/mapfiles/localinfo.xsl"&gt;localinfo.xsl&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://maps.google.com/mapfiles/localpanel.xsl"&gt;localpanel.xsl&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://maps.google.com/mapfiles/geocodepanel.xsl"&gt;geocodepanel.xsl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p id="p-1"&gt;This is in addition to the (now expected) XMLHttpRequest stuff. There even appears to be some of Microsoft's weird &lt;a href="http://msdn.microsoft.com/workshop/author/vml/default.asp" title="Introduction to Vector Markup Language (VML)"&gt;VML&lt;/a&gt;, although as I'm on a Mac I don't have access to &lt;acronym title="Internet Explorer"&gt;IE&lt;/acronym&gt;/Windows to see what it's doing with it.&lt;/p&gt;

&lt;p id="p-2"&gt;The bulk of the Google Maps JavaScript appears to be hidden away in &lt;a href="http://www.google.com/mapfiles/maps.1.js"&gt;maps.1.js&lt;/a&gt;, which becomes a lot more readable if you feed it through &lt;a href="http://www.prettyprinter.de/"&gt;PrettyPrinter.de&lt;/a&gt;&lt;/p&gt;

&lt;p id="p-3"&gt;As for Google Maps itself, it's an amazing piece of work but it's a shame they didn't follow &lt;a href="http://map.search.ch/"&gt;map.search.ch&lt;/a&gt;'s lead in degrading gracefully to a static version for unsupported browsers.&lt;/p&gt;

&lt;p id="p-4"&gt;If anyone has any further insights in to how it all works, please post them in a comment.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-maps"&gt;google-maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/maps"&gt;maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="google"/><category term="google-maps"/><category term="maps"/><category term="xslt"/></entry><entry><title>XML.com: Automated Tree Drawing: XSLT and SVG</title><link href="https://simonwillison.net/2004/Sep/9/xmlcom/#atom-tag" rel="alternate"/><published>2004-09-09T02:14:53+00:00</published><updated>2004-09-09T02:14:53+00:00</updated><id>https://simonwillison.net/2004/Sep/9/xmlcom/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.xml.com/pub/a/2004/09/08/tree.html"&gt;XML.com: Automated Tree Drawing: XSLT and SVG&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Includes a recursive text parser in XSLT. May cause your brain to melt.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/svg"&gt;svg&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="svg"/><category term="xslt"/></entry><entry><title>IE Objectifier</title><link href="https://simonwillison.net/2004/Aug/20/ie/#atom-tag" rel="alternate"/><published>2004-08-20T22:45:38+00:00</published><updated>2004-08-20T22:45:38+00:00</updated><id>https://simonwillison.net/2004/Aug/20/ie/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.jenseng.com/object/objectifier.html"&gt;IE Objectifier&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
mod_action + XSLT + PHP = neat hack.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://diveintomark.org/archives/blinks/2004/08/#b20040820035223"&gt;b-links [dive into mark]&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="xslt"/></entry><entry><title>Introducing dbagg3, an Atom-powered client/server aggregator</title><link href="https://simonwillison.net/2004/Aug/6/introducing/#atom-tag" rel="alternate"/><published>2004-08-06T16:08:09+00:00</published><updated>2004-08-06T16:08:09+00:00</updated><id>https://simonwillison.net/2004/Aug/6/introducing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.decafbad.com/blog/2004/08/05/introducing_dbagg3_an_atompowered_clientserver_aggregator"&gt;Introducing dbagg3, an Atom-powered client/server aggregator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Way smart aggregator built on top of Atom and XSLT.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="xslt"/></entry><entry><title>Amazon's Web Services and XSLT</title><link href="https://simonwillison.net/2004/Aug/5/amazons/#atom-tag" rel="alternate"/><published>2004-08-05T05:43:52+00:00</published><updated>2004-08-05T05:43:52+00:00</updated><id>https://simonwillison.net/2004/Aug/5/amazons/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.xml.com/pub/a/2004/08/04/tr-xml.html"&gt;Amazon&amp;#x27;s Web Services and XSLT&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The Amazonn REST API lets you feed in the URL of an XSLT document.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="xslt"/></entry><entry><title>XHTML FAQ: please remove application/xml XSLT hack</title><link href="https://simonwillison.net/2004/Jul/23/xhtml/#atom-tag" rel="alternate"/><published>2004-07-23T21:29:21+00:00</published><updated>2004-07-23T21:29:21+00:00</updated><id>https://simonwillison.net/2004/Jul/23/xhtml/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://lists.w3.org/Archives/Public/www-html-editor/2004JulSep/0027.html"&gt;XHTML FAQ: please remove application/xml XSLT hack&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Bjoern Hoehrmann blows it out of the water.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.paranoidfish.org/links/2004/07/23/"&gt;paranoidfish.org/links/2004/07/23&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xhtml"&gt;xhtml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="xhtml"/><category term="xslt"/></entry><entry><title>Mark Pilgrim's Atom feed</title><link href="https://simonwillison.net/2004/May/4/mark/#atom-tag" rel="alternate"/><published>2004-05-04T17:39:58+00:00</published><updated>2004-05-04T17:39:58+00:00</updated><id>https://simonwillison.net/2004/May/4/mark/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://diveintomark.org/public/2004/05/atom-with-xsl.xml"&gt;Mark Pilgrim&amp;#x27;s Atom feed&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Atom + XSL + CSS = a self explanatory feed that functions in a browser.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://diveintomark.org/archives/2004/05/02/user-friendly-feeds"&gt;Another crack at user-friendly feeds&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mark-pilgrim"&gt;mark-pilgrim&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="mark-pilgrim"/><category term="xslt"/></entry><entry><title>A Transforming Experience for Content Management?</title><link href="https://simonwillison.net/2004/Mar/8/transforming/#atom-tag" rel="alternate"/><published>2004-03-08T16:56:51+00:00</published><updated>2004-03-08T16:56:51+00:00</updated><id>https://simonwillison.net/2004/Mar/8/transforming/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cmswatch.com/Features/ProductWatch/FeaturedProduct/?feature_id=100"&gt;A Transforming Experience for Content Management?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Good overview of XSLT 2.0.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.steptwo.com.au/columntwo/archives/001148.html#001148"&gt;Column Two&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;



</summary><category term="xslt"/></entry><entry><title>Using XPath to mine XHTML</title><link href="https://simonwillison.net/2003/Oct/21/xpathRocks/#atom-tag" rel="alternate"/><published>2003-10-21T05:31:23+00:00</published><updated>2003-10-21T05:31:23+00:00</updated><id>https://simonwillison.net/2003/Oct/21/xpathRocks/#atom-tag</id><summary type="html">
    &lt;p&gt;This morning, I finally decided to &lt;a href="http://users.skynet.be/sbi/libxml-python/" title="Libxml and Libxslt Python Bindings for Windows"&gt;install libxml2&lt;/a&gt; and see what &lt;a href="http://www.xmldatabases.org/WK/blog/607?t=item" title="Givin libxml2 some love"&gt;all the fuss&lt;/a&gt; was about, in particular with respect to XPath. What followed is best described as an enlightening experience.&lt;/p&gt;

&lt;p&gt;XPath is a beautifully elegant way of adressing "nodes" within an &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt; document. XPath expressions look a little like file paths, for example:&lt;/p&gt;

&lt;dl&gt;
 &lt;dt&gt;&lt;code class="xpath"&gt;/first/second&lt;/code&gt;&lt;/dt&gt;
 &lt;dd&gt;Match any &lt;code class="xml"&gt;&amp;lt;second&amp;gt;&lt;/code&gt; elements that occur inside a &lt;code class="xml"&gt;&amp;lt;first&amp;gt;&lt;/code&gt; element that is the root element of the document&lt;/dd&gt;
 &lt;dt&gt;&lt;code class="xpath"&gt;//second&lt;/code&gt;&lt;/dt&gt;
 &lt;dd&gt;Match all &lt;code class="xml"&gt;&amp;lt;second&amp;gt;&lt;/code&gt; elements irrespective of their place in the document&lt;/dd&gt;
 &lt;dt&gt;&lt;code class="xpath"&gt;//second[@hi]&lt;/code&gt;&lt;/dt&gt;
 &lt;dd&gt;Match all &lt;code class="xml"&gt;&amp;lt;second&amp;gt;&lt;/code&gt; elements with a 'hi' attribute&lt;/dd&gt;
 &lt;dt&gt;&lt;code class="xpath"&gt;//second[@hi="there"]&lt;/code&gt;&lt;/dt&gt;
 &lt;dd&gt;Match all &lt;code class="xml"&gt;&amp;lt;second&amp;gt;&lt;/code&gt; elements with a 'hi' attribute that equals "there"&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;A full &lt;a href="http://www.zvon.org/xxl/XPathTutorial/General/examples.html"&gt;XPath tutorial&lt;/a&gt; is available.&lt;/p&gt;

&lt;p&gt;The Python libxml2 bindings make running XPath expressions incredibly simple. Here's some code that extracts the titles of all of the entries on my Kansas blog from the site's &lt;acronym title="Really Simply Syndication"&gt;RSS&lt;/acronym&gt; feed:&lt;/p&gt;

&lt;pre&gt;&lt;code class="python"&gt;&amp;gt;&amp;gt;&amp;gt; import libxml2
&amp;gt;&amp;gt;&amp;gt; import urllib
&amp;gt;&amp;gt;&amp;gt; rss = libxml2.parseDoc(
      urllib.urlopen('http://www.a-year-in-kansas.com/syndicate/').read())
&amp;gt;&amp;gt;&amp;gt; rss.xpathEval('//item/title')
[&amp;lt;xmlNode (title) object at 0xb4b260&amp;gt;, &amp;lt;xmlNode (title) object at 0xa99968&amp;gt;, 
&amp;lt;xmlNode (title) object at 0x10dce68&amp;gt;]
&amp;gt;&amp;gt;&amp;gt; [node.content for node in rss.xpathEval('//item/title')]
['Music and Brunch', 'House hunting', 'Arrival']
&amp;gt;&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Why is this so exciting? I've been &lt;a href="/2002/Jun/16/myFirstXhtmlMindBomb/" title="My first XHTML mind bomb"&gt;saying&lt;/a&gt; &lt;a href="/2002/Aug/11/benefitsOfXhtml/" title="Benefits of XHTML"&gt;for&lt;/a&gt; &lt;a href="/2003/Jan/06/xhtmlIsJustFine/" title="XHTML is just fine"&gt;over&lt;/a&gt; &lt;a href="/2003/Jan/08/xhtmlIsStillGreatForContent/" title="XHTML is still great for content"&gt;a&lt;/a&gt; &lt;a href="/2003/Aug/03/futureProotContent/" title="XHTML for future-proof content"&gt;year&lt;/a&gt; that &lt;acronym title="eXtensible HyperText Markup Language"&gt;XHTML&lt;/acronym&gt; is an ideal format for storing pieces of content in a database or content management system. Serving content to browsers as &lt;acronym title="HyperText Markup Language"&gt;HTML&lt;/acronym&gt; 4 makes perfect sense, but storing your actual content as &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt; gives you the ability to process that content in the future using &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt; tools.&lt;/p&gt;

&lt;p&gt;So far, the best example of a powerful tool for manipulating this stored &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt; has been &lt;acronym title="eXtensible Stylesheet Language Transformations"&gt;XSLT&lt;/acronym&gt;. &lt;acronym title="eXtensible Stylesheet Language Transformations"&gt;XSLT&lt;/acronym&gt; has its fans, but is also often criticised as being unintuitive and having a steep learning curve. XPath is a far better example of a powerful, easy to use tool that can be brought to bare on &lt;acronym title="eXtensible HyperText Markup Language"&gt;XHTML&lt;/acronym&gt; content.&lt;/p&gt;

&lt;p&gt;Enough talk, here's an example of what I mean. The following code snippet creates a Python dictionary of all of the acronyms currently visible on the front page of my blog, mapping their shortened version to the expanded text (extracted from the title attribute):&lt;/p&gt;

&lt;pre&gt;&lt;code class="python"&gt;
&amp;gt;&amp;gt;&amp;gt; blog = libxml2.parseDoc(
    urllib.urlopen('http://simon.incutio.com/').read())
&amp;gt;&amp;gt;&amp;gt; ctxt = blog.xpathNewContext()
&amp;gt;&amp;gt;&amp;gt; ctxt.xpathRegisterNs('xhtml', 'http://www.w3.org/1999/xhtml')
0
&amp;gt;&amp;gt;&amp;gt; acronyms = dict([(a.content, a.prop('title')) 
    for a in ctxt.xpathEval('//xhtml:acronym')])
&amp;gt;&amp;gt;&amp;gt; for acronym, fulltext in acronyms.items():
	print acronym, ':', fulltext


DHTML : Dynamic HyperText Markup Language
URL : Universal Republic of Love
HTML : HyperText Markup Language
SIG : Special Interest Group
PHP : PHP: Hypertext Preprocessor
CSS : Cascading Style Sheets
&amp;gt;&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above code is slightly more complicated than the first example, as using XPath with a document that uses &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt; namespaces requires some extra work to register the namespace with the XPath parser. Still, it's a pretty short piece of code considering what it does.&lt;/p&gt;

&lt;p&gt;For an example of how powerful XPath can be on a much larger scale, take a look at Sam Ruby's &lt;a href="http://www.intertwingly.net/blog/1601.html"&gt;XPath enabled blog search feature&lt;/a&gt;.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/libxml2"&gt;libxml2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xhtml"&gt;xhtml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xpath"&gt;xpath&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="libxml2"/><category term="python"/><category term="xhtml"/><category term="xml"/><category term="xpath"/><category term="xslt"/></entry><entry><title>Moveably Type with XSLT</title><link href="https://simonwillison.net/2003/Aug/11/MTxslt/#atom-tag" rel="alternate"/><published>2003-08-11T19:13:35+00:00</published><updated>2003-08-11T19:13:35+00:00</updated><id>https://simonwillison.net/2003/Aug/11/MTxslt/#atom-tag</id><summary type="html">
    &lt;p&gt;Kevin Davis has set up an &lt;a href="http://alazanto.org/weblog/mt_carbon/a_small_demonstration.php" title="A Small Demonstration"&gt;impressive demonstration&lt;/a&gt; of the power of Moveable Type templates when combined with browser-side &lt;acronym title="Extensible Stylesheet Language Transformations"&gt;XSLT&lt;/acronym&gt; transformations. He's set up &lt;acronym title="Moveable Type"&gt;MT&lt;/acronym&gt; to output an &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt; document containing just his entries (similar to an &lt;acronym title="Really Simple Syndication"&gt;RSS&lt;/acronym&gt; feed), along with a link to an &lt;acronym title="Extensible Stylesheet Language Transformations"&gt;XSLT&lt;/acronym&gt; stylesheet that causes Mozilla and &lt;acronym title="Internet Explorer"&gt;IE&lt;/acronym&gt; 6 to transform the entry and render it as &lt;acronym title="eXtensible HyperText Markup Language"&gt;XHTML&lt;/acronym&gt;.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="xslt"/></entry><entry><title>Clearout</title><link href="https://simonwillison.net/2003/Jul/10/clearout/#atom-tag" rel="alternate"/><published>2003-07-10T13:52:43+00:00</published><updated>2003-07-10T13:52:43+00:00</updated><id>https://simonwillison.net/2003/Jul/10/clearout/#atom-tag</id><summary type="html">
    &lt;ul&gt;
 &lt;li&gt;Tristan Louis' &lt;a href="http://www.tnl.net/blog/entry/RSS2Necho"&gt;RSS to Necho convertor&lt;/a&gt; puts paid to the idea that the success of one format will be detrimental to the usefulness of the other.&lt;/li&gt;
 &lt;li&gt;O'Reilly's RegExp Power series (&lt;a href="http://www.perl.com/pub/a/2003/06/06/regexps.html" title="Regexp Power"&gt;part one&lt;/a&gt; and &lt;a href="http://www.perl.com/pub/a/2003/07/01/regexps.html" title="Power Regexps, Part II"&gt;part two&lt;/a&gt;) demonstrate some powerful tricks for use with Perl compatible regular expressions.&lt;/li&gt;
 &lt;li&gt;Norman Walsh explains &lt;a href="http://norman.walsh.name/2003/07/02/conneg"&gt;Content Negotiation&lt;/a&gt; and some of the pitfalls with modern browser implementations.&lt;/li&gt;
 &lt;li&gt;So &lt;a href="http://forum.digitalspy.co.uk/board/t/51809/11f30324974ff57f0779a36abf0b7ebdds.html" title="No more Mister Biffo"&gt;that's&lt;/a&gt; what happened to Digitiser. See also a &lt;a href="http://www.lynn3686.freeserve.co.uk/digitiser.html"&gt;Digitiser Tribute&lt;/a&gt; and a &lt;a href="http://www.geocities.com/flyingturduk/biffo.html"&gt;Mr Biffo interview&lt;/a&gt; from 2001 for background information. I cuss you bad.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.resort.com/~prime8/Orwell/patee.html"&gt;George Orwell: Politics and the English Language&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;Clay Shirky: &lt;a href="http://www.shirky.com/writings/group_enemy.html"&gt;A Group Is Its Own Worst Enemy&lt;/a&gt;. The title is misguiding; this is an essay about how online groups behave and how to look after them.&lt;/li&gt;
 &lt;li&gt;A &lt;a href="http://jakarta.apache.org/commons/httpclient/"&gt;Java HttpClient Class&lt;/a&gt;.&lt;/li&gt;
 &lt;li&gt;Some good stuff on Boxes and Arrows: &lt;a href="http://www.boxesandarrows.com/archives/ten_quotable_moments_challenges_and_responses_for_ui_designers.php"&gt;Ten Quotable Moments: Challenges and Responses for UI Designers&lt;/a&gt; and &lt;a href="http://www.boxesandarrows.com/archives/views_and_forms_principles_of_task_flow_for_web_applications_part_1.php"&gt;Views and Forms: Principles of Task Flow for Web Applications (Part 1)&lt;/a&gt;.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.lynnparkplace.org/vot/archives/accessibility/000050.html"&gt;Inside our notions of "document"&lt;/a&gt; and &lt;a href="http://www.lynnparkplace.org/vot/archives/accessibility/000051.html"&gt;Inside our documents II - the Runoff model&lt;/a&gt;.&lt;/li&gt;
 &lt;li&gt;5 days worth of XSLT observations from Simon St. Laurent: &lt;a href="http://www.oreillynet.com/pub/wlg/3339" title="XSLT Training, Day 1"&gt;One&lt;/a&gt;, &lt;a href="http://www.oreillynet.com/pub/wlg/3345" title="XSLT Training, Day 2"&gt;Two&lt;/a&gt;, &lt;a href="http://www.oreillynet.com/pub/wlg/3350" title="Labels vs. Types and Other Culture Clashes"&gt;Three&lt;/a&gt;, &lt;a href="http://www.oreillynet.com/pub/wlg/3356" title="Switching Gears - XSL-FO, Day 1"&gt;Four&lt;/a&gt;, &lt;a href="http://www.oreillynet.com/pub/wlg/3363" title="XSL-FO, Day 2"&gt;Five&lt;/a&gt;.&lt;/li&gt;
 &lt;li&gt;Windows programming with open source tools: &lt;a href="http://www.mingw.org/"&gt;Minimalist GNU For Windows&lt;/a&gt; and &lt;a href="http://webclub.kcom.ne.jp/ma/colinp/win32/"&gt;Win32 Programming with GNU C and C++&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/clay-shirky"&gt;clay-shirky&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/digitiser"&gt;digitiser&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/george-orwell"&gt;george-orwell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/httpclient"&gt;httpclient&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/java"&gt;java&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/perl"&gt;perl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/regular-expressions"&gt;regular-expressions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/simon-st-laurent"&gt;simon-st-laurent&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tristan-louis"&gt;tristan-louis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/windows"&gt;windows&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="clay-shirky"/><category term="digitiser"/><category term="george-orwell"/><category term="httpclient"/><category term="java"/><category term="open-source"/><category term="perl"/><category term="regular-expressions"/><category term="rss"/><category term="simon-st-laurent"/><category term="tristan-louis"/><category term="windows"/><category term="xslt"/></entry><entry><title>XHTML is still great for content</title><link href="https://simonwillison.net/2003/Jan/8/xhtmlIsStillGreatForContent/#atom-tag" rel="alternate"/><published>2003-01-08T22:34:19+00:00</published><updated>2003-01-08T22:34:19+00:00</updated><id>https://simonwillison.net/2003/Jan/8/xhtmlIsStillGreatForContent/#atom-tag</id><summary type="html">
    &lt;p&gt;In response to &lt;cite&gt;Mark Pilgrim&lt;/cite&gt;'s &lt;a href="http://www.diveintomark.org/archives/2003/01/05.html#poisoning_the_envelope"&gt;Poisoning the envelope&lt;/a&gt;, &lt;cite&gt;Brian Donovan&lt;/cite&gt; has &lt;a href="http://www.monokromatik.com/veethree/?viewNewsItem=1&amp;amp;newsitemid=634" title="More about the dead cats..."&gt;expanded upon his opinion&lt;/a&gt; that long term web facing content should not be stored as (X)HTML:&lt;/p&gt;

&lt;blockquote cite="http://www.monokromatik.com/veethree/?viewNewsItem=1&amp;amp;newsitemid=634"&gt;
&lt;p&gt;Do everything "right" (proper DTD's, validating all of your HTML, etc.) and, assuming that browser makers don't chuck backwards compatibility (about as reasonable as deciding not to pay for medical insurance because of your past track record of good health) and you will still either (1.) be locked into circa 2002 XHTML forever / until you find yourself with an extra month or two (or more) of free time and get the itch to go through several years of accumulated content to bring it up to spec or (2.) find yourself building a patchwork site because you've been incorporating recent developments as they've come along (i.e. all of the entries after 2006 use XForms where appropriate after MSIE 9, Opera 11, Moz3/NS 10 support finally solidified, but earlier entries using plain old (X)HTML forms).&lt;/p&gt;

&lt;p&gt;Patching your cms (or getting/paying a someone to do it for you) from time to time could be (by far) preferable to and cheaper than periodically hand-editing several years' worth of articles stored in HTML format.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again, I agree with Brian's points with respect to &lt;acronym title="HyperText Markup Language"&gt;HTML&lt;/acronym&gt;. His argument fails however when you consider &lt;acronym title="eXtensible HyperText Markup Language"&gt;XHTML&lt;/acronym&gt;. The beautiful thing about (valid) &lt;acronym title="eXtensible HyperText Markup Language"&gt;XHTML&lt;/acronym&gt; is that it can be processed by any tool capable of processing &lt;acronym title="eXtensible Markup Language"&gt;XML&lt;/acronym&gt;. No hand editing is required - if you later need to convert your content to a newer standard (and personally I see &lt;acronym title="eXtensible HyperText Markup Language"&gt;XHTML&lt;/acronym&gt; 1.0 as a pretty stable horse) it takes a simple &lt;acronym title="XSL Transformations"&gt;XSLT&lt;/acronym&gt; stylesheet, or possibly a short Python script. You have created future proof content without having to reinvent the wheel.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xhtml"&gt;xhtml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="xhtml"/><category term="xslt"/></entry><entry><title>Excellent introduction to XSLT</title><link href="https://simonwillison.net/2002/Nov/2/excellentIntroductionToXslt/#atom-tag" rel="alternate"/><published>2002-11-02T20:31:08+00:00</published><updated>2002-11-02T20:31:08+00:00</updated><id>https://simonwillison.net/2002/Nov/2/excellentIntroductionToXslt/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;a href="http://www.xfront.com/rescuing-xslt.html"&gt;Rescuing XSLT from Niche Status&lt;/a&gt; is &lt;q cite="http://www.xfront.com/rescuing-xslt.html"&gt;A Gentle Introduction to XSLT through HTML Templates&lt;/q&gt;. It is something of a hybrid article, consisting of a discussion of the problems involved with both teaching and learning XSLT followed by an excellent (if somewhat brief) tutorial covering the most important XSLT tags and concepts and how they can be used to convert a simple XML document in to XHTML.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="xslt"/></entry><entry><title>Generating HTML with XQuery</title><link href="https://simonwillison.net/2002/Oct/20/xQuery/#atom-tag" rel="alternate"/><published>2002-10-20T13:57:31+00:00</published><updated>2002-10-20T13:57:31+00:00</updated><id>https://simonwillison.net/2002/Oct/20/xQuery/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;a href="http://www.gnu.org/software/qexo/XQ-Gen-XML.html"&gt;Generating XML and HTML using XQuery&lt;/a&gt; (via &lt;a href="http://www.whump.com/moreLikeThis/link/03114" title="Generating XHTML using XQuery"&gt;More Like This&lt;/a&gt;). I had been confusing XQuery with XPath - it turns out XQuery is a fully featured scripting language which can be used to do all kinds of things with data from XML documents. The article explains how XQuery can be used to build a web photo gallery application and compares XSLT and XQuery using a Docbook transformation example.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="xslt"/></entry><entry><title>50 XSLT tips</title><link href="https://simonwillison.net/2002/Oct/17/xsltTips/#atom-tag" rel="alternate"/><published>2002-10-17T14:04:09+00:00</published><updated>2002-10-17T14:04:09+00:00</updated><id>https://simonwillison.net/2002/Oct/17/xsltTips/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;a href="http://www.perfectxml.com/TipsXSLT.asp"&gt;50 XSLT Tips&lt;/a&gt;. I particularly like Tip 13, whish shows how you can use a recursive template call to print things out multiple times (for example, 5 asterisks for something with a 5 star rating).&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="xslt"/></entry><entry><title>Installing PHP and XSL on Windows</title><link href="https://simonwillison.net/2002/Jun/24/installingPhpAndXslOnWindows/#atom-tag" rel="alternate"/><published>2002-06-24T23:16:54+00:00</published><updated>2002-06-24T23:16:54+00:00</updated><id>https://simonwillison.net/2002/Jun/24/installingPhpAndXslOnWindows/#atom-tag</id><summary type="html">
    &lt;p&gt;I'm currently reinstalling PHP on my Windows machine, and in doing so I came across this tutorial: &lt;a href="http://shanx.com/php/xsl/getXsl.htm"&gt;Installing XSL and PHP on Windows&lt;/a&gt;. The tutorial provides all the necessary files and instructions to get XSL working with minimum hassle. I've been meaning to play with XSL for some time, and this has provided me with just the boost I needed to give it a go.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xslt"&gt;xslt&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="php"/><category term="xslt"/></entry></feed>