2011-10-27 165 views
4

轉換時間似乎需要很多工作...必須有一個更簡單的方法。在XSLT中將24小時制時間轉換爲12小時制

<xsl:variable name="hour12"> 
    <xsl:choose> 
     <xsl:when test="$hour24 &lt; 0"> 
     <xsl:value-of select="12 + $hour24" /> 
     </xsl:when> 
     <xsl:when test="$hour24 = 0"> 
     <xsl:value-of select="12" /> 
     </xsl:when> 
     <xsl:when test="$hour24 = 12"> 
     <xsl:value-of select="$hour24" /> 
     </xsl:when> 
     <xsl:when test="$hour24 &gt; 12"> 
     <xsl:value-of select="$hour24 - 12" /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$hour24" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 

有什麼建議嗎?

回答

6

哦...我愛怎麼值等於布爾值0或1。它使生活變得更輕鬆......

<xsl:variable name="hour12"> 
    <xsl:value-of select="$hour24 - (12 * ($hour24 > 12)) + (12 * ($hour24 = 0))" />` 
</xsl:variable> 

而對於A/P標識

<xsl:variable name="ap"> 
    <xsl:value-of select="substring('ap', 1 + ($hour24 >= 12), 1)" /> 
</xsl:variable> 
+0

漂亮整齊的解決方案。如果您的處理器支持XSLT 2.0,那麼您可能需要查看format-time()函數。它允許您靈活地格式化xs:time值,您可以通過調用xs:time($ timevariable)從字符串值創建該值。 –

+0

不幸的是沒有XSLT 2.0 – CaffGeek

+0

爲什麼,爲什麼,我們爲什麼一直看到這個''廢話?它應該是''。 –

0

對於時間轉換,這裏的東西,我覺得簡單

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="time/text()"> 
    <xsl:variable name="vZ" select="(.+12) mod 12"/> 
    <xsl:value-of select="$vZ - ($vZ -12)*($vZ=0)"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變被應用在下面的XML文檔

<t> 
<time>-3</time> 
<time>0</time> 
<time>7</time> 
<time>12</time> 
<time>17</time> 
<time>24</time> 
</t> 

想要的,正確的結果產生

<t> 
    <time>9</time> 
    <time>12</time> 
    <time>7</time> 
    <time>12</time> 
    <time>5</time> 
    <time>12</time> 
</t> 

對於AM/PM(如果我對邊緣情況的瞭解是正確的),我們添加以下代碼

<xsl:variable name="vNorm" select= 
    "not(. >= 0)*(24 +.) 
    + 
    (. >=0 and not(. = 24))*. 
    + 
    not(. = 24) 
    "/> 
    <xsl:value-of select="$vPeriods[1+($vNorm>=12)]"/> 

完整的變換變爲

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:timePeriods> 
    <p>am</p> 
    <p>pm</p> 
</my:timePeriods> 

<xsl:variable name="vPeriods" select= 
"document('')/*/my:timePeriods/*"/> 

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

<xsl:template match="time/text()"> 
    <xsl:variable name="vZ" select="(.+12) mod 12"/> 
    <xsl:value-of select="$vZ - ($vZ -12)*($vZ=0)"/> 

    <xsl:variable name="vNorm" select= 
    "not(. >= 0)*(24 +.) 
    + 
    (. >=0 and not(. = 24))*. 
    + 
    not(. = 24) 
    "/> 
    <xsl:value-of select="$vPeriods[1+($vNorm>=12)]"/> 
</xsl:template> 
</xsl:stylesheet> 

和當施加到同一個XML文檔(上圖)的結果爲

<t> 
    <time>9pm</time> 
    <time>12am</time> 
    <time>7am</time> 
    <time>12pm</time> 
    <time>5pm</time> 
    <time>12am</time> 
</t> 
相關問題