使用XSLT删除和复制XML元素
使用XSLT,我希望转换具有以下结构的XML文件:使用XSLT删除和复制XML元素,xml,xslt,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>
<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>
...
...
...
进入:
...
换句话说:我需要完全删除e3元素,并用一个包含e2元素的副本替换它们,并将其名称更改为e3;将一些属性(例如a、b)复制到新元素,并添加一些新属性(例如e)
其他任何东西都必须完好无损
提前感谢您。也许这对您有用: XSLT1.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
元素,从父e2
复制@a
和@b
属性,并添加一个新的@e
属性。其他所有内容都按原样复制。也许这对您有用:
XSLT1.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
元素,从父e2
复制@a
和@b
属性,并添加一个新的@e
属性。其他所有内容都按原样复制。也许这对您有用:
XSLT1.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
元素,从父e2
复制@a
和@b
属性,并添加一个新的@e
属性。其他所有内容都按原样复制。也许这对您有用:
XSLT1.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
元素,从父e2
复制@a
和@b
属性,并添加一个新的@e
属性。其他内容照搬原样。问题不够清楚。1.您将它们替换为封闭的e2元素的副本(名称更改为e3)是什么意思,因为我仍然可以在输出中同时看到e2
和e3
元素。2.请具体说明要复制的属性,不要让我们假设任何东西。@LingamurthyCS,新的e3元素是封闭e2元素的副本,其中一些属性被删除,一些属性被添加。要复制的属性-如示例a和b所示,删除了c,添加了e。您希望删除哪些属性,并添加哪些属性?@LingamurthyCS,我已编辑了前面的注释。复制a和b,删除c,添加e。“添加e”。这个问题还不够清楚。1.您将它们替换为封闭的e2元素的副本(名称更改为e3)是什么意思,因为我仍然可以在输出中同时看到e2
和e3
元素。2.请具体说明要复制的属性,不要让我们假设任何东西。@LingamurthyCS,新的e3元素是封闭e2元素的副本,其中一些属性被删除,一些属性被添加。要复制的属性-如示例a和b所示,删除了c,添加了e。您希望删除哪些属性,并添加哪些属性?@LingamurthyCS,我已编辑了前面的注释。复制a和b,删除c,添加e。“添加e”。这个问题还不够清楚。1.您将它们替换为封闭的e2元素的副本(名称更改为e3)是什么意思,因为我仍然可以在输出中同时看到e2
和e3
元素。2.请具体说明要复制的属性,不要让我们假设任何东西。@LingamurthyCS,新的e3元素是封闭e2元素的副本,其中一些属性被删除,一些属性被添加。要复制的属性-如示例a和b所示,删除了c,添加了e。您希望删除哪些属性,并添加哪些属性?@LingamurthyCS,我已编辑了前面的注释。复制a和b,删除c,添加e。“添加e”。这个问题还不够清楚。1.您将它们替换为封闭的e2元素的副本(名称更改为e3)是什么意思,因为我仍然可以在输出中同时看到e2
和e3
元素。2.请具体说明要复制的属性,不要让我们假设任何东西。@LingamurthyCS,新的e3元素是封闭e2元素的副本,其中一些属性被删除,一些属性被添加。要复制的属性-如示例a和b所示,删除了c,添加了e。您希望删除哪些属性,并添加哪些属性?@LingamurthyCS,我已编辑了前面的注释。复制a和b,删除c,添加e。“添加e”。值来自。。。?