Получить сортировку записей по двум полям по критерию наибольшего значения, используя xslt - PullRequest
0 голосов
/ 07 июня 2018

В моем входе ниже двух записей с BEGDA и ENTRY, каждая из которых является числовым значением.Я получил запись, которая имеет самые большие значения BEGDA и ENTRY.Я пытаюсь отсортировать оба поля, но кажется, что он выбирает первое из группы, когда BEGDA соответствует

 <?xml version="1.0" encoding="utf-8"?>
<root>
    <E1PITYP>
        <PLVAR>01</PLVAR>
        <OTYPE>P</OTYPE>
        <OBJID>EMPLOYEE-6-51</OBJID>
        <INFTY>0002</INFTY>
        <BEGDA>20180607</BEGDA>
        <ENTRY>201806071133452850700</ENTRY>
        <ENDDA>99991231</ENDDA>
        <E1P0002>
            <PERNR>EMPLOYEE-6-51</PERNR>
            <INFTY>0002</INFTY>
            <ENDDA>99991231</ENDDA>
            <BEGDA>20180607</BEGDA>
            <INITS>TH</INITS>
            <NACHN>Hire</NACHN>
            <VORNA>Test</VORNA>
            <MIDNM/>
            <ANRED/>
            <GESCH>2</GESCH>
            <GBDAT>19900605</GBDAT>
            <NATIO>GB</NATIO>
            <PERID/>
        </E1P0002>
    </E1PITYP>
    <E1PITYP>
        <PLVAR>01</PLVAR>
        <OTYPE>P</OTYPE>
        <OBJID>EMPLOYEE-6-51</OBJID>
        <INFTY>0002</INFTY>
        <BEGDA>20180607</BEGDA>
        <ENTRY>201806071137058230700</ENTRY>
        <ENDDA>99991231</ENDDA>
        <E1P0002>
            <PERNR>EMPLOYEE-6-51</PERNR>
            <INFTY>0002</INFTY>
            <ENDDA>99991231</ENDDA>
            <BEGDA>20180607</BEGDA>
            <INITS>TH</INITS>
            <NACHN>Hire</NACHN>
            <VORNA>Test</VORNA>
            <MIDNM/>
            <ANRED/>
            <GESCH>2</GESCH>
            <GBDAT>19900605</GBDAT>
            <NATIO>GB</NATIO>
            <PERID>AA888888A</PERID>
        </E1P0002>
    </E1PITYP>

</root>

Мой xslt ниже, я не уверен, что делаю неправильно.Пожалуйста, посоветуйте экспертов.

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
    version="2.0">
    <xsl:template match="root">
        <xsl:for-each-group select="E1PITYP[INFTY = '0002']" group-by="BEGDA">
            <xsl:sort select="BEGDA" order="descending"/>
            <xsl:sort select="ENTRY" order="descending"/>
            <xsl:if test="position() = 1">
                <xsl:copy-of select="."/>
            </xsl:if>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 07 июня 2018

Только что понял, в моем случае BEGDA может дублировать, но ENTRY не будет, поэтому целесообразно группировать по ENTRY или "."

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
    version="2.0">
    <xsl:template match="root">
        <xsl:for-each-group select="E1PITYP[INFTY = '0002']" group-by="ENTRY">
            <xsl:sort select="BEGDA" order="descending"/>
            <xsl:sort select="ENTRY" order="descending"/>
            <xsl:if test="position() = 1">
                <xsl:copy-of select="."/>
            </xsl:if>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet

>

или

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
    version="2.0">
    <xsl:template match="root">
        <xsl:for-each-group select="E1PITYP[INFTY = '0002']" group-by=".">
            <xsl:sort select="BEGDA" order="descending"/>
            <xsl:sort select="ENTRY" order="descending"/>
            <xsl:if test="position() = 1">
                <xsl:copy-of select="."/>
            </xsl:if>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>
...