Java 使用XSLT输出多个文件
我试图获得一个使用XSLT2.0输出多个文件的示例 在Java 1.6中使用Saxon B 9.7.0.1时,我得到以下错误: C:\Documents and Settings\Administrator\Desktop\saxon>java -jar saxon9.jar -s:input.xml -xsl:transform.xml Error on line 15 of transform.xml: java.net.URISyntaxException: Illegal character in path at index 20: file:///C:/Documents and Settings/Administrator/Desktop/saxon/output1/test1.html at xsl:for-each (file:/C:/Documents%20and%20Settings/Administrator/Desktop/saxon/transform.xml#10) processing /tests/testrun[1] Transformation failed: Run-time errors were reported C:\Documents and Settings\Administrator\Desktop\saxon>java-jar-saxon9.jar-s:input.xml-xsl:transform.xml transform.xml的第15行出错: java.net.URISyntaxException:索引20处的路径中存在非法字符:file:///C:/Documents 和设置/Administrator/Desktop/saxon/output1/test1.html 在xsl:for-each(文件:/C:/Documents%20和%20设置/Administrator/Desktop/saxon/transform.xml#10) 处理/测试/测试运行[1] 转换失败:报告了运行时错误 input.xmlJava 使用XSLT输出多个文件,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,我试图获得一个使用XSLT2.0输出多个文件的示例 在Java 1.6中使用Saxon B 9.7.0.1时,我得到以下错误: C:\Documents and Settings\Administrator\Desktop\saxon>java -jar saxon9.jar -s:input.xml -xsl:transform.xml Error on line 15 of transform.xml: java.net.URISyntaxException: Illegal chara
transform.xml
URI中的字符20是“文档和设置”中的第一个空格。作为一种快速修复方法,请尝试将文件移动到没有空格的路径。(比如说,“C:\test”或类似的东西。)我怀疑长期的解决办法是在将
$filename
输入到xsl:result文档之前将XSLT更改为将空格编码为%20
,但我担心我的XSLT-2.0-fu不够强大,无法告诉您如何使用
编辑:我还没有测试过这个功能,因为我手头没有XSLT 2.0处理器,但是在浏览了文档之后,您似乎想要这个功能。以下内容可能适合您:
<xsl:result-document href="{fn:encode-for-uri($filename)}" format="html">
我对saxon-o也有同样的问题:outputfile将空格替换为%20
发现问题在于saxon和java版本
Linux JAVA 1.7.0_45:Saxon创建%20
Unix JAVA 1.5.0_61:SAXON创建%20
Unix JAVA 1.4.2_22:SAXON不创建%20目录我将其移动到C:\中,这就成功了,谢谢!但是,似乎Saxon开发人员也可以做一些事情来纠正这一点,因为它很好地替换了转换文件路径中的空格。我刚刚尝试了您的更改,我似乎无法让它产生相同的错误。我还在$filename的声明中尝试了它。请注意,我必须删除“fn:”名称空间,因为它说它未声明。我不确定这是否会在注释中正确出现,但我相信您需要将fn
名称空间声明为http://www.w3.org/2005/xpath-functions
。更多信息:不,它把它变成了一个URL。从第二个链接获取名称空间。:-)这看起来像是它的主要抄袭者——引用这一点是恰当的。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="text"/>
<xsl:output method="html" indent="yes" name="html"/>
<xsl:template match="/">
<xsl:for-each select="//testrun">
<xsl:variable name="filename"
select="concat('output1/',@run,'.html')" />
<xsl:value-of select="$filename" /> <!-- Creating -->
<xsl:result-document href="{$filename}" format="html">
<html><body>
<xsl:value-of select="@run"/>
</body></html>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:result-document href="{fn:encode-for-uri($filename)}" format="html">