>我有这样的XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<release>
<changerequest>101</changerequest>
<morechangerequest />
<year>1998</year>
</release>
<release>
<year>1998</year>
<remarks>
<remarkname>name</remarkname>
<remarktitle>remarktitle</remarktitle>
</remarks>
<remarks>
<remarkname>name2</remarkname>
<remarktitle>remarktitle2</remarktitle>
</remarks>
<moreremarks />
</release>
<othertags />
</root>
我希望有这样的输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<release>
<changerequest>101</changerequest>
<morechangerequest/>
<year>1998</year>
<remarks>
<remarkname>name</remarkname>
<remarktitle>remarktitle</remarktitle>
</remarks>
<remarks>
<remarkname>name2</remarkname>
<remarktitle>remarktitle2</remarktitle>
</remarks>
<moreremarks/>
</release>
<othertags />
</root>
也就是说,将第二个版本标记下的所有备注标记移动到第一个版本标记,然后删除第二个版本标记。
我使用的 XSLT
:<?xml version="1.0" encoding="UTF-8"?>
<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:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*|//release[1]/*"/>
<remarks>
<xsl:apply-templates select="@*|//release[2]/remarks/*"/>
</remarks>
</xsl:copy>
</xsl:template>
<xsl:template match="//release[2]"/>
</xsl:stylesheet>
它有两个问题:
- 它删除了除 xml 中的发布标签之外的其他所有内容。
- 仅保留一个备注标记。
有灯吗?谢谢
将第二个版本标记下的所有备注标记移动到第一个 发布标记,然后删除第二个版本标记。
这可以按如下方式完成:
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>
<release>
<xsl:apply-templates select="release[1]/*"/>
<xsl:apply-templates select="release[2]/remarks"/>
<xsl:apply-templates select="*[not(self::release)]"/>
</release>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>