سؤال

لديّ مجموعة من الأوتار IE G: Lines = '9،1،306 ، Lucy ، G ، 38،12'

أحتاج إلى أن يكون الإخراج في XSLT 1.0:

1،9،12،38،306 ، G ، Lucy

هذا هو الكود الحالي الخاص بي:

<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 واحد فقط: 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: فرز ينص على ما إذا كان الخط هو رقم أم لا. ال ليس() إرجاع خطأ إذا كان السطر رقمًا ، وصحيحًا إذا لم يكن كذلك. يتم فرز خطأ قبل صحيح ، وبالتالي تظهر الأرقام أولاً. إذا حذفت هذا النوع ، فستظهر الحروف أولاً.

التالي XSL: فرز ينفصل العددي ، وبالتالي سيقوم بفرز الأرقام بشكل صحيح ، ولكن لا يؤثر على الحروف (التي تُرجع جميعها عند تطبيق الرقم ()).

الاخير XSL: فرز سيتم فرز الحروف أبجديًا.

نصائح أخرى

<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)! = الرقم ($ foo) هو IS XSLT 1.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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top