使用 SaxonEE 和 Python 使用 XSLT 转换 JSON

Posted

技术标签:

【中文标题】使用 SaxonEE 和 Python 使用 XSLT 转换 JSON【英文标题】:Transforming JSON with XSLT using SaxonEE and Python 【发布时间】:2021-09-09 04:13:38 【问题描述】:

我正在尝试编写一个 Python 脚本,用 XSLT 将 JSON 转换为文本文件 (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 的技术?

【问题讨论】:

【参考方案1】:

我认为您想使用 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('.') 可能会有所帮助。

【讨论】:

以上是关于使用 SaxonEE 和 Python 使用 XSLT 转换 JSON的主要内容,如果未能解决你的问题,请参考以下文章

关于Python的浅复制和深复制

使用zeep / python创建XML序列

python 一行函数定义

python best_fit(XS,YS)

python calc_slope(XS,YS)

错误:S4s-elt-character:“xs:appinfo”和“xs:documentation”以外的架构元素中不允许使用非空白字符