XSLT非正式时间转换

时间:2013-07-02 13:49:35

标签: datetime xslt-2.0

我目前正在进行文档翻译,以便将XML作为XML导入到另一个系统,这涉及到非正式的时间表示的翻译,例如:

<estimated-time>15 mins<estimated-time>

我需要将其翻译成以下内容:

<tr:estimated_time>00:15:00</tr:estimated_time>

我已经弄乱了令牌化,子串和各种时间函数,并且无法想出任何东西,尽管我对XSLT缺乏经验。

根据Jirka的回答,我尝试了以下内容:

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

非常感谢任何协助。

更新:它有效!原版中有一些我没有发现的奇怪的新线条,这些线条阻止它工作。

1 个答案:

答案 0 :(得分:0)

可能有一个更复杂或更清洁的解决方案,但使用标记化应该以这种方式完成

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:tst="test">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <times>
            <xsl:apply-templates select="times/time" />         
        </times>
    </xsl:template>

    <xsl:template match="time">
        <time>
            <xsl:value-of select="tst:getSomething(.,'hours')" />
            <xsl:text>:</xsl:text>
            <xsl:value-of select="tst:getSomething(.,'mins')" />
            <xsl:text>:</xsl:text>
            <xsl:value-of select="tst:getSomething(.,'sec')" />
        </time>
    </xsl:template>

    <xsl:function name="tst:getSomething">
        <xsl:param name="testedString" />
        <xsl:param name="lookingFor" />

        <xsl:variable name="tokens" select="tokenize($testedString, ' ')" />
        <xsl:variable name="tmp">
            <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($tmp) = 1) then concat('0', $tmp) else $tmp" />
    </xsl:function>

</xsl:stylesheet>

它产生输出

<?xml version="1.0" encoding="UTF-8"?>
<times>
    <time>05:30:00</time>
    <time>00:05:00</time>
</times>