XSL匹配属性值后为对应元素添加同级兄弟节点的实现问题
问题原因
你当前的写法错误根源在于匹配对象是属性节点。XSLT处理属性节点时,在属性模板内新增的元素会被自动归入属性所属的<COL>元素内部,所以最终会变成子节点而非同级节点。
解决方法
将匹配规则调整为匹配包含目标属性值的<COL>元素本身,先完整复制原有<COL>元素,再追加新增节点即可,修正后的完整XSLT代码如下:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" media-type="text/xml" method="xml" /> <xsl:param name="rtdTag" /> <xsl:param name="rtdDupTag" /> <!-- 默认复制所有节点 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 匹配包含目标属性值的COL元素 --> <xsl:template match="COL[@* = $rtdTag]"> <!-- 先完整复制原COL元素 --> <xsl:copy-of select="."/> <!-- 再追加同级的新COL节点 --> <COL NAME="DuplicateTag" VAL="{$rtdDupTag}"/> </xsl:template> </xsl:stylesheet>
效果说明
调整后匹配的是<COL>元素本身,在模板内先后输出原<COL>和新<COL>,两个节点自然为同级关系,完全符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Shaun Roberts
相关产品推荐
相关产品推荐

