在XSLT中将24小时时间转换为12小时时间

时间:2011-10-27 19:53:41

标签: xslt

转换小时似乎需要做很多工作......必须有一种更简单的方法。

  <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>

有什么建议吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>