python - 将评估的 xpath 传递给扩展

标签 python xslt xpath lxml

我正在使用 lxml python 库。

假设我们有产品 xml,例如:

<product id='123' />

并且想要应用xsl模板:

<xsl:template match="product">
    <ssi:include virtual="/ssi/reviews/{@id}"/>
</xsl:template>

ssi:include 是一个简单的 lxml 扩展,它将 nginx ssi 指令作为注释插入 HTML 代码中。问题是评估 @id 并将属性传递为 virtual="/ssi/include/123"。有办法吗? 我已经找到了解决方案并正在使用它:

import lxml.etree
import re
from copy import deepcopy

ns = '{ssi}'

# ssi extensions
class SsiExtElement(lxml.etree.XSLTExtension):
    def execute(self, context, self_node, input_node, output_parent):
        _, tag = self_node.tag.split('}')
        tmp = lxml.etree.Element('tmp')
        for k, v in self_node.attrib.items():
            if re.search('\{(.*)\}', v): #here we search {xpath} values to evaluate
                elem = deepcopy(input_node)
                matches = re.findall('\{(.*)\}', v)
                for match in matches:
                    v = v.replace('{%s}' % match, elem.xpath(match)[0])
            tmp.set(k, v)
        self.process_children(context, output_parent=tmp)
        attrs = ' '.join(u'%s="%s"' % (k, v) for k, v in tmp.attrib.items())
        ssi = lxml.etree.Comment(u'#%s %s' % (tag, attrs))
        output_parent.append(ssi)
        for node in tmp:
        output_parent.append(node)
        if (self_node.tag.replace(ns,'') in ('if', 'else', 'elif')
            and self_node.getnext().tag.replace(ns, '') not in ('else', 'elif')):
        output_parent.append(lxml.etree.Comment(u'#endif'))

最佳答案

尝试使用 xsl:attribute

<xsl:template match="product">
    <ssi:include>
       <xsl:attribute name="virtual">
          <xsl:value-of select="concat('/ssi/reviews/',@id)"/>
       <xsl:attibute>
    </ssi:include>
</xsl:template>

关于python - 将评估的 xpath 传递给扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280211/

相关文章:

python - 是否可以将 django View 集与两个序列化器一起使用?

javascript - 我可以在 javascript 中使用 XPath 返回整个 XML 文档吗?

xml - 所见即所得的 XML 编辑器(基于 DTD 或 RelaxNG 或 XSD 的语法)

xml - 将具有相同属性名称的多个元素转换为一个新元素,并将这些属性值作为子元素

xml - xsl 键与 xpath 谓词匹配

python - 如何访问selenium中具有相同类名的第二个元素

如果祖先存在,则 XSLT 删除属性

Python 诅咒,将终端窗口分成 4 个垫 - prefresh() 返回 ERR

python - Google 和 Oauthlib - 范围已更改

python - 检查 Python 中两个字符串中的常用字母是否位于同一位置?