【问题标题】:XSLT 2.0 xsl:value-of separator attribute not working in Java 1.7 with apache.xalanXSLT 2.0 xsl:value-of 分隔符属性在带有 apache.xalan 的 Java 1.7 中不起作用
【发布时间】:2013-05-20 05:32:43
【问题描述】:

XSLT 2.0 xsl:value-of 元素 separator 属性似乎不适用于内置 Java 1.7 XSLT 处理器。这是示例(从XSLT 2nd ed. 的第 4 章略微编辑以减小大小):

XML 文件

<?xml version="1.0" encoding="utf-8"?>
<cars>
    <manufacturer name="Chevrolet">
    </manufacturer>
    <manufacturer name="Ford">
    </manufacturer>
    <manufacturer name="Volkswagen">
    </manufacturer>
</cars>  

XSLT 文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
         <xsl:value-of select="cars/manufacturer/@name" separator=", "/>
    </xsl:template>
</xsl:stylesheet>

Java 代码

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class FooMain {
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
        TransformerFactory factory = TransformerFactory.newInstance();
        System.out.println("transformer factory class: "+factory.getClass()); // line-a
        Source xslt = new StreamSource(new File("transform.xslt"));
        Transformer transformer = factory.newTransformer(xslt);                                                                                                                                                                     
        Source text = new StreamSource(new File("input.xml"));
        transformer.transform(text, new StreamResult(new File("output.html")));
    }
}

当代码运行时,它会产生以下输出文件:

Chevrolet

...与书中描述的相反:

Chevrolet, Ford, Volkswagen

我在 Ubuntu Precise 中使用 Java 1.7,TransformerFactory 实例的类名报告为(在上述 Java 代码的 line-a 中):

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

更新

我进行了实验并将 XSLT 文件中的 separator 属性重命名为 separatorBOO 并且代码继续运行而不会抱怨并产生完全相同的结果输出。所以看起来 XSLT 2.0 separator 属性根本无法识别??

【问题讨论】:

    标签: java xslt xalan


    【解决方案1】:

    您必须提供另一个工厂,因为 Xalan 不支持 xslt2 转换。 尝试使用撒克逊语。我想如果类路径中没有提供程序,您只需将 jar 放入您的类路径中,因为 Java 正在使用它的嵌入式版本。

    【讨论】:

    • 是的,将 saxon9he.jar 放在运行时类路径中就可以了
    • saxon 是唯一支持 xslt2 转换的库吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2011-02-03
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多