在XSLT之前替换XML中的文本

时间:2014-01-08 20:44:39

标签: java xml xslt file-io

我需要在将XML文件中的某个文本替换为XSL-Transformer之前替换它。 它是DOCTYPE标记中的DTD-URL。它指向一个Web服务器,但我希望它可以脱机使用,所以我想将它更改为指向本地文件的URL。

但是我不能直接编辑原始XML。我想把文件读成字符串,在文本上使用String.replaceAll()并将其保存到另一个文件中,然后传递给Transformer。我已经试过了,但它真的很慢;我正在使用的文件大小为ca. 500kiB。

有没有更好(=更快)的方法来实现这个目标?

编辑:用于转换的代码:

public String getPlaylist(String playlist) {
    Source source = new StreamSource(library);
    StreamSource xsl = new StreamSource(getClass().getResourceAsStream("M3Utransformation.xml"));
    StringWriter w = new StringWriter();
    Result result = new StreamResult(w);
    try {
        Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
        transformer.setParameter("playlist", playlist);
        transformer.transform(source, result);
        return w.getBuffer().toString();
    } catch (Throwable t) {
        t.printStackTrace();
        return null;
    }
}

1 个答案:

答案 0 :(得分:4)

您可以创建实体解析器,并使用它。

以下示例使用JAXP DocumentBuilder和CatalogResolver

public static void main(String[] args) throws ParserConfigurationException,
        SAXException, IOException, TransformerConfigurationException, TransformerException {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    db.setEntityResolver(new CatalogResolver());

    File src = new File("src/article.xml");
    Document doc = db.parse(src);

    // Here, we execute the transformation
    // Use a Transformer for output
    File stylesheet = new File("src/aticle.xsl");
    TransformerFactory tFactory = TransformerFactory.newInstance();
    StreamSource stylesource = new StreamSource(stylesheet);
    Transformer transformer = tFactory.newTransformer(stylesource);

    DOMSource source = new DOMSource(document);
    StreamResult result = new StreamResult(System.out);
    transformer.transform(source, result);
}

创建目录属性文件,并将其放在类路径中 CatalogManager.properties必须是名称,请参阅CatalogManager API documentation

定义目录XML文件,将上面的属性文件指向它。从 http://www.xml.com/pub/a/2004/03/03/catalogs.html您可以找到一个非常简单的目录XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <public publicId="-//OYRM/foo" uri="src/bar.dtd"/>
</catalog>

使用上面的catalog.xml和CatalogManager.properties,你最终会将对publicId“ - // OYRM / foo”的引用解析为uri src / bar.dtd xml-commons包含解析器:

http://xerces.apache.org/mirrors.cgi#binary

有关解析器主题的更完整处理,请阅读Tom White's article from XML.com

转换器应用程序是从Java跟踪中进行的,用于可扩展样式表语言转换&gt; Transforming Data with XSLT