Xml XSLT日期范围为每天

Xml XSLT日期范围为每天,xml,xslt,xsd,Xml,Xslt,Xsd,我想征求您对xslt的专业知识。 我有XML格式的日期范围,例如。 现在,我需要每个日期发送1行,例如,对于ABC1 id,我需要发送10条记录,以startdate enddate作为增量 转换后的数据应如下所示 在此之前,ABC1总共需要10个数据段,ABC2总共需要2个数据段 请指导我如何在XSLT中实现逻辑。正如您所说,您至少可以使用XSLT 2。您可以利用xs:date数据类型和算术运算(如减法XSLT/XPath 2)以及更高版本的支持,以天为单位计算差异,然后使用正确的日期多次

我想征求您对xslt的专业知识。 我有XML格式的日期范围,例如。

现在,我需要每个日期发送1行,例如,对于ABC1 id,我需要发送10条记录,以startdate enddate作为增量

转换后的数据应如下所示

在此之前,ABC1总共需要10个数据段,ABC2总共需要2个数据段


请指导我如何在XSLT中实现逻辑。

正如您所说,您至少可以使用XSLT 2。您可以利用xs:date数据类型和算术运算(如减法XSLT/XPath 2)以及更高版本的支持,以天为单位计算差异,然后使用正确的日期多次处理每个项目:

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

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

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="data">
      <xsl:variable name="data" select="."/>
      <xsl:for-each select="0 to days-from-duration(xs:date(End_Date) - xs:date(Start_Date))">
          <xsl:apply-templates select="$data" mode="increment">
              <xsl:with-param name="date" tunnel="yes" select="xs:date($data/Start_Date) + xs:dayTimeDuration('P1D') * ."/>
          </xsl:apply-templates>
      </xsl:for-each>
  </xsl:template>

  <xsl:template match="data/Start_Date | data/End_Date" mode="increment">
      <xsl:param name="date" tunnel="yes"/>
      <xsl:copy>
          <xsl:value-of select="$date"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XSLT 3在线示例位于。

那么您是否使用支持xs:date数据类型和算术的XSLT 2或3处理器?我现在使用XSLT 2,但也可以使用3。移动到任何版本都没有问题。对于ABC2,您希望在2018年5月10日、11日、12日重复两次或三次吗?对于ABC2,3重复10、11和12,您真是太棒了。谢谢你的解决方案,也许我需要时间去理解它,但是你太棒了。
<data>
<ID>ABC1</ID>
<Start_Date>2018-05-01</Start_Date>
<End_Date>2018-05-01</End_Date>
<data>
<data>
<ID>ABC1</ID>
<Start_Date>2018-05-02</Start_Date>
<End_Date>2018-05-02</End_Date>
<data>
<data>
<ID>ABC1</ID>
<Start_Date>2018-05-10</Start_Date>
<End_Date>2018-05-10</End_Date>
<data><root>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

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

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="data">
      <xsl:variable name="data" select="."/>
      <xsl:for-each select="0 to days-from-duration(xs:date(End_Date) - xs:date(Start_Date))">
          <xsl:apply-templates select="$data" mode="increment">
              <xsl:with-param name="date" tunnel="yes" select="xs:date($data/Start_Date) + xs:dayTimeDuration('P1D') * ."/>
          </xsl:apply-templates>
      </xsl:for-each>
  </xsl:template>

  <xsl:template match="data/Start_Date | data/End_Date" mode="increment">
      <xsl:param name="date" tunnel="yes"/>
      <xsl:copy>
          <xsl:value-of select="$date"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
<xsl:template match="@* | node()" mode="#default increment">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()" mode="#current"/>
  </xsl:copy>
</xsl:template>