我有这些我希望排序的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());
}
}
}
答案 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
具有相似的语义。
如果这对您不起作用,那么如果您总是使用相同数量的数字组件,则可以使用正则表达式将值拆分并使用多个排序键。