python-3.x - 使用 python 和 xslt 2.0 进行 schematron 验证

标签 python-3.x xslt-2.0 schematron

我有一个使用 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并在 Windows 上使用 Python 3.7 和 Saxon-C HE 1.2.1 运行以下示例 Python 程序:

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 运行 Saxon-C 时遇到问题,我想最好在他们的支持论坛上提出问题,并提供所有最少但完整的详细信息来重现它,我相信他们会帮助您解决问题告诉您如何启动和运行。

关于python-3.x - 使用 python 和 xslt 2.0 进行 schematron 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65134343/

相关文章:

java - 如何根据 Java 中的 Schematron 模式验证文档?

python - 使用seaborn时条件和输入之间的形状不一致

装饰器的 Python 3 类型提示

python - `my_instance = MyClass(a, b).my_method(c)` 是可接受的(Pythonic)模式吗?

xml - 建议 xpath 检查相同类型的嵌套元素中的第一个 'text' 节点

java - Schematron 的 Uri

python - 在 Python 中使用 lxml 根据 Schematron 验证带有命名空间的 XML

Python 正则表达式非捕获组

xml - 如何根据属性选择有条件的节点

java - XSLT 与 javax.xml.transform 的乘法结果不正确 (0.2*0.8*0.8)