能否仅重命名XML特定层级的同名标签?附XSLT尝试代码
问题解答
你的当前XSLT无法完全实现需求,原因有两点:
- 匹配规则
//Modifications/Modifications仅会选中所有作为直接子节点的Modifications(在你的三层示例里仅覆盖第二层级元素),无法命中倒数第二层级的目标节点; - 你创建的新元素名存在笔误,应该是
Modifications_1(少了末尾的s)。
正确实现方案
以下XSLT可同时重命名第二层级和倒数第二层级的<Modifications>为<Modifications_1>:
<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> <!-- 匹配目标层级的Modifications元素 --> <xsl:template match="/Modifications/Modifications | Modifications[Modifications[not(Modifications)]]"> <xsl:element name="Modifications_1"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> </xsl:stylesheet>
匹配规则说明
/Modifications/Modifications:精准匹配根节点下的直接子<Modifications>(即第二层级元素);Modifications[Modifications[not(Modifications)]]:匹配所有满足「自身是<Modifications>,且它的子<Modifications>没有任何子节点」的元素——也就是倒数第二层级的节点(因为它的子节点是最内层的<Modifications>)。
测试效果
针对你提供的三层示例XML,转换后结果为:
<Modifications> <Modifications_1> <Modifications> </Modifications> </Modifications_1> </Modifications>
如果是四层嵌套的XML结构:
<Modifications> <Modifications> <Modifications> <Modifications> </Modifications> </Modifications> </Modifications> </Modifications>
转换后会得到:
<Modifications> <Modifications_1> <Modifications_1> <Modifications> </Modifications> </Modifications_1> </Modifications_1> </Modifications>
内容的提问来源于stack exchange,提问作者Raymond Arcand
相关产品推荐
相关产品推荐

