XSLT:将第二个节点下的节点移动到第一个节点并删除第二个节点



>我有这样的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>

它有两个问题:

  1. 它删除了除 xml 中的发布标签之外的其他所有内容。
  2. 仅保留一个备注标记。

有灯吗?谢谢

将第二个版本标记下的所有备注标记移动到第一个 发布标记,然后删除第二个版本标记。

这可以按如下方式完成:

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>

相关内容

  • 没有找到相关文章

最新更新