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

XSLT如何将指定属性的v:data节点及子节点嵌套到新v:container节点

问题根因

你遇到的异常是目标节点匹配模板的内部逻辑错误导致的:你在匹配到v:data[@name='Custom']节点后,没有先保留原v:data节点本身,而是直接将新增的v:container套在了v:data的子节点外层,同时误将原v:data的属性复制给了v:container,才会出现属性移位、原节点未被包裹的问题。移除属性筛选后嵌套逻辑正常,也进一步说明你的基础身份转换逻辑是可用的,只是匹配规则的内部处理有误。

修复方案

核心逻辑

保留默认身份转换模板保证其余节点结构不变,单独编写目标节点的匹配规则,先创建v:container节点,再完整复制原v:data节点及其所有内容到容器内部。

完整示例代码

<!-- 注意此处v前缀的命名空间URI必须和你原XML中v的命名空间完全一致,否则匹配会失效 -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:v="替换为原XML中v前缀对应的实际命名空间URI">

<!-- 身份转换模板:原样复制所有未匹配特殊规则的节点、属性 -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- 仅匹配name属性为Custom的v:data节点 -->
<xsl:template match="v:data[@name='Custom']">
    <!-- 新增要求的v:container节点 -->
    <v:container type="static">
        <!-- 完整复制原v:data节点及其所有属性、子节点 -->
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </v:container>
</xsl:template>

</xsl:stylesheet>

排查校验点

如果调整后仍有问题,优先检查两个点:

  • XSLT中声明的v前缀命名空间URI是否和原XML完全一致,命名空间不匹配会导致属性筛选规则失效
  • 不要在v:container节点上调用属性复制逻辑,避免原v:data的属性被误写到容器节点上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 16:45:03