Re: [xml-bindings]XSLT extension functions
- From: Gary Benson <gary inauspicious org>
- To: xml-bindings gnome org
- Subject: Re: [xml-bindings]XSLT extension functions
- Date: Sat, 15 Jun 2002 13:48:20 +0100 (BST)
On Mon, 10 Jun 2002, Gary Benson wrote:
> I've been trying to write some extension functions in python, and have a 
> few questions.
So I figured this out for myself in the end: read on...
> Firstly, I've been trying something like the example in extfunc.py:
> 
> | def f(ctx, str):
> |     return string.upper(str)
> | 
> | libxslt.registerExtModuleFunction("foo", "http://example.com/foo", f)
> 
> This works fine when I call it like in the example:
> 
> | <xsl:value-of select="foo:foo('bar')"/>
> 
> But, if I call it with something like:
> 
> | <xsl:value-of select="foo:foo(@date)"/>
> 
> Then instead of a string, the function gets passed a list of one 
> PyCObject.  What is this object, and how do I turn it into something I can 
> access?  I'm currently working around this by calling foo:foo(string(@date))
> but that's a little hacky...
Okay, so the PyCObjects are nodes.  You can turn them into xmlNode objects 
via:
| def f(ctx, nodeset):
|     nodeset = map(lambda n: libxml2.xmlNode(_obj=n), nodeset)
|     ...
> Secondly, with this method I am only able to return strings (or, I guess, 
> numbers).  How would I go about returning a node set?  What would you 
> create the node set from, since you need a parent node to create a new 
> node?
Okay, so you need to get the insertion node of the output document and use 
that as the parent:
| def f(ctx, nodeset):
|     ...
|     pctxt = libxslt.xpathParserContext(_obj=ctx)
|     ctxt  = pctxt.context()
|     tctxt = ctxt.transformContext()
|     root  = tctxt.insertNode()
You then insert nodes (which appear in the output document):
|     node = root.newTextChild(None, "strong", "hello mum")
And finally, you return an empty string:
|     return ""
Don't know if this is a sensible thing to do, but it works :)
> Finally, is it possible to create an XSL thing instead of creating an 
> XPath function? So I could do something like:
> 
> | <foo:foo select="@date">
> 
> rather than using xsl:value-of.
I didn't work this out, but it's not important (to me) anymore...
Cheers,
Gary
[ gary inauspicious org ][ GnuPG 85A8F78B ][ http://inauspicious.org/ ]
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]