проверка схемы с помощью python и xslt 2.0

У меня есть документ Schematron, в котором используется XSLT 2.0, и я ищу метод в python для проверки серии XML-файлов с использованием правил Schematron.

Я пробовал lxml, но он не поддерживает XSLT 2.0, и я также пытался использовать saxonc api, который, кажется, просто падает, когда я пытаюсь его инициализировать.

У кого-нибудь была успешная обработка XSLT 2.0 в python для проверки Schematron?


person Talmtikisan    schedule 03.12.2020    source источник
comment
На какой платформе вы используете Saxon-C с Python? Вылетает ли он при любой попытке его использования? Или просто с вашим XSLT, скомпилированным Schematron? Какую реализацию Schematron вы используете (Skeleton или Schxslt)?   -  person Martin Honnen    schedule 04.12.2020


Ответы (1)


Я скачал последний выпуск Schxslt 1.5.2 schxslt-1.5.2-xslt-only.zip с https://github.com/schxslt/schxslt/releases/tag/v1.5.2 и запустите следующий пример программы 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 до сих пор не выпустила новую версию со всеми исправлениями.

Если у вас возникнут проблемы с запуском Saxon-C из Python, я думаю, лучше открыть проблему или вопрос на их форуме поддержки со всеми минимальными, но полными подробностями, чтобы воспроизвести его, и я уверен, что они помогут вам рассказать вам, как чтобы встать и бежать.

person Martin Honnen    schedule 04.12.2020