2016-12-14 120 views
0

我想按照这个答案给出了指导意见: time difference计算时间差重新

但不明白为什么模板方法失败。也许它与命名空间有关。 而我不明白我的功能方法的结果。

输入XML:

<BatchData > 
<Line> 
    <Batch> 
     <start>2011-12-13T16:15:26</start> 
     <end>2011-12-13T16:17:27</end> 
    </Batch> 
</Line> 

XSL文件:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:date="http://exslt.org/dates-and-times" 
extension-element-prefixes="date" 
> 
<xsl:include href="date.msxsl.xsl" /> 

<!-- msxsl.exe myDateTestInput.xml myDateEXSLT.xsl -o dateTestOut.html--> 
<!-- java -cp C:\XSL\SaxonHE9-7-0-14J\saxon9he.jar net.sf.saxon.Transform -t -s:myDateTestInput.xml -xsl:myDateEXSLT.xsl -o:dateTestOut.html --> 

<xsl:output method="html" /> 
<xsl:template match="/BatchData/Line/Batch"> 
    <html> 
     <head> 

     </head> 

     <body> 

       <table > 
        <tr> 
         <td> 
          <xsl:variable name="time-diff-dur"> 
          <xsl:call-template name="date:difference"> 
           <xsl:with-param name="start" select="start" /> 
           <xsl:with-param name="end" select="end" /> 
          </xsl:call-template> 
          </xsl:variable> 
          <!-- The above returns a duration formatted string, so convert that to seconds: --> 
          <xsl:variable name="time-diff-sec"> 
           <xsl:call-template name="date:seconds"> 
            <xsl:with-param name="seconds" select="$time-diff-dur" /> 
           </xsl:call-template> 
          </xsl:variable> 

          <!-- 
           <xsl:variable name="time-diff-sec" select="date:seconds(date:difference(start, end))" /> 
           <xsl:value-of select="$time-diff-sec"></xsl:value-of> 
          --> 

         </td> 

         </tr> 
       </table> 
     </body> 
    </html> 
</xsl:template> 

我同时使用msxsl和Saxon9he。他们在模板方法上都失败了,但撒克逊至少提供了一些错误信息。这是使用模板的错误:

静态误差在XSL:呼叫模板上线25列51 myDateEXSLT.xsl的: XTSE0650:没有模板存在名为日期:区别在XSL 静态错误:调用myDateEXSLT.xsl第32列第52行模板: XTSE0650:没有指定日期的模板:秒 myDateEXSLT.xsl第31行xsl:变量的警告: SXWN9001:没有以下兄弟指令的变量没有效果 样式表汇编过程中报告了错误

当我注释掉模板并取消注释函数方法时,我没有得到任何错误,但不知道如何将time-diff-sec的结果显示为表数据值。相反,输出只是输入文件的2个日期时间。

我也使用“导入”而不是“包含”,但没有任何区别。有区别吗?

所以总结一下问题:

  1. 我做了什么错模板方法?
  2. 如何显示功能方法中的 值?
  3. 'import'和'include'之间有区别吗?

也许前者是从一个网站拉下来,而后者是为了本地资源。

感谢。

这是文件date.msxsl.xsl。我会在这里发布它,因为该exslt.org网站似乎有问题。 (重命名扩展名): date.msxsl.xsl

回答

2

在回答您的具体问题:

  1. “我做了什么错模板方法?“
    <xsl:call-template>只是做的是:它由name属性指定调用一个模板,您的XSL没有定义命名任何模板,无论是date:differencedate:seconds,所以它自然失败。如果这样的模板被定义。导入或包含的文件,它可能工作,但要包括的文件不包含任何这样的模板无论是。
  2. “我怎么显示从函数逼近的价值?”
    ,而不是调用非如果存在模板,请尝试调用该函数。请仔细阅读的内容,它看起来像你想要的功能的确被称为date:difference。这是为了与MSXSL库一起处理的,所以确保你在使用它 - 尝试用Saxon处理这个,例如,会抛出错误。我不是很了解微软的XML处理堆栈,所以我不能告诉你.NET是否可以工作 - 从OxygenXML调用.NET 1.0和.NET 2.0库的初步测试表明,.NET将不起作用。
  3. “'import'和'include'之间有区别吗?”
    总之,是的。请参阅Stylesheet Inclusion in the official W3 documentation部分。
    您使用上面的<xsl:include>。这需要一个有效的HREF - 基本上,一条路径。您提供的值为date.msxsl.xsl,因此XSL解析器将查找名为date.msxsl.xsl的文件,该文件位于与XSL样式表文件本身相同的目录中。假设您将该文件保存在与您自己的XSL相同的目录中,那么XSL处理器将会找到它。但是,该文件也不包含任何称为date:differencedate:seconds的模板,因此您的call-template指令失败。

没有深入研究从源文件中提取日期值或在输出中格式化它们的细节,我创建了一个超级简单,快速且脏的示例,使用MSXSL处理时成功执行v4.0库。

样品XSL:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="http://exslt.org/dates-and-times" 
    > 
    <xsl:include href="date.msxsl.xsl" /> 

    <xsl:template match="/"> 
     <TEST> 
      <xsl:value-of select="date:difference('2011-12-13T16:15:26', '2011-12-13T16:17:27')"/> 
     </TEST> 
    </xsl:template> 

</xsl:stylesheet> 

/的匹配是在逻辑根匹配。这匹配任何输入,所以我不打扰在这个例子中提供任何。

还应注意xmlns:date声明:该date前缀在includ 文件(date.msxsl.xsl)定义,但它也必须在这里宣布在includ荷兰国际集团文件

示例输出:

<TEST xmlns:date="http://exslt.org/dates-and-times">PT2M1S</TEST> 

但这似乎工作:在两个日期时间之间的差是的确2分钟,1秒钟。

这应该给你一个基础。现在,解决其余的问题,最好在你这样做的时候有一些有趣的学习。 :)