当前位置: 首页 > 知识库问答 >
问题:

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

昝唯
2023-03-14

我试图使用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的人,并希望在我需要处理的代码方面得到任何帮助。

谢谢,米特。

共有1个答案

孙钱青
2023-03-14

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

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

引用

    < li>W3C DOM:命名空间算法
 类似资料:
  • 我想使用XSL编码在XML开始时添加样式表标记 输入XML:

  • 问题内容: 我正在解析由外部程序生成的xml文件。然后,我想使用自己的名称空间将自定义注释添加到此文件。我的输入如下所示: 问题是lxml仅在使用命名空间时才声明它们,这意味着该声明会重复多次,就像这样(简化): 是否可以强制lxml在诸如或的父元素中只编写一次此声明?还是有充分的理由不这样做?我想要的结果是: 一个重要的问题是必须保留从文件中读取的现有数据,因此我不能仅制作一个新的根元素(我想?

  • 我有一个具有WSDL定义的非常基本的WCF服务,如下所示: 我想添加名称空间xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“根据定义,但我不知道在哪里以及如何。 如何添加该名称空间?非常感谢。

  • 我正在生成一个XML Xades签名。我需要在标记签名中添加名称空间http://uri.etsi.org/01903/v1.3.2#。 如果我在对文档签名后添加此标记,我将得到无效签名错误。 我需要命名空间将在标记签名中而不是标记对象中

  • 我正在使用最新的PHPExcel master(最近一次提交时间是2015年3月28日)来解析客户端的xlsx文件,下面的代码没有抱怨地读取该文件,但是没有找到任何数据(我当前得到的唯一输出是空): xlsx文件中的工作簿定义如下所示: 我认为存在“Orders”表是不可行的,因为它在默认名称空间中查找“sheets”,而不是在“X”名称空间中查找“sheets”。抱歉,如果术语有点胡言乱语,但希

  • 在这一节中,我们将探索JavaScript中关于命名空间的模式。命名空间可被看作位于一个唯一标识符下的代码单元的逻辑组合。标识符可以被很多命名空间引用,每一个命名空间本身可以包含一个分支的嵌套命名空间(或子命名空间)。 在应用开发过程中,出于很多原因,我们都要使用命名空间。在JavaScript中,它们帮助我们避免在全局空间中于其他对象或者变量出现冲突。它们对于在代码库中组织功能块也非常有用,这样