對於時間轉換,這裏的東西,我覺得簡單:
<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>
漂亮整齊的解決方案。如果您的處理器支持XSLT 2.0,那麼您可能需要查看format-time()函數。它允許您靈活地格式化xs:time值,您可以通過調用xs:time($ timevariable)從字符串值創建該值。 –
不幸的是沒有XSLT 2.0 – CaffGeek
爲什麼,爲什麼,我們爲什麼一直看到這個' '廢話?它應該是' '。 –