Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT删除和复制XML元素_Xml_Xslt - Fatal编程技术网

使用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> ...

使用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>

...
...
...
进入:


...
换句话说:我需要完全删除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”。值来自。。。?