You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在lxml扩展元素中访问XSLT参数与变量值

在lxml的XSLT扩展元素中访问xsl:param和xsl:variable的值

我来帮你搞定这个问题——你现在需要在自定义的XSLT扩展元素里拿到xsl:param和xsl:variable的实际值,而不是像现在这样只拿到$var1这种字符串形式的引用。

核心解决方案:用好XSLT上下文对象

lxml给XSLTExtension.execute方法传递的context参数其实藏着你需要的变量上下文,你完全可以通过它直接获取变量值,不用自己找什么映射表。这里有两种靠谱的实现方式:

1. 直接获取单个变量值

如果你的属性值就是单纯的变量引用(比如{$var1}),可以先提取变量名(去掉开头的$),然后用context.variable_value()方法拿到实际值:

修改你的FooExtensionElement类:

class FooExtensionElement( etree.XSLTExtension ):
    def execute( self, context, self_node, input_node, output_parent ):
        attr1 = self_node.get( "attr1" )
        # 去掉变量名前面的$符号
        var_name = attr1.lstrip('$')
        # 从上下文里取出变量的实际值
        var_value = context.variable_value(var_name)
        print( "attr1: {}".format( var_value ))

2. 执行复杂XPath表达式求值

如果需要处理更复杂的表达式(比如拼接、运算之类的),可以用context.xpath_eval()方法,它会在当前的XSLT变量上下文里执行表达式:

class FooExtensionElement( etree.XSLTExtension ):
    def execute( self, context, self_node, input_node, output_parent ):
        attr1 = self_node.get( "attr1" )
        # 直接在当前上下文里计算XPath表达式
        var_value = context.xpath_eval(attr1)
        print( "attr1: {}".format( var_value ))

为什么你之前的尝试没成功?

  • 方案1的问题:你找的那个“变量映射表”其实就是context内部维护的,lxml的文档里确实没把这个方法放在最显眼的位置,但它是访问XSLT变量的标准方式。
  • 方案2的问题:你之前用deepcopy(node).xpath(...)是在普通的XML节点上执行XPath,这个节点已经脱离了XSLT的运行上下文,自然识别不了$var1这种XSLT变量。必须用context提供的求值方法,才能在当前变量环境里运行表达式。

运行效果

修改后再跑你的代码,输出就会变成你想要的样子:

attr1: passed param value
XSLT ouput: passed param value

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:34:07