标签: xalan

Xalan 2.7中缺少字符串函数,而是使用了java.lang.String?

我正在使用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) …

xslt xpath function xalan

4
推荐指数
2
解决办法
8771
查看次数

EXSLT:没有更多的DTM ID可用

我一整天都在寻找这个问题的答案.我正在为中等大小的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等的计算会很好,但我无法弄清楚如何.

希望可以有人帮帮我!:)

xml xslt xalan exslt

4
推荐指数
1
解决办法
3217
查看次数

如何防止具有META-INF\services\javax.xml.transform.TransformerFactory的xalan.jar接管内置在Xalan实现中的JDK 1.6?

考虑这段代码(完全基于飞碟的"入门"代码,保留其权利):

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)

几个事实:

  1. 使用JDK 1.6或1.5独立运行(调用main)非常有效(生成PDF)
  2. 但是当从现有Web应用程序通过URLClassLoader加载时,它会失败,并显示以下错误:

Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in …

java xerces classloader xalan

4
推荐指数
1
解决办法
1万
查看次数

java.lang.NoClassDefFoundError:org/apache/xpath/XPathAPI

我正在通过main在eclipse中执行一个类,因为我得到了这个错误

java.lang.NoClassDefFoundError: org/apache/xpath/XPathAPI
Run Code Online (Sandbox Code Playgroud)

我正在使用jRE6.

请帮我解决这个问题

java xalan

4
推荐指数
1
解决办法
1万
查看次数

在 XML + XSLT 中保持实体完整

我使用 XSL 样式表(使用 Apache Xalan)将 XML 转换为(某种)HTML。在 XML 中可以有像 之类的实体&mdash;,必须保持原样。在 XML 文件的开头,我有一个引用这些实体的文档类型。我应该怎么做才能使实体保持不变?

<!DOCTYPE article [
<!ENTITY mdash "&mdash;"><!-- em dash -->
]>
Run Code Online (Sandbox Code Playgroud)

在 XML 文本中SAXParseException: Recursive entity expansion, 'mdash'遇到时给我。&mdash

xml xslt xalan html-entities

3
推荐指数
1
解决办法
4899
查看次数

XSLT处理递归深度

首先让我说我根本不知道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))

java xslt recursion xalan

3
推荐指数
1
解决办法
1953
查看次数

获取当前节点xpath

我需要获取当前节点的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.请帮忙.

reflection xslt xpath xalan xslt-1.0

3
推荐指数
1
解决办法
3242
查看次数

使用xalan扩展在XSL中使用Java集合

我想迭代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很新,所以我向你寻求帮助.

java xml xslt collections xalan

3
推荐指数
1
解决办法
2778
查看次数

为同一个XSL样式表使用不同的HTML模板

是否可以为同一个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)

html java xslt velocity xalan

3
推荐指数
1
解决办法
146
查看次数

检查 XSLT 中的字符串是否为有效日期

我有一个 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>&#44;</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)

xml xslt xalan

3
推荐指数
1
解决办法
7617
查看次数