1

我正在使用date:format-date 模板 EXSLT 文件我正在使用 XSLT 1.0 和 MSXML3.0 作为处理器。

我的 date:format-date 模板 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>

由于第 3 方的限制,我无法使用 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 类的描述。 ” [我使用当前版本]。

我根据SimpleDateFormat 类将月份指定为“dd MMMMM yyyy”,这样月份将是完整月份的名称,例如一月。但它不起作用:(我查看了 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 类文档中了解到的那样,这应该导致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 日星期一,我得到的是2010 年 1 月 7

4

2 回答 2

0

根据您引用的 EXSLT 页面(日期:格式日期模板 EXSLT 文件):

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

你正在使用什么实现?它似乎在 MSXML 中不受本机支持。

于 2010-04-29T19:33:48.390 回答
0

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

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

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

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

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

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

编辑

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

于 2010-04-28T14:00:25.770 回答