Frage

Ich habe eine Gruppe von Zeichenketten, dh g: Linien = '9,1,306, LUCY, G, 38,12'

Ich brauche die Ausgabe in XSLT zu 1.0:

1,9,12,38,306, G, LUCY

Dies ist mein aktueller Code:

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

kann ich es nur Anzeige erhalten '1, 12, 306, 38, 9, G, LUCY', weil die zweite Art besteht nicht abgeholt werden.

Wer in der Lage helfen Sie mir?

War es hilfreich?

Lösung

Um dies zu erreichen mit nur einem xsl: foreach-Anweisung, versuchen Sie Folgendes:

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

Der erste xsl: sort Sorten auf, ob die Linie eine Zahl ist oder nicht. Die nicht () false zurück, wenn die Zeile eine Zahl ist, und dann, wenn dies nicht der Fall. falsch ist, bevor wahr sortiert, und so die Zahlen kommen zuerst. Wenn Sie diese Art weglassen, erscheinen die Buchstaben zuerst.

Der nächste xsl: sort sortiert numerisch, und so werden die Zahlen richtig sortieren, aber nicht die Buchstaben beeinflussen (die alle Rückkehr NaN, wenn die Anzahl () angewendet wird)

.

Der letzte xsl:. Art werden die Buchstaben in alphabetischer Reihenfolge sortieren

Andere Tipps

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

gibt mir

1, 9, 89, 306, G, LUCY,

Ich denke, das ist, was Sie brauchen, nicht wahr?

In XSLT 1.0 Ich denke, dass Sie so etwas wie diese brauchen:

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

Nummer ($ foo)! = Anzahl ($ foo) ist XSLT 1.0 Idiom für die Prüfung, ob ein Wert keine Zahl ist.

Weitere (mehr sauber I guess) Lösung wäre, wählen / Art ersten Zahlen, dann andere.

Ich glaube, das leistet, was Sie wollen.

aufgeteilt ich die Auswertung aus / Art von Zahlen und dann Textknoten Werte.

    <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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top