XSLT - 更改节点的顺序

XSLT - Change the order of nodes

我有一个 xml 链接,

<person-group>
    <name>
        <surname>Agate</surname>
        <given-names>R. J.</given-names>
    </name>
    <name>
        <surname>Choe</surname>
        <given-names>M.</given-names>
    </name>
    <name>
        <surname>Arnold</surname>
        <given-names>A. P.</given-names>
    </name>
</person-group>

在输出 xml 中,我必须将 <surname><given-names> 的顺序更改为 <given-names><surname> expect first node 。所以输出 xml 应该是这样的,

<person-group>
    <name>
        <surname>Agate</surname>
        <given-names>R. J.</given-names>
    </name>
    <name>
        <given-names>M.</given-names>
        <surname>Choe</surname>   
    </name>
    <name>    
        <given-names>A. P.</given-names>
        <surname>Arnold</surname>
    </name>
</person-group>

我写了下面的 xsl 来完成这个任务,

<xsl:template match="person-group">
        <person-group>
            <xsl:apply-templates/>
        </person-group>
    </xsl:template>

    <xsl:template match="name[position()=1]">
        <name>
            <xsl:apply-templates select="child::surname" />
            <xsl:apply-templates select="child::given-names" />
        </name>
    </xsl:template>

    <xsl:template match="name[position()>1]">
        <name>
            <xsl:apply-templates select="child::given-names"/>
            <xsl:apply-templates select="child::surname"/>
            <xsl:apply-templates/>
        </name>
    </xsl:template>

    <xsl:template match="surname" >
        <surname>
            <xsl:apply-templates />
        </surname>
    </xsl:template>

    <xsl:template match="given-names" >
        <given-names>
            <xsl:apply-templates />
        </given-names>
    </xsl:template>

但是,将 <name> 个节点的内容加倍并给了我这样的输出,

<person-group>
    <name>
        <surname>Agate</surname>
        <given-names>R. J.</given-names>
    </name>
    <name>
        <given-names>M.</given-names>
        <surname>Choe</surname>
        <given-names>M.</given-names>
        <surname>Choe</surname>
    </name>
    <name>
        <given-names>A. P.</given-names>
        <surname>Arnold</surname>
        <given-names>A. P.</given-names>
        <surname>Arnold</surname>
    </name>
</person-group>

如何修改我的代码以获得预期的结果..

您只需要一个标识模板和 name 个位置大于 1 的节点的模板覆盖。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>    

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="name[position() &gt; 1]">
        <xsl:copy>
            <xsl:apply-templates select="given-names,surname"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>