EXSLT日期:没有document()XSLT 1.0的format-date模板

时间:2010-04-28 12:09:50

标签: xslt date document msxml exslt

我正在使用date:format-date template EXSLT file我正在使用XSLT 1.0和MSXML3.0作为处理器。

我的日期:格式 - 日期模板EXSLT文件的声明是:

<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"
  xmlns:str="http://exslt.org/strings"
  extension-element-prefixes="msxsl date str">
   ...
</xsl:stylesheet>

由于第三方限制,我无法使用document()函数。所以我已经改变了XML片段

中的月份和日期(类似地)
<date:months>
  <date:month length="31" abbr="Jan">January</date:month>
  <date:month length="28" abbr="Feb">February</date:month>
  <date:month length="31" abbr="Mar">March</date:month>
  <date:month length="30" abbr="Apr">April</date:month>
  <date:month length="31" abbr="May">May</date:month>
  <date:month length="30" abbr="Jun">June</date:month>
  <date:month length="31" abbr="Jul">July</date:month>
  <date:month length="31" abbr="Aug">August</date:month>
  <date:month length="30" abbr="Sep">September</date:month>
  <date:month length="31" abbr="Oct">October</date:month>
  <date:month length="30" abbr="Nov">November</date:month>
  <date:month length="31" abbr="Dec">December</date:month>
</date:months>

变量:

 <xsl:variable name="months">
   <month length="31" abbr="Jan">January</month>
   <month length="28" abbr="Feb">February</month>
   <month length="31" abbr="Mar">March</month>
   <month length="30" abbr="Apr">April</month>
   <month length="31" abbr="May">May</month>
   <month length="30" abbr="Jun">June</month>
   <month length="31" abbr="Jul">July</month>
   <month length="31" abbr="Aug">August</month>
   <month length="30" abbr="Sep">September</month>
   <month length="31" abbr="Oct">October</month>
   <month length="30" abbr="Nov">November</month>
   <month length="31" abbr="Dec">December</month>
</xsl:variable>

相应地,我更改了最初使用document()函数的代码:
[来自EXSLT样式表的月份处理位]

<xsl:variable name="month-node" select="document('')/*/date:months/date:month[number($month)]" />

使用MSXML3.0节点设置功能

<xsl:variable name="month-node" select="msxsl:node-set($months)/month[number($month)]" />

所以我认为这样可行。

根据EXLT指令“格式模式字符串的解释与JDK 1.1 SimpleDateFormat class.”[我使用的当前版本]相同。

我根据SimpleDateFormat class将月份指定为'dd MMMMM yyyy',以便月份将是整个月的名称,例如1月。但它不起作用:(我已经查看了EXSLT样式表,并且它已经有了这样做的逻辑。还有一些逻辑可以使用'E'模式显示一周的名称,这不起作用对我而言。也许从使用document()变为变量会破坏它。

非常感谢任何帮助。

非常感谢!

实施例

<xsl:call-template name="date:format-date">
    <xsl:with-param name="date-time" select="'2010-07-01'"/>
    <xsl:with-param name="pattern" select="'dd MMMMM yyyy'" />
</xsl:call-template>

正如我从SimpleDateFormat class文档中了解到的,这应该会导致 2010年7月1日,而我得到的是 01 07 2010



<xsl:call-template name="date:format-date">
    <xsl:with-param name="date-time" select="'2010-07-01'"/>
    <xsl:with-param name="pattern" select="'EEE, dd MMMMM yyyy'" />
</xsl:call-template>

这应该会导致 2010年7月1日星期一,我得到的是,01 07 2010

2 个答案:

答案 0 :(得分:0)

当您在XML的无根片段(如月份列表)上使用msxml:node-set时,该函数会自动创建一个包含片段的根。

因此,在您的情况下,您从节点集的路径是错误的:

msxsl:node-set($months)/month[number($month)]

这是错误的,因为/month不是$months的根。您可以通过跳过人工根并直接转到月份来轻松修复它:

msxsl:node-set($months)//month[number($month)]

请注意//运算符,而不是/运算符。

修改

经过测试,我发现我错了。事实上,您使用的原始代码段对我来说很好。 //运算符是不必要的。您确定$month变量设置正确吗?

答案 1 :(得分:0)

根据您引用的EXSLT页面(date:format-date template EXSLT file):

  

目前没有XSLT处理器   我们知道那种支持   date:format-date native。

您使用的是什么实现?它似乎在MSXML中原生支持。