计算重新访问的xslt 1.0中的时差

时间:2016-12-14 00:28:42

标签: xml templates xslt namespaces xslt-1.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。他们都在模板方法上失败了,但Saxon至少提供了一些错误信息。这是使用模板的错误:

  

myDateEXSLT.xsl第25行第51行的xsl:call-template的静态错误:     XTSE0650:没有名为date:difference的模板   mysateEXSLT.xsl第32行第52行的xsl:call-template的静态错误:     XTSE0650:没有名为date:seconds的模板   警告xsl:myDateEXSLT.xsl第31行第44行的变量:     SXWN9001:没有后续兄弟指令的变量无效   样式表编译期间报告了错误

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

我也使用“import”而不是“include”,但这没有任何区别。有区别吗?

总结一下问题:

  1. 我在模板方法上做错了什么?
  2. 我该如何显示     功能方法的价值?
  3. 之间有区别         'import'和'include'?
  4. 也许前者是将其从网站上拉下来,而后者则是本地资源。

    感谢。

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

1 个答案:

答案 0 :(得分:2)

回答您的具体问题:

  1. “我在模板方法上做错了什么?”
    <xsl:call-template>就是这样做的:调用 模板,由name属性指定。您的XSL没有定义任何名为date:differencedate:seconds的模板,因此它自然会失败。如果在导入或包含的文件中定义了这样的模板,它可能会起作用,但您所包含的文件也不包含任何此类模板。
  2. “如何显示函数方法的值?”
    不要调用不存在的模板,而是尝试调用该函数。仔细阅读the date.msxsl.xsl file provided at the EXSLT page的内容,看起来您想要的功能确实称为date:difference。这适用于使用MSXSL库进行处理,因此请确保您正在使用它 - 例如,尝试使用Saxon处理此问题会导致错误。我不熟悉微软的XML处理堆栈,所以我不能告诉你.NET是否有用 - 从OxygenXML调用.NET 1.0和.NET 2.0库的初步测试表明.NET无法运行。 / LI>
  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指令失败。
  4. 在不深入研究从源文件中提取日期值或在输出中格式化它们的细节的情况下,我创建了一个超级简单,快速且简单的示例,在使用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前缀在包含 ed 文件(date.msxsl.xsl)中定义,但也必须在此处声明包含 ing 文件。

    示例输出:

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

    这确实有效:两个日期时间之间的差异确实是2分1秒。

    这应该给你一个基础。现在,解决剩下的问题,理想情况下,这样做会有一些有趣的学习。 :)