2008-09-26 93 views
2

我很難找到採用時間格式的好方法,並輕鬆確定它是否有效,然後生成使用XSLT 1.0進行格式設置的結果元素。在XSLT 1.0中格式化24小時的最佳方式是什麼?

鑑於以下XML:

<root> 
    <srcTime>2300</srcTime> 
</root> 

這將是巨大的,產生結果的xml:

<root> 
    <dstTime>23:00</dstTime> 
</root> 

但是,如果源XML包含無效的24小時時間格式,生成的dstTime元素應該是空白的。

例如,當無效源XML如下:

<root> 
    <srcTime>NOON</srcTime> 
</root> 

生成的XML應該是:

<root> 
    <dstTime></dstTime> 
</root> 

的問題是,什麼是最好的XSLT 1.0片段可能寫出來產生預期的結果?希望能夠保持簡單,並且不必分析每一段時間(即,如果可能的話,模式匹配將是甜蜜的)。

+0

可以幫助但注意到2400是無效的日期。中午是1200,午夜是0000. – dacracot 2008-09-26 23:40:15

回答

5

在XSLT 1.0中沒有任何正則表達式,所以恐怕模式匹配不可行。

我不清楚<srcTime>23:00</srcTime>應該是合法的嗎?如果是,嘗試:

<dstTime> 
    <xsl:if test="string-length(srcTime) = 4 or 
       string-length(srcTime) = 5"> 
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" /> 
    <xsl:if test="$hour >= 0 and 24 > $hour"> 
     <xsl:variable name="minute"> 
     <xsl:choose> 
      <xsl:when test="string-length(srcTime) = 5 and 
          substring(srcTime, 3, 1) = ':'"> 
      <xsl:value-of select="substring(srcTime, 4, 2)" /> 
      </xsl:when> 
      <xsl:when test="string-length(srcTime) = 4"> 
      <xsl:value-of select="substring(srcTime, 3, 2)" /> 
      </xsl:when> 
     </xsl:choose> 
     </xsl:variable> 
     <xsl:if test="$minute >= 0 and 60 > $minute"> 
     <xsl:value-of select="concat($hour, ':', $minute)" /> 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</dstTime> 

如果不是,和四位數字是當時的法律的唯一的事情:

<dstTime> 
    <xsl:if test="string-length(srcTime) = 4"> 
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" /> 
    <xsl:if test="$hour >= 0 and 24 > $hour"> 
     <xsl:variable name="minute" select="substring(srcTime, 3, 2)" /> 
     <xsl:if test="$minute >= 0 and 60 > $minute"> 
     <xsl:value-of select="concat($hour, ':', $minute)" /> 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</dstTime> 
3

XSLT 1.0對日期/時間操作沒有任何標準支持。

您必須編寫一個簡單的解析和格式化函數。這不會很簡單,這不會很好。

XSLT確實是爲樹轉換而設計的。這種文本節點操作最好在XSLT之外完成。

1

看一看: http://www.exslt.org/具體是「日期和時間」部分。 我還沒有深入研究它,但它看起來可能就是你要找的東西。

1

即使是exslt.org的time()函數也不會幫助你,因爲它希望它的輸入格式是正確的(xs:dateTime或者xs:time)。

這是在XSLT之外最好解決的問題。我認爲這是一個經常使用XSLT來完成它並非真正設計的事情,並設法使事情有效的人。這真的是沒有設計來解析字符串。

理想的解決方案是修復生成XML文檔的任何內容,以便使用爲此目的而方便建立的國際標準格式化時間,使用不應該堅持或傳輸垃圾數據的原則(如果可以避免的話)所以。

但是,如果這是不可能的,你應該在將數據傳遞給XSLT之前修正數據,或者在生成轉換的輸出後修復數據。

相關問題