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
相关产品推荐
相关产品推荐

