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

时间:2016-01-18 15:53:40

标签: xml xslt xslt-1.0

我有这样的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中的release标记之外的所有其他内容。
  2. 仅保留一个备注标记。
  3. 有什么灯吗?谢谢,

1 个答案:

答案 0 :(得分:1)

  

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

这可以按如下方式完成:

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>