Группировать по xslt 2.0 - PullRequest
       9

Группировать по xslt 2.0

0 голосов
/ 08 ноября 2018

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

Я был бы очень признателен за вводимые данные.

Вот мой входной XML:

<root>
    <worker>
        <change1>
            <date_of_change>date1</date_of_change>
            <field1>field1</field1>
            <field2>field2</field2>
            <field4>field4</field4>
        </change1>
        <change2>
            <date_of_change>date1</date_of_change>
            <field1>field1</field1>
            <field2>field2</field2>
            <field3>field3</field3>
        </change2>
        <change3>
            <date_of_change>date2</date_of_change>          
            <field2>field2</field2>
            <field3>field3</field3>
            <field4>field4</field4>
        </change3>
    </worker>
    <worker>
        <change1>
            <date_of_change>date1</date_of_change>
            <field1>field1</field1>
            <field2>field2</field2>
            <field3>field3</field3>
        </change1>
        <change2>
            <date_of_change>date2</date_of_change>
            <field1>field1</field1>         
            <field3>field3</field3>
        </change2>
        <change3>
            <date_of_change>date2</date_of_change>          
            <field3>field3</field3>
            <field4>field4</field4>
        </change3>
    </worker>
</root>

Вот ожидаемый выходной XML:

<root>
    <worker>
        <row1>
            <date_of_change>date1</date_of_change>
            <field1>field1</field1>
            <field2>field2</field2>
            <field3>field3</field3>
            <field4>field4</field4>
        </row1>
        <row2>
            <date_of_change>date2</date_of_change>          
            <field2>field2</field2>
            <field3>field3</field3>
            <field4>field4</field4>
        </row2>
    </worker>
    <worker>
        <row1>
            <date_of_change>date1</date_of_change>
            <field1>field1</field1>
            <field2>field2</field2>
            <field3>field3</field3>
        </row1>
        <row2>
            <date_of_change>date2</date_of_change>
            <field1>field1</field1>         
            <field3>field3</field3>
            <field4>field4</field4>
        </row2>     
    </worker>
</root>

Требуется, чтобы у работника было несколько изменений, произошедших в одной и той же дате date_of_change, тогда его необходимо сгруппировать в одну строку со всеми доступными полями из этих множественных изменений.

1 Ответ

0 голосов
/ 08 ноября 2018

Если вы еще не нашли решение самостоятельно, попробуйте следующую таблицу стилей XSLT-2.0. Поначалу решение было более сложным, чем предполагалось, поэтому я решил его реализовать. Это может быть не оптимально, но вы можете использовать его в качестве исходной позиции для собственных нужд. Он использует две xsl:for-each-group инструкции для упорядочения элементов и одну xsl:element для построения row имени элемента.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>    

  <xsl:template match="/root">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="worker">
    <xsl:copy>
      <xsl:for-each-group select="*[starts-with(local-name(),'change')]/*[starts-with(local-name(),'field')]" group-by="../date_of_change">
        <xsl:element name="{concat('row',position())}">
            <xsl:copy-of select="../date_of_change" />
            <xsl:for-each-group select="current-group()" group-by=".">
                <xsl:sort select="local-name()" />
                <xsl:copy-of select="." />
            </xsl:for-each-group>
        </xsl:element>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template> 

</xsl:stylesheet>

Его вывод:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <worker>
      <row1>
         <date_of_change>date1</date_of_change>
         <field1>field1</field1>
         <field2>field2</field2>
         <field3>field3</field3>
         <field4>field4</field4>
      </row1>
      <row2>
         <date_of_change>date2</date_of_change>
         <field2>field2</field2>
         <field3>field3</field3>
         <field4>field4</field4>
      </row2>
   </worker>
   <worker>
      <row1>
         <date_of_change>date1</date_of_change>
         <field1>field1</field1>
         <field2>field2</field2>
         <field3>field3</field3>
      </row1>
      <row2>
         <date_of_change>date2</date_of_change>
         <field1>field1</field1>
         <field3>field3</field3>
         <field4>field4</field4>
      </row2>
   </worker>
</root>
...