1

我正在尝试使用 Apache FOP 为我正在处理的应用程序创建 PDF 文档。

这需要我创建一个有效的 XSL-FO 文件,然后 FOP 引擎对其进行解析以格式化它创建的文档的样式。

XSL 文件具有自定义名称空间,这会使 FOP 引擎在尝试解析文件时抛出错误。我得到的错误是,

org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
at     com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.checkDOMNSErr(CoreDocumentImpl.java:2526)
at com.sun.org.apache.xerces.internal.dom.AttrNSImpl.setName(AttrNSImpl.java:113)
    ....

XSL/XML 文件中的命名空间示例:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:altova="http://www.altova">

<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

通过 XSL 解析的 FOP JSP 文件代码:

<%@ page import='java.io.*'%>
<%@ page import='org.xml.sax.InputSource'%>
<%@ page import='org.apache.fop.apps.Driver'%>
<%@ page import='org.apache.fop.apps.Options'%>
<%@ page import='oracle.xml.parser.v2.XMLDocument'%>
<%@ page import='oracle.xml.parser.v2.XSLProcessor'%>
<%@ page import='oracle.xml.parser.v2.XSLStylesheet'%>
<%@ page import='oracle.xml.parser.v2.DOMParser'%>
<%
response.setContentType("application/pdf");

XMLDocument   v_doc;
XSLStylesheet v_xsl = null;
String        v_fop;
DOMParser     parser = new DOMParser();
XSLProcessor processor = new XSLProcessor();
// set the encoding for the XML Processing
String        v_encode = "UTF-8";

// get the XSL
v_xsl = new XSLStylesheet(new    java.io.StringReader(request.getParameter("template")),null);

// get the XML String from the form which was posted
parser.parse(new java.io.StringReader(request.getParameter("xml")));
// get the XML Document
v_doc = parser.getDocument();

// create an output stream to get the transformed results
ByteArrayOutputStream v_out = new ByteArrayOutputStream();
// transform the xml and xsl to get an FOP
processor.processXSL(v_xsl, v_doc, v_out);
// convert the FOP byte array to a string with encoding set above
v_fop = new String(v_out.toByteArray(),v_encode);

//
// Now call the apache FOP processing
//
Driver driver = new Driver();
// set the desired output
// see http://xml.apache.org/fop/output.html for all output types
driver.setRenderer(Driver.RENDER_PDF);

// set the input for the FOP engine
driver.setInputSource(new InputSource(new StringReader(v_fop)));
// set the output to stream to the browser
driver.setOutputStream(response.getOutputStream());
// process
driver.run();
%>

现在, 将命名空间添加到已创建的 XML 文档 中谈到了我需要添加类似于 .setAttributeNS(" http://www.w3.org/2000/xmlns/ ", "xmlns:ns2"的代码的同一行, "http://"); 到我的 JSP 来理解 XML 命名空间并克服 NAMESPACE_ERR 错误。

我不是 Java 人,如果我需要使用的代码,我将不胜感激。

谢谢,米特。

4

1 回答 1

0

使用样式表的顶级元素来定义所有命名空间:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:altova="http://www.altova" xmlns:x="adobe:ns:meta/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

然后删除内联命名空间:

<x:xmpmeta>
<rdf:RDF>

参考

于 2013-10-03T00:37:48.977 回答