我有一个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>
如何修改我的代码以获得预期的结果..
答案 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() > 1]">
<xsl:copy>
<xsl:apply-templates select="given-names,surname"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>