我面临一个问题,我需要对元素进行排序,具体取决于它们的值,它包含一个以句点分隔的数字.我需要根据第一个时段之前的数字值,然后是第一个和第二个时段之间的数字等对元素进行排
<?xml version="1.0" encoding="UTF-8"?>
<root>
<ROW>2.0.1</ROW>
<ROW>1.2</ROW>
<ROW>1.1.1</ROW>
<ROW>1.2.0</ROW>
<ROW>1</ROW>
</root>
结果应该是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<ROW>1</ROW>
<ROW>1.1.1</ROW>
<ROW>1.2</ROW>
<ROW>1.2.0</ROW>
<ROW>2.0.1</ROW>
</root>
这有可能吗?感谢任何帮助.
有一个“简单”的答案,不使用任何扩展:将行值拆分为chucks并对其进行排序.<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="ROW">
<xsl:sort select="substring-before(concat(., '.'), '.')" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="ROW">
<xsl:param name="prefix" select="''"/>
<xsl:choose>
<!-- end of recursion, there isn't any more ROW with more chucks -->
<xsl:when test=". = substring($prefix, 1, string-length($prefix)-1)">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="chuck" select="substring-before(concat(substring-after(., $prefix), '.'), '.')"/>
<!-- this test is for grouping ROW with same prefix, to skip duplicates -->
<xsl:if test="not(preceding-sibling::ROW[starts-with(., concat($prefix, $chuck))])">
<xsl:variable name="new-prefix" select="concat($prefix, $chuck, '.')"/>
<xsl:apply-templates select="../ROW[starts-with(., $new-prefix) or . = concat($prefix, $chuck)]">
<xsl:sort select="substring-before(concat(substring-after(., $new-prefix), '.'), '.')" data-type="number"/>
<xsl:with-param name="prefix" select="$new-prefix"/>
</xsl:apply-templates>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
