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() > 1]">
<xsl:copy>
<xsl:apply-templates select="given-names,surname"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我有一个 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() > 1]">
<xsl:copy>
<xsl:apply-templates select="given-names,surname"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>