XSLT 2.0 xsl:value-of 元素分隔符属性似乎无法使用内置的Java 1.7 XSLT处理器。以下是示例(从XSLT 2nd ed.的第4章稍微编辑以减小大小):
<?xml version="1.0" encoding="utf-8"?>
<cars>
<manufacturer name="Chevrolet">
</manufacturer>
<manufacturer name="Ford">
</manufacturer>
<manufacturer name="Volkswagen">
</manufacturer>
</cars>
<?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>
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 文件中的分隔符属性重命名为 separatorBOO ,代码继续运行而没有抱怨并产生完全相同的输出。因此,似乎根本无法识别XSLT 2.0 分隔符属性
答案 0 :(得分:4)
您必须提供另一个工厂,因为Xalan不支持xslt2转换。 尝试使用Saxon。我猜你只需要将jar放入你的类路径,因为如果类路径中没有提供者,Java就会使用它的嵌入式版本。