假设我有一个XPath函数,我正在使用lxml(with libxml和libxslt)从XSL转换调用,例如:
<xsl:template match="/">
<xsl:variable name="result" select="myns:my-func(./*)" />
...
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
从这个函数,我想返回一个包含以下内容的XML片段:
some sample <em>text</em>
Run Code Online (Sandbox Code Playgroud)
python函数my_func使用lxml可通过XSL样式表正确设置,并用于lxml.html.fragments_fromstring获取以下格式的结果:
['some sample ', <Element em at 0x106c203b0>]
如何返回此列表,以便稍后可以在变量的XSL转换中使用它,就像它是直接在XSL上下文中从XPath表达式收集一样?似乎每当我将字符串列表传递回XSL处理器时都会lxml引发异常.
首先是定义你的函数。它需要将节点集作为项目列表返回。这些项目可能包括元素(还有注释和处理指令)、字符串和元组。
硬编码的示例可能如下所示:
from lxml import etree
def myFunc(context, parm):
em = etree.Element('em')
em.text = 'text'
return ['some sample ', em]
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下parm参数不是必需的,但我已将其包含在此处以匹配在调用myns:my-func时传递参数的示例代码。
如果您想使用fragments_fromstring来构造节点集,而不是手动构建它,则函数定义会变得更加简单。
def myFunc(context, parm):
import lxml.html
return lxml.html.fragments_fromstring('some sample <em>text</em>')
Run Code Online (Sandbox Code Playgroud)
接下来,您需要设置命名空间并注册函数名称。
myns = etree.FunctionNamespace('http://example.org/myNamespace')
myns['my-func'] = myFunc
Run Code Online (Sandbox Code Playgroud)
最后,您可以在 XSLT 样式表中使用它,如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myns="http://example.org/myNamespace">
<xsl:template match="/">
<xsl:variable name="result" select="myns:my-func(./*)" />
<xsl:for-each select="$result">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
请注意,样式表中使用的命名空间 URL 必须与 FunctionNamespace 中注册的命名空间 URL匹配。
现在假设您已将此样式表加载到名为xslt的字符串中,示例转换可能如下所示:
root = etree.XML('<root></root>')
doc = etree.ElementTree(root)
transform = etree.XSLT(etree.XML(xslt))
res = transform(doc)
Run Code Online (Sandbox Code Playgroud)
有关完整的工作示例,请参阅此Pastebin 链接。
| 归档时间: |
|
| 查看次数: |
705 次 |
| 最近记录: |