我正在使用Xalan 2.7.0(与Apache FOP 1.0捆绑在一起)并且在使用字符串函数时遇到问题.
该行<xsl:value-of select="fn:replace('test', 't', '*')"/>导致此异常:
javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
Run Code Online (Sandbox Code Playgroud)
<xsl:value-of select="fn:string-length('foobar')"/> 结果是:
javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.stringLength([ExpressionContext,] ).
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
Run Code Online (Sandbox Code Playgroud)
现在这很奇怪!为什么Xalan会寻找一个stringLength函数java.lang.String?我测试了<xsl:value-of select="fn:substring('foobar', 2, 3)"/>,确实:结果是o,所以参数被用作startIndex, endIndex(比如java.lang.String.substring())而不是XPath的fn:substring(string, start, length)函数.
所以我认为Xalan在某种程度上错过了它的XPath函数库,而是使用了常规的String类.我通过调用不存在的函数fn:index-of('foobar', 'bar')来确认这一点,该函数工作正常并映射到java.lang.String.indexOf(str).
为什么Xalan会这样做?我该如何解决?
系统信息:Xalan使用标准的Mac OS X 10.6.4 Java版本1.6.0_20.
更新
好吧,replace()暂时搁置这个功能.作为一个XSLT 1.0处理器,Xalan不应该实现XPath 1.0函数子字符串 (string, startIndex, length)而不是(string, startIndex, endIndex) …
我一整天都在寻找这个问题的答案.我正在为中等大小的XML文档(~1.5MB,~1000个元素)创建样式表,这给我带来了很多麻烦.它是关于为不同的加工厂设备创建事件 - 时间线图.XML是通过SAP MII QueryTempalte thingy生成的,并且采用/ Rowsets/Rowset/Row格式.所有这些数据都以/设备/设备/事件格式处理并存储在本地节点集中.然后将此节点集处理为HTML,然后在浏览器中呈现.现在,我开始遇到麻烦了.我可以轻松地提取过去5天的数据,从而导致来自MII的约900行数据,并被处理为我的节点格式,导致不到900行.但第二个我从MII获取了1017行,样式表只会渲染大约一半,然后停止并且"没有更多的DTM ID可用"异常.现在,MII服务器只运行JDK 1.5.x,我读过,这可能是一个问题 - 唯一的问题是,我对此无能为力.所以现在我在这里问:有没有办法优化我的代码?我为我的XSL和示例XML附加了一些链接.
XSL:http: //pastie.org/1566517 Samlpe XML:http://pastie.org/1566522
现在,示例XML可能不会产生任何"有趣"的可视结果,并且无法复制错误.但是,如果有人能够发现obvoius优化,我很想知道:)我一直在想,替换/移动startOffset,endOffset等的计算会很好,但我无法弄清楚如何.
希望可以有人帮帮我!:)
考虑这段代码(完全基于飞碟的"入门"代码,保留其权利):
package flyingsaucerpdf;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextRenderer;
public class PDFMaker {
public static void main(String[] args) throws Exception {
new PDFMaker().go();
}
public void go() throws Exception {
String inputFile = "sample.html";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}
}
Run Code Online (Sandbox Code Playgroud)
几个事实:
Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in …
我正在通过main在eclipse中执行一个类,因为我得到了这个错误
java.lang.NoClassDefFoundError: org/apache/xpath/XPathAPI
Run Code Online (Sandbox Code Playgroud)
我正在使用jRE6.
请帮我解决这个问题
我使用 XSL 样式表(使用 Apache Xalan)将 XML 转换为(某种)HTML。在 XML 中可以有像 之类的实体—,必须保持原样。在 XML 文件的开头,我有一个引用这些实体的文档类型。我应该怎么做才能使实体保持不变?
<!DOCTYPE article [
<!ENTITY mdash "—"><!-- em dash -->
]>
Run Code Online (Sandbox Code Playgroud)
在 XML 文本中SAXParseException: Recursive entity expansion, 'mdash'遇到时给我。&mdash
首先让我说我根本不知道XSLT.我有一项任务是调查在XSLT处理期间发生的Java OutOfMemory异常的一些JVM转储.
我发现OutOfMemory发生在递归XSLT处理期间(我们使用XALAN).
我发现令人震惊的是递归大于10万次.
在XSLT处理过程中这种深度递归可以接受的情况是什么?
请注意,线程堆栈跟踪大约300k行,并填充了此变体,直到OutOfMemory发生:
at org/apache/xalan/transformer/TransformerImpl.executeChildTemplates(Bytecode PC:150(Compiled Code))
at org/apache/xalan/templates/ElemElement.execute(Bytecode PC:352(Compiled Code))
at org/apache/xalan/transformer/TransformerImpl.executeChildTemplates(Bytecode PC:150(Compiled Code))
我需要获取当前节点的xpath,我已经编写了一个xsl函数
<func:function name="fn:getXpath">
<xsl:variable name="xpath">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="concat($xpath, name())" />
<xsl:if test="not(position()=last())">
<xsl:value-of select="concat('/', $xpath)" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<func:result select="$xpath" />
</func:function>
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我收到以下错误
file:///D:/test.xsl; Line #165; Column #63; Variable accessed before it is bound!
file:///D:/test.xsl; Line #165; Column #63; java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
我正在使用xalan 2.7.0.请帮忙.
我想迭代ArrayList <String>并将所有字符串放到输出树,但不知道如何做到这一点.
java方法:
public ArrayList<String> getErrorList(String name) {
if (errorMap.containsKey(name)) {
return errorMap.get(name);
}
return new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)
xsl文件:
<xsl:variable name="list">
<xsl:value-of select="validator:getErrorList($validator, 'model')"/>
</xsl:variable>
<tr>
<td style="color: red;">
<ul>
<li> first string from ArrayList </li>
. . .
<li> last string from ArrayList </li>
</ul>
</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
我对xsl很新,所以我向你寻求帮助.
是否可以为同一个XSLT样式表使用不同的HTML布局?
我一直在阅读XSLT,我看到的大多数示例都表明HTML代码实际上是嵌入在样式表中的.
是否可以将相同的样式表用于多个HTML布局?(我的想法类似于Velocity的工作原理 - 即可以使用相同的Velocity标签处理多个HTML文件).
我正在使用Java Xalan处理器来处理XSLT.
我在下面尝试过@Dimitre Novatchev方法,它完美无缺.唯一的问题是我如何处理循环元素?例如,如果将xml文档修改为:
<person>
<fname>John</fname>
<lname>Smith</lname>
<age>25</age>
<age>33</age>
<age>55</age>
</person>
Run Code Online (Sandbox Code Playgroud)
我如何遍历每个年龄元素?
这是我在HTML模板上尝试但我没有看到任何区别:
<html xmlns:gen="my:tranform-generated">
<body>
<h1>Hi <gen:fname/> <gen:lname/>!</h1>
You are <gen:age/> years old.
<gen:for-each select="/person/age">
<gen:age/>,
</gen:for-each>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
预期产出
我想要上面的输出
Hi JohnSmith!
You are 25 years old.
25, 33, 55
Run Code Online (Sandbox Code Playgroud) 我有一个 xml 文档,其中有一些日期节点,我试图获取它们的值(如果这些值是有效日期,否则为空字符串)。
XML:
<root>
<START_DATE><![CDATA[03/05/2015]]></START_DATE>
<START_DATE><![CDATA[05/05/2015]]></START_DATE>
<START_DATE><![CDATA[Online]]></START_DATE>
</root>
Run Code Online (Sandbox Code Playgroud)
XSLT:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="START_DATE">
<xsl:copy>
<xsl:value-of select="if(string(normalize-space(.)) castable as xs:date) then normalize-space(.) else ''"></xsl:value-of>
</xsl:copy>
<xsl:text>,</xsl:text>
</xsl:template>
</xsl:transform>
Run Code Online (Sandbox Code Playgroud)
输出:
,,,
Run Code Online (Sandbox Code Playgroud)
预期的:
03/05/2015,05/05/2015,,
Run Code Online (Sandbox Code Playgroud) xalan ×10
xslt ×8
java ×5
xml ×4
xpath ×2
classloader ×1
collections ×1
exslt ×1
function ×1
html ×1
recursion ×1
reflection ×1
velocity ×1
xerces ×1
xslt-1.0 ×1