2012-12-26 67 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