
本文旨在指导开发者如何在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 文件:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="pathToCSV"/>
<xsl:template match="/">
<root>
<xsl:choose>
<xsl:when test="unparsed-text-available($pathToCSV)">
<xsl:variable name="csv" select="unparsed-text($pathToCSV)"/>
<xsl:message>CSV file content: <xsl:value-of select="$csv"/></xsl:message>
<!-- 在这里对 CSV 内容进行解析和转换 -->
</xsl:when>
<xsl:otherwise>
<error>Cannot locate: <xsl:value-of select="$pathToCSV"/></error>
</xsl:otherwise>
</xsl:choose>
</root>
</xsl:template>
</xsl:stylesheet>在这个例子中,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 转换器。
注意事项
总结
通过使用 unparsed-text-available() 和 unparsed-text() 函数,以及通过 Java 将文件 URI 作为参数传递给 XSLT,我们可以有效地在 XSLT 样式表中读取 CSV 文件并进行转换。 这种方法可以避免文件路径解析的问题,并提高 XSLT 转换的可靠性。 记住在实际应用中,需要根据具体情况调整文件路径和参数传递方式。
以上就是读取XSLT样式表中的CSV文件的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号