簡體   English   中英

使用 Saxon C HE 和 Python 時沒有 DTD 驗證和 XInclude 解析

[英]No DTD validation and XInclude resolution when using Saxon C HE with Python

我對 Python 的 Saxon C HE 版本有疑問。成功安裝后,我嘗試了一些示例,其中我執行了 XSLT 轉換。 這些都奏效了。

但是,當我解析一個 XML 文件時,在解析過程中沒有執行 DTD 驗證,也沒有解析 XIncludes。 我已經嘗試了很多東西,但是我不可能解決這個問題。 我希望有人能告訴我並解釋我的錯誤。

附件是一個示例,當 DTD 驗證完成時應該顯示意圖錯誤,因為 DTD 中沒有名稱為 FOU 的元素。 當我運行腳本時,它會創建一個 Result.xml 文件,並且存在錯誤的 FOU 元素和未解析的 XInclude。

我知道使用 lxml 很容易做到這一點,但我想知道它如何與 Saxon 解析器一起工作。

XML 師傅:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE TEST SYSTEM "Test.dtd">
<TEST>
    <FOU Id="A-1">
        <BAR Name="Test-Bar-1"/>
        <BAR Name="Test-Bar-2"/>
        <BAR Name="Test-Bar-3"/>
    </FOU>
    <TUTU Id="TU-1">
        <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Include.xml" xpointer="xpointer(/node()/node()/*)"/>
    </TUTU>
</TEST>

XML 包括:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE TEST SYSTEM "Test.dtd">
<TEST>
    <TUTU Id="TU-1">
        <TITI Name="Titi-1"/>
        <TITI Name="Titi-2"/>
        <TITI Name="Titi-3"/>
    </TUTU>
</TEST>

DTD:

<!ELEMENT TEST  (FOO+ , TUTU+)>
<!ELEMENT FOO   (BAR+)>
<!ELEMENT BAR   ANY>
<!ELEMENT TUTU  (TITI+)>
<!ELEMENT TITI  ANY>
<!-- Attribute -->
<!ATTLIST TEST
>
<!ATTLIST FOO
    Id      ID    #REQUIRED
>
<!ATTLIST BAR
    Name        CDATA #IMPLIED
>
<!ATTLIST TUTU
    Id      ID    #REQUIRED
>
<!ATTLIST TITI 
    Name        CDATA #IMPLIED
>

Python 腳本:

import saxonc

with saxonc.PySaxonProcessor(license=False) as proc:
    print(proc.version)
    xdmAtomicval = proc.make_boolean_value(False)
    xsltproc = proc.new_xslt_processor()
    document = proc.parse_xml(xml_file_name='Master.xml')
    print(document)
    
    xsltproc.set_source(xdm_node=document)
    xsltproc.set_output_file("Result.xml")
    xsltproc.compile_stylesheet(stylesheet_file="styl.xslt")
    xsltproc.transform_to_file(stylesheet_file="styl.xslt")
    
    documentRes = proc.parse_xml(xml_file_name='Result.xml')
    print(documentRes)

您應該能夠將xidtd 配置屬性設置為“on”。

proc.set_configuration_property("xi", "on")
proc.set_configuration_property("dtd", "on")

但是,唯一能讓它工作的方法是從 xinclude 中刪除 xpointer。 我沒有時間研究為什么這不起作用。

parse_xml() 似乎也沒有執行任何驗證或 xinclude 解析,但它確實發生在轉換上(將 dtd 驗證設置為“關閉”或“恢復”以獲取 Result.xml)。

這是我用來測試的 Python 的修改版本...

import os
import saxonc

with saxonc.PySaxonProcessor(license=False) as proc:
    print(proc.version)
    proc.set_cwd(os.getcwd())
    proc.set_configuration_property("xi", "on")
    proc.set_configuration_property("dtd", "on")

    document = proc.parse_xml(xml_file_name='Master.xml')
    print(document)

    xsltproc = proc.new_xslt30_processor()
    xsltproc.transform_to_file(source_file="Master.xml", stylesheet_file="styl.xslt", output_file="Result.xml")

    documentRes = proc.parse_xml(xml_file_name='Result.xml')
    print(documentRes)

PyDocumentBuilder 11 中新增的 PyDocumentBuilder class 應該能夠讓您進行 DTD 驗證。 請參閱: https://www.saxonica.com/saxon-c/doc11/html/saxonc.html#PyDocumentBuilder您應該能夠使用方法 dtd_validation 來設置驗證。

您可以按如下方式創建 PyDocumentBuilder:

proc.new_document_builder

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM