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

使用XSLT剥离XML中<email-description>字段内嵌HTML的问题求助

问题原因
  • 你现有XSLT中编写的模板匹配规则为node()[ancestor::field and not(self::text())],但你的XML结构里不存在名为field的节点,目标处理字段是email-description,因此该模板完全不会触发,所有内容都走默认的复制逻辑,自然没有任何变化。
  • 另外需要注意中存储的HTML存在两种形式,对应不同的处理逻辑:一种是HTML直接作为XML子节点嵌入,另一种是转义后的纯文本字符串(即你示例中&lt;html&gt;这类形式,本质是普通文本,不会被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(., '&lt;', '<'), '&gt;', '>'), '<[^>]+>', '')"/>

内容的提问来源于stack exchange,提问作者Captain Le Chuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:57:03