使用 python 和 xslt 2.0 进行 schematron 验证

schematron validation with python and xslt 2.0

我有一个使用 XSLT 2.0 的 Schematron 文档,我正在 python 中寻找一种使用 Schematron 规则验证一系列 xml 的方法。

我试过 lxml,但它不支持 XSLT 2.0,我也试过使用 saxonc api,当我尝试初始化它时它似乎崩溃了。

有人在 python 中成功处理 XSLT 2.0 以进行 Schematron 验证吗?

我从 https://github.com/schxslt/schxslt/releases/tag/v1.5.2 下载了最新的 Schxslt 版本 1.5.2 schxslt-1.5.2-xslt-only.zip 和 运行 以下示例 Python 程序使用 Python 3.7 和 Saxon- C HE 1.2.1 Windows:

import saxonc

with saxonc.PySaxonProcessor(license=False) as proc:
    print("Test Saxon/C on Python")
    print(proc.version)

    xslt30_processor = proc.new_xslt30_processor()

    xslt30_processor.set_cwd(".")

    xslt30_processor.transform_to_file(source_file="price-xslt2.sch", stylesheet_file="../../../schxslt-1.5.2/2.0/pipeline-for-svrl.xsl", output_file="price-compiled-saxon-c.xsl")

    xslt30_processor.transform_to_file(source_file="books.xml", stylesheet_file="price-compiled-saxon-c.xsl", output_file="saxon-c-report-books.xml")

运行 没问题,第一次 transform_to_file 调用生成一个 XSLT 文件 price-compiled-saxon-c.xsl,第二次 transform_to_file 调用应用于输入样本并生成验证报告为 saxon-c-report-books.xml.

如果您想避免使用中间文件,那么以下方法也有效:

import saxonc

with saxonc.PySaxonProcessor(license=False) as proc:
    print("Test Saxon/C on Python")
    print(proc.version)

    xslt30_processor = proc.new_xslt30_processor()

    xslt30_processor.set_cwd(".")

    compiled_schematron = xslt30_processor.transform_to_value(source_file="price-xslt2.sch", stylesheet_file="../../../schxslt-1.5.2/2.0/pipeline-for-svrl.xsl")
    
    stylesheet_node = compiled_schematron.item_at(0).get_node_value()

    xslt30_processor.compile_stylesheet(stylesheet_node = stylesheet_node)

    xslt30_processor.transform_to_file(source_file="books.xml", output_file="saxon-c-report-3-books.xml")

唯一未知的因素是我安装的 Saxon-C 1.2.1,我无法判断它是否与您可以从 Saxonica 下载的最新版本相同,因为该版本已有一年历史,并且关于 https://saxonica.plan.io/projects/saxon-c 导致了一些我可能已经应用的修复;不幸的是,到目前为止,Saxonica 从未发布包含所有修复的新维护版本。

如果你 运行 从 Python 遇到 运行ning Saxon-C 的问题,我想最好在他们的支持论坛上打开一个问题或一个问题,所有最小但复制它的完整细节,我相信他们会帮助你告诉你如何起床和 运行ning。