使用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)。
其他任何事情都必须保持不变。
提前谢谢。
答案 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
属性。其他所有内容都按照原样复制。