【问题标题】:How can I loop on string tokens in XSLT 1.0?如何在 XSLT 1.0 中循环字符串标记?
【发布时间】:2016-05-03 09:04:40
【问题描述】:

我想在 DD、/、MM、/、YYYY 等许多元素中标记表示日期格式(如 DD/MM/YYYY)的字符串,并在它们上循环以进行转换

<tag date-format="DD/MM/YYYY" />

<container>
  <number:day number:style="long" />
  <number:text>/</number:text>
  <number:month number:style="long" />
  <number:text>/</number:text>
  <number:year number:style="long" />
</container>

因此,标签

<tag date-format="MM-DD-YYYY" />

应该转换成

<container>
  <number:month number:style="long" />
  <number:text>-</number:text>
  <number:day number:style="long" />
  <number:text>-</number:text>
  <number:year number:style="long" />
</container>

我一点也不知道如何在不支持标记器或正则表达式的 XSLT 1.0 中做到这一点。

请注意我绑定到 XSLT 1.0 并且无法升级

【问题讨论】:

    标签: xml xslt-1.0


    【解决方案1】:

    试试这个作为你的起点:

    <xsl:template match="tag[@date-format]">
        <container>
            <xsl:call-template name="analyze-date-format">
                <xsl:with-param name="date-format" select="@date-format" />
            </xsl:call-template>
        </container>
    </xsl:template>
    
    <xsl:template name="analyze-date-format">
        <xsl:param name="date-format"/>
        <xsl:variable name="separators" select="translate($date-format, 'YMD', '')" />
        <xsl:variable name="separator" select="substring($separators, 1, 1)" />
        <xsl:variable name="token">
            <xsl:choose>
                <xsl:when test="$separator">
                    <xsl:value-of select="substring-before($date-format, $separator)" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$date-format" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$token = 'YYYY'">
                <number:year number:style="long" />
            </xsl:when>
            <xsl:when test="$token = 'MM'">
                <number:month number:style="long" />
            </xsl:when>
            <xsl:when test="$token = 'DD'">
                <number:day number:style="long" />
            </xsl:when>
        </xsl:choose> 
        <xsl:if test="$separators">
            <number:text>
                <xsl:value-of select="$separator" />
            </number:text>
             <!-- recursive call -->
            <xsl:call-template name="analyze-date-format">
                <xsl:with-param name="date-format" select="substring-after($date-format, $separator)" />
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    

    这是假设所有标记都是大写的(可能还有其他一些假设)。您可能需要为其他令牌类型添加更多测试。

    注意number: 前缀必须绑定到命名空间!

    【讨论】:

    • 这真是一个绝妙的解决方案,它就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2020-12-03
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2015-12-04
    相关资源
    最近更新 更多