XSLT实现将meltNum嵌入同层级chem节点的问题求助
问题解决:将
<meltNum>嵌入同级每个<chem>节点 错误原因分析
你当前的代码存在两个核心问题:
- 使用
//elemCode会选取整个文档中所有<elemCode>节点,导致所有元素代码被重复输出 - 错误使用
key分组逻辑,你的场景不需要分组,仅需按层级遍历处理节点
正确XSLT实现
采用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> <!-- 移除原meltNum节点 --> <xsl:template match="meltNum"/> <!-- 给每个chem节点插入对应meltNum --> <xsl:template match="chem"> <xsl:copy> <!-- 插入当前meltChem下的meltNum值 --> <meltNum> <xsl:value-of select="../meltNum"/> </meltNum> <!-- 保留chem原有的子节点 --> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:负责原样复制XML中未被特殊模板匹配的节点,保证整体结构不被破坏
- 移除meltNum模板:匹配所有原
<meltNum>节点,不输出任何内容,实现原节点的移除 - chem节点处理模板:
- 复制当前
<chem>节点 - 通过
../meltNum获取其父节点<meltChem>下的<meltNum>值,插入到<chem>内部最前方 - 继续处理
<chem>原有的<elemCode>和<value>子节点
- 复制当前
将该XSLT应用到你的输入XML,即可生成完全符合期望的输出结果。
内容的提问来源于stack exchange,提问作者Slim
相关产品推荐
相关产品推荐

