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
相关产品推荐
相关产品推荐

