EXSLT date:格式化不带文档的日期模板()XSLT 1.0

EXSLT date:格式化不带文档的日期模板()XSLT 1.0,xslt,date,document,msxml,exslt,Xslt,Date,Document,Msxml,Exslt,我使用XSLT1.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://e

我使用XSLT1.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>

一月
二月
前进
四月
也许
六月
七月
八月
九月
十月
十一月
十二月
到变量:

<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指令“格式模式字符串解释为JDK1.1所述”[我使用的是当前版本]

我根据“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>

据我从文件中了解,这将导致2010年7月1日



<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年7月1日

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

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

msxsl:node-set($months)/month[number($month)]
这是错误的,因为
/month
不是
$months
的根。您可以跳过人工根并直接转到month来轻松修复它:

msxsl:node-set($months)//month[number($month)]
请注意
/
运算符,而不是
/
运算符

编辑


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

根据您引用的EXSLT页面():

目前没有XSLT处理器 我们知道这种支持 日期:本机设置日期格式


您使用的是什么实现?MSXML似乎不支持它。

@Welbog:我想是的。我已经编辑了$months的结构,以便在没有文档()的情况下使用它。我确实得到了结果,但格式不正确。我在问题中添加了示例。