昨天我have already asked a question about Saxon and XSLT,但我仍然没有完全解决我的问题。关于我要实现的目标的简短说明:
作为第一个输入文件,我有一个带有以下代码的html文件:
`
<h1>Use_Cases</h1>
<table border="1">
<tr>
<td>file_name</td>
<td>function1()</td>
<td>function2()</td>
<td>function3()</td>
<td>function4()</td>
<td></td>
</tr>
<tr>
<td>test1</td>
<td>a+a;</td>
<td>b+b;</td>
<td>c+c;</td>
<td>d+d;</td>
<td></td>
</tr>
<tr>
<td>test2</td>
<td>a+a;</td>
<td>b+b;</td>
<td>c+c;</td>
<td>d+d;</td>
<td></td>
</tr>```
`
function1(){
a+a;}
function2(){
b+b;}
function3(){
c+c;}
我已经写了这样的代码来基于最后一个问题来转换我的html文件:
<xsl:template match="/html/body/table" >
<xsl:for-each select="/tr/td[1]">
<xsl:variable name="file_name" select="../tr/td[1]"/>
<xsl:result-document href="{$file_name}.cpp" method="text">
<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="td">
<xsl:param name="pos" select="position()"/>
<xsl:value-of select="., '{', ../following-sibling::tr[1]/td[$pos + 1], '}'" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
我的问题是,Saxon不会告诉我任何错误或错误,它只会终止工作并且不会创建任何文件。我也尝试过在在线IDE https://xsltfiddle.liberty-development.net/中处理我的代码但它告诉我:
xsl:result-document在禁用扩展功能时被禁用
我有什么问题?为什么Saxon在不创建任何文件的情况下结束工作(并且没有错误)?
预先感谢。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
</xsl:template>
<xsl:template match="td">
<xsl:param name="pos" select="position()"/>
<xsl:value-of select="., '{', ../following-sibling::tr[1]/td[$pos + 1], '}'" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
如果从命令行运行Saxon,则可以将-o:file.text
用作特定的输出文件名;如果您需要在XSLT代码中执行此操作,请使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:result-document href="file.text">
<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
</xsl:result-document>
</xsl:template>
<xsl:template match="td">
<xsl:param name="pos" select="position()"/>
<xsl:value-of select="., '{', ../following-sibling::tr[1]/td[$pos + 1], '}'" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
至于Saxon没有给您任何错误,您没有告诉我们您如何尝试准确使用它以及确切使用哪个版本。
[我认为,出于您的示例,出于某种原因,您将我在<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
上下文中做出的选择match="/"
移到了具有不同匹配模式的其他模板中,然后添加了for-each
以进一步更改上下文,只是我不希望任何HTML文档在表格单元格中包含另一个文档,因此当您的上下文是表格单元格时,以html
开头的相对路径不太可能选择任何内容。关于在线小提琴,对不起,但它没有设置为支持
xsl:result-document
,因为一方面,在公共服务器上具有必需安全设置的Saxon会禁用该指令,而另一方面,小提琴正在提供服务作为XSLT 1-3游乐场,目前尚未集成任何功能来创建和显示多个结果。
@echo off
echo "Welcome to XMLT transformation...!!!"
set /p input1="Write name of XML (with '.xml' Extension) to transform= "
echo %input1%
set /p input2="Write name of workbook-sheet (Excel Sheet name) to transform= "
echo %input2%
java -jar C:\Users\saxon9he.jar %input1% transfer_xml.xsl workbook_name=%input2%
java -jar C:\Users\saxon9he.jar %input2%.html transfer_html.xsl
pause
我首先从xml创建一个html文件,然后应基于该html文件创建2个带代码的文本文件。我已经尝试过您的代码,它可以正常工作,非常感谢。您能给我解释一下如何在/tr/td[1]
处获得两个文件名吗?