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
相关产品推荐
相关产品推荐

