النوع الأبجدي الرقمي على قيم السلسلة المختلطة: ألفا ألفا ألفا

StackOverflow https://stackoverflow.com/questions/4037136

  •  26-09-2019
  •  | 
  •  

سؤال

بالنظر إلى XML حيث يمكن أن يكون العدد رقميًا فقط ؛ ابدأ بالرقم ثم تشمل ألفا ؛ أو اتبع نمط رقمي ألفا الرقمي:

<FORMSLIST>
    <FORMS>
        <FORMNUMBER>3 ABC</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>12 ABC 45</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>3 XYZ</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>18</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>326</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>21 B</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>12 EFG 79</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>3 ABCD</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
</FORMSLIST>

هذه ورقة الأنماط الخاصة بي (التباين في نوع أبجدي رقمي على قيمة السلسلة المختلطة إعادة النظر):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="vAlpha" select="' ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
        <xsl:for-each-group select="FORMSLIST/FORMS" group-by="FORMSEQ">
            <xsl:sort select="FORMSEQ" data-type="number"/>
            <!-- NEED HELP WITH THE FOLLOWING SORT -->
            <xsl:for-each select="current-group()[(floor(number(FORMNUMBER)) = floor(number(FORMNUMBER))) or (substring-before(FORMNUMBER,' ') and translate(substring-before(FORMNUMBER,' '),' 0123456789','') = '')]">
                <xsl:sort select="translate(FORMNUMBER, $vAlpha, '')" data-type="number"/>
                <xsl:sort select="substring-after(FORMNUMBER,' ')"/>
                <xsl:element name="{local-name()}">
                    <xsl:copy-of select="*"/>
                </xsl:element>
            </xsl:for-each>
            <!-- THIS SORT WORKS AND I DON'T HAVE QUESTIONS ON THIS: ALPHA ONLY FORMS; BEGIN WITH ALPHA AND THEN GO TO NUMERIC...MAY ALSO GO BACK TO ALPHA -->
            <xsl:for-each select="current-group()[contains($vAlpha,substring(FORMNUMBER,1,1)) or (translate(FORMNUMBER, $vAlpha, '') = '')]">
                <xsl:sort select="translate(FORMNUMBER, ' 0123456789', '')"/>
                <xsl:sort select="translate(FORMNUMBER, $vAlpha, '')" data-type="number"/>
                <xsl:element name="{local-name()}">
                    <xsl:copy-of select="*"/>
                </xsl:element>
            </xsl:for-each>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

التحول الناتج هو:

<FORMSLIST>
    <FORMS>
        <FORMNUMBER>3 ABC</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>3 ABCD</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>3 XYZ</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>18</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>21 B</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>326</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>12 ABC 45</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>12 EFG 79</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
</FORMSLIST>

تتمثل النتيجة المرجوة في الحصول على النماذج "12 ABC 45" و "12 EFG 79" في النوع مثل SO (يتم فرز القائمة أولاً بالرقم الأول):

<FORMSLIST>
    <FORMS>
        <FORMNUMBER>3 ABC</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>3 ABCD</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>3 XYZ</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>12 ABC 45</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>12 EFG 79</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>18</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>21 B</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
    <FORMS>
        <FORMNUMBER>326</FORMNUMBER>
        <FORMSEQ>99900</FORMSEQ>
    </FORMS>
</FORMSLIST>

لقد جربت العديد من الاختلافات ولكن لا يبدو أن الأمر يعمل على العمل.

هل كانت مفيدة؟

المحلول

في XSLT 2.0 ، الرمز المميز(Formnumber ، '') يعيد سلسلة من الرموز المميزة مفصولة بمساحة في شكل. لذلك يمكنك استخدام هذه <xsl:sort> عناصر:

            <xsl:sort select="tokenize(FORMNUMBER, ' ')[1]" data-type="number"/>
            <xsl:sort select="tokenize(FORMNUMBER, ' ')[2]" />
            <xsl:sort select="tokenize(FORMNUMBER, ' ')[3]" data-type="number"/>

لم يخبر. لكن يبدو أنه سيفعل ما تريده بالضبط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top