Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT按字母顺序排序&;数值问题_Xslt_Sorting_Alphanumeric - Fatal编程技术网

XSLT按字母顺序排序&;数值问题

XSLT按字母顺序排序&;数值问题,xslt,sorting,alphanumeric,Xslt,Sorting,Alphanumeric,我有一组字符串,例如g:lines='9,1306,LUCY,g,38,12' 我需要输出为XSLT 1.0: 1,9,12,38306,G,露西 这是我当前的代码: <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']"> <xsl:sort select="g:line"/> <xsl:sort select="number(g:line)" dat

我有一组字符串,例如g:lines='9,1306,LUCY,g,38,12'

我需要输出为XSLT 1.0:

1,9,12,38306,G,露西

这是我当前的代码:

<xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']">
  <xsl:sort select="g:line"/>
  <xsl:sort select="number(g:line)" data-type="number"/>
  <xsl:value-of select="normalize-space(g:line)" /><xsl:text/>
  <xsl:if test="position()!=last()"><xsl:text>,&#160;</xsl:text></xsl:if>
</xsl:for-each>
我可以让它只显示“1、12、306、38、9、G、LUCY”,因为第二类没有被拾取

有人能帮我吗?


<xsl:template match="/">
  <xsl:for-each select="(9,1,306,'LUCY','G',89)" >
    <xsl:sort select="if (number()) then () else ."/>
    <xsl:sort select="number(.)" data-type="number" />
    <xsl:value-of select="."/>
    <xsl:value-of select="', '" />
  </xsl:for-each>
</xsl:template>
给我

1,9,89,306,G,露西


我想这就是您需要的,对吗?

在XSLT 1.0中,我认为您需要这样的东西:

<xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']">  
    <xsl:sort select="g:line[number(g:line) != number(g:line)]"/>  
    <xsl:sort select="g:line[number(g:line) = number(g:line)]" data-type="number"/>
    <xsl:value-of select="normalize-space(g:line)" /><xsl:text/>  
    <xsl:if test="position()!=last()"><xsl:text>,&#160;</xsl:text></xsl:if>  
</xsl:for-each>
数字($foo)!=number($foo)是XSLT1.0习惯用法,用于测试值是否不是数字


另一个(我想是更干净的)解决方案是先选择/排序第一个数字,然后再选择其他数字。

我相信这可以满足您的需要

我首先拆分了求值/排序数字,然后是文本节点值

    <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus'][number(g:line)=number(g:line)]">
        <xsl:sort select="g:line" data-type="number" order="ascending"/>
        <xsl:value-of select="normalize-space(g:line)" />
        <xsl:text/>
        <xsl:if test="position()!=last() or $all_alerts[g:problem!='normal_service'][g:service='bus'][number(g:line)!=number(g:line)]">
            <xsl:text>,&#160;</xsl:text>
        </xsl:if>
    </xsl:for-each>

    <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus'][number(g:line)!=number(g:line)]">
        <xsl:sort select="g:line[number(g:line) != number(g:line)]"/>
        <xsl:value-of select="normalize-space(g:line)" />
        <xsl:text/>
        <xsl:if test="position()!=last()">
            <xsl:text>,&#160;</xsl:text>
        </xsl:if>
    </xsl:for-each>

, 
, 

要仅使用一条xsl:foreach语句实现此目的,请尝试以下操作:

<xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']"> 
  <xsl:sort select="not(number(g:line))"/> 
  <xsl:sort select="number(g:line)" data-type="number"/> 
  <xsl:sort select="g:line"/> 
  <xsl:value-of select="normalize-space(g:line)" /><xsl:text/> 
  <xsl:if test="position()!=last()"><xsl:text>,&#160;</xsl:text></xsl:if> 
</xsl:for-each> 
第一个xsl:sort根据行是否为数字进行排序。如果行是数字,not()将返回false,如果不是则返回true。false在true之前排序,因此数字首先出现。如果省略此排序,字母将首先出现

下一个xsl:sort按数字排序,因此将正确排序数字,但不会影响字母(应用number()时,所有字母都返回NaN)


最后一个xsl:sort将按字母顺序对字母进行排序。

如果列表中有非数字项,它们应该如何按数字排序?我知道这些项既有数字也有字母,我只需要按数字排序,然后再按字母顺序排序。我需要做什么才能让这种情况发生我收到了一个错误,可能是因为代码是2.0的,我使用的是1.0 javax.xml.transform.TransformerConfiguration异常:javax.xml.transform.TransformerException:javax.xml.transform.TransformerException:找不到函数:如果我敢说你永远都不应该习惯XSLT 1.0的话。它远远落后于2.0。很抱歉,我不能在这方面帮助您,但您有一个相当高级的愿望,如果您想坚持使用XSLT1.0,您可能会走运。您已经看到了答案中的技巧:仅当项目不是数字时才使用文本值。如果是,则返回“nothing”。因此,如果您(或其他人)可以将其映射到XSLT1.0,那么您就应该这样做。我将放弃这个问题,因为我再也不想进入XSLT1.0模式了。再次抱歉。不,我明白,我的公司正在使用一个名为Alfresco的开源CMS,它不允许我使用XSLT2.0。谢谢你的帮助。上面的代码给了我这个输出:1,12,306,38,9,G,LUCY