1

我目前正在翻译文档以作为 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>

任何帮助将不胜感激。

更新:它有效!我没有发现原始文件中有一些奇怪的换行符,这阻止了它的工作。

4

1 回答 1

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>
于 2013-07-03T06:44:10.147 回答