
Paul Everitt wrote:
Stefan Behnel wrote:
Anyway, I don't know if it's a good idea to use XSLT here, since there may be too many 'ifs' and 'maybes'.
Ahh, too bad. I was hoping to avoid an approach that only worked with lxml. But, if that's the way it is, that's the way it is. Out of curiosity, is it not a good idea based on the current state, or the long-term plans as well?
As I said, if you want to test it, feel free. That way, we know what works and what may have to be fixed. It may enable us to decide if it's worth implementing.
Essentially, I'm looking for a way to bring new nodes into a document. Similar to how XInclude does, but under programmatic control, and with the ability to do arguments.
XSLT supports arguments in functions, just like XPath does.
I'd prefer to keep the integration point in a declarative document-oriented style, instead of a script-oriented style. But it sounds like I might not be able to get there from here and I have to take what I can get. :^)
But using element classes, you could do something like this (untested):
class MyDataFiller(ElementBase): def _init(self): child = self[0] if child.tag == 'sqlquery': query = child.text del self[0] # remove sqlquery element to prevent running this twice # run SQL query, generate result child nodes for it
Namespace('ns')['mydata'] = MyDataFiller
xml = XML("""
<myroot xmlns='ns'> <mydata> <sqlquery>SELECT from ...</sqlquery> </mydata> </myroot> """)
data = xml[0] # will call _init() for data_child in data:
# do something with data
In the example above, is the _init called when the document is parsed, or when the element is traversed?
I updated the documentation regarding this point, but for a short answer:
Stated differently, if I want to evaluate the query and get the new nodes, do I have to write some script to grab each node and "evaluate" it?
Yes. This is only done when a Python object is instantiated. Which means that you may have to do something like this:
tree.xpath('//XPath expression to find all complex elements')
to instantiate them first.
Stefan