XSLT转换XML为固定位置平面文件时无翻译项补位异常问题
解决XSLT生成固定长度平面文件时无翻译项的补位失效问题
问题背景
需要生成固定位置的平面文件,输入XML包含带两种语言描述的记录。现有XSLT在文本值较短时能正常补位到指定长度,但当元素无翻译项时,补位逻辑失效,无法生成符合要求的固定长度字段。
输入场景示例
场景1:元素无翻译
<record> <descriptions/> </record>
场景2:元素有单种翻译
<record> <descriptions> <description lang="en">Short Text</description> </descriptions> </record>
场景3:元素有两种翻译
<record> <descriptions> <description lang="en">English Description</description> <description lang="fr">French Description</description> </descriptions> </record>
当前XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <xsl:apply-templates select="record"/> </xsl:template> <xsl:template match="record"> <!-- 假设每个语言描述固定长度为20,补位用空格 --> <xsl:variable name="en-desc" select="descriptions/description[@lang='en']"/> <xsl:variable name="fr-desc" select="descriptions/description[@lang='fr']"/> <xsl:value-of select="concat( substring($en-desc, 1, 20), substring($fr-desc, 1, 20) )"/> </xsl:template> </xsl:stylesheet>
当前转换结果
场景1输出
无任何内容,总长度为0,不符合固定40长度要求
场景2输出
Short Text (仅英文补位到20,法语部分为空,总长度20,不符合40长度要求)
场景3输出
English Description French Description (正常补位,总长度40,符合要求)
期望结果
场景1期望输出
(40个空格,总长度40)
场景2期望输出
Short Text (20个空格,总长度40)
场景3期望输出
English Description French Description (与当前输出一致,总长度40)
解决方案
核心修改点:无论翻译项是否存在,都先拼接足够长度的补位字符,再截取固定长度,确保字段始终符合要求。修改后的XSLT如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 定义固定长度和补位字符 --> <xsl:variable name="field-length" select="20"/> <xsl:variable name="pad-char" select="' '"/> <!-- 预先生成足够长度的补位字符串 --> <xsl:variable name="pad-string" select="translate(substring('xxxxxxxxxxxxxxxxxxxxxxxx',1,$field-length),'x',$pad-char)"/> <xsl:template match="/"> <xsl:apply-templates select="record"/> </xsl:template> <xsl:template match="record"> <xsl:variable name="en-desc" select="descriptions/description[@lang='en']"/> <xsl:variable name="fr-desc" select="descriptions/description[@lang='fr']"/> <!-- 先拼接补位字符串,再截取固定长度,确保无论原内容是否存在都能补位 --> <xsl:value-of select="concat( substring(concat($en-desc, $pad-string), 1, $field-length), substring(concat($fr-desc, $pad-string), 1, $field-length) )"/> </xsl:template> </xsl:stylesheet>
解释
- 预先生成与字段长度一致的补位字符串
$pad-string,避免重复拼接; - 对每个语言描述,先将原内容与补位字符串拼接,再截取固定长度。即使原内容为空,拼接补位字符串后截取也能得到全补位的固定长度字段;
- 固定长度和补位字符通过变量定义,便于后续修改维护。
内容的提问来源于stack exchange,提问作者user2215655
相关产品推荐
相关产品推荐

