转换小时似乎需要做很多工作......必须有一种更简单的方法。
<xsl:variable name="hour12">
<xsl:choose>
<xsl:when test="$hour24 < 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 > 12">
<xsl:value-of select="$hour24 - 12" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$hour24" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
有什么建议吗?
答案 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>