基于XSLT 1.0按分隔元素拆分父元素的实现需求
XSLT 1.0 解决方案适配Xalan
针对你需要拆分包含<separator/>标签的父元素的需求,我整理了一个完全兼容XSLT 1.0(适配Xalan)的实现方案,核心逻辑是保留父元素的所有属性,将<separator/>前后的内容分别放入两个同结构的父元素中,并将<separator/>置于中间位置。
完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有未被特殊匹配的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配包含<separator/>子节点的任意元素 --> <xsl:template match="*[separator]"> <!-- 生成第一个父元素,复制原属性和separator之前的内容 --> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="node()[not(following-sibling::separator)]"/> </xsl:copy> <!-- 输出原separator节点 --> <xsl:apply-templates select="separator"/> <!-- 生成第二个父元素,复制原属性和separator之后的内容 --> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="node()[not(preceding-sibling::separator)]"/> </xsl:copy> </xsl:template> <!-- 单独处理separator节点,确保直接复制不被父模板干扰 --> <xsl:template match="separator"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
代码逻辑说明
- 身份模板:作为XSLT的基础模板,负责原样复制XML中所有未被特殊模板匹配的节点和属性,保证文档其他部分不受影响。
- 目标元素匹配模板:专门捕获包含
<separator/>的父元素:- 复制原元素的标签和所有属性,生成第一个父元素,仅包含
<separator/>之前的所有子内容(文本、嵌套标签等)。 - 直接输出原
<separator/>节点。 - 再次复制原元素的标签和属性,生成第二个父元素,仅包含
<separator/>之后的所有子内容。
- 复制原元素的标签和所有属性,生成第一个父元素,仅包含
- separator节点模板:单独匹配
<separator/>,避免它被父元素的模板重复处理,确保原样输出。
测试示例
输入XML
<some_tag some_attr="some_value"> some text <some_other_tag>some another text</some_other_tag> <separator/> some other content </some_tag>
输出XML
<some_tag some_attr="some_value"> some text <some_other_tag>some another text</some_other_tag> </some_tag> <separator/> <some_tag some_attr="some_value"> some other content </some_tag>
这个方案支持任意结构的父元素,不管标签名、属性数量如何,都能正确拆分。如果同一个父元素中有多个<separator/>,会自动依次拆分出对应数量的父元素(比如两个<separator/>会拆成三个父元素,每个分隔符都置于中间)。
内容的提问来源于stack exchange,提问作者Grief
相关产品推荐
相关产品推荐

