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

如何使用XSLT移除XML字符串中的LF(xA)和Tab(x9)字符

移除XSLT变量中的换行(LF)和制表符(Tab)

当前输出的<a>标签id属性包含多余的换行(&#xA;)和制表符(&#x9;),示例如下:

<p class="Judg-1"><a id="&#xA;&#x9;&#x9;&#x9;&#x9;[1]&#xA;&#x9;&#x9;&#x9;"></a></p>

原始XML

<?xml version="1.0" encoding="UTF-8"?>
<Judgment>
    <Para level="1" no="1" pID="p1_1" indent="none">
        <Text indent="none" align="left">Paragraph 1</Text>
    </Para>
</Judgment>

原XSLT代码(尝试substring-after未生效)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [<!ENTITY nbsp "&#160;">]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:param name="portlet"/>
    <xsl:output method="html" encoding="UTF-8" indent="no"/>
<xsl:template match="Judgment//Para[@level=1]/Text[position() = 1] | Annex//Para[@level=1]/Text[position() = 1]">
        <p class="Judg-1">
            <xsl:variable name="para-no">
                <!--[<xsl:value-of select="substring-after(substring-after(substring-after(../@pID,'p1_'), '&#xA;'), '&#x9;')"/>]-->
                [<xsl:value-of select="substring-after(../@pID,'p1_')"/>]
            </xsl:variable>
            <a id="{$para-no}"></a>
        </p>
</xsl:template>
</xsl:stylesheet>

解决方法

之前用substring-after无效,是因为你匹配的是字符串'&#xA;',但实际是变量内容中存在的控制字符(换行、制表符本身),而非转义后的字符串。直接用XSLT 2.0的replace()函数即可一次性移除所有目标字符。

修改后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [<!ENTITY nbsp "&#160;">]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:param name="portlet"/>
    <xsl:output method="html" encoding="UTF-8" indent="no"/>
<xsl:template match="Judgment//Para[@level=1]/Text[position() = 1] | Annex//Para[@level=1]/Text[position() = 1]">
        <p class="Judg-1">
            <!-- 先拼接出原始编号字符串 -->
            <xsl:variable name="para-no" select="concat('[', substring-after(../@pID,'p1_'), ']')"/>
            <!-- 移除所有换行(\n对应xA)和制表符(\t对应x9) -->
            <xsl:variable name="cleaned-para-no" select="replace($para-no, '[\n\t]', '')"/>
            <a id="{$cleaned-para-no}"></a>
        </p>
</xsl:template>
</xsl:stylesheet>

说明

  • replace($para-no, '[\n\t]', ''):用正则表达式匹配换行符(\n)或制表符(\t),一次性替换为空字符串,彻底移除这些控制字符。
  • 也可以拆分为两次replace调用,效果一致:replace(replace($para-no, '\n', ''), '\t', '')

处理后生成的<a>标签id将不再包含多余的换行和制表符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:15:12