- From: Eric van der Vlist <vdv@dyomedea.com>
- Date: 28 Sep 2002 10:49:50 +0200
- To: Eric van der Vlist <vdv@dyomedea.com>
- Cc: Tim Bray <tbray@textuality.com>, www-tag@w3.org
On Fri, 2002-09-27 at 23:04, Eric van der Vlist wrote: > Yes, it would make things more concrete. I am also quite sure that it > would be trivial to write it as a SAX filter especially given the fact > that the Hlinks definition seems to precede the use of the mappings > allowing a brute streaming processing. Just to illustrate this assertion, here is what it takes to implement the filter in Python for the basic attributes (xlink:type and xlink:href) and still assuming that there is only one link per "start tag": #!/usr/bin/python import sys, xml.sax.saxutils, xml.sax, xml.sax.xmlreader HLINK_NS = 'http://www.w3.org/2002/06/hlink' XLINK_NS = 'http://www.w3.org/1999/xlink' ELEMENT = (None, "element") HREF = (XLINK_NS, "href") HTYPE = (XLINK_NS, "type") class Hlink: def __init__(self, attrs): self.attrs = attrs def transform(self, attrs): res = {} locator = self.attrs[(None, "locator")] for (ns, n) in attrs.keys(): if n == self.attrs[(None, "locator")][1:]: locator = attrs[(ns, n)] else: res[(ns, n)] = attrs[(ns, n)] res[HTYPE] = "simple" res[HREF] = locator return attrs.__class__(res, {}) class HlinkFilter(xml.sax.saxutils.XMLFilterBase): def __init__ (self): xml.sax.saxutils.XMLFilterBase.__init__(self) self.Hlinks={} def startDocument(self): xml.sax.saxutils.XMLFilterBase.startDocument(self) xml.sax.saxutils.XMLFilterBase.startPrefixMapping(self, "xlink", XLINK_NS) def startElementNS(self, (uri, name), qname, attrs): if uri==HLINK_NS and name=="hlink": self.Hlinks[attrs[ELEMENT]] = Hlink(attrs) elif self.Hlinks.has_key(name): attrs = self.Hlinks[name].transform(attrs) xml.sax.saxutils.XMLFilterBase.startElementNS(self, (uri, name), qname, attrs) oh = xml.sax.saxutils.XMLGenerator() parser = xml.sax.make_parser() parser.setFeature("http://xml.org/sax/features/namespaces", 1) filter = HlinkFilter() filter.setContentHandler(oh) parser.setContentHandler(filter) parser.parse(sys.stdin) And still, if the source is: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:hlink="http://www.w3.org/2002/06/hlink" xmlns:vdv="http://eric.van-der-vlist.com/whatever"> <head> <hlink:hlink namespace="http://www.w3.org/1999/xhtml" element="img" locator="@src" effect="embed" actuate="onLoad" onFailure="warn"/> </head> <body> <br vdv:foo="bar"/> <img src="whatever" vdv:foo="bar"/> </body> </html> The result is: vdv@ibook:~/repros/libxslt$ ./hlink.py < hlink.xml <?xml version="1.0" encoding="iso-8859-1"?> <html xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" xmlns:hlink="http://www.w3.org/2002/06/hlink" xmlns:vdv="http://eric.van-der-vlist.com/whatever"> <head> <hlink:hlink locator="@src" onFailure="warn" actuate="onLoad" element="img" namespace="http://www.w3.org/1999/xhtml" effect="embed"></hlink:hlink> </head> <body> <br vdv:foo="bar"></br> <img xlink:type="simple" xlink:href="whatever" vdv:foo="bar"></img> </body> </html>vdv@ibook:~/repros/libxslt$ This doesn't prove much, but show that if we define a mapping between HLink and XLink (which will need to take care of multiple links), the implementation would not add a large overhead on the applications. Eric -- Rendez-vous à Paris. http://www.technoforum.fr/integ2002/index.html ------------------------------------------------------------------------ Eric van der Vlist http://xmlfr.org http://dyomedea.com (W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema ------------------------------------------------------------------------
Received on Saturday, 28 September 2002 04:50:23 UTC