以下是输入,我想合并和排序元素而不使用xsl:sort !!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lists SYSTEM "number.dtd">
<numbers>
<number>
<num val="7"/>
<num val="2"/>
<num val="9"/>
<num val="16"/>
<num val="12"/>
<num val="15"/>
<number/>
<number>
<num val="29"/>
<num val="18"/>
<num val="30"/>
<num val="32"/>
</number>
</numbers>
输出应该是::
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lists SYSTEM "number.dtd">
<numbers>
<number>
<num val="2"/>
<num val="7"/>
<num val="9"/>
<num val="12"/>
<num val="15"/>
<num val="16"/>
<num val="18"/>
<num val="29"/>
<num val="30"/>
<num val="32"/>
</number>
</numbers>
在xsl中,请不要使用xsl:sort ...∩_∩
答案 0 :(得分:1)
不使用xsl:sort,您可以执行以下操作,但如果您的数字高得多,为负数,非整数或实际数字,那么您将需要调整内容,或者可能不会work(我尝试将最后一个值从32增加到3200并且xsltproc不仅要求我提供更高的--maxdepth值,而且还需要52倍的长度!):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<numbers>
<number>
<xsl:call-template name="iterate.over.nums">
<xsl:with-param name="i">0</xsl:with-param>
</xsl:call-template>
</number>
</numbers>
</xsl:template>
<xsl:template name="iterate.over.nums">
<xsl:param name="i">0</xsl:param>
<xsl:choose>
<xsl:when test="not(numbers/number/num/@val >= $i)" />
<xsl:otherwise>
<xsl:for-each select="numbers/number/num[@val = $i]">
<num val="{@val}"/>
</xsl:for-each>
<xsl:call-template name="iterate.over.nums">
<xsl:with-param name="i" select="$i + 1" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>