如何对包含数字但有时也包含字母的XML条目进行排序?

时间:2017-04-03 19:30:26

标签: xml xslt xslt-2.0

我有这些我希望排序的id值:

<xsl:sort select="substring-before(@id, '.')" data-type="number"/>
<xsl:sort select="substring-after(@id, '.')" data-type="number"/>

目前,我正试图这样排序。这适用于只有数字但不包含字母的id值。

Id. 4.10
Id. 4.11
Id. 4.12
Id. 4.3
Id. 4.9
1.1
1.2
1.3

目前给我的顺序是:

Id. 4.3
Id. 4.9
Id. 4.10
Id. 4.11
Id. 4.12
1.1
1.2
1.3

我如何对其进行排序,以便订购:

class Migrate extends CI_Controller {

    public function __construct()
    {
        parent::__construct();

        $this->input->is_cli_request()
        or exit("Execute via command line: php index.php migrate");

        $this->load->library('migration');
    }

    public function index()
    {
        if(!$this->migration->latest())
        {
            show_error($this->migration->error_string());
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您展示的顺序可以通过以下方式完成:

X1

这可以通过使用<xsl:sort select="number(starts-with(@id, 'Id. '))" data-type="number" order="descending"/> <xsl:sort select="substring-before(replace(@id, '^Id. ', ''), '.')" data-type="number"/> <xsl:sort select="substring-after(replace(@id, '^Id. ', ''), '.')" data-type="number"/> 属性(也可以在编号方案中处理更多级别,例如“1.10.2”)来简化 - 但是,这取决于您使用的处理器。

答案 1 :(得分:2)

XSLT 3.0为此定义了排序规则URI:

<xsl:sort collation="http://www.w3.org/2013/collation/UCA?numeric=yes"/>

这将任何数字序列视为数字,因此2.20(a)-3在2.20(a)-10之前和2.8(b)-4之后排序。

但是这(我认为)会在“1.3”之后加上“id.4.10”。要解决此问题,您需要在其前面添加另一个排序键

<xsl:sort select="not(starts-with(., 'id'))"/>

(之前的假排序)

这是在当前的Saxon版本中实现的。早期的Saxon版本提供了排序规则URI

http://saxon.sf.net/collation?alphanumeric=yes

具有相似的语义。

如果这对您不起作用,那么如果您总是使用相同数量的数字组件,则可以使用正则表达式将值拆分并使用多个排序键。