0

これが私の最初の XML です。

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Sick</leaveDescription>

<leaveCodeStr>SS</leaveCodeStr>

<balanceAmount>90.22</balanceAmount>

<leaveDescription>Vacation</leaveDescription>

<leaveCodeStr>VA</leaveCodeStr>

<balanceAmount>187.11</balanceAmount>

<leaveDescription>Winter Recess</leaveDescription>

<leaveCodeStr>WR</leaveCodeStr>

<balanceAmount>30</balanceAmount>

<effectiveDate>03/11/2013 23:59:59</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>03/11/2013 23:59:59</lastPayEndDate>

</leaveBalanceTotal>

この XSLT を使用して、必要な形式に変換しています。

<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xtt="urn:com.workday/xtt"
    xmlns:etv="urn:com.workday/etv"
    xmlns:wd="urn:com.workday.report/CR-INT486-Kuali_Trojan_Time-Absence_Balances-Outbound" 
    exclude-result-prefixes="wd xsl"
    >

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

    <xsl:template match="/">
        <document>
            <xsl:for-each select="wd:Report_Data/wd:Report_Entry/wd:All_Eligible_Time_Off_Plans_for_Worker">
                <leaveBalanceTotal>
                    <employeeId><xsl:value-of select="parent::node()/wd:employeeId"/></employeeId>
                    <uscId><xsl:value-of select="parent::node()/wd:uscId"/></uscId>
                    <leaveCodeId><xsl:value-of select="wd:leaveCodeStr"/></leaveCodeId>
                    <balanceAmount><xsl:value-of select="wd:balanceAmount"/></balanceAmount>
                    <effectiveDate><xsl:value-of select="parent::node()/wd:effectiveDate"/></effectiveDate>
                    <totalDaysService><xsl:value-of select="parent::node()/wd:totalDaysService"/></totalDaysService>
                    <lastPayEndDate><xsl:value-of select="parent::node()/wd:lastPayEndDate"/></lastPayEndDate>
                </leaveBalanceTotal>
            </xsl:for-each>
        </document>
    </xsl:template>
</xsl:stylesheet>

これは私が得る出力です:

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Sick</leaveDescription>

<leaveCodeStr>SS</leaveCodeStr>

<balanceAmount>90.22</balanceAmount>

<effectiveDate>03/11/2013 23:59:59</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>03/11/2013 23:59:59</lastPayEndDate>

</leaveBalanceTotal>

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Vacation</leaveDescription>

<leaveCodeStr>VA</leaveCodeStr>

<balanceAmount>187.11</balanceAmount>

<effectiveDate>03/11/2013 23:59:59</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>03/11/2013 23:59:59</lastPayEndDate>

</leaveBalanceTotal>

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Winter Recess</leaveDescription>

<leaveCodeStr>WR</leaveCodeStr>

<balanceAmount>30</balanceAmount>

<effectiveDate>03/11/2013 23:59:59</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>03/11/2013 23:59:59</lastPayEndDate>

</leaveBalanceTotal>

ただし、次のように 2 つの日付フィールドを UNIX ミリ秒に変換し、日付を UNIX ミリ秒に変換する必要があります。

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Sick</leaveDescription>

<leaveCodeStr>SS</leaveCodeStr>

<balanceAmount>90.22</balanceAmount>

<effectiveDate>1363060799000</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>1363060799000</lastPayEndDate>

</leaveBalanceTotal>

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Vacation</leaveDescription>

<leaveCodeStr>VA</leaveCodeStr>

<balanceAmount>187.11</balanceAmount>

<effectiveDate>1363060799000</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>1363060799000</lastPayEndDate>

</leaveBalanceTotal>

<leaveBalanceTotal>

<employeeId>0001234</employeeId>

<uscId>1234567894654</uscId>

<leaveDescription>Winter Recess</leaveDescription>

<leaveCodeStr>WR</leaveCodeStr>

<balanceAmount>30</balanceAmount>

<effectiveDate>1363060799000</effectiveDate>

<totalDaysService>6062</totalDaysService>

<lastPayEndDate>1363060799000</lastPayEndDate>

</leaveBalanceTotal>

基本的に、誰かがこれらの日付を変換する方法を教えてくれることを願っています。どんな助けでも大歓迎です。

4

1 に答える 1

2

1970 年 1 月 1 日以降の期間を 1 ミリ秒で割ることにより、Unix エポック以降のミリ秒を取得できます。

たとえば、プレフィックスxs:が名前空間 URI にバインドされているhttp://www.w3.org/2001/XMLSchema場合、次の XPath 2.0 式

(xs:dateTime('2013-02-14T23:59:59') - xs:dateTime('1970-01-01T00:00:00')) 
div xs:dayTimeDuration('PT0.001S')

に評価されます

1360886399000


追加するために編集:

日付を解析するために、XSLT 2.0 での正規表現マッチングを調べることができます。たとえば、日付をxs:dateTime値に解析できる関数を作成できます。

<!-- parses a dateTime value from a string of format "mm/dd/yyyy hh:mm:ss" -->
<xsl:function name="foo:parseDateTime" as="xs:dateTime">
  <xsl:param name="input" as="xs:string"/>
  <xsl:variable name="dateTimeLiteral">
    <xsl:analyze-string select="normalize-space($input)" 
                        regex="(\d\d)/(\d\d)/(\d\d\d\d)\s(\d\d):(\d\d):(\d\d)">
      <xsl:matching-substring>
        <xsl:number value="regex-group(3)" format="0001"/>          
        <xsl:text>-</xsl:text>
        <xsl:number value="regex-group(2)" format="01"/>          
        <xsl:text>-</xsl:text>
        <xsl:number value="regex-group(1)" format="01"/>
        <xsl:text>T</xsl:text>
        <xsl:number value="regex-group(4)" format="01"/>
        <xsl:text>:</xsl:text>
        <xsl:number value="regex-group(5)" format="01"/>
        <xsl:text>:</xsl:text>
        <xsl:number value="regex-group(6)" format="01"/>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:variable>
  <xsl:value-of select="xs:dateTime($dateTimeLiteral)"/>
</xsl:function>

ミリ秒に変換する上記の例をカプセル化する別の関数を作成できます。

<!-- converts a dateTime into milliseconds since the beginning of 1970" -->
<xsl:function name="foo:toMilliseconds" as="xs:integer">
  <xsl:param name="input" as="xs:dateTime"/>
  <xsl:value-of select="(xs:dateTime($input)-xs:dateTime('1970-01-01T00:00:00'))
                        div xs:dayTimeDuration('PT0.001S')"/>
</xsl:function>

次に、これらを組み合わせて、次のように日付をミリ秒単位で書き込むことができます。

<xsl:value-of select="foo:toMilliseconds(foo:parseDateTime(lastPayEndDate))"/>
于 2013-03-11T21:16:21.173 に答える