You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT变量失效问题:XML日期转日-月-年格式实现求助

解决XSLT变量失效问题&日期格式转换方案

咱们先看你的原始XML输入:

<MODULO>
  <NAME>ObtemSumarioSNC_P</NAME>
  <VALUES>
    <ROW>
      <DataEscritura>19770324</DataEscritura>
      <DataUltimoBalanco>20161231</DataUltimoBalanco>
      <TotalVendas>**********</TotalVendas>
    </ROW>
  </VALUES>
</MODULO>

要把YYYYMMDD格式的日期转成DD-MM-YYYY,同时解决变量失效的问题,我给你写了一个可靠的XSLT模板,先看代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 匹配根节点,复制结构并处理日期 -->
  <xsl:template match="/MODULO">
    <MODULO>
      <!-- 直接复制NAME节点 -->
      <xsl:copy-of select="NAME"/>
      <VALUES>
        <!-- 遍历每一行数据 -->
        <xsl:for-each select="VALUES/ROW">
          <ROW>
            <!-- 调用通用日期格式化模板处理DataEscritura -->
            <DataEscritura>
              <xsl:call-template name="format-date">
                <xsl:with-param name="date-string" select="DataEscritura"/>
              </xsl:call-template>
            </DataEscritura>
            <!-- 同样处理DataUltimoBalanco -->
            <DataUltimoBalanco>
              <xsl:call-template name="format-date">
                <xsl:with-param name="date-string" select="DataUltimoBalanco"/>
              </xsl:call-template>
            </DataUltimoBalanco>
            <!-- 复制TotalVendas节点 -->
            <xsl:copy-of select="TotalVendas"/>
          </ROW>
        </xsl:for-each>
      </VALUES>
    </MODULO>
  </xsl:template>

  <!-- 通用日期格式化模板,复用逻辑避免重复代码 -->
  <xsl:template name="format-date">
    <xsl:param name="date-string"/>
    <!-- 分别提取年、月、日,变量作用域仅限当前模板内部,不会失效 -->
    <xsl:variable name="year" select="substring($date-string, 1, 4)"/>
    <xsl:variable name="month" select="substring($date-string, 5, 2)"/>
    <xsl:variable name="day" select="substring($date-string, 7, 2)"/>
    <!-- 拼接成目标格式 -->
    <xsl:value-of select="concat($day, '-', $month, '-', $year)"/>
  </xsl:template>
</xsl:stylesheet>

为啥你的变量会失效?大概率踩了这几个坑:

  • 变量作用域问题:如果你在<xsl:for-each>、<xsl:if>这类块级标签内部定义变量,外部是访问不到的。比如你在for-each里定义了格式化后的日期变量,然后在for-each外面想用,肯定会报错,因为变量的作用域只限于定义它的元素内部。
  • 尝试修改只读变量:XSLT里的变量是只读的,一旦定义就不能修改。如果你写了两次<xsl:variable name="xxx">,第二次是重新定义了一个新变量,不是修改原来的,这会导致你误以为变量“失效”。
  • 拼写错误:变量名大小写或者拼写不一致,比如把$date-string写成$datestring,系统会认为这是未定义的变量,自然就“失效”了。

应用模板后的输出结果:

<MODULO>
  <NAME>ObtemSumarioSNC_P</NAME>
  <VALUES>
    <ROW>
      <DataEscritura>24-03-1977</DataEscritura>
      <DataUltimoBalanco>31-12-2016</DataUltimoBalanco>
      <TotalVendas>**********</TotalVendas>
    </ROW>
  </VALUES>
</MODULO>

内容的提问来源于stack exchange,提问作者Gustavo Jose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:14:54