我需要根据子标记值对xml段进行排序,尽管父标记可以具有不同的名称。
我的输入xml就是这样
<root>
<A>
<id>1000</id>
</A>
<A>
<id>1001</id>
</A>
<A>
<id>1002</id>
</A>
<B>
<id>1000</id>
</B>
<B>
<id>1001</id>
</B>
<B>
<id>1002</id>
</B>
</root>
无论父标签是什么,我都希望对标签“ id”进行排序。因此结果应如下所示:
<root>
<A>
<id>1000</id>
</A>
<B>
<id>1000</id>
</B>
<A>
<id>1001</id>
</A>
<B>
<id>1001</id>
</B>
<A>
<id>1002</id>
</A>
<B>
<id>1002</id>
</B>
</root>
如何在xslt中实现?
谢谢! 汤姆
答案 0 :(得分:1)
匹配root
的模板应包含apply-templates
select="*"
(对于所有子节点)和<xsl:sort select="id"/>
内部。
因此整个XSLT脚本如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="*">
<xsl:sort select="id"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,我使用<xsl:strip-space elements="*"/>
来实现
“更好”的输出格式。尝试没有它的转化看看
差异。