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>

2番目のソートが選択されていないため、「1、12、306、38、9、G、LUCY」のみを表示するようにできます。

誰でも私を助けることができますか?

4

4 に答える 4

13

xsl:foreach ステートメントを 1 つだけ使用してこれを実現するには、次のことを試してください。

<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

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

私はこれがあなたが望むものを達成すると信じています。

最初に数値の評価/並べ替えを分割し、次にテキスト ノード値を分割します。

    <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 に答える