首先要定义你的功能.它需要将节点集作为项列表返回.这些项目可能包括元素(也包括注释和处理指令),字符串和元组.
硬编码示例可能如下所示:
from lxml import etree
def myFunc(context, parm):
em = etree.Element('em')
em.text = 'text'
return ['some sample ', em]
请注意,在这种情况下,parm参数不是必需的,但我在此处将其包含在内,以匹配将调用中的参数传递给myns的示例代码:my-func.
如果你想使用fragments_fromstring来构建你的节点集,而不是手动构建它,那么函数定义就变得更加简单了.
def myFunc(context, parm):
import lxml.html
return lxml.html.fragments_fromstring('some sample text')
接下来,您需要设置命名空间并注册函数名称.
myns = etree.FunctionNamespace('http://example.org/myNamespace')
myns['my-func'] = myFunc
最后,您可以在XSLT样式表中使用它,如下所示:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myns="http://example.org/myNamespace">
请注意,样式表中使用的命名空间URL必须与FunctionNamespace中注册的命名空间URL匹配.
现在假设您已将此样式表加载到名为xslt的字符串中,示例转换可能如下所示:
root = etree.XML('')
doc = etree.ElementTree(root)
transform = etree.XSLT(etree.XML(xslt))
res = transform(doc)
有关完整的示例,请参阅此pastebin link.