2012-12-26 64 views
0

我正在使用XSLT 2.0將XML文件轉換爲XHTML。我正在使用saxon9處理器進行轉換。在轉換時,出現如下錯誤:忽略DOCTYPE聲明

java.io.FileNotFoundException:c:\ test \ book.dtd(系統找不到指定的文件)。

它正在尋找一個DTD,因爲XML具有帶PUBLIC ID的DOCTYPE聲明。

我正在尋找解決方案來解決這個錯誤,但我無法做到這一點。我嘗試了resolver.jar。

我已經下載了resolver.jar並放置在saxon.jar所在的同一位置,並嘗試了以下命令行。

java -cp c:/saxon9/saxon9.jar;c:saxon9/resolver.jar; net.sf.saxon.Transform -x:org.apache.xml.resolver.tools.ResolvingXMLReader -t -s:c:/test/sample2.xml -xsl:c:/test/body.xsl >c:/test/out /output.html 

我得到相同的錯誤信息。

我提到幾個網站使用resolver.jar,但我不清楚與指令,並沒有得到所需的輸出。我發現http://sourceforge.net/apps/mediawiki/saxon/index.php?title=XML_Catalogs。 這是使用resolver.jar省略DOCTYPE聲明的正確解決方案嗎?如果對如何使用這個有幫助,或者有其他可以使用的方法嗎?

我的XML文件看起來像

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE chapter PUBLIC "-//ES//DTD book DTD version 5.3.0//EN//XML" "book.dtd" [<! ENTITY fx1 SYSTEM "fx1" NDATA IMAGE>]> 
<chapter> 
<info> 
<ce:link locator="fx1"/>… 

我創建catalog.xml文件像下面並存儲在同一個位置。

<catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 
<system systemId="-//ES//DTD book DTD version 5.3.0//EN//XML" uri="book.dtd"/> 
</catalog> 

我還定義在環境變量classpath中像:

c:\saxon9\saxon9.jar;c:\saxon\resolver.jarUsed the following command line for conversion(referred http://sourceforge.net/apps/mediawiki/saxon/index.php?title=XML_Catalogs) 

但我仍然面臨着同樣的問題,我無法找到其確切的問題是,什麼別的需要去做?

C:\>java -cp c:\saxon9\saxon9.jar;c:\saxon9\resolver.jar -Dxml.catalog.files=c:\saxon9\catalog.xml net.sf.saxon.Transform -r:org.apache.xml.resolver.tools.CatalogResolver -x:org.apache.xml.resolver.tools.ResolvingXMLReader -y:org.apache.xml.resolver.tools.ResolvingXMLReader -xsl:c:\test\body1.xsl -s:c:\test\Main.xml -o:c:\test\output.html 

但收到以下錯誤

Error java.io.FileNotFoundException: c:\test\book.dtd (The system cannot find the file specified) 
Transformation failed: Run-time errors were reported 

及時幫助非常感謝,因爲這是非常緊迫......

+0

公共ID( 「 - // ES // DTD書DTD版本5.3.0 // EN // XML」)是由[愛思唯爾(HTTP發佈的DTD://cdn.elsevier。 COM /資產/ text_file/0018/111339/bk53_book530_dtd.txt)。它不是獨立的,因爲它牽扯到其他聲明。沒有完整的發行版,你不會走得太遠。我建議完全刪除doctype聲明,並使用非驗證解析器與撒克遜。 – arayq2

+0

此外,內部子集中的實體聲明被破壞:'<!'之間不應有空格和「ENTITY」。即使有了這個修復,仍然存在沒有聲明名爲'IMAGE'的符號的問題。 – arayq2

+0

在應該是的目錄中。但是,您的真正問題可能是您根本沒有Elsevier DTD。 – arayq2

回答

0

如果您使用的是Linux系統,你可以剝離DOCTYPE聲明,例如使用sed,並將結果輸入到Saxon中,例如:

sed '/<!DOCTYPE/d' in.xml | saxonb-xslt -s:- -xsl:stylesheet.xsl 
+0

嗨托馬斯,我正在使用Windows 7 – VSr

+1

sed通常不是一個好主意,因爲沒有什麼需要doctype聲明完全在一行上。 – arayq2

+0

@ arayq2:好點! –

0

很多內容取決於輸入XML文件中doctype聲明的格式。由於撒克遜正在尋找'C:\ test \ book.dtd',這聽起來像是存在外部標識符。所以,你必須像這些之一:

1. <!DOCTYPE book PUBLIC "some-public-id" "c:\test\book.dtd"> 

2. <!DOCTYPE book SYSTEM "c:\test\book.dtd"> 

的基本問題是,系統標識部分(「C:\測試\ book.dtd」)是硬違約。除非您使用目錄機制指向DTD的其他位置,否則它將始終被查找。 (這是我們必須忍受的XML規範中的一個缺陷。)

業務的第一順序是您是否擁有源XML格式的DTD。如果您沒有,並且無法獲得一個,那麼您唯一的選擇是預處理源XML,並刪除doctype聲明的整個外部標識符部分(即上述兩種形式中的任何一種)。只要它沒有內部子集(['和']'分隔符對之間的其他聲明),刪除整個doctype聲明也可以。)

如果您確實有DTD,則可以將一個複製在c:\ test \ book.dtd中。如果你不想這樣做,你將不得不使用目錄機制將Saxon(及其解析器)指向所需的位置。僅將resolver.jar放入類路徑中是不夠的。你還需要給它一些東西來配合!

特別是,您需要給它一個目錄文件(通過xml.catalog.files環境變量 - 注意documentation中示例的命令行);並且您需要在輸入XML格式的DTD的目錄中輸入條目。這應該將系統標識符'c:\ test \ book.dtd'(和/或公共標識符,如果源XML在doctype聲明中有一個)映射到您放置DTD的文件系統中的位置。

+0

我編輯了我的問題,用我的XML和目錄文件,以及我使用的命令行,但仍然收到相同的錯誤... – VSr

+0

您是否擁有DTD?這是一個內容看起來像[this]的文件(http://cdn.elsevier.com/assets/text_file/0018/111339/bk53_book530_dtd.txt)。如果你沒有,並且不能得到它,那麼你需要在-x選項中使用一個非驗證解析器。 – arayq2

+0

嗨arayq2,謝謝你的回覆... – VSr

2

xmllint工具爲我工作。

xmllint --dropdtd -o file.xml file.xml 

正如托馬斯提到你可以管的結果saxonb。

xmllint --dropdtd file.xml | saxonb-xslt -s:- -xsl:stylesheet.xsl