使用SaxonEE与Python通过XSLT实现JSON转CSV的方案咨询
方案结论
你的需求完全可以通过Saxon-EE/C实现,不需要强制切换到Python调用Java的方案,你当前代码的问题是调用逻辑和原Java命令的执行逻辑不匹配。
问题原因
你原Java命令用了-it参数,是从XSLT的初始模板启动转换,没有指定XML输入源;而你用的apply_templates_returning_file方法是匹配输入XML节点的执行模式,配套的set_initial_match_selection方法只支持传入XML文件,自然无法识别JSON输入。
正确实现代码
你的XSLT已经定义了接收JSON的$in参数,只需要先将JSON文件解析为Saxon支持的XDM节点作为参数传入,再调用初始模板执行即可:
from saxonc import PySaxonProcessor with PySaxonProcessor(license=True) as proc: xslt30proc = proc.new_xslt30_processor() # 解析JSON文件为XDM节点,传入XSLT的$in参数 json_input = proc.parse_json(file_name='initial.json') xslt30proc.set_parameter("in", json_input) # 调用初始模板,对应原Java命令的-it参数 exec_result = xslt30proc.call_template_returning_file( stylesheet_file='styling.xslt', output_file='result.csv' ) print(exec_result)
如果你的XSLT初始模板不是默认名称,额外补充template_name参数指定你的模板名即可。
备选方案(调用Java命令)
如果遇到Saxon-C的兼容问题,也可以通过Python的subprocess模块直接调用你原来的Java命令实现调度:
import subprocess cmd = [ "java", "-cp", "saxon-ee-10.5.jar", "com.saxonica.Transform", "-it", "-xsl:styling.xslt", "-o:result.csv" ] run_result = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8") # 打印执行状态和输出信息 print(f"执行返回码:{run_result.returncode}") print(f"标准输出:{run_result.stdout}") print(f"错误输出:{run_result.stderr}")
内容的提问来源于stack exchange,提问作者RK7
相关产品推荐
相关产品推荐

