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

XSLT 2.0实现子节点剪切至新节点问题求助

解决XSLT中节点的剪切移动问题

我来帮你搞定这个「剪切粘贴」的需求——你现在的代码是把节点复制到新元素里,但原父节点还留着这些节点,核心要做的就是在处理原父节点时,把要移动的子节点排除掉,同时在新元素里保留它们,这样就实现了剪切效果。

问题分析

你当前的代码用<xsl:apply-templates>复制了目标节点,但没有对原父节点里的这些节点做过滤,所以它们会被默认的复制逻辑保留下来。要实现剪切,就得在处理原父节点时,只保留不需要移动的子节点,再把要移动的节点放到新元素中。

解决方案代码

结合你的输入输出例子,我写了完整的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>

  <!-- 处理ParentNode,实现剪切逻辑 -->
  <xsl:template match="ParentNode">
    <xsl:copy>
      <!-- 复制ParentNode的所有属性 -->
      <xsl:copy-of select="@*"/>
      
      <!-- 只保留不需要移动的子节点:这里排除最后两个BasicDouble,保留第一个 -->
      <xsl:apply-templates select="node()[not(self::BasicDouble) or position() = 3]"/>
      
      <!-- 创建新元素,并放入要移动的BasicDouble -->
      <NewElement>
        <xsl:apply-templates select="BasicDouble[position() > 3]"/>
      </NewElement>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  1. 身份转换模板:这是XSLT里的基础模板,负责复制所有没有被自定义模板匹配的内容(比如你的<BasicInt>、<BasicEnum>、<Pair>这些节点),确保其他内容不受影响。
  2. ParentNode的处理:
    • 首先复制ParentNode本身和它的所有属性;
    • 用node()[not(self::BasicDouble) or position() = 3]筛选要保留的子节点:这里position()=3对应你输入里第一个<BasicDouble>的位置,排除后面两个;
    • 创建<NewElement>,并把要移动的最后两个<BasicDouble>放进去。

适配你的实际需求(按属性筛选)

如果你是像原代码里那样,要按@Descr属性筛选节点(比如移动@Descr='Input A'和@Descr='Input B'的<BasicDouble>),只需要修改筛选条件即可:

<!-- 修改ParentNode模板里的保留和选择逻辑 -->
<xsl:template match="ParentNode">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <!-- 保留除了指定Descr的BasicDouble之外的所有节点 -->
    <xsl:apply-templates select="node()[not(self::BasicDouble[@Descr = 'Input A' or @Descr = 'Input B'])]"/>
    <!-- 把指定的BasicDouble放到新元素里 -->
    <NewElement>
      <xsl:apply-templates select="BasicDouble[@Descr = 'Input A' or @Descr = 'Input B']"/>
    </NewElement>
  </xsl:copy>
</xsl:template>

用这个代码处理你的输入XML,就能得到你想要的输出:原父节点里不再保留被移动的<BasicDouble>,它们只出现在<NewElement>中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:13