如何在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
相关产品推荐
相关产品推荐

