如何修改XSLT将XML转为以Ctrl+A(Unicode)为分隔符的CSV
XSLT修改方案:替换分隔符为Ctrl+A(Unicode )
已实现将指定XML转换为竖线|分隔的文本文件,现需调整为Ctrl+A(Unicode编码U+0001,显示为)作为字段分隔符,同时行尾替换为Ctrl+B(Unicode编码U+0002,显示为),匹配参考示例格式。
核心修改点
- 更新分隔符参数:将
csvDelimiter改为Ctrl+A的XML实体 - 统一行尾标识符:用Ctrl+B的XML实体
替换原有换行符 - 修正尾行格式:TRL与计数之间用Ctrl+A分隔,行尾加Ctrl+B
- 适配引号逻辑:保持原有引号包裹规则,判断条件基于新分隔符
修改后的完整XSLT代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:itk="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:fct="http://www.taleo.com/xsl_functions" xmlns:quer="http://www.taleo.com/ws/integration/query"> <xsl:output method="text" encoding="UTF-8"/> <!-- 分隔符设为Ctrl+A(Unicode U+0001) --> <xsl:param name="csvDelimiter"></xsl:param> <xsl:param name="csvQuoteCharacter">"</xsl:param> <!-- 行尾符设为Ctrl+B(Unicode U+0002) --> <xsl:param name="lineEnd"></xsl:param> <!-- 根模板 --> <xsl:template match="/"> <!-- 处理数据记录 --> <xsl:apply-templates select="//itk:record"/> <!-- 构建尾行,用Ctrl+A分隔TRL与计数 --> <xsl:text>TRL</xsl:text> <xsl:value-of select="$csvDelimiter"/> <xsl:value-of select="format-number(count(//itk:record), '000000000')"/> <xsl:value-of select="$lineEnd"/> </xsl:template> <xsl:function name="fct:nvl"> <xsl:param name="value"/> <xsl:param name="replace-with"/> <xsl:choose> <xsl:when test="string-length($value) > 0"> <xsl:value-of select="$value"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$replace-with"/> </xsl:otherwise> </xsl:choose> </xsl:function> <!-- 处理每条record --> <xsl:template match="itk:record"> <xsl:for-each select="itk:field"> <xsl:value-of select="fct:quote(.)"/> <xsl:if test="position() != last()"> <xsl:value-of select="$csvDelimiter"/> </xsl:if> </xsl:for-each> <!-- 行尾用Ctrl+B替代换行符 --> <xsl:value-of select="$lineEnd"/> </xsl:template> <!-- 字段引号处理(适配新分隔符) --> <xsl:function name="fct:quote"> <xsl:param name="value"/> <xsl:choose> <xsl:when test="contains($value, $csvDelimiter) or contains($value, $csvQuoteCharacter)"> <xsl:value-of select="$csvQuoteCharacter"/> <xsl:value-of select="replace($value, $csvQuoteCharacter, concat($csvQuoteCharacter, $csvQuoteCharacter))"/> <xsl:value-of select="$csvQuoteCharacter"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$value"/> </xsl:otherwise> </xsl:choose> </xsl:function> </xsl:stylesheet>
修改细节说明
- 分隔符替换:
csvDelimiter参数使用(Ctrl+A的XML实体),确保XSLT能正确输出该控制字符,避免编码问题。 - 行尾统一:新增
lineEnd参数定义为(Ctrl+B的实体),替换原换行符,让所有行尾匹配参考示例格式。 - 尾行修正:原TRL行直接拼接数字,现在加入分隔符,符合字段分隔规则,计数格式保持8位补零。
- 引号逻辑适配:保留原有引号包裹逻辑,当字段包含Ctrl+A或引号时自动添加引号,避免数据歧义。
模拟输出效果(控制字符用符号替代显示)
12663342Document.pdf2022-07-17 16:31:29 12663324"Rishabh's| Resume.pdf"2022-07-17 06:38:44 TRL000000002
内容的提问来源于stack exchange,提问作者sandeep himgire
相关产品推荐
相关产品推荐

