我正在研究通过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.0
到2.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不是为我解决这个问题。
您是否可以使用XSLT 2.0,还是仅限于1.0? – LarsH
@LarsH我现在正在使用XSL 1.0,但我不认为我只是被“限制”了。我试过你的解决方案,但仍然有问题。见'更新#2'。 – ubiquibacon
为了修复#2,您需要确保您使用的是支持XSLT 2.0的XSLT处理器。例如。 Saxon-HE(http://sourceforge.net/projects/saxon/)。然后再将版本号更改为2.0。 – LarsH