应用XSLT时访问w3.org时出错

时间:2010-02-09 04:51:39

标签: java xslt

我正在将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下载

2 个答案:

答案 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。这不起作用(可能)