读取XSLT样式表中的CSV文件

本文旨在指导开发者如何在XSLT样式表中读取CSV文件,并将其转换为XML格式。我们将重点介绍使用unparsed-text-available()和unparsed-text()函数检查文件是否存在并读取其内容,同时提供一种通过Java传递文件URI作为参数的有效方法,解决文件路径问题。

在XSLT中读取外部文件,特别是CSV文件,是数据转换和处理的常见需求。 Saxon 9 提供了 unparsed-text-available() 和 unparsed-text() 函数,允许我们检查文件是否存在并读取其内容。 然而,在实际应用中,特别是从Java等外部程序调用XSLT时,文件路径的处理可能会遇到一些问题。

使用 unparsed-text-available() 和 unparsed-text() 函数

unparsed-text-available($pathToCSV) 函数用于检查指定路径的文本文件是否存在,并返回一个布尔值。unparsed-text($pathToCSV) 函数则用于读取指定路径的文本文件,并将其内容作为字符串返回。

以下是一个基本的 XSLT 示例,演示如何使用这两个函数读取 CSV 文件:


  

  

  
    
      
        
          
          CSV file content: 
          
        
        
          Cannot locate: 
        
      
    
  

在这个例子中,pathToCSV 是一个 XSLT 参数,用于指定 CSV 文件的路径。xsl:choose 元素根据 unparsed-text-available() 函数的返回值来决定是否读取 CSV 文件。如果文件存在,unparsed-text() 函数将读取其内容并将其存储在 $csv 变量中。

文件路径问题与解决方案

在使用 unparsed-text-available() 和 unparsed-text() 函数时,一个常见的问题是文件路径的解析。特别是当从Java等外部程序调用XSLT时,相对路径可能会导致问题。

一个有效的解决方案是使用 java.io.File 类的 toURI() 方法生成一个 file: URI,并将该 URI 作为 $pathToCSV 样式表参数传递给 XSLT。

以下是一个 Java 示例:

import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;

public class XSLTProcessor {

    public static void main(String[] args) {
        try {
            File csvFile = new File("C:/Dev/mydata.csv"); // 替换为你的 CSV 文件路径
            String pathToCSV = csvFile.toURI().toString();

            File stylesheet = new File("transform.xsl"); // 替换为你的 XSLT 文件路径
            StreamSource stylesource = new StreamSource(stylesheet);
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer(stylesource);

            transformer.setParameter("pathToCSV", pathToCSV);

            File xmlInput = new File("input.xml"); //可以是一个空的XML文件
            StreamSource xmlSource = new StreamSource(xmlInput);

            StreamResult result = new StreamResult(new File("output.xml"));

            transformer.transform(xmlSource, result);

            System.out.println("Transformation completed.");

        } catch (TransformerConfigurationException e) {
            System.err.println("Transformer configuration error: " + e.getMessage());
        } catch (TransformerException e) {
            System.err.println("Transformation error: " + e.getMessage());
        }
    }
}

在这个 Java 示例中,我们首先创建一个 File 对象,指向 CSV 文件。然后,我们使用 toURI().toString() 方法将其转换为 file: URI。最后,我们将该 URI 作为参数传递给 XSLT 转换器。

注意事项

  • 确保 Saxon 9 已正确安装并配置。
  • 在使用 toURI() 方法时,请注意处理文件路径中的特殊字符,例如空格和反斜杠。
  • 在 XSLT 中,可以使用 xsl:message 元素来输出调试信息,例如 $pathToCSV 的值,以便更好地了解文件路径解析的过程。
  • 确保XSLT文件和CSV文件具有相应的读取权限。

总结

通过使用 unparsed-text-available() 和 unparsed-text() 函数,以及通过 Java 将文件 URI 作为参数传递给 XSLT,我们可以有效地在 XSLT 样式表中读取 CSV 文件并进行转换。 这种方法可以避免文件路径解析的问题,并提高 XSLT 转换的可靠性。 记住在实际应用中,需要根据具体情况调整文件路径和参数传递方式。