Saxon引擎不创建带有文本的文件

问题描述 投票:1回答:1

昨天我have already asked a question about Saxon and XSLT,但我仍然没有完全解决我的问题。关于我要实现的目标的简短说明:

  1. 作为第一个输入文件,我有一个带有以下代码的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>```
    

`

  1. 我的目标是获取名为test1.cpp和test2.cpp的文本文件,每个文件包含4个类似这样的功能:

    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() &lt; 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="&#10;"/>
          <xsl:text>&#10;</xsl:text>
      </xsl:template>

我的问题是,Saxon不会告诉我任何错误或错误,它只会终止工作并且不会创建任何文件。我也尝试过在在线IDE https://xsltfiddle.liberty-development.net/中处理我的代码但它告诉我:

xsl:result-document在禁用扩展功能时被禁用

我有什么问题?为什么Saxon在不创建任何文件的情况下结束工作(并且没有错误)?

预先感谢。

xml saxon xslt-3.0
1个回答
0
投票
<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() &lt; 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="&#10;"/> <xsl:text>&#10;</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() &lt; 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="&#10;"/>
      <xsl:text>&#10;</xsl:text>
  </xsl:template> 

</xsl:stylesheet>

至于Saxon没有给您任何错误,您没有告诉我们您如何尝试准确使用它以及确切使用哪个版本。

[我认为,出于您的示例,出于某种原因,您将我在<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() &lt; 6]"/>上下文中做出的选择match="/"移到了具有不同匹配模式的其他模板中,然后添加了for-each以进一步更改上下文,只是我不希望任何HTML文档在表格单元格中包含另一个文档,因此当您的上下文是表格单元格时,以html开头的相对路径不太可能选择任何内容。

关于在线小提琴,对不起,但它没有设置为支持xsl:result-document,因为一方面,在公共服务器上具有必需安全设置的Saxon会禁用该指令,而另一方面,小提琴正在提供服务作为XSLT 1-3游乐场,目前尚未集成任何功能来创建和显示多个结果。


0
投票
@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]处获得两个文件名吗?

© www.soinside.com 2019 - 2024. All rights reserved.