使用 SaxonEE 和 Python 通过 XSLT 转换 JSON

Transforming JSON with XSLT using SaxonEE and Python

我正在尝试编写 Python 脚本,将 JSON 转换为带有 XSLT 的文本文件 (CSV)。

使用 saxon-ee-10.5.jar,我可以通过 运行 以下命令成功执行所需的转换 (Windows 10):

java -cp saxon-ee-10.5.jar com.saxonica.Transform -it -xsl:styling.xslt -o:result.csv

如何使用 Python 获得相同的结果?我一直在尝试 Saxon-EE/C,但我不确定我想要发生的事情是否可行。

这是我迄今为止尝试过的示例。我的 XSLT 已经为 initial.json 文件定义了一个 $in 参数,但是 PyXslt30Processor.apply_templates_returning_file() 似乎需要调用 PyXslt30Processor.set_initial_match_selection(),我不确定是否可以传递非 XML 文件。

from saxonc import PySaxonProcessor
with PySaxonProcessor(license=True) as proc:
  xslt30proc = proc.new_xslt30_processor()
  xslt30proc.set_initial_match_selection(file_name='initial.json')
  content = xslt30proc.apply_templates_returning_file(
    stylesheet_file='styling.xslt', 
    output_file='result.csv'
  )
  print(content)

我想用 Saxon-EE/C 实现什么,还是我应该尝试从 Python 调用 Java 的技巧?

我认为您想使用 call_template... 而不是应用模板,例如https://www.saxonica.com/saxon-c/doc/html/saxonc.html#PyXslt30Processor-call_template_returning_file

xslt30proc.call_template_returning_file(None, stylesheet_file='styling.xslt', 
    output_file='result.csv'
  )

使用 None 作为模板名称应该与在命令行中使用 -it 相同,即从调用名为 xsl:initial-template.

的模板开始

在这种情况下不要使用 xslt30proc.set_initial_match_selection

但是,在 call_template_returning_file 调用之前设置 xslt30proc.set_cwd('.') 可能会有所帮助。