XSLT speed comparisons

uche.ogbuji at gmail.com uche.ogbuji at gmail.com
Fri Sep 29 09:10:20 EDT 2006


Damian wrote:
> Hi, I'm from an ASP.NET background an am considering making the switch
> to Python. I decided to develop my next project in tandem to test the
> waters and everything is working well, loving the language, etc.
>
> What I've got is:
> two websites, one in ASP.NET v2 and one in Python 2.5 (using 4suite for
> XML/XSLT)
> both on the same box (Windows Server 2003)
> both using the same XML, XSLT, CSS
>
> The problem is, the Python version is (at a guess) about three times
> slower than the ASP one. I'm very new to the language and it's likely

The ASP one being MSXML, right?  In that case that result doesn't
surprise me.

> that I'm doing something wrong here:

Now wrong, but we can definitely simplify your API

> from os import environ
> from Ft.Lib.Uri import OsPathToUri
> from Ft.Xml import InputSource
> from Ft.Xml.Xslt import Processor
>
> def buildPage():
>     try:
>         xsluri = OsPathToUri('xsl/plainpage.xsl')
>         xmluri = OsPathToUri('website.xml')
>
>         xsl = InputSource.DefaultFactory.fromUri(xsluri)
>         xml = InputSource.DefaultFactory.fromUri(xmluri)
>
>         proc = Processor.Processor()
>         proc.appendStylesheet(xsl)
>
>         params = {"url":environ['QUERY_STRING'].split("=")[1]}
>         for i, v in enumerate(environ['QUERY_STRING'].split("/")[1:]):
>             params["selected_section%s" % (i + 1)] = "/" + v
>
>         return proc.run(xml, topLevelParams=params)
>     except:
>         return "Error blah blah"
>
> print "Content-Type: text/html\n\n"
> print buildPage()

This should work:

from os import environ
from Ft.Xml.Xslt import Transform

def buildPage():
    try:
        params = {"url":environ['QUERY_STRING'].split("=")[1]}
        for i, v in enumerate(environ['QUERY_STRING'].split("/")[1:]):
            params["selected_section%s" % (i + 1)] = "/" + v

        return Transform('website.xml', 'xsl/plainpage.xsl',
topLevelParams=params)
    except:
        return "Error blah blah"

print "Content-Type: text/html\n\n"
print buildPage()

-- % --

For what it's worth I just developed, and switched to WSGI middleware
that only does the transform on the server side if the client doesn't
understand XSLT.  It's called applyxslt and is part of wsgi.xml [1].
That reduces server load, and with caching (via Myghty), there's really
no issue for me.  For more on WSGI middleware see [2].

[1] http://uche.ogbuji.net/tech/4suite/wsgixml/
[2] http://www.ibm.com/developerworks/library/wa-wsgi/

--
Uche Ogbuji                               Fourthought, Inc.
http://uche.ogbuji.net                    http://fourthought.com
http://copia.ogbuji.net                   http://4Suite.org
Articles: http://uche.ogbuji.net/tech/publications/




More information about the Python-list mailing list