我對 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)
uj5u.com熱心網友回復:
您應該能夠將xi和dtd 配置屬性設定為“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)
uj5u.com熱心網友回復:
SaxonC 11 中的PyDocumentBuilder新類應該能夠讓您進行 DTD 驗證。請參閱:https :
//www.saxonica.com/saxon-c/doc11/html/saxonc.html#PyDocumentBuilder 您應該能夠使用方法 dtd_validation 來設定驗證。
您可以按如下方式創建 PyDocumentBuilder:
proc.new_document_builder
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/436611.html
下一篇:僅獲取資料為最大值的行
