7

我有一组字符串,即 g:lines = '9,1,306,LUCY,G,38,12'

我需要输出在 XSLT 1.0 中:

1,9,12,38,306,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' 因为第二类没有被选中。

任何人都可以帮助我吗?

4

4 回答 4

13

要仅使用一个 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将按字母顺序对字母进行排序。

于 2010-04-20T12:43:30.300 回答
0
<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, 露西,

我想这就是你需要的,对吧?

于 2010-04-19T20:00:07.013 回答
0

在 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>

number($foo) != number($foo) 是用于测试值是否不是数字的 XSLT 1.0 习惯用法。

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

于 2010-04-19T20:26:44.433 回答
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>
于 2010-04-19T22:15:39.463 回答