xml - XSL : How can I sort a three digit, 连字符分隔值?

标签 xml sorting xpath xslt-2.0

问题

我试图对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 放在一起,它应该按照您想要的方式排序。

关于xml - XSL : How can I sort a three digit, 连字符分隔值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28006972/

相关文章:

xml - 为具有相同名称的元素创建 XML 模式?

java - 从 API 提要解析 XML (Java)

c++ - 如何使用自定义比较器对数组进行排序?

xpath选择有条件的节点

python - 从悬停元素获取定位器

xml - 如何在Powershell中使用PrependChild将现有元素添加到新的XML对象中

xml - 如何在不更改名称的情况下在不同的命名空间中扩展复杂类型

sorting - Elasticsearch使用嵌套聚合中的值对公式进行排序

java - 根据特定键对 HashMap 项进行分组

sql-server - where 子句中的 .exist 和 .value 哪个更快?