我正在将xslt应用于HTML文件(已经过滤并整理以使其可解析为XML)。
我的代码如下所示:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
this.xslt = transformerFactory.newTransformer(xsltSource);
xslt.transform(sanitizedXHTML, result);
但是,我收到的每个doctype都会收到错误:
错误:'服务器返回HTTP响应代码:503为URL:http://www.w3.org/TR/html4/loose.dtd'
我从浏览器访问dtds没有问题。
我几乎无法控制正在解析的HTML,并且因为我需要实体,所以无法翻录DOCTYPE。
欢迎任何帮助。
修改
我试图像这样禁用DTD验证:
private Source getSource(StreamSource sanitizedXHTML) throws ParsingException {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(false);
spf.setValidating(false); // Turn off validation
XMLReader rdr;
try {
rdr = spf.newSAXParser().getXMLReader();
} catch (SAXException e) {
throw new ParsingException(e);
} catch (ParserConfigurationException e) {
throw new ParsingException(e);
}
InputSource inputSrc = new InputSource(sanitizedXHTML.getInputStream());
return new SAXSource(rdr, inputSrc);
}
然后只是调用它......
Source source = getSource(sanitizedXHTML);
xslt.transform(source, result);
错误仍然存在。
编辑2:
写了一个实体解析器,并在我的本地磁盘上获得了HTML 4.01 Transitional DTD。但是,我现在收到此错误:
错误:'实体“HTML.Version”的声明必须以“>”结尾。'
DTD ,从w3.org下载
答案 0 :(得分:2)
我在answer中对相关问题提出了一些建议。
特别是,在解析XML文档时,您可能希望关闭DTD验证,以防止解析器尝试获取DTD。或者,您可以使用自己的实体解析程序返回DTD的本地副本,而不是通过网络获取它。
编辑:在SAX Parser Factory上调用setValidating(false)
可能不足以阻止解析器加载外部DTD。解析器可能需要DTD用于其他目的,例如实体定义。 (也许您可以更改HTML清理/预处理阶段,将所有实体引用替换为等效的数字字符实体引用,从而消除对DTD的需求?)
我认为没有standard SAX feature flag可以确保完全禁用外部DTD加载,因此您可能必须使用特定于解析器的内容。因此,如果您正在使用Xerces,则可能需要查找Xerces-specific features并致电setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
以确定。
答案 1 :(得分:1)
假设您想要加载DTD(对于您的实体),您将需要使用解析器。您遇到的基本问题是W3C出于性能原因限制了对DTD URL的访问(如果不这样做,则不会获得任何性能)。
现在您应该使用DTD的本地副本并使用目录来处理此问题。你应该看一下Apache Commons Resolver。如果您不知道如何使用目录,则Norm Walsh's article
中会详细记录这些目录当然,如果您进行验证,则会遇到问题。这是一个SGML DTD,您正在尝试将其用于XML。这不起作用(可能)