我正在尝试遵循此答案中给出的指南:时间差
,但不明白为什么模板方法失败。也许它与命名空间有关。而且我不了解我的功能方法的结果。
输入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",但这没有任何区别。有区别吗?
因此总结问题:
- 模板方法我做错了什么?
- 我如何显示 来自功能方法的价值?
- 是否有区别 "导入"one_answers" include"?
也许前者是为了将其从站点拉下来,而后者是用于本地资源的。
谢谢。
这是文件date.msxsl.xsl。我会在这里发布它,因为该exslt.org网站似乎存在问题。(重命名扩展名):date.msxsl.xsl
回答您的特定问题:
-
"我在模板方法上做错了什么?"
<xsl:call-template>
就是这样做的:IT 调用 a 模板,如name
属性所指定的。您的XSL不能定义任何名为date:difference
或date:seconds
的模板,因此自然会失败。如果在导入或随附的文件中定义了这样的模板,则可能会起作用,但是您包含的文件也不包含任何此类模板。 -
"如何从函数方法显示值?"
而不是调用不存在的模板,而是尝试调用该功能。仔细阅读在EXSLT页面上提供的date.msxsl.xsl
文件的内容,看起来您想要的功能确实称为date:difference
。这旨在使用MSXSL库处理,因此请确保您正在使用它 - 例如,尝试与撒克逊人一起处理此问题会丢弃错误。我对Microsoft的XML处理堆栈的知识不佳,所以我无法告诉您.NET是否可以工作 - 初步测试调用.NET 1.0和.NET 2.0库中的oxygenxml库表明.NET表明.NET表明.NET不起作用。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -
"'import'和'include'?简而言之,是的。请参阅 stylesheet包含的部分。
您在上面使用<xsl:include>
。这需要有效的HREF - 基本上是一条路径。您提供date.msxsl.xsl
的值,因此XSL Parser寻找一个名为date.msxsl.xsl
的文件,该文件与XSL样式表文件本身在同一目录中。假设您将该文件保存在与您自己的XSL相同的目录中,则XSL处理器会找到它。但是,该文件还不包含任何称为date:difference
或date: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秒。
这应该为您提供基础。现在,算出其余的,理想情况下,您可以进行一些有趣的学习。:)