Xml xsl 1.0上的日期操作

Xml xsl 1.0上的日期操作,xml,datetime,xslt-1.0,operation,Xml,Datetime,Xslt 1.0,Operation,我需要在变量中定义的给定日期前后3天,并将每个日期存储在xsl 1.0中新的单个变量中。 我不能使用任何扩展或第三方工具 通过论坛上的答案,我发现:对于一个类似的问题,但我不完全理解它是否以及如何应用于我的代码 Mi date变量采用标准日期时间格式,如下所示: <xsl:variable name="Date" select="2014-05-13T00:00:00"/> 我需要输出一个类似以下内容的html: <table> <tr> &

我需要在变量中定义的给定日期前后3天,并将每个日期存储在xsl 1.0中新的单个变量中。 我不能使用任何扩展或第三方工具

通过论坛上的答案,我发现:对于一个类似的问题,但我不完全理解它是否以及如何应用于我的代码

Mi date变量采用标准日期时间格式,如下所示:

<xsl:variable name="Date" select="2014-05-13T00:00:00"/>

我需要输出一个类似以下内容的html:

<table>
  <tr>
    <td>
   2014-05-10
    <td>
  </tr>
  <!---some rows with pricing information -->
</table>
<table>
  <tr>
    <td>
   2014-05-11
    <td>
  </tr>
  <!---some rows with pricing information -->
</table>
<table>
  <tr>
    <td>
   2014-05-12
    <td>
  </tr>
  <!---some rows with pricing information -->
</table>
<!-- etc -->

2014-05-10
2014-05-11
2014-05-12
在包含定价信息的行中,我必须使用每个单独的日期来执行其他操作,因此每天必须存储在一个变量中以供进一步使用

有没有办法做到这一点,只使用XSLT1.0

提前感谢。

SAXON 6.5.5支持,但是没有实现将优雅地解决问题的
日期:add-duration()
from

但是,您可以直接:

您还可以使用绑定外部Java类的捷径技术,将类名作为命名空间URI的一部分

使用快捷技术,名称空间的URI标识将在其中找到外部函数的类。命名空间URI必须是
“java:
,后跟完全限定的类名(例如
xmlns:date=“java:java.util.date”

引用from,Java中向日期添加天数的方法是

String dt = "2008-01-01";  // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1);  // number of days to add
dt = sdf.format(c.getTime());  // dt is now the new date
XSLT版本可能如下所示(未经测试):


关于从XPath与Java类和对象交互:

  • 发件人:
    • 如果存在具有正确名称的可用方法,系统函数
      函数available(字符串名称)
      将返回true
    • 如果方法是构造函数,则XPath值的类型为“wrapped Java object”。使用此函数的唯一方法是将其传递给另一个外部函数[…]
    • 如果结果是任何其他Java对象(包括null),它将作为“包装的Java对象”返回
    • 可以直接调用静态方法
  • 从)
    • 实例级方法(即非静态方法)是通过提供Java Object类型的额外第一个参数来调用的,Java Object是要调用方法的对象
我不确定方法名的格式。Saxon 6.5.5文档似乎暗示了虚线格式(
toString()
变成了
to-string()
),所以我一直在这里使用它。也许
calendar:set-time()
必须实际调用
calendar:setTime()
,尝试一下并修复我的答案。

SAXON 6.5.5支持,但没有实现
date:add-duration()

但是,您可以直接:

您还可以使用绑定外部Java类的捷径技术,将类名作为命名空间URI的一部分

使用快捷技术,名称空间的URI标识将在其中找到外部函数的类。命名空间URI必须是
“java:
,后跟完全限定的类名(例如
xmlns:date=“java:java.util.date”

引用from,Java中向日期添加天数的方法是

String dt = "2008-01-01";  // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1);  // number of days to add
dt = sdf.format(c.getTime());  // dt is now the new date
XSLT版本可能如下所示(未经测试):


关于从XPath与Java类和对象交互:

  • 发件人:
    • 如果存在具有正确名称的可用方法,系统函数
      函数available(字符串名称)
      将返回true
    • 如果方法是构造函数,则XPath值的类型为“wrapped Java object”。使用此函数的唯一方法是将其传递给另一个外部函数[…]
    • 如果结果是任何其他Java对象(包括null),它将作为“包装的Java对象”返回
    • 可以直接调用静态方法
  • 从)
    • 实例级方法(即非静态方法)是通过提供Java Object类型的额外第一个参数来调用的,Java Object是要调用方法的对象
我不确定方法名的格式。Saxon 6.5.5文档似乎暗示了虚线格式(
toString()
变成了
to-string()
),所以我一直在这里使用它。也许
calendar:set-time()
必须实际调用
calendar:setTime()
,尝试一下并修复我的答案。

在纯XSLT 1.0中添加/减去日期的天数:

结果:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <GivenDate>2014-05-13T00:00:00</GivenDate>
   <NewDate>2014-05-10</NewDate>
</output>

2014-05-13T00:00:00
2014-05-10
--
请注意,givenDate的参数值是一个字符串,因此必须用单引号括起来。

在纯XSLT 1.0中添加/减去日期前后的天数:

结果:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <GivenDate>2014-05-13T00:00:00</GivenDate>
   <NewDate>2014-05-10</NewDate>
</output>

2014-05-13T00:00:00
2014-05-10
--

请注意,givenDate的参数值是一个字符串,因此必须用单引号括起来。

您使用的XSLT处理器是什么?最佳答案取决于此。(换句话说,您可以在另一个线程中使用答案,并根据您的需要调整答案,但是如果您能够访问某些sor的XSLT扩展,则会容易得多。)