
本文旨在指导开发者如何在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 变量中。
文件路径问题与解决方案
这是一款使用jquery制作的带商品分类侧边栏列表的商城导航菜单。该商城菜单兼容ie8浏览器。用户可以通过点击左侧的下拉菜单来查看各种商品的列表,非常实用和方便。 使用方法 在页面中引入样式文件style.css和jquery.min.js文件。
在使用 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 转换的可靠性。 记住在实际应用中,需要根据具体情况调整文件路径和参数传递方式。









