Уверен, что это действительно легко, но ударить головой в данный момент. Я пытаюсь реализовать 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>
Но это не дает мне несколько строк для части дисплея продукта. Я отредактировал часть, которая смотрит, чтобы получить информацию из другого файла, это работает на производстве.
Я рад изменить методы, если есть более простой ... Заранее спасибо.
Было бы полезно получить полное представление XML о желаемом выходе. – zx485
Добавили желаемый результат на вопрос, спасибо. –