问题
我正在尝试对rule / @ id的整个值进行排序,其中@id的值是三个值的连字符字符串,例如“ 1-10-12”或“ 10-15-2”。我尝试过转换为数字,并且尝试过格式化数字,但是没有运气。
代码示例输出仅按最左边的数字排序,子值不正确。
XML来源:
<rule-mapping name="C">
<rule id="0-1-1">
<checker id="checker1"/>
<checker id="checker2"/>
</rule>
<rule id="0-1-10">
<checker id="checker3"/>
</rule>
<rule id="0-1-11">
<checker id="checker4"/>
</rule>
<rule id="15-1-2">
<checker id="checker5"/>
</rule>
<rule id="0-1-12">
<checker id="checker6"/>
</rule>
</rule-mapping>
转换代码段:
<tbody>
<xsl:for-each select="rule-mapping/rule">
<xsl:sort select="substring-before(@id, '-')" data-type="number"/>
<xsl:sort select="substring-after(@id, '-')" data-type="number"/>
<row>
<entry>
<xsl:value-of select="@id"/>
</entry>
<entry>
<xsl:for-each select="checker">
<p>
<codeph><xsl:value-of select="@id"/></codeph><xsl:text> </xsl:text>
</p>
</xsl:for-each>
</entry>
</row>
<xsl:text>
</xsl:text>
</xsl:for-each>
</tbody>
预期产量:
<row>
<entry>0-1-1</entry>
<entry>
<p><codeph>checker1</codeph> </p>
<p><codeph>checker2</codeph> </p>
</entry>
</row>
<row>
<entry>0-1-10</entry>
<entry>
<p>
<codeph>checker3</codeph> </p>
</entry>
</row>
<row>
<entry>0-1-11</entry>
<entry>
<p>
<codeph>checker4</codeph> </p>
</entry>
</row>
<row>
<entry>0-1-12</entry>
<entry>
<p>
<codeph>checker6</codeph> </p>
</entry>
</row>
<row>
<entry>15-1-2</entry>
<entry>
<p>
<codeph>checker5</codeph> </p>
</entry>
</row>
提前致谢。
最佳答案
您有正确的想法,但您需要进一步采取措施:
<xsl:sort select="substring-before(@id, '-')" data-type="number"/>
<xsl:sort select="substring-before(substring-after(@id, '-'), '-')" data-type="number"/>
<xsl:sort select="substring-after(substring-after(@id, '-'), '-')" data-type="number"/>
将这三个
xsl:sort
放在一起,它应该按照您想要的方式排序。