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

基于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/>的父元素:
    1. 复制原元素的标签和所有属性,生成第一个父元素,仅包含<separator/>之前的所有子内容(文本、嵌套标签等)。
    2. 直接输出原<separator/>节点。
    3. 再次复制原元素的标签和属性,生成第二个父元素,仅包含<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:52:46