2016-03-14 5 views
0

Уверен, что это действительно легко, но ударить головой в данный момент. Я пытаюсь реализовать Group By в XSL с помощью метода Muenchian. Однако примеры, которые я прочитал, выглядят на двух узлах, мне это нужно на нескольких. Так что я пытался о внесении изменений в коде, но терпит неудачу в данный момент ... Моего XML является: -XSL для группировки XML

<?xml version="1.0" encoding="UTF-8" ?> 
<KBBCONNECTJOB> 
<OGOODS> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>Base End Support Panel Natural Oak</NAME> 
    <POS>1</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM Highline Integrated Dishwasher Fascia</NAME> 
    <POS>2</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM Highline Base Unit</NAME> 
    <POS>3</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM Highline Integrated Fridge/Freeezer Fascia</NAME> 
    <POS>4</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM 3 Drawer Pan Unit</NAME> 
    <POS>5</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM Highline Base Unit</NAME> 
    <POS>6</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>500MM Highline Base Unit</NAME> 
    <POS>7</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM Fridge/Freezer Housing Unit - Type 6</NAME> 
    <POS>8</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>600MM Double Oven Housing Unit - Type 2</NAME> 
    <POS>9</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>2650 Plinth Natural Oak Inc Seal Strip</NAME> 
    <POS>10</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>Worktop 600 Single P/F 4000 Black Brazil</NAME> 
    <POS>11</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>30MM Bullnose Sq Cornice 3600MM Natural</NAME> 
    <POS>12</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>10Mtr Roll Edging Tape Natural Oak</NAME> 
    <POS>13</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <CODE>ET03</CODE> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>Schock Stnd Inset 1.5 Bowl Drainer Sink</NAME> 
    <POS>14</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>90</SUPP> 
    <WHAT>1</WHAT> 
    <NAME>Schock Universal Plumbing Kit 1.5 Bowl</NAME> 
    <POS>15</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>130</SUPP> 
    <WHAT>3</WHAT> 
    <NAME>CDA - Integrated Combination Fridge/freezer 70/30 A+ Rated</NAME> 
    <POS>1</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>130</SUPP> 
    <WHAT>3</WHAT> 
    <NAME>CDA - Integrated Washing Machine</NAME> 
    <POS>2</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>130</SUPP> 
    <WHAT>3</WHAT> 
    <NAME>CDA - Double Oven Bi Aa Rated Main Oven Touch Control Clock S/steel</NAME> 
    <POS>3</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>130</SUPP> 
    <WHAT>3</WHAT> 
    <NAME>CDA - Five Burner Front Control 70cm Gas Hob Wok Ffd Stainless Steel</NAME> 
    <POS>4</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>130</SUPP> 
    <WHAT>3</WHAT> 
    <NAME>CDA - 70cm Chimney Extractor Hood - Stainless Steel</NAME> 
    <POS>5</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
    <Row> 
    <SUPP>130</SUPP> 
    <WHAT>3</WHAT> 
    <NAME>CDA - Fully Integrated Dishwasher 60 Cm A++Aa Rated</NAME> 
    <POS>6</POS> 
    <ORDERNO>2204</ORDERNO> 
    </Row> 
</OGOODS> 
</KBBCONNECTJOB> 

мне это нужно в формате

order 
    what 
     supp 
      name what pos ordercat 

<?xml version="1.0" encoding="utf-16"?> 
<order display="2204"> 
    <productgroup display="Kitchen Units"> 
    <supplier display="supplier 1 from lookup"> 
     <product display="Base End Support Panel Natural Oak" what="1"pos= "1" ordercat="D" /> 
     <product display="600MM Highline Integrated Dishwasher Fascia" what="1"pos= "2" ordercat="D" /> 
     <product display="600MM Highline Base Unit" what="1"pos= "3" ordercat="D" /> 
     <product display="600MM Highline Integrated Fridge/Freeezer Fascia" what="1"pos= "4" ordercat="D" /> 
     <product display="600MM 3 Drawer Pan Unit" what="1"pos= "5" ordercat="D" /> 
     <product display="600MM Highline Base Unit" what="1"pos= "6" ordercat="D" /> 
     <product display="500MM Highline Base Unit" what="1"pos= "7" ordercat="D" /> 
     <product display="600MM Fridge/Freezer Housing Unit - Type 6" what="1"pos= "8" ordercat="D" /> 
     <product display="600MM Double Oven Housing Unit - Type 2" what="1"pos= "9" ordercat="D" /> 
     <product display="2650 Plinth Natural Oak Inc Seal Strip" what="1"pos= "10" ordercat="D" /> 
     <product display="Worktop 600 Single P/F 4000 Black Brazil" what="1"pos= "11" ordercat="D" /> 
     <product display="30MM Bullnose Sq Cornice 3600MM Natural" what="1"pos= "12" ordercat="D" /> 
     <product display="10Mtr Roll Edging Tape Natural Oak" what="1"pos= "13" ordercat="D" /> 
     <product display="Schock Stnd Inset 1.5 Bowl Drainer Sink" what="1"pos= "14" ordercat="D" /> 
     <product display="Schock Universal Plumbing Kit 1.5 Bowl" what="1"pos= "15" ordercat="D" /> 
    </supplier> 
    </productgroup> 
    <productgroup display="Appliances"> 
    <supplier display="Supplier 2 from lookup"> 
     <product display="CDA - Integrated Combination Fridge/freezer 70/30 A+ Rated" what="3"pos= "1" ordercat="D" /> 
     <product display="CDA - Integrated Washing Machine" what="3"pos= "2" ordercat="D" /> 
     <product display="CDA - Double Oven Bi Aa Rated Main Oven Touch Control Clock S/steel" what="3"pos= "3" ordercat="D" /> 
     <product display="CDA - Five Burner Front Control 70cm Gas Hob Wok Ffd Stainless Steel" what="3"pos= "4" ordercat="D" /> 
     <product display="CDA - 70cm Chimney Extractor Hood - Stainless Steel" what="3"pos= "5" ordercat="D" /> 
     <product display="CDA - Fully Integrated Dishwasher 60 Cm A++Aa Rated" what="3"pos= "6" ordercat="D" /> 
    </supplier> 
    </productgroup> 
</order> 

Номер заказа всегда будет одинаковым, но другие части могут быть одинаковыми, или все из одной и той же SUPP, или каждая строка может отличаться.

Мой текущий XSL, который частично работает это: -

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output encoding="iso-8859-1"/> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="no"/> 

    <xsl:key name="level0" match="/KBBCONNECTJOB/OGOODS/Row" use="ORDERNO" /> <!-- group --> 
    <xsl:key name="level1" match="/KBBCONNECTJOB/OGOODS/Row" use="concat(ORDERNO, '|', WHAT)" /> <!-- group by WHAT --> 
    <xsl:key name="level2" match="/KBBCONNECTJOB/OGOODS/Row" use="concat(ORDERNO, '|', WHAT, '|', SUPP)" /> <!-- group by WHAT and SUPP --> 
    <xsl:key name="level3" match="/KBBCONNECTJOB/OGOODS/Row" use="concat(ORDERNO, '|', WHAT, '|', SUPP, '|', POS)" /> <!-- group by WHAT and SUPP and POS to get the lines --> 
    <xsl:key name="level4" match="/KBBCONNECTJOB/OGOODS/Row" use="concat(ORDERNO, '|', WHAT, '|', SUPP, '|', POS, '|', NAME)" /> 


    <xsl:template match="/KBBCONNECTJOB"> 
     <xsl:for-each select="/KBBCONNECTJOB/OGOODS/Row[count(. | key('level0', ORDERNO)[1]) = 1]"> 
      <order> 
       <xsl:attribute name="display"> 
        <xsl:value-of select="ORDERNO"/> 
       </xsl:attribute> 

       <xsl:for-each select="/KBBCONNECTJOB/OGOODS/Row[count(. | key('level1', concat(ORDERNO, '|', WHAT))[1]) = 1]"> <!-- get the WHAT groups --> 
        <xsl:sort select="WHAT" />      

        <productgroup> 
         <xsl:for-each select="key('level3', concat(ORDERNO, '|', WHAT, '|', SUPP, '|', POS))"> 
          <xsl:variable name="lookup_what" select="WHAT"/> 
          <xsl:attribute name="display"> 
       <!--    <xsl:value-of select="document('./Lookups/lookup_specialsmap.xml')/data/kbbproducttab[@what=$lookup_what]/type"/> --> 
          </xsl:attribute> 

          <supplier> 
           <xsl:for-each select="key('level4', concat(ORDERNO, '|', WHAT, '|', SUPP, '|', POS, '|', NAME))"> 
            <xsl:variable name="lookup_supp" select="SUPP"/> 
            <xsl:attribute name="display"> 
    <!--         <xsl:value-of select="document('./Lookups/lookup_suppliers.xml')/data/kbbsupplier[@code=$lookup_supp]/k8suppliercode"/> --> 
            </xsl:attribute> 

            <product> 
             <xsl:for-each select="key('level4', concat(ORDERNO, '|', WHAT, '|', SUPP, '|', POS, '|', NAME))"> 

              <xsl:attribute name="display"> 
               <xsl:value-of select="NAME"/> 
              </xsl:attribute> 
              <xsl:attribute name="what"> 
               <xsl:value-of select="WHAT"/> 
              </xsl:attribute> 
              <xsl:attribute name="pos"> 
               <xsl:value-of select="POS"/> 
              </xsl:attribute> 
              <xsl:attribute name="ordercat"> 
               <xsl:text>D</xsl:text> 
              </xsl:attribute> 
             </xsl:for-each> 
            </product> 
           </xsl:for-each> 
          </supplier> 
         </xsl:for-each> 
        </productgroup> 
       </xsl:for-each> 
      </order>  
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

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

Я рад изменить методы, если есть более простой ... Заранее спасибо.

+0

Было бы полезно получить полное представление XML о желаемом выходе. – zx485

+0

Добавили желаемый результат на вопрос, спасибо. –

ответ

0

Замки, подобные вам, совсем близко.
Ваша первая группа для каждой группы строк по ORDERNO. Ваш второй для каждого из них должен рассматривать только строки, которые уже выбраны по умолчанию для каждого. Для этого введите текущий ORDERNO в переменную. и используйте ключ levle0 во втором для каждого.

<xsl:variable name="onr" select="ORDERNO" /> 
<xsl:for-each select="key('level0', $onr)[count(. | key('level1', concat($onr, '|', WHAT))[1]) = 1]"> <!-- get the WHAT groups --> 
       <xsl:sort select="WHAT" />      

Следуйте этой концепции для более глубоких петель.
Внимание: Это решение для группировки Muencian 1.0. Но ваша таблица стилей говорит 2.0. Поэтому есть и другие возможности.

+0

Спасибо за ответ и помощь. Попробуй это и посмотри, как я нахожусь. (Вне офиса в данный момент). –

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