Xml XSLT-字符串和数字升序,Saxon处理器

Xml XSLT-字符串和数字升序,Saxon处理器,xml,xslt,xslt-2.0,saxon,Xml,Xslt,Xslt 2.0,Saxon,我试图了解撒克逊处理器是如何选择升序的 我有如下xml <catalog> <cd> <title lan="en">Empire Burlesque</title> <price>10.90</price> <year>1985</year> </cd> <cd> <title la

我试图了解撒克逊处理器是如何选择升序的

我有如下xml

<catalog>
    <cd>
        <title lan="en">Empire Burlesque</title>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title lan="en">Hide your heart</title>
        <price> </price>
        <year>1988</year>
    </cd>
    <cd>
        <title lan="fr">Greatest Hits</title>
        <price>13.90</price>
        <year>1982</year>
    </cd>
    <cd>
        <title lan="sp">Still got the blues</title>
        <price>abc</price>
        <year>1990</year>
    </cd>
    <cd>
        <title lan="fr">Eros</title>
        <price>24.90</price>
        <year>1997</year>
    </cd>
</catalog>
似乎空字符串排在第一位,然后price有数字,按预期排序,price有字符串值,排在第一位


撒克逊处理器如何决定此顺序

它的排序与其他排序一样自然有序。首先是空格,然后是数字0-9和字母。看

当我按价格排序时,我会给出以下结果

如果您按字母顺序排序,则只会显示您显示的结果,即将
价格
的内容视为文本。如果按以下方式排序,您将得到不同的结果:

<xsl:sort select="price" data-type="number" order="ascending"/>

在这种情况下,所有不能转换为数字的值将排在第一位

请注意,用于排序的默认数据类型是文本,除非您明确地覆盖它1,否则您还将在
“100.00”之后看到排序的“9.00”的价格



(1) 或者,如果您有一个将
price
定义为数字数据类型的模式,并且您使用的是一个支持模式的处理器。

没有“自然”顺序。即使是字母顺序也不总是遵循ASCII顺序。不管XML文档的编码是什么,所有字符都被翻译成Unicode并进行处理。而且,正如您链接的网页所说,“8位[Extended]ASCII表有几种不同的变体”,因此将其作为未命名的标准是没有什么好处的。更具体地说,XSLT 2.0表示默认顺序取决于实现。在Saxon实现中,默认顺序是按Unicode代码值。如果您想要数字排序,那么使用data type=“number”效果很好。如果混合使用文本和数字,请指定
排序规则=”http://saxon.sf.net/collation?alphanumeric=yes
可能会给出最好的结果-尽管我不确定它是否处理十进制数和整数。
<xsl:sort select="price" data-type="number" order="ascending"/>