使用XSLT删除和复制XML元素

时间:2015-03-12 22:35:24

标签: xml xslt

使用XSLT,我想转换具有以下结构的XML文件:

<e1>
  <e2 a="a1" b="b1" c="c1">
    <e3 foo="a"/>
    <e3 foo="b"/>
    <e3 foo="c"/>
    ...
  </e2>
  <e2 a="a2" b="b2" c="c2">
    <e3 foo="d"/>
    ...
  </e2>
  ...
</e1>

分为:

<e1>
  <e2 a="a1" b="b1" c="c1">
    <e3 a="a1" b="b1" e="e"/>
  </e2>
  <e2 a="a2" b="b2" c="c2">
    <e3 a="a2" b="b2" e="e"/>
  </e2>
  ...
</e1>

在单词中:我需要完全删除e3元素,并用封闭的e2元素的副本替换它们,并将其名称更改为e3;将一些属性(例如a,b)复制到新元素,并添加一些新属性(例如e)。

其他任何事情都必须保持不变。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

也许这对你有用:

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="e2[e3]">   
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <e3 a="{@a}" b="{@b}" e="e"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="e3"/>

</xsl:stylesheet>

删除所有现有的e3元素,并且 - 对于包含至少一个e2子元素的任何e3元素 - 添加新的e3元素,复制{{来自父@a的1}}和@b个属性,并添加了新的e2属性。其他所有内容都按照原样复制