XSLT-如何为两个日期之间的每个日期创建元素
我正在使用以下XML结构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> <
<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使用我更新的解决方案我更正了错误。这太棒了。再次感谢!