python – 如何从XPath函数返回文本片段?

python – 如何从XPath函数返回文本片段?,第1张

概述假设我有一个XPath函数,我正在使用lxml(使用libxml和libxslt)从XSL转换调用,例如: <xsl:template match="/"> <xsl:variable name="result" select="myns:my-func(./*)" /> ...</xsl:template> 从这个函数,我想返回一个包含以下内容的XML片段: some sample < 假设我有一个XPath函数,我正在使用lxml(使用libxml和libxslt)从XSL转换调用,例如:
<xsl:template match="/">  <xsl:variable name="result" select="myns:my-func(./*)" />  ...</xsl:template>

从这个函数,我想返回一个包含以下内容的XML片段:

some sample <em>text</em>

使用lxml可以通过XSL样式表正确设置python函数my_func,并使用lxml.HTML.fragments_fromstring获取格式为的结果:

[‘some sample’,< Element em at 0x106c203b0>]

如何返回此列表,以便稍后可以在变量的XSL转换中使用它,就像它是直接在XSL上下文中从XPath表达式收集一样?似乎每当我将一个字符串列表传递回XSL处理器时,lxml就会引发异常.

解决方法 首先要定义你的功能.它需要将节点集作为项列表返回.这些项目可能包括元素(也包括注释和处理指令),字符串和元组.

硬编码示例可能如下所示:

from lxml import etreedef 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 <em>text</em>')

接下来,您需要设置命名空间并注册函数名称.

myns = etree.Functionnamespace('http://example.org/mynamespace')myns['my-func'] = myFunc

最后,您可以在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>

请注意,样式表中使用的命名空间URL必须与Functionnamespace中注册的命名空间URL匹配.

现在假设您已将此样式表加载到名为xslt的字符串中,示例转换可能如下所示:

root = etree.XML('<root></root>')doc = etree.ElementTree(root)transform = etree.XSLT(etree.XML(xslt))res = transform(doc)

有关完整的示例,请参阅此pastebin link.

总结

以上是内存溢出为你收集整理的python – 如何从XPath函数返回文本片段?全部内容,希望文章能够帮你解决python – 如何从XPath函数返回文本片段?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1205122.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存