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

如何修改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">&#x1;</xsl:param>
    <xsl:param name="csvQuoteCharacter">"</xsl:param>
    <!-- 行尾符设为Ctrl+B(Unicode U+0002) -->
    <xsl:param name="lineEnd">&#x2;</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>

修改细节说明

  1. 分隔符替换:csvDelimiter参数使用&#x1;(Ctrl+A的XML实体),确保XSLT能正确输出该控制字符,避免编码问题。
  2. 行尾统一:新增lineEnd参数定义为&#x2;(Ctrl+B的实体),替换原换行符,让所有行尾匹配参考示例格式。
  3. 尾行修正:原TRL行直接拼接数字,现在加入分隔符,符合字段分隔规则,计数格式保持8位补零。
  4. 引号逻辑适配:保留原有引号包裹逻辑,当字段包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:36:34