2015-08-11 4 views
1

Team,Группировка сгруппированных данных и перебор каждых сгруппированных данных в XSLT

Нужна ваша помощь в группировке данных в XSLT.

Требования:

  1. данные, основанные на report_number
  2. Group шаг 1 выходных данных на основе program_name
  3. перебирать каждый из сгруппированных данных и создания XML, как в ожидаемом Group выход

Я могу выполнить первые два шага. Я не в состоянии прийти к логике для шага 3.

Вход:

<?xml version="1.0" ?> 
<MTR> 
    <program> 
     <program_row> 
      <report_number>1</report_number> 
      <program_id>PMP</program_id> 
      <program_name>Portfolio Manager Program</program_name> 
      <ssn_tin>1111111111</ssn_tin> 
      <acct_number>1111111111</acct_number> 
      <total_value/> 
     </program_row> 
     <program_row> 
      <report_number>1</report_number> 
      <program_id>PMP</program_id> 
      <program_name>Portfolio Manager Program</program_name> 
      <ssn_tin>2222222222</ssn_tin> 
      <acct_number>2222222222</acct_number> 
      <total_value/> 
     </program_row> 
     <program_row> 
      <report_number>1</report_number> 
      <program_id>PMP</program_id> 
      <program_name>Customer Manager Program</program_name> 
      <ssn_tin>3333333333</ssn_tin> 
      <acct_number>3333333333</acct_number> 
      <total_value/> 
     </program_row> 
     <program_row> 
      <report_number>1</report_number> 
      <program_id>PMP</program_id> 
      <program_name>Portfolio Manager Program</program_name> 
      <ssn_tin>4444444444</ssn_tin> 
      <acct_number>4444444444</acct_number> 
      <total_value/> 
     </program_row> 
     <program_row> 
      <report_number>1</report_number> 
      <program_id>PMP</program_id> 
      <program_name>Relationship Manager Program</program_name> 
      <ssn_tin>55555555555</ssn_tin> 
      <acct_number>55555555555</acct_number> 
      <total_value/> 
     </program_row> 
     <program_row> 
      <report_number>2</report_number> 
      <program_id>PMP</program_id> 
      <program_name>Ringo Manager Program</program_name> 
      <ssn_tin>6666666666</ssn_tin> 
      <acct_number>6666666666</acct_number> 
      <total_value/> 
     </program_row> 
    </program> 
</MTR> 

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
<MTR> 
<reports> 
    <report> 
     <report_number>1</report_number> 
     <headers> 
      <header> 
       <prog_name>Portfolio Manager Program</prog_name> 
       <acct_no>1111111111,2222222222,55555555555</acct_no> 
      </header> 
      <header> 
       <prog_name>Customer Manager Program</prog_name> 
       <acct_no>3333333333</acct_no> 
      </header> 
      <header> 
       <prog_name>Relationship Manager Program</prog_name> 
       <acct_no>4444444444</acct_no> 
      </header> 
     </headers> 
    </report> 
    <report> 
     <report_number>2</report_number> 
     <headers> 
      <header> 
       <prog_name>Ringo Manager Program</prog_name> 
       <acct_no>6666666666</acct_no> 
      </header>   
     </headers> 
    </report> 
</reports> 
</MTR> 

Неполное XSLT:

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

    <xsl:key name="kGroup" match="program_row" use="report_number"/> 
    <xsl:key name="progNameGroup" match="program_row" use="program_name"/> 

    <xsl:template match="MTR"> 
     <MTR> 

      <xsl:copy-of select="emb_disc" /> 

      <xsl:copy-of select="emb_foot_note" /> 

      <reports> 
      <xsl:for-each select="program/program_row[generate-id(.) = generate-id(key('kGroup', report_number)[1])]"> 
       <report> 

        <headers> 
         <xsl:for-each select="key('kGroup', report_number)[generate-id() = generate-id(key('progNameGroup', program_name)[1])]"> 
          <xsl:for-each select="key('progNameGroup', program_name)"> 
           <header> 
            <prog_name></prog_name> 
            <acct_no></acct_no> 
           </header>          
          </xsl:for-each> 
         </xsl:for-each>  
        </headers> 
       </report>  
      </xsl:for-each> 
      </reports> 

     </MTR> 
    </xsl:template> 

</xsl:stylesheet>  

ответ

0

Вот коррекции, вам необходимо убедиться, что ключ второго уровня включает значение ключа первого уровня и то вам нужно вывести элементы:

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

    <xsl:key name="kGroup" match="program_row" use="report_number"/> 
    <xsl:key name="progNameGroup" match="program_row" use="concat(report_number, '|', program_name)"/> 

    <xsl:template match="MTR"> 
     <MTR> 

      <xsl:copy-of select="emb_disc" /> 

      <xsl:copy-of select="emb_foot_note" /> 

      <reports> 
      <xsl:for-each select="program/program_row[generate-id(.) = generate-id(key('kGroup', report_number)[1])]"> 
       <report> 
        <xsl:copy-of select="report_number"/> 
        <headers> 
         <xsl:for-each select="key('kGroup', report_number)[generate-id() = generate-id(key('progNameGroup', concat(report_number, '|', program_name))[1])]"> 
          <header> 
           <prog_name><xsl:value-of select="program_name"/></prog_name> 
           <acct_no> 
            <xsl:for-each select="key('progNameGroup', concat(report_number, '|', program_name))/acct_number"> 
             <xsl:if test="position() > 1">,</xsl:if> 
             <xsl:value-of select="."/> 
            </xsl:for-each> 
           </acct_no> 
          </header>                 
         </xsl:for-each>  
        </headers> 
       </report>  
      </xsl:for-each> 
      </reports> 

     </MTR> 
    </xsl:template> 

</xsl:stylesheet> 

Интернет образца в http://xsltransform.net/6qVRKx9.

+0

Большое спасибо. Извините за задержку в принятии ответа. Я хотел бы интегрировать эту логику и полностью проверить, прежде чем принимать. Оно работало завораживающе. – rashpencilbox

Смежные вопросы