Java 1.7下使用apache.xalan时,XSLT 2.0的xsl:value-of分隔符属性无法正常工作

3

XSLT 2.0的xsl:value-of元素separator属性似乎无法与内置的Java 1.7 XSLT处理器配合使用。以下是示例(从XSLT第二版第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,上面Java代码中的line-a报告了TransformerFactory实例的类名:

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

更新

我进行了实验并将XSLT文件中的separator属性更名为separatorBOO,代码继续运行而不报错,并且产生完全相同的输出。因此似乎XSLT 2.0的separator属性根本没有被识别?

1个回答

4

由于Xalan不支持xslt2转换,因此您需要提供另一个工厂。尝试使用Saxon。我猜您只需要将jar文件放入类路径中,如果类路径中没有提供程序,则Java将使用其嵌入式版本。


1
是的,在运行时类路径中放置saxon9he.jar就解决了问题。 - Marcus Junius Brutus
萨克森是唯一支持XSLT2转换的库吗? - frewper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接