xsl:sort 不对数据进行排序
xsl:sort not sorting data
我需要以下 xml 来对 id 字段进行排序:
<top>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>9</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>6</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>3</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
</top>
这样排序:
<top>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>3</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>6</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>9</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
</top>
换句话说,我希望 contentitem 分组保持不变,但在结果 xml 中按 ID 顺序列出。我正在尝试使用以下 xsl 但没有任何运气。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<!-- -->
<xsl:strip-space elements="*"/>
<!-- -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- -->
<xsl:template match="contents">
<xsl:copy>
<xsl:apply-templates select="contentitem">
<xsl:sort select="id" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
看来您应该对 repeat1
元素进行排序,而不是对 contents
元素进行排序。
试试这个 XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="top">
<xsl:copy>
<xsl:apply-templates select="repeat1">
<xsl:sort select="repeat2/contents/contentitem/id" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我需要以下 xml 来对 id 字段进行排序:
<top>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>9</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>6</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>3</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
</top>
这样排序:
<top>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>3</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>6</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
<repeat1>
<repeat2>
<contents>
<contentitem>
<id>9</id>
<moretags1/>
<moretags2/>
</contentitem>
</contents>
</repeat2>
</repeat1>
</top>
换句话说,我希望 contentitem 分组保持不变,但在结果 xml 中按 ID 顺序列出。我正在尝试使用以下 xsl 但没有任何运气。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<!-- -->
<xsl:strip-space elements="*"/>
<!-- -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- -->
<xsl:template match="contents">
<xsl:copy>
<xsl:apply-templates select="contentitem">
<xsl:sort select="id" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
看来您应该对 repeat1
元素进行排序,而不是对 contents
元素进行排序。
试试这个 XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="top">
<xsl:copy>
<xsl:apply-templates select="repeat1">
<xsl:sort select="repeat2/contents/contentitem/id" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>