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

使用XSLT 1.0解析XML邮件HTML内容生成目标XML

用XSLT 1.0解析带标识的div为指定XML结构的实现方案

核心实现逻辑

要把带Attr A/B/C/D标识的div转成对应命名的XML元素,核心是用模板匹配精准定位这些div节点,转换元素名的同时保留嵌套结构——毕竟原始内容里的div是嵌套的,得递归处理子节点。

具体代码示例

先模拟一个常见的原始<body_html>结构:

<body_html>
  <div Attr="A">
    主内容A
    <div Attr="B">
      次级内容B
      <div Attr="C">深层内容C</div>
    </div>
    <div Attr="D">附属内容D</div>
  </div>
</body_html>

对应的XSLT 1.0实现代码如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配根节点,初始化转换结构 -->
  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="body_html/*"/>
    </root>
  </xsl:template>

  <!-- 匹配Attr为A的div,转成<A>元素 -->
  <xsl:template match="div[@Attr='A']">
    <A>
      <!-- 保留当前节点的文本内容 -->
      <xsl:value-of select="text()"/>
      <!-- 递归处理子节点,确保嵌套的div也能被转换 -->
      <xsl:apply-templates select="*"/>
    </A>
  </xsl:template>

  <!-- 匹配Attr为B的div,转成<B>元素 -->
  <xsl:template match="div[@Attr='B']">
    <B>
      <xsl:value-of select="text()"/>
      <xsl:apply-templates select="*"/>
    </B>
  </xsl:template>

  <!-- 匹配Attr为C的div,转成<C>元素 -->
  <xsl:template match="div[@Attr='C']">
    <C>
      <xsl:value-of select="text()"/>
      <xsl:apply-templates select="*"/>
    </C>
  </xsl:template>

  <!-- 匹配Attr为D的div,转成<D>元素 -->
  <xsl:template match="div[@Attr='D']">
    <D>
      <xsl:value-of select="text()"/>
      <xsl:apply-templates select="*"/>
    </D>
  </xsl:template>

  <!-- 身份模板:原样复制未被上面模板匹配到的节点(可选,按需保留) -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

这段代码的关键细节:

  • 用div[@Attr='X']的匹配模式精准锁定目标div,注意XSLT 1.0对属性名大小写敏感,别写错
  • 每个转换模板里都加了<xsl:apply-templates>,确保嵌套的子div能被递归处理
  • 最后一个“身份模板”是用来保留那些不需要转换的节点(比如不带Attr标识的div或其他标签),如果不需要可以直接删掉

之前模板未生效的常见排查点

  1. 匹配路径错误:检查属性名是否和原始XML完全一致(比如原始是Attr你写成了attr,大小写不匹配会导致模板不触发)
  2. 未递归处理子节点:如果只写了<xsl:value-of>没加<xsl:apply-templates>,嵌套的div不会被转换
  3. 命名空间问题:如果原始XML带命名空间,模板匹配时必须绑定对应前缀,比如ns:div[@ns:Attr='A']
  4. 处理器兼容性:确认你用的XSLT处理器支持1.0规范,虽然大部分工具兼容,但别用2.0/3.0独有的语法

可参考的资料

  • W3C XSLT 1.0官方规范:重点看模板匹配和节点选择章节,搞懂匹配模式和节点集的处理逻辑
  • 《XSLT入门经典》:里面有大量节点转换、嵌套结构处理的实例,适合快速上手
  • XSLT 1.0核心函数文档:吃透@*、node()、text()这些节点选择器的用法,避免语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:54:25