2

lxml 的文档讨论passing了 xslt 的参数。它是: http: //lxml.de/xpathxslt.html#stylesheet-parameters但是我如何将 a 传递sequence/tuple/list给相同的transform方法,以便我的 xslt 将捕获它并使用它(到 xml)呈现它xsl:for-each

如果我像这样通过它:

transform = etree.XSLT(xslt_content)
transform(input_xml_content,
          **{'items':('item1', 'item2')})

我得到的是:

  File "xslt.pxi", line 519, in lxml.etree.XSLT.__call__ (src/lxml/lxml.etree.c:119769)
  File "xslt.pxi", line 642, in lxml.etree._convert_xslt_parameters (src/lxml/lxml.etree.c:120985)
  File "xslt.pxi", line 634, in lxml.etree._convert_xslt_parameters (src/lxml/lxml.etree.c:120882)
  File "apihelpers.pxi", line 1364, in lxml.etree._utf8 (src/lxml/lxml.etree.c:22190)
TypeError: Argument must be bytes or unicode, got 'tuple'
4

2 回答 2

0

您的参考资料非常简单地解释了一切。参数传递的语法是这样的......

>>> result = transform(doc_root, a="'A'")
>>> str(result)
'<?xml version="1.0"?>\n<foo>A</foo>\n'

您所要做的就是将数据序列化为字符串。

于 2012-10-18T04:48:01.713 回答
0

也许有点晚了,但我正在寻找同样问题的答案,但找不到任何答案。我想出的是将xslt加载为xml并在使用transform应用之前对其进行修改

def apply_xslt(xml_file, xslt_file_path, xslt_params):
    try:
        xslt = etree.parse(xslt_file_path)

        for key, value in xslt_params.iteritems():
            xslt.find("//{http://www.w3.org/1999/XSL/Transform}param[@name='" + key + "']").attrib['select'] = value

        transform = etree.XSLT(xslt)

        newdom = transform(xml_file)
        return newdom
    except Exception as e:
        raise e
于 2017-12-04T18:04:27.090 回答