java - 通过 XSL 样式表将命名空间添加到 Java(Apache FOP - JSP)文件解析

标签 java xml xslt xsl-fo apache-fop

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

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

XSL 文件具有自定义 namespace ,这使得 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();
%>

现在, Adding namespace to an already created XML document 谈到在同一行中我需要添加类似于 .setAttributeNS("http://www.w3.org/2000/xmlns/ ", "xmlns:ns2", "http://"); 的代码到我的 JSP,让它理解 XML namespace 并克服 NAMESPACE_ERR 错误。

我不是 Java 人员,并且希望获得有关我需要使用的代码的任何帮助。

谢谢, 米特。

最佳答案

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

<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>

引用文献

关于java - 通过 XSL 样式表将命名空间添加到 Java(Apache FOP - JSP)文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17347526/

相关文章:

java - 无法解决 Circle 类的问题

java - 将一个 Hibernate 命名查询包含在另一个 Hibernate 命名查询中

sql-server - 如何在 SQL Server 中的 XML 投影中输出原始 xml,而不引入额外的 xml 根元素

java - 如何使用DOM在JAVA中向xml文件添加多个属性值

java - 使用 GWT 和 Spring Security 的条件 UI?

java - 字符串相乘?

xslt - Saxon 9 XSLT变形金刚vs Xalan 2.7

xml - 将 XML 扁平化为 HTML 表

java - 虽然我在服务器中启用了 Java,但我面临着 java 路径问题

c# - 如何在 C# 中使用 XPath 检索最后一个节点?