问题

我正在尝试对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>&#160;</xsl:text>

                </p>
              </xsl:for-each>
              </entry>
            </row>
            <xsl:text>&#xA;</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放在一起,它应该按照您想要的方式排序。

10-07 13:10
查看更多