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

XSLT转换后XML文本非法字符未清理问题求助

问题描述

我有如下XML payload:

<?xml version="1.0" encoding="UTF-8"?>
<problem>
    <abstract>Hahahahah; ; ; ...]]]]```"ss""''''///</abstract>
</problem>

使用以下XSLT转换:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:nsCDM="http://b2b.ibm.com/schema/B2B_CDM_Incident/R2_2">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:variable name="validChars" select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. '"/>
        <xsl:value-of select="translate(., translate(., $validChars, ''), '')" />
    </xsl:template>
    
     <xsl:template match="/">
            <INBOUND>
                <ID>
                    <xsl:value-of select="/problem/abstract"/>
                </ID>
            </INBOUND>
     </xsl:template>
</xsl:stylesheet>

需求是移除文本中的非法字符,但转换结果如下,非法字符并未被移除:

<?xml version="1.0" encoding="UTF-8"?>
<INBOUND xmlns:nsCDM="http://b2b.ibm.com/schema/B2B_CDM_Incident/R2_2">
   <ID>Hahahahah; ; ; ...]]]]```"ss""''''///</ID>
</INBOUND>
问题原因

你写的<xsl:value-of select="/problem/abstract"/>是直接提取节点的文本值,不会触发你定义的text()模板。XSLT中,xsl:value-of是直接获取节点的原始字符串内容,不会走模板匹配流程;而你定义的文本过滤模板,只有在通过xsl:apply-templates处理节点时才会生效。

解决方案

把<xsl:value-of>替换成<xsl:apply-templates select="/problem/abstract/node()"/>,这样就会触发text()模板对文本节点进行过滤处理。修改后的XSLT如下:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:nsCDM="http://b2b.ibm.com/schema/B2B_CDM_Incident/R2_2">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:variable name="validChars" select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. '"/>
        <xsl:value-of select="translate(., translate(., $validChars, ''), '')" />
    </xsl:template>
    
     <xsl:template match="/">
            <INBOUND>
                <ID>
                    <!-- 替换为apply-templates触发文本处理模板 -->
                    <xsl:apply-templates select="/problem/abstract/node()"/>
                </ID>
            </INBOUND>
     </xsl:template>
</xsl:stylesheet>

转换后的结果会变成:

<?xml version="1.0" encoding="UTF-8"?>
<INBOUND xmlns:nsCDM="http://b2b.ibm.com/schema/B2B_CDM_Incident/R2_2">
   <ID>Hahahahah ... ss</ID>
</INBOUND>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:13:09