XSLT-如何为两个日期之间的每个日期创建元素

XSLT-如何为两个日期之间的每个日期创建元素,xslt,xslt-2.0,xslt-3.0,Xslt,Xslt 2.0,Xslt 3.0,我正在使用以下XML结构 <File> <Record> <ID>01234</ID> <Description>Sample description</Description> <StartDate>2021-01-29</StartDate> <EndDate>2021-02-02</EndDate> </Record> <

我正在使用以下XML结构

<File>
<Record>
    <ID>01234</ID>
    <Description>Sample description</Description>
    <StartDate>2021-01-29</StartDate>
    <EndDate>2021-02-02</EndDate>
</Record>
<Record>
    <ID>56789</ID>
    <Description>Sample description</Description>
    <StartDate>2021-02-03</StartDate>
    <EndDate>2021-02-06</EndDate>
</Record>

01234
样本描述
2021-01-29
2021-02-02
56789
样本描述
2021-02-03
2021-02-06
我需要为中间的每个日期创建一个记录元素,包括给定的开始日期和结束日期。生成的XML需要如下所示

<File>
<Record>
    <ID>01234</ID>
    <Description>Sample description</Description>
    <EventDate>2021-01-29</EventDate>
</Record>
<Record>
    <ID>01234</ID>
    <Description>Sample description</Description>
    <EventDate>2021-01-30</EventDate>
</Record>
<Record>
    <ID>01234</ID>
    <Description>Sample description</Description>
    <EventDate>2021-01-31</EventDate>
</Record>
<Record>
    <ID>01234</ID>
    <Description>Sample description</Description>
    <EventDate>2021-02-01</EventDate>
</Record>
<Record>
    <ID>01234</ID>
    <Description>Sample description</Description>
    <EventDate>2021-02-02</EventDate>
</Record>
<Record>
    <ID>56789</ID>
    <Description>Sample description</Description>
    <EventDate>2021-02-03</EventDate>
</Record>
<Record>
    <ID>56789</ID>
    <Description>Sample description</Description>
    <EventDate>2021-02-04</EventDate>
</Record>
<Record>
    <ID>56789</ID>
    <Description>Sample description</Description>
    <EventDate>2021-02-05</EventDate>
</Record>
<Record>
    <ID>56789</ID>
    <Description>Sample description</Description>
    <EventDate>2021-02-06</EventDate>
</Record>

01234
样本描述
2021-01-29
01234
样本描述
2021-01-30
01234
样本描述
2021-01-31
01234
样本描述
2021-02-01
01234
样本描述
2021-02-02
56789
样本描述
2021-02-03
56789
样本描述
2021-02-04
56789
样本描述
2021-02-05
56789
样本描述
2021-02-06
到目前为止,我所做的研究并没有给我太多的帮助,鉴于我的XSLT知识严重缺乏,我非常感谢任何帮助。我的偏好是不使用递归函数(可能是XSLT 3.0??),但在这一点上,我会选择任何东西


谢谢。

这里有一种方法可以做到这一点:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml"/>

  <xsl:template match="Record">
    <xsl:variable name="currentRec" select="."/>
    <xsl:variable name="numberDays" select="xs:integer((xs:date(EndDate) - xs:date(StartDate)) div xs:dayTimeDuration('P1D'))"/>
    <xsl:for-each select="0 to $numberDays">
        <Record>
            <xsl:copy-of select="$currentRec/ID"/>
            <xsl:copy-of select="$currentRec/Description"/>
            <EventDate><xsl:value-of select="xs:date($currentRec/StartDate) + (xs:dayTimeDuration('P1D')*(position()-1))"/></EventDate>
        </Record>
    </xsl:for-each>
  </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作了吗:

您可以使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    expand-text="yes"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:output indent="yes"/>

  <xsl:template match="Record">
      <xsl:apply-templates select="(0 to days-from-duration(xs:date(EndDate) - xs:date(StartDate))) ! current()" mode="split"/>
  </xsl:template>
  
  <xsl:template match="Record" mode="split">
      <xsl:copy>
          <xsl:apply-templates select="* except (StartDate, EndDate)"/>
          <EventDate>{xs:date(StartDate) + xs:dayTimeDuration('P1D') * (position() - 1)}</EventDate>
      </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

{xs:date(StartDate)+xs:dayTimeDuration('P1D')*(position()-1)}

应该会让你知道如何在
开始日期中添加一天
,你甚至可以在剩余的几天中将持续时间乘以一个整数,整个差异是
xs:date(EndDate)-xs:date(StartDate)
谢谢@Sebastien!当我测试你的解决方案时,我没有得到起始日期的元素。有什么想法吗?@user6353351使用我更新的解决方案我更正了错误。这太棒了。再次感谢!