重新访问XSLT 1.0的时间差



我正在尝试遵循此答案中给出的指南:时间差

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

输入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:XSLSaxonHE9-7-0-14Jsaxon9he.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上的静态错误:MyDateExsslt.xsl的第25行51列上的呼叫网板: XTSE0650:不存在命名日期的模板:差异 XSL上的静态错误:MyDateExslt.xsl的第32列第32列上的呼叫网板: XTSE0650:不存在命名的模板命名日期:秒 XSL警告:MyDateExslt.xsl的第31行上的变量: SXWN9001:一个没有以下同胞说明没有效果的变量 在样式表汇编期间报告了错误

当我评论模板并取消输入功能方法时,我没有错误,但不知道如何将Time-Diff-SEC的结果显示为table-data值。相反,输出只是输入文件的2个数据。

我还使用了"导入"而不是" inclage",但这没有任何区别。有区别吗?

因此总结问题:

  1. 模板方法我做错了什么?
  2. 我如何显示 来自功能方法的价值?
  3. 是否有区别 "导入"one_answers" include"?

也许前者是为了将其从站点拉下来,而后者是用于本地资源的。

谢谢。

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

回答您的特定问题:

  1. "我在模板方法上做错了什么?"
    <xsl:call-template>就是这样做的:IT 调用 a 模板,如name属性所指定的。您的XSL不能定义任何名为date:differencedate:seconds的模板,因此自然会失败。如果在导入或随附的文件中定义了这样的模板,则可能会起作用,但是您包含的文件也不包含任何此类模板。
  2. "如何从函数方法显示值?"
    而不是调用不存在的模板,而是尝试调用该功能。仔细阅读在EXSLT页面上提供的date.msxsl.xsl文件的内容,看起来您想要的功能确实称为date:difference。这旨在使用MSXSL库处理,因此请确保您正在使用它 - 例如,尝试与撒克逊人一起处理此问题会丢弃错误。我对Microsoft的XML处理堆栈的知识不佳,所以我无法告诉您.NET是否可以工作 - 初步测试调用.NET 1.0和.NET 2.0库中的oxygenxml库表明.NET表明.NET表明.NET不起作用。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  3. "'import'和'include'?简而言之,是的。请参阅 stylesheet包含的部分。
    您在上面使用<xsl:include>。这需要有效的HREF - 基本上是一条路径。您提供date.msxsl.xsl的值,因此XSL Parser寻找一个名为date.msxsl.xsl的文件,该文件与XSL样式表文件本身在同一目录中。假设您将该文件保存在与您自己的XSL相同的目录中,则XSL处理器会找到它。但是,该文件还不包含任何称为date:differencedate:seconds的模板,因此您的call-template指令失败。

而无需挖掘从源文件中提取日期值的详细信息,或者在输出中格式化它们,我创建了一个超简单,快速且dirty的示例,该示例在使用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前缀在Include ED file(date.msxsl.xsl)中定义,但也必须在此处在Include > ING 文件中声明。

样本输出:

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

这确实在起作用:两个日期时间的差异确实是2分钟和1秒。

这应该为您提供基础。现在,算出其余的,理想情况下,您可以进行一些有趣的学习。:)

相关内容

  • 没有找到相关文章

最新更新