首页 > 解决方案 > Xslt 将元素复制到现有元素,如果不存在则创建新元素

问题描述

xml 转换非常新,我被困在(可能适合你)非常简单的任务。让我们建议我们有来源:

<root>
  <someValue>123</someValue>
</root>

应该转化为:

<root>
 <additional>
   <someValue>123</someValue>
 </additional>
</root>

但如果我们有这个作为来源:

<root>
 <additional>
  <b>something</b>
 </additional>
 <someValue>123</someValue>
</root>

我们应该将someValue移动到现有的附加,即:

<root>
 <additional>
  <b>something</b>
  <someValue>123</someValue>
 </additional>     
</root>

请记住,在同一级别上可能存在具有相同行为的其他元素移至附加下)。好吧,非常感谢工作示例,但是如果它附有对其工作原理的简短描述,那就太棒了(我更喜欢钓鱼,而不是仅仅被喂食)。

标签: xslt

解决方案


一种可能的方法是添加一个additional包装器作为 的子级root,并删除现有的additional包装器 - 因此它的子级向上移动成为root(或者更确切地说是添加的additional包装器的子级)的子级:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/root">
    <xsl:copy>
        <additional>
            <xsl:apply-templates/>
        </additional>
    </xsl:copy>
</xsl:template>

<xsl:template match="additional">
    <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

推荐阅读