XML в CSV (генерация новой даты с вводом даты) - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть требование, в котором я должен сгенерировать новую дату (ГГГГММДД) из даты, которая входит в запись (ГГГГММДД), и ниже приведена логика для создания новой даты:

1.Если «MM - 1» = 0, то задайте MM -'12 'и значение Year как YearFromActualDate - 1 2.DD всегда '01' 3. Если «ММ - 1»! = 0, то ММ на выходе будет «ММ - 1», а год останется прежним Я упомянул ожидаемый результат, который даст представление о вышеупомянутой логике. Пожалуйста, сообщите.

        <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:fn="http://www.w3.org/2005/xpath-functions" >
<xsl:output method="text" encoding="utf-8" />
<xsl:param name="delim" select="','" />
<xsl:param name="quote" select="'&quot;'" />
<xsl:param name="break" select="'&#xA;'" />
<xsl:template match="/">
    <xsl:value-of select="$quote" />
    <xsl:text>Name</xsl:text>
    <xsl:value-of select="$quote" />
    <xsl:value-of select="$delim" /> 
    <xsl:value-of select="$quote" />
    <xsl:text>Date</xsl:text>
    <xsl:value-of select="$quote" />
    <xsl:value-of select="$delim" />
    <xsl:value-of select="$quote" />
    <xsl:text>NewDate</xsl:text>
    <xsl:value-of select="$quote" />
    <xsl:value-of select="$break" /> 
    <xsl:apply-templates select="ID/ED/E1" /> 
</xsl:template>
<xsl:template match="E1">
    <xsl:value-of select="$quote" />
    <xsl:value-of select="name"/>
    <xsl:value-of select="$quote" />
    <xsl:value-of select="$delim" />   
    <xsl:value-of select="$quote" />
    <xsl:value-of select="date"/>
    <xsl:value-of select="$quote" />
    <xsl:value-of select="$delim" />  
    <xsl:value-of select="$quote" />
    <xsl:variable name="newdate" select="'01'" />
    <xsl:variable name="inMonth" select="substring(date,5,2)" />
    <xsl:variable name="inputYear" select="substring(date,1,4)" />
    <xsl:choose>
        <xsl:when test = "$inMonth='01'">
            <xsl:variable name="calculatedMonth" select="12"/>
            <xsl:value-of select="concat(xs:integer($inputYear) - 1,$calculatedMonth,$newdate)" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="inMonthlength" select="string-length(xs:string(xs:integer($inMonth) - 1))" />
            <xsl:if test="xs:integer($inMonthlength) !=2">
                <xsl:value-of select="concat($inputYear,concat(0,xs:integer($inMonth) - 1),$newdate)" />
            </xsl:if>
            <xsl:if test="xs:integer($inMonthlength) =2">
                <xsl:value-of select="concat($inputYear,(xs:integer($inMonth) - 1),$newdate)" />
            </xsl:if>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="$quote"/>
    <xsl:if test="following-sibling::*">
        <xsl:value-of select="$break" />    
    </xsl:if>
</xsl:template>

Введите:

   <ID>
   <ED>
   <E1>
   <name>Eva</name>
   <date>20190504</date> (Consider date as YYYYMMDD)
   </E1>
   <E1>
   <name>Alan</name>
   <date>20190101</date>
   </E1>
   </ED>
   <ID>

Ожидаемый результат:

     "Name","Date","NewDate"
     "Eva","20190504","20190401"
     "Alan","20190101","20181201"

1 Ответ

0 голосов
/ 16 апреля 2019

Если я правильно перепроектировал ваш алгоритм, то вам нужен первый день предыдущего месяца.

Логически шаги:

  1. Преобразование вашей даты в значение xs: date
  2. Возьмите первый день текущего месяца
  3. Вычтите один месяц.

На практике проще всего объединить (1) и (2), чтобы вы получили

xs:date(replace($date, '(....)(..)(..)', '$1-$2-01')) - xs:yearMonthDuration('P1M')

и затем вы можете отформатировать эту дату как ГГГГММДД, используя

format-date($date, '[Y0001][M01][D01]')
...