2012-12-10 76 views
1

我正在研究通过JAR文件分发的Java桌面,并且该JAR包含应用程序需要的所有内容。该应用程序通过首先生成XML文件,然后使用XSL文件将XML转换为HTML来生成各种HTML报表。一旦生成报告,它需要是一个文件,所以我想要使用的任何脚本我必须包含在文件中,并且我想使用jQuery。我在资源文件夹中有一个jQuery文件,我可以通过它解析并将其添加到XML文件中,但是当通过XSL将XML转换为HTML时,出现以下错误:实体名称错误

ERROR: 'The entity name must immediately follow the '&' in the entity reference.' 
javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The entity name must immediately follow the '&' in the entity reference. 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The entity name must immediately follow the '&' in the entity reference.' 

阅读错误我可以看到我需要编码特殊字符,但我不准备手动编码整个jQuery文件。

所以我的最终目标是:

1)需要在我的HTML报告如下:

<script> 
// the entire jQuery library 
</script> 

2)我的主要应用程序必须被完全包含在一个JAR文件

3.)我想不要将jQuery库复制/粘贴到XSL文件中。这工作,但似乎马虎。

更新#1:

我错上上面第3点。我不能复制/粘贴jQuery库到XSL文件没有得到错误:

java.io.UTFDataFormatException: encoded string too long: 239677 bytes 

它后面紧跟着更可笑的错误:

javax.xml.transform.TransformerConfigurationException: This Templates does not contain a class with the name 'GregorSamsa'. 

GregorSamsa在The Metamorphosis

UPDATE #2:

我的XSL样式表的开始是这样的:

<?xml version="1.0" encoding="UTF-8"?> 

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

    <xsl:output method="html"/> 

我改变了版本号从1.02.0但我得到的是一条错误:

ERROR: 'Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:sequence'' 
javax.xml.transform.TransformerException: java.lang.RuntimeException: Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:sequence' 

此外,我的jQuery的文件是在相同的位置,我的XSL样式表,所以我认为以下应该工作(但事实并非如此):

<xsl:sequence select="unparsed-text('jquery-1.8.3.min.js')" /> 

更新#3:

下载Saxon for Java here并将JAR文件添加到我的应用程序中。更改我的电话给变压器厂到这一点:

TransformerFactory f = new net.sf.saxon.TransformerFactoryImpl(); // was TransformerFactory.newInstance(); 
Transformer t = f.newTransformer(new StreamSource(Example.class.getResourceAsStream("resource/report_style.xsl"))); 
Source s = new StreamSource(XMLFile); 
Result r = new StreamResult(HTMLFile); 
t.transform(s, r); 

使用建议<xsl:sequence select="unparsed-text('jquery-1.8.3.min.js')" />我仍然得到我最初的错误相当于,虽然现在有撒克逊解析器:

net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference. 
SXXP0003: Error reported by XML parser: The entity name must immediately follow the '&' in the entity reference. 

更新#4:

我没有得到任何东西,所以我最终在创建后读取了HTML文件,并添加了JavaScript,然后将其写回。这是一个额外的步骤,但报告生成时间的任何差异都是不可思议的,并且可以工作。我仍然有兴趣知道为什么XSLT 2.0不是为我解决这个问题。

+0

您是否可以使用XSLT 2.0,还是仅限于1.0? – LarsH

+0

@LarsH我现在正在使用XSL 1.0,但我不认为我只是被“限制”了。我试过你的解决方案,但仍然有问题。见'更新#2'。 – ubiquibacon

+0

为了修复#2,您需要确保您使用的是支持XSLT 2.0的XSLT处理器。例如。 Saxon-HE(http://sourceforge.net/projects/saxon/)。然后再将版本号更改为2.0。 – LarsH

回答

1

如果你可以使用XSLT 2.0,你可以尝试

<script> 
    <xsl:sequence select="unparsed-text('path/to/jqueryvNN.js')" /> 
</script> 

这应该在jQuery库定义为复制文本,并将其输出适当的HTML。你正在使用HTML输出方法,对吗?使用cdata-section-elements="script"(记录的here)诱导XSLT以更高效且更人性化的方式序列化JavaScript也是一个好主意。 (如果你使用库的标准缩小版本,那么它不会很人性化。)

由于XSLT不需要解析js文件,所以你不会有关于未转义的投诉&符号等。

相关问题