如何在xslTransformer.transform()方法中提供空源?

时间:2014-04-09 18:48:50

标签: xslt-2.0 saxon

我有一个xslt 2.0文件,用于将csv文件转换为xml文件。 xsl取自这里: http://p2p.wrox.com/xslt/40898-transform-csv-file-xml.html#post164344

现在我试图通过Java转换器(使用Saxon9 xsl变压器工厂)执行此操作。由于csv文件作为参数传递给xsl,因此我无需在transform方法的Source参数中传递任何内容。由于transform方法的javadoc声明如下: Transformer.transform方法的javadoc清楚地说明了以下内容:

“一个空的Source被表示为由DocumentBuilder.newDocument()构造的空文档。转换空Source的结果取决于转换行为;它并不总是一个空的Result。” 我试图创建一个空文档并尝试转换,如下所示:

TransformerFactory transformerFactory =  TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);
    Source xsltSource = new StreamSource("file:///C:/my.xsl");
    Transformer xsltTransformer = transformerFactory.newTransformer(xsltSource);
xsltTransformer.setParameter("pathToCSV", "'file:///C:/input.csv'");
StringWriter writer = new StringWriter();
xsltTransformer.transform(new DOMSource(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()), new StreamResult(writer));

上面的代码没有输出任何内容并且没有按预期工作,因为我认为考虑输入的空文档而不是xsl中以下行传递的csv文件:

<xsl:param name="pathToCSV"  />
<xsl:variable name="input" select="unparsed-text($pathToCSV)"/>

有人能指点我如何实现我想要实现的目标吗?

1 个答案:

答案 0 :(得分:0)

考虑使用Saxon API http://saxonica.com/documentation/html/using-xsl/embedding/s9api-transformation.html而不是使用JAXP API,如果您想使用XSLT 2.0功能,例如从您链接到的XSLT开始使用命名模板。或者,如果要将JAXP与空虚拟文档一起使用,则至少需要添加模板

<xsl:template match="/">
  <xsl:call-template name="main"/>
</xsl:template>