Группировать по трем общим элементам (XML в XML) - PullRequest
0 голосов
/ 22 января 2019

У нас есть требование, в котором нам нужно сгруппировать по сегментам, которые разделяют три общих черты ... Я приложил пример ввода и желаний. Было бы здорово, если кто-то поможет.

Мынужно создать группу на основе страны, названия компании и месяца рождения.

Я пытался , и я новичок в этом ... так что не удалось.

Это наш вход

<?xml version='1.0' encoding='utf-8'?>
<EMPDTLS>

    <EMP>
        <FIRST_NAME>John</FIRST_NAME>
        <LAST_NAME>Mathew</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>DEC</MONTH_OF_BIRTH>
        <COMPANY_NAME>TCS</COMPANY_NAME>
        <BAND>B</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Luis</FIRST_NAME>
        <LAST_NAME>Phillip</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>DEC</MONTH_OF_BIRTH>
        <COMPANY_NAME>TCS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Nick</FIRST_NAME>
        <LAST_NAME>Tatar</LAST_NAME>
        <COUNTRY>USA</COUNTRY>
        <MONTH_OF_BIRTH>JAN</MONTH_OF_BIRTH>
        <COMPANY_NAME>CTS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Zuza</FIRST_NAME>
        <LAST_NAME>Bark</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>JUNE</MONTH_OF_BIRTH>
        <COMPANY_NAME>TCS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Jane</FIRST_NAME>
        <LAST_NAME>ellis</LAST_NAME>
        <COUNTRY>ENGLAND</COUNTRY>
        <MONTH_OF_BIRTH>JUNE</MONTH_OF_BIRTH>
        <COMPANY_NAME>IBM</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
        <EMP>
        <FIRST_NAME>SANJAY</FIRST_NAME>
        <LAST_NAME>BAWARI</LAST_NAME>
        <COUNTRY>ENGLAND</COUNTRY>
        <MONTH_OF_BIRTH>JUNE</MONTH_OF_BIRTH>
        <COMPANY_NAME>IBM</COMPANY_NAME>
        <BAND>B</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Akhi</FIRST_NAME>
        <LAST_NAME>Mahe</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>SEPT</MONTH_OF_BIRTH>
        <COMPANY_NAME>IBM</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Vishh</FIRST_NAME>
        <LAST_NAME>Bombard</LAST_NAME>
        <COUNTRY>GERMANY</COUNTRY>
        <MONTH_OF_BIRTH>OCT</MONTH_OF_BIRTH>
        <COMPANY_NAME>IBM</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Sharon</FIRST_NAME>
        <LAST_NAME>Watson</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>JULY</MONTH_OF_BIRTH>
        <COMPANY_NAME>CTS</COMPANY_NAME>
        <BAND>B</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Poo</FIRST_NAME>
        <LAST_NAME>Smith</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>SEPT</MONTH_OF_BIRTH>
        <COMPANY_NAME>CTS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>John</FIRST_NAME>
        <LAST_NAME>Smith</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>DEC</MONTH_OF_BIRTH>
        <COMPANY_NAME>TCS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>

</EMPDTLS>  






<Desired Output>
<?xml version='1.0' encoding='utf-8'?>
<EMPDTLS>
<EmpGrp>
    <EMP>
        <FIRST_NAME>John</FIRST_NAME>
        <LAST_NAME>Mathew</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>DEC</MONTH_OF_BIRTH>
        <COMPANY_NAME>TCS</COMPANY_NAME>
        <BAND>B</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>Luis</FIRST_NAME>
        <LAST_NAME>Phillip</LAST_NAME>
        <COUNTRY>INDIA</COUNTRY>
        <MONTH_OF_BIRTH>DEC</MONTH_OF_BIRTH>
        <COMPANY_NAME>TCS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
</EmpGrp>
<EmpGrp>
    <EMP>
        <FIRST_NAME>Nick</FIRST_NAME>
        <LAST_NAME>Tatar</LAST_NAME>
        <COUNTRY>USA</COUNTRY>
        <MONTH_OF_BIRTH>JAN</MONTH_OF_BIRTH>
        <COMPANY_NAME>CTS</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
</EmpGrp>
<EmpGrp>
    <EMP>
        <FIRST_NAME>Jane</FIRST_NAME>
        <LAST_NAME>ellis</LAST_NAME>
        <COUNTRY>ENGLAND</COUNTRY>
        <MONTH_OF_BIRTH>JUNE</MONTH_OF_BIRTH>
        <COMPANY_NAME>IBM</COMPANY_NAME>
        <BAND>A</BAND>
    </EMP>
    <EMP>
        <FIRST_NAME>SANJAY</FIRST_NAME>
        <LAST_NAME>BAWARI</LAST_NAME>
        <COUNTRY>ENGLAND</COUNTRY>
        <MONTH_OF_BIRTH>JUNE</MONTH_OF_BIRTH>
        <COMPANY_NAME>IBM</COMPANY_NAME>
        <BAND>B</BAND>
    </EMP>
</EmpGrp>

**

1 Ответ

0 голосов
/ 23 января 2019

Составные ключи группировки немного проще в XSLT 3 (последняя версия XSLT с лета 2017 года и поддерживается Saxon 9.8 или 9.9, а также Altova 2017 или 2018 или 2019), так как там вы можете использовать, например, for-each-group composite="yes" group-by="COUNTRY, COMPANY_NAME, MONTH_OF_BIRTH":

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:output indent="yes"/>

  <xsl:template match="EMPDTLS">
      <xsl:copy>
          <xsl:for-each-group select="EMP" composite="yes" group-by="COUNTRY, COMPANY_NAME, MONTH_OF_BIRTH">
              <EmpGrp>
                  <xsl:copy-of select="current-group()"/>
              </EmpGrp>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Вы можете проверить это онлайн на https://xsltfiddle.liberty -development.net / jyRYYhU / 1 .

Что касается XSLT 2, см. https://cranesoftwrights.github.io/books/ptux/index.htm для тщательной обработки XSLT, если у вас нет другого доступного учебника, или также смотрите спецификацию https://www.w3.org/TR/xslt20/#grouping-examples, в которой имеется «Составной ключ группировки»."как второй пример, вложив for-each-group.Другой метод в XSLT 2 - объединить различные элементы, составляющие ключ группировки, в строку, например, group-by="string-join((COUNTRY, COMPANY_NAME, MONTH_OF_BIRTH), '|')", убедившись, что символ разделителя (например, |) не содержится ни в одном значении элемента ключа.

...