使用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或其他标签),如果不需要可以直接删掉
之前模板未生效的常见排查点
- 匹配路径错误:检查属性名是否和原始XML完全一致(比如原始是
Attr你写成了attr,大小写不匹配会导致模板不触发) - 未递归处理子节点:如果只写了
<xsl:value-of>没加<xsl:apply-templates>,嵌套的div不会被转换 - 命名空间问题:如果原始XML带命名空间,模板匹配时必须绑定对应前缀,比如
ns:div[@ns:Attr='A'] - 处理器兼容性:确认你用的XSLT处理器支持1.0规范,虽然大部分工具兼容,但别用2.0/3.0独有的语法
可参考的资料
- W3C XSLT 1.0官方规范:重点看模板匹配和节点选择章节,搞懂匹配模式和节点集的处理逻辑
- 《XSLT入门经典》:里面有大量节点转换、嵌套结构处理的实例,适合快速上手
- XSLT 1.0核心函数文档:吃透
@*、node()、text()这些节点选择器的用法,避免语法错误
内容的提问来源于stack exchange,提问作者Anh Pham
相关产品推荐
相关产品推荐

