【问题标题】:Example for setting (multiple) parameters in Python LXML XSLT在 Python LXML XSLT 中设置(多个)参数的示例
【发布时间】:2023-04-25 02:23:01
【问题描述】:

寻找这个问题的解决方案一段时间,因为the documentation 不是很清楚。

我最终使用了以下方法,并认为我会分享回来。

【问题讨论】:

  • 文档说“参数作为关键字参数传递给转换调用”,假设关于关键字参数docs.python.org/2/tutorial/controlflow.html#keyword-arguments 的文档看起来很清楚。但是,我同意该文档没有显示传递两个或多个参数的示例。另一方面,如果您希望它清楚地显示两个参数的使用,那么答案中的示例应该同时显示 XSLT 和 Python 代码。
  • 将问题标题更新为示例,并使用 xslt 示例更新答案

标签: python xslt lxml params


【解决方案1】:

显然您可以chain parameter arguments 将 XSLT 应用于原始 xml 树。 我发现最可靠的方法是始终使用 tree.XSLT.strparam() 方法来包装参数值。 我猜对于字符串或整数等更简单的类型并不需要。但是这个方法不管用。

<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <xsl:output method="xml" omit-xml-declaration="no"/>
   <xsl:param name="var1"/>
   <xsl:param name="var2"/>
   <!-- actual sheet omitted because example -->
</xsl:stylesheet>
from lxml import etree

var = "variable string"

original_tree = etree.parse("original.xml")
xslt_tree = etree.parse("transform.xsl")
xslt = etree.XSLT(xslt_tree)
lom_tree = xslt(original_tree, var1=etree.XSLT.strparam("str_example"), var2=etree.XSLT.strparam(var))

print(etree.tostring(lom_tree, pretty_print=True))

【讨论】:

  • 以什么方式使用strparam解决您问题中的问题,设置多个参数?或者,如果您认为文档中的其他示例不可靠,它们以何种方式对您不利?如果有人想传入一个数字值,我不明白为什么使用 strparam 会使其可靠,在这种情况下,使用文档中示例中的数字似乎是正确的方法。
  • 将可靠部分替换为标题中的示例,并添加了一些使用简单类型的说明
  • 请注意,您可以将 xslt 嵌入为 python 字符串并将参数绑定到它。
【解决方案2】:

实际上,使用 strparam 的问题在于,当您没有仔细阅读 xlst documentation of lxml 时,您不会意识到您传递的任何内容都只是一个字符串被解释为 xpath !

  transform = etree.XSLT(xslt_tree)
  doc_root = etree.XML('<a><b>Text</b></a>')

  ### "5" is a numeric value, so it's sent as is
  result = transform(doc_root, a="5")

  ### "/a/b/text()" *and* "test" are both interpreted as a xpath !
  result = transform(doc_root, a="/a/b/text()")
  result = transform(doc_root, a="test")

  ### to actually send the string "test", you *must* quote it twice or use strparam
  result = transform(doc_root, a="'test'")
  result = transform(doc_root, a=etree.XSLT.strparam("test")

【讨论】:

    最近更新 更多