使用XSLT剥离XML中<email-description>字段内嵌HTML的问题求助
问题原因
- 你现有XSLT中编写的模板匹配规则为
node()[ancestor::field and not(self::text())],但你的XML结构里不存在名为field的节点,目标处理字段是email-description,因此该模板完全不会触发,所有内容都走默认的复制逻辑,自然没有任何变化。 - 另外需要注意
中存储的HTML存在两种形式,对应不同的处理逻辑:一种是HTML直接作为XML子节点嵌入,另一种是转义后的纯文本字符串(即你示例中 <html>这类形式,本质是普通文本,不会被XSLT识别为节点)。
解决方案
场景1:中的HTML是未转义的子节点
直接用以下XSLT即可,仅修改email-description字段,其余结构完全保留:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 身份模板:复制所有未匹配到的节点和属性 --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- 单独匹配email-description节点,直接输出其纯文本内容 --> <xsl:template match="email-description"> <xsl:copy> <xsl:value-of select="string(.)"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
原理:元素的string()方法会自动拼接所有后代文本节点,自动过滤掉HTML标签,得到纯文本。
场景2:中的HTML是转义后的字符串
你使用的Saxon引擎支持XSLT 2.0+,可以先把转义的HTML字符串解析为节点片段,再提取纯文本:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="email-description"> <xsl:copy> <!-- 先解析转义的HTML为节点片段,再提取纯文本 --> <xsl:value-of select="parse-xml-fragment(.)/string()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
如果HTML格式不规范无法正常解析,也可以直接用正则替换删除所有标签:
<xsl:value-of select="replace(replace(replace(., '<', '<'), '>', '>'), '<[^>]+>', '')"/>
内容的提问来源于stack exchange,提问作者Captain Le Chuck
相关产品推荐
相关产品推荐

