【问题标题】:how to convert a csv to xml through XSLT file using Java code and Saxon-HE Saxon-HE-9.5.1-5如何使用 Java 代码和 Saxon-HE Saxon-HE-9.5.1-5 通过 XSLT 文件将 csv 转换为 xml
【发布时间】:2014-07-02 18:54:38
【问题描述】:

我正在尝试将此命令行代码(它采用 .csv 文件并通过 xslt 文件转换为 xml 并且这有效)转换为 Java 代码: java -jar saxon9he.jar -xsl:"csv2xml.xslt" flatfile=input.csv -s:dummy.xml > output.txt

//使用 Saxon-HE 9.5 的 Java 代码: 公共静态无效transformFileUsingStyleSheet(字符串csvFile,字符串xslID) 抛出 TransformerException {

    // Create a transform factory instance.
    TransformerFactory tfactory = TransformerFactory.newInstance();

    // Create a transformer for the stylesheet.
    Transformer transformer =
        tfactory.newTransformer(new StreamSource(xslID));

    // Transform the source XML to System.out.
    transformer.transform(new StreamSource(csvFile),
                          new StreamResult(new File("ConvertedCSV2XML.xml")));

}

但是我在调​​用上面的 java 方法时遇到了这个错误:SXXP0003:XML 解析器报告的错误:prolog 中不允许内容,如下所示:transformFileUsingStyleSheet("input.csv"," csv2xml.xslt.xslt");

【问题讨论】:

  • 您要转换的文件必须是格式正确的 XML。我要做的是将 XSLT 文件本身作为输入(或仍然使用dummy.xml)和 CSV 作为xsl:param。您可以使用unparsed-text() 读取CSV 进行处理。 (这就是基于命令行似乎正在发生的事情。)

标签: xslt csv saxon


【解决方案1】:

您发布的命令行表明 Xslt 采用名为 flatfile 的参数,您必须在运行转换之前设置,因此请确保您在 Java 代码中也这样做,应该是 transformer.setParameter("flatfile", csvFile)。正如评论中已经指出的那样,命令行传入一个 dummy.xml Xml 输入文档,如果你想使用 Transformer API,你也需要这样做,所以确保你传入第三个参数 inputFile例如dummy.xml 然后使用transformer.transform(new StreamSource(inputFile), ..) 作为变换方法的第一个参数。

但是,请注意,Saxon 有自己的 Api,它允许您以命名模板开始运行样式表,而无需虚拟 XML 输入文件。

【讨论】:

  • 谢谢你的建议有效!只是好奇如何在不使用虚拟 XML 输入文件的情况下使用 Saxon API 执行此操作?
  • 查看saxonica.com/documentation/index.html#!using-xsl/embedding/… 了解使用该API 的概述,一旦您拥有XsltTransformer,您就可以使用xsltTransformerInstance.setInitialTemplate(new QName("main")) 来设置一个名为main 的模板作为起点。在样式表中,您将拥有例如<xsl:template match="/" name="main">...</xsl:template>。然后设置参数xsltTransformerInstance.setParameter(new QName("flatfile"), new XdmAtomicValue(csvFile))
【解决方案2】:

JAXP 转换 API 是为 XSLT 1.0 设计的,它需要一个 XML 文档作为主要的源文档。您需要提供一个虚拟源文档 (XML) 来满足 API 要求,或者使用 Saxon 的 s9api API,它提供对 XSLT 2.0(和 XSLT 3.0)功能的完全访问权限。

【讨论】:

猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2018-06-11
相关资源
最近更新 更多