XSLT按字母顺序排序&;数值问题
我有一组字符串,例如g:lines='9,1306,LUCY,g,38,12' 我需要输出为XSLT 1.0: 1,9,12,38306,G,露西 这是我当前的代码: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
<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>, </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>, </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>, </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>, </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>, </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