XSLT - 更改节点

时间:2015-11-13 08:58:28

标签: xml xslt xslt-2.0

我有一个xml linke,

<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>期望第一个节点。所以输出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>

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

1 个答案:

答案 0 :(得分:3)

您只需要一个身份模板以及位置大于1的name个节点的模板覆盖。

<?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>