Xml 如果使用,错误的路径表达式很可能会导致编译时错误。问题是,最需要这个的人是初学者,而初学者自然不希望有任何额外的复杂性。

Xml 如果使用,错误的路径表达式很可能会导致编译时错误。问题是,最需要这个的人是初学者,而初学者自然不希望有任何额外的复杂性。,xml,saxon,xslt-3.0,Xml,Saxon,Xslt 3.0,以下几点观察: (一) 这显然是错误的。“/tr/td”强制选择来自文档的根,而不是当前元素。对于要使用`select=“tr/td[1]”的相对选择 类似地,当您执行select=“html/body…”时,您正在从错误的上下文中进行相对选择。要正确使用路径表达式,必须了解不同的指令如何更改上下文 (2) 当扩展函数被禁用时,xsl:result文档被禁用 这是因为xsltfiddle必须处理不受信任的样式表,并且它不能允许不受信任的样式表将文档写入服务器文件存储上的任意位置。如果在自己的

以下几点观察:

(一)


这显然是错误的。“/tr/td”强制选择来自文档的根,而不是当前元素。对于要使用`select=“tr/td[1]”的相对选择

类似地,当您执行
select=“html/body…”
时,您正在从错误的上下文中进行相对选择。要正确使用路径表达式,必须了解不同的指令如何更改上下文

(2) 当扩展函数被禁用时,xsl:result文档被禁用

这是因为xsltfiddle必须处理不受信任的样式表,并且它不能允许不受信任的样式表将文档写入服务器文件存储上的任意位置。如果在自己的服务器或笔记本电脑上运行(使用默认选项),则不会出现此问题

(3) Saxon没有告诉我任何错误,它只是结束工作,没有创建任何文件


是的,像XSLT这样的动态语言带来的一个不幸后果是,错误的路径表达式往往没有任何症状,只是没有选择任何内容,因此无法执行某些代码(例如xsl:for each的主体)。支持模式的XSLT是为了解决这个问题而设计的,但它增加了复杂性,因此只有少数用户真正利用了它——尽管根据我的经验,如果您在前期做出努力,它可以在后续维护时提供良好的生产力回报。正确使用模式感知XSLT后,错误的路径表达式很可能会导致编译时错误。问题是,最需要这个的人是初学者,初学者自然不希望有任何额外的复杂性。

谢谢你的回答,我使用的是萨克森第九版。要运行saxon,我使用带有以下代码的.bat文件:
@echo off
echo“欢迎使用XMLT转换…”!
set/p input1=“写入XML的名称(扩展名为“.XML”)进行转换=“
echo%input1%
set/p input2=”写入要转换的工作簿表的名称(Excel表名)”
echo%input2%
java-jar C:\Users\saxon9he.jar%input1%transfer\u xml.xsl工作簿名称=%input2%
java-jar C:\Users\saxon9he.jar%input2%.html transfer\u html html html.xsl
暂停我首先从xml创建一个html文件,然后在此html文件的基础上创建两个文本文件代码。我已经试过你的代码了,非常感谢。能否请您解释一下如何在
/tr/td[1]
上获得两个文件名?@Fedo,我添加了第二个示例,假设您希望将除第一行之外的每一行映射到结果文档,然后从第一行中提取函数名。感谢您的回答,我使用的是第九版Saxon。要运行saxon,我使用带有以下代码的.bat文件:
@echo off
echo“欢迎使用XMLT转换…”!
set/p input1=“写入XML的名称(扩展名为“.XML”)进行转换=“
echo%input1%
set/p input2=”写入要转换的工作簿表的名称(Excel表名)”
echo%input2%
java-jar C:\Users\saxon9he.jar%input1%transfer\u xml.xsl工作簿名称=%input2%
java-jar C:\Users\saxon9he.jar%input2%.html transfer\u html html html.xsl
暂停我首先从xml创建一个html文件,然后在此html文件的基础上创建两个文本文件代码。我已经试过你的代码了,非常感谢。能否请您解释一下,我如何在
/tr/td[1]
上获得两个文件名?@Fedo,我添加了第二个示例,假设您希望将除第一行之外的每一行映射到结果文档,然后从第一行中提取函数名。如我的回答所述,表达式
/tr/td[1]
不选择任何内容,因为文档的根元素未命名
tr
。因此,
xsl:for each
执行零次,因此不会创建任何文档。正如我在回答中所解释的,表达式
/tr/td[1]
不选择任何内容,因为文档的根元素未命名为
tr
。因此,
xsl:for-each
执行零次,因此不会创建任何文档。
          <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;}


    <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>

<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>
<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>
<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[position() > 1]" mode="file"/>
  </xsl:template>

  <xsl:template match="td">
      <xsl:param name="pos" select="position()"/>
      <xsl:value-of select="../../tr[1]/td[$pos + 1], '{', ., '}'" separator="&#10;"/>
      <xsl:text>&#10;</xsl:text>
  </xsl:template>

  <xsl:template match="tr" mode="file">
      <xsl:result-document href="{td[1]}.cpp">
          <xsl:apply-templates select="td[position() > 1 and position() &lt; 6]"/>
      </xsl:result-document>
  </xsl:template>

</xsl:stylesheet>
@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
 <xsl:template  match="/html/body/table" >
    <xsl:for-each select="/tr/td[1]">