2016-06-15 59 views
0

我想獲得TimestampCreate與ControlPoint時間戳匹配的狀態。 這場比賽不必毫秒匹配如何獲得與ControlPoint時間戳匹配的TimestampCreate狀態?

我不知道該怎麼做。

我使用XSLT 1.0 預計輸出

<ProtectionOrderStatus> 
    <ProtectionOrderStatusCode>SBJO</ProtectionOrderStatusCode> 
    <ProtectionOrderStatusDate>2016-05-09</ProtectionOrderStatusDate> 
</ProtectionOrderStatus> 

我的XML 1.0代碼

<?xml version="1.0" encoding="UTF-8"?> 
<Integration> 
    <ControlPoint Timestamp="5/9/2016 2:34:34 PM" UserID="Kuku">SAVE</ControlPoint> 
    <ProtectionOrders> 
     <ProtectionOrder Op="E" InternalProtectionOrderID="11831"> 
      <Statuses> 
       <Status> 
        <Current>true</Current> 
        <Active>No</Active> 
        <Date>05/09/2016</Date> 
        <Type Word="DISMISSED">Dismissed</Type> 
        <TimestampCreate Op="A">05/09/2016 14:34:48:633</TimestampCreate> 
       </Status> 
       <Status Op="A"> 
        <Current>false</Current> 
        <Active>Yes</Active> 
        <Date Op="A">05/09/2016</Date> 
        <Type Op="A" Word="SBJO">Signed By Judicial Officer</Type> 
        <TimestampCreate>05/09/2016 14:34:34:737</TimestampCreate> 
       </Status> 
       <Status> 
        <Current>false</Current> 
        <Active>No</Active> 
        <Date>12/30/2014</Date> 
        <Type Word="DRAFT">Draft</Type> 
        <TimestampCreate>05/09/2016 14:34:14:987</TimestampCreate> 
       </Status> 
      </Statuses> 
     </ProtectionOrder> 
    </ProtectionOrders> 
</Integration> 

我的XSLT代碼

<?xml version="1.0" encoding="UTF-8"?> 
    <ProtectionOrderStatus> 
    <ProtectionOrderStatusCode> 
     <xsl:value-of select="Statuses/Status/Type/@Word"/> 
    </ProtectionOrderStatusCode> 
    <ProtectionOrderStatusDate> 
     <xsl:value-of select="Statuses/Status/Date"/> 
    </ProtectionOrderStatusDate> 
</ProtectionOrderStatus> 

我的XSLT是產生下面的輸出這是錯誤的

 <ProtectionOrderStatus> 
     <ProtectionOrderStatusCode>DISMISSED</ProtectionOrderStatusCode> 
     <ProtectionOrderStatusDate>2016-05-09</ProtectionOrderStatusDate> 
    </ProtectionOrderStatus> 
+0

您正在使用一些非標準的擴展函數:很難說如何在不知道使用哪個XSLT處理器的情況下使用它們。 - 另外,如果通過「匹配」你的意思是「匹配到最近的秒」,你應該明確地陳述。 –

回答

0

以下樣式:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:variable name="ctl" select="Integration/ControlPoint/@Timestamp"/> 
<xsl:variable name="date" select="substring-before($ctl, ' ')"/> 
<xsl:variable name="time" select="substring-before(substring-after($ctl, ' '), ' ')"/> 

<xsl:variable name="month" select="substring-before($date, '/')"/> 
<xsl:variable name="day" select="substring-before(substring-after($date, '/'), '/')"/> 
<xsl:variable name="year" select="substring-after(substring-after($date, '/'), '/')"/> 

<xsl:variable name="h12" select="substring-before($time, ':')"/> 
<xsl:variable name="pm" select="contains($ctl,'PM')"/> 
<xsl:variable name="h" select="$h12 mod 12 + 12 * $pm"/> 

<xsl:variable name="ts"> 
    <xsl:value-of select="format-number($month, '00')"/> 
    <xsl:text>/</xsl:text> 
    <xsl:value-of select="format-number($day, '00')"/> 
    <xsl:text>/</xsl:text> 
    <xsl:value-of select="$year"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="$h"/> 
    <xsl:text>:</xsl:text> 
    <xsl:value-of select="substring-after($time, ':')"/> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:variable name="status" select="//Status[starts-with(TimestampCreate, $ts)]"/> 
    <ProtectionOrderStatus> 
     <ProtectionOrderStatusCode> 
      <xsl:value-of select="$status/Type/@Word"/> 
     </ProtectionOrderStatusCode> 
     <ProtectionOrderStatusDate>  
      <xsl:value-of select="$status/Date"/> 
     </ProtectionOrderStatusDate> 
    </ProtectionOrderStatus> 
</xsl:template> 

</xsl:stylesheet> 

應用到你的榜樣輸入,將返回:

<?xml version="1.0" encoding="UTF-8"?> 
<ProtectionOrderStatus> 
    <ProtectionOrderStatusCode>SBJO</ProtectionOrderStatusCode> 
    <ProtectionOrderStatusDate>05/09/2016</ProtectionOrderStatusDate> 
</ProtectionOrderStatus> 

注意

  • 這裏假定TimestampCreate小時是零填充到兩位數(您的例子是模糊的在這方面);

  • 如果多於一個Status匹配條件,則只返回第一個值。

+0

真棒邁克爾。使用你的解決方案,我的代碼現在返回正確的輸出。同一時間戳創建的狀態不會超過一個。 – user3781064

+0

我有一個問題給你Michael.hor257k。我的代碼在使用你的代碼後正在工作。然而,我的老闆要求我使用樣式表中的內部函數。因爲如果我編輯問題,我可能會失分,你會推薦做什麼?我應該編輯問題還是應該發佈一個新問題,我可以將樣式表與我應該調用的函數一起轉換TimestampCreate和TimeStamp?請指教。 – user3781064

+0

我建議你發佈一個新問題 - 並確保我們瞭解這些功能是什麼,他們究竟做了什麼。雖然我懷疑你不能在你輸入的日期使用它們。 –