Конвертировать 24 часа в 12 часов в XSLT - PullRequest
4 голосов
/ 27 октября 2011

Преобразование часа, кажется, требует много работы ... должен быть более простой способ.

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

6 голосов
/ 27 октября 2011

Ох ... Мне нравится, как логические значения равны 0 или 1. Это делает жизнь намного проще ...

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

А для идентификатора а / п

<xsl:variable name="ap">
    <xsl:value-of select="substring('ap', 1 + ($hour24 >= 12), 1)" />
</xsl:variable>
0 голосов
/ 28 октября 2011

Что касается преобразования времени, вот что мне кажется более простым :

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...