我试图找到一个我发现使用XSLT 2.0输出多个文件的例子。
使用Saxon B 9.7.0.1和Java 1.6,我收到此错误:
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
<?xml version="1.0" encoding="UTF-8"?>
<tests>
<testrun run="test1">
<test name="foo" pass="true" />
<test name="bar" pass="true" />
<test name="baz" pass="true" />
</testrun>
<testrun run="test2">
<test name="foo" pass="true" />
<test name="bar" pass="false" />
<test name="baz" pass="false" />
</testrun>
<testrun run="test3">
<test name="foo" pass="false" />
<test name="bar" pass="true" />
<test name="baz" pass="false" />
</testrun>
</tests>
<?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>
答案 0 :(得分:1)
URI中的字符20是“文档和设置”中的第一个空格。作为快速修复,尝试将文件移动到没有空格的路径。 (说,“C:\ test”或其他一些。)我怀疑长期修复是在将%20
提供给$filename
之前更改您的XSLT以将空格编码为xsl:result-document
,但是我担心我的XSLT-2.0-fu不够强大,无法告诉你如何。
编辑:我没有对此进行测试,因为我没有方便的XSLT 2.0处理器,但在浏览了文档之后,看起来你想要encode-for-uri函数。以下内容可能对您有用:
<xsl:result-document href="{fn:encode-for-uri($filename)}" format="html">
答案 1 :(得分:1)
我遇到了与saxon -o相同的问题:输出文件用%20替换空格..
发现问题是撒克逊和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目录