私は現在、XML として別のシステムにインポートするためのドキュメントの翻訳に取り組んでいます。これには、次のような非常に非公式な時間表現の翻訳が含まれます。
<estimated-time>15 mins<estimated-time>
そして、これを次のようなものに翻訳する必要があります。
<tr:estimated_time>00:15:00</tr:estimated_time>
私はトークン化、部分文字列、およびさまざまな時間関数をいじりましたが、何も思いつきませんでしたが、XSLT の経験はまったくありません。
ジルカの答えに続いて、私は次のことを試しました:
<xsl:template match="estimated-time">
<tr:estimated_time>
<xsl:value-of select="time:parseTime(./text(), 'hours')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="time:parseTime(./text(), 'mins')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="time:parseTime(./text(), 'seconds')"/>
</tr:estimated_time>
</xsl:template>
<xsl:function name="time:parseTime">
<xsl:param name="testedString"/>
<xsl:param name="lookingFor"/>
<xsl:variable name="tokens" select="tokenize($testedString, ' ')" />
<xsl:variable name="out">
<xsl:choose>
<xsl:when test="$tokens[. = $lookingFor]">
<xsl:variable name="pos" select="index-of($tokens, $lookingFor)-1"/>
<xsl:value-of select="$tokens[$pos]"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>00</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="if (string-length($out)=1) then concat('0', $out) else $out"/>
</xsl:function>
その結果、常に次の結果が得られました。
<tr:estimated_time>00:00:00</tr:estimated_time>
どんな援助でも大歓迎です。
更新:動作します!私が見つけなかったオリジナルのいたるところに奇妙な改行がいくつかあり、それが機能を妨げていました。