XSLT Диапазон дат на каждый день - PullRequest
0 голосов
/ 09 мая 2018

Я хотел бы получить ваши экспертные знания по xslt. У меня есть диапазон дат в XML, например,

<data>
<ID>ABC1</ID>
<Start_Date>2018-05-01</Start_Date>
<End_Date>2018-05-10</End_Date>
<data>
<ID>ABC2</ID>
<Start_Date>2018-05-10</Start_Date>
<End_Date>2018-05-12</End_Date>
<data>
<root>

Теперь мне нужно отправить 1 строку на дату, например, для идентификатора ABC1 мне нужно отправить 10 записей с конечной датой startdate в качестве приращения.

после преобразования данные должны выглядеть следующим образом

<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>

пока так далее, итого для ABC1 нам нужно иметь 10 секций данных и для ABC2 2 секций данных.

Пожалуйста, руководство, как я могу реализовать логику в XSLT.

1 Ответ

0 голосов
/ 09 мая 2018

Поскольку вы говорите, что можете использовать как минимум 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, но только для xsl:mode материала, который можно заменить для XSLT 2 на

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

XSLT 3, онлайн-образец на https://xsltfiddle.liberty -development.net / gWmuiJ6 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...