2016-02-26 2 views
1

У меня есть входящий XML-файл, и мне нужно сделать split.XSLT1.0 Group/Merge/Split

Входящее XML-файл

<BOM> 
<Header> 
    <row> 
     <DocDate>20160101</DocDate> 
    </row> 
</Header> 
<Document_Lines> 
    <row> 
     <Vendor>V1</Vendor> 
     <BaseEntry>11003</BaseEntry> 
     <BaseLine>0</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00001</ItemCode> 
     <Quantity>1000</Quantity> 
     <Pieces>5.00000</Pieces> 
    </row> 
    <row> 
     <Vendor>V1</Vendor> 
     <BaseEntry>11003</BaseEntry> 
     <BaseLine>1</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00002</ItemCode> 
     <Quantity>100</Quantity> 
     <Pieces>1.00000</Pieces> 
    </row> 
    <row> 
     <Vendor>V2</Vendor> 
     <BaseEntry>11004</BaseEntry> 
     <BaseLine>0</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00008</ItemCode> 
     <Quantity>200</Quantity> 
     <Pieces>1.00000</Pieces> 
    </row> 
    <row> 
     <Vendor>V2</Vendor> 
     <BaseEntry>11004</BaseEntry> 
     <BaseLine>1</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00009</ItemCode> 
     <Quantity>1000</Quantity> 
     <Pieces>2.00000</Pieces> 
    </row> 
</Document_Lines> 
<BatchNumbers> 
    <row> 
     <BatchNumber>B0-1</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-2</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-3</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-4</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-5</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B1-1</BatchNumber> 
     <Quantity>100</Quantity> 
     <BaseLineNumber>1</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B2-1</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>2</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B3-1</BatchNumber> 
     <Quantity>500</Quantity> 
     <BaseLineNumber>3</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B3-2</BatchNumber> 
     <Quantity>500</Quantity> 
     <BaseLineNumber>3</BaseLineNumber> 
    </row> 
</BatchNumbers> 

мне нужно разделить это на два сегмента, как это ниже.

Примечание:

Пожалуйста, смотрите на "Кусочки" близко, что указывает на связь между "BaseLineNumber" и "Document_Lines/ряд". В разделенном сегменте BaseLineNumber она должна быть всегда начинается с 0. можно использовать для группировки «BaseEntry», поэтому, я пытался использовать ключевой матч, но в конце концов не удалось :(

(XSL: ключ Name = "группы" матч = "/ BOM/Document_Lines/строка" использование = "BaseEntry")

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

<BOM> 
<Header> 
    <row> 
     <Vendor>V1</Vendor> 
     <DocDate>20160101</DocDate> 
    </row> 
</Header> 
<Document_Lines> 
    <row> 
     <Vendor>V1</Vendor> 
     <BaseEntry>11003</BaseEntry> 
     <BaseLine>0</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00001</ItemCode> 
     <Quantity>1000</Quantity> 
     <Pieces>5.00000</Pieces> 
    </row> 
    <row> 
     <Vendor>V1</Vendor> 
     <BaseEntry>11003</BaseEntry> 
     <BaseLine>1</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00002</ItemCode> 
     <Quantity>100</Quantity> 
     <Pieces>1.00000</Pieces> 
    </row> 
</Document_Lines> 
<BatchNumbers> 
    <row> 
     <BatchNumber>B0-1</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-2</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-3</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-4</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B0-5</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B1-1</BatchNumber> 
     <Quantity>100</Quantity> 
     <BaseLineNumber>1</BaseLineNumber> 
    </row> 
</BatchNumbers> 

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

<BOM> 
<Header> 
    <row> 
     <Vendor>V2</Vendor> 
     <DocDate>20160101</DocDate> 
    </row> 
</Header> 
<Document_Lines> 
    <row> 
     <Vendor>V2</Vendor> 
     <BaseEntry>11004</BaseEntry> 
     <BaseLine>0</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00008</ItemCode> 
     <Quantity>200</Quantity> 
     <Pieces>1.00000</Pieces> 
    </row> 
    <row> 
     <Vendor>V2</Vendor> 
     <BaseEntry>11004</BaseEntry> 
     <BaseLine>1</BaseLine> 
     <BaseType>22</BaseType> 
     <ItemCode>ITM00009</ItemCode> 
     <Quantity>1000</Quantity> 
     <Pieces>2.00000</Pieces> 
    </row> 
</Document_Lines> 
<BatchNumbers> 
    <row> 
     <BatchNumber>B2-1</BatchNumber> 
     <Quantity>200</Quantity> 
     <BaseLineNumber>0</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B3-1</BatchNumber> 
     <Quantity>500</Quantity> 
     <BaseLineNumber>1</BaseLineNumber> 
    </row> 
    <row> 
     <BatchNumber>B3-2</BatchNumber> 
     <Quantity>500</Quantity> 
     <BaseLineNumber>1</BaseLineNumber> 
    </row> 
</BatchNumbers> 

Для того, чтобы достичь этого, я сделал два шага. см. ниже вывод, Шаг 2 - это то, что я хочу, но BaseLineNumber неверен. Я знаю, что это немного сложно понять. и я новичок в этом веб-сайте, я не знаю, как напрямую поместить мой код внутри комментариев, а не редактировать.

Шаг1:

<BOM> 
<CALL id="11003"> 
    <Document_Lines> 
     <row> 
      <BaseEntry>11003</BaseEntry> 
      <BaseLine>0</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>ITM08314</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>3535</Quantity> 
      <U_SSAB_LMA_NPCS>5.00000</U_SSAB_LMA_NPCS> 
     </row> 
    </Document_Lines> 
    <BatchNumbers> 
     <Row> 
      <BatchNumber>B0-1</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-2</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-3</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-4</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-5</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
    </BatchNumbers> 
</CALL> 
<CALL id="11003"> 
    <Document_Lines> 
     <row> 
      <BaseEntry>11003</BaseEntry> 
      <BaseLine>1</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>ITM07951</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>566</Quantity> 
      <U_SSAB_LMA_NPCS>1.00000</U_SSAB_LMA_NPCS> 
     </row> 
    </Document_Lines> 
    <BatchNumbers> 
     <Row> 
      <BatchNumber>B1-1</BatchNumber> 
      <Quantity>566</Quantity> 
      <BaseLineNumber>1</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>6000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>8.000000</U_SSAB_BA_THCKNS> 
     </Row> 
    </BatchNumbers> 
</CALL> 
<CALL id="11004"> 
    <Document_Lines> 
     <row> 
      <BaseEntry>11004</BaseEntry> 
      <BaseLine>0</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>6327</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>1884</Quantity> 
      <U_SSAB_LMA_NPCS>1.00000</U_SSAB_LMA_NPCS> 
     </row> 
    </Document_Lines> 
    <BatchNumbers> 
     <Row> 
      <BatchNumber>B2-1</BatchNumber> 
      <Quantity>1884</Quantity> 
      <BaseLineNumber>2</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>9600.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>2500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>10.000000</U_SSAB_BA_THCKNS> 
     </Row> 
    </BatchNumbers> 
</CALL> 
<CALL id="11004"> 
    <Document_Lines> 
     <row> 
      <BaseEntry>11004</BaseEntry> 
      <BaseLine>1</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>2507</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>4522</Quantity> 
      <U_SSAB_LMA_NPCS>2.00000</U_SSAB_LMA_NPCS> 
     </row> 
    </Document_Lines> 
    <BatchNumbers> 
     <Row> 
      <BatchNumber>B3-1</BatchNumber> 
      <Quantity>2261</Quantity> 
      <BaseLineNumber>3</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>9600.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>2500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>12.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B3-2</BatchNumber> 
      <Quantity>2261</Quantity> 
      <BaseLineNumber>3</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>9600.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>2500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>12.000000</U_SSAB_BA_THCKNS> 
     </Row> 
    </BatchNumbers> 
</CALL> 

Step2

<BOM> 
<CALL id="11003"> 
    <Document_Lines> 
     <row> 
      <BaseEntry>11003</BaseEntry> 
      <BaseLine>0</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>ITM08314</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>3535</Quantity> 
      <U_SSAB_LMA_NPCS>5.00000</U_SSAB_LMA_NPCS> 
     </row> 
     <row> 
      <BaseEntry>11003</BaseEntry> 
      <BaseLine>1</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>ITM07951</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>566</Quantity> 
      <U_SSAB_LMA_NPCS>1.00000</U_SSAB_LMA_NPCS> 
     </row> 
    </Document_Lines> 
    <BatchNumbers> 
     <Row> 
      <BatchNumber>B0-1</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-2</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-3</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-4</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B0-5</BatchNumber> 
      <Quantity>707</Quantity> 
      <BaseLineNumber>0</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>10000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>6.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B1-1</BatchNumber> 
      <Quantity>566</Quantity> 
      <BaseLineNumber>1</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>6000.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>1500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>8.000000</U_SSAB_BA_THCKNS> 
     </Row> 
    </BatchNumbers> 
</CALL> 
<CALL id="11004"> 
    <Document_Lines> 
     <row> 
      <BaseEntry>11004</BaseEntry> 
      <BaseLine>0</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>6327</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>1884</Quantity> 
      <U_SSAB_LMA_NPCS>1.00000</U_SSAB_LMA_NPCS> 
     </row> 
     <row> 
      <BaseEntry>11004</BaseEntry> 
      <BaseLine>1</BaseLine> 
      <BaseType>22</BaseType> 
      <ItemCode>2507</ItemCode> 
      <ShipDate>20160224</ShipDate> 
      <Quantity>4522</Quantity> 
      <U_SSAB_LMA_NPCS>2.00000</U_SSAB_LMA_NPCS> 
     </row> 
    </Document_Lines> 
    <BatchNumbers> 
     <Row> 
      <BatchNumber>B2-1</BatchNumber> 
      <Quantity>1884</Quantity> 
      <BaseLineNumber>2</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>9600.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>2500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>10.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B3-1</BatchNumber> 
      <Quantity>2261</Quantity> 
      <BaseLineNumber>3</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>9600.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>2500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>12.000000</U_SSAB_BA_THCKNS> 
     </Row> 
     <Row> 
      <BatchNumber>B3-2</BatchNumber> 
      <Quantity>2261</Quantity> 
      <BaseLineNumber>3</BaseLineNumber> 
      <U_SSAB_BA_LENGTH>9600.000000</U_SSAB_BA_LENGTH> 
      <U_SSAB_BA_WIDTH>2500.000000</U_SSAB_BA_WIDTH> 
      <U_SSAB_BA_THCKNS>12.000000</U_SSAB_BA_THCKNS> 
     </Row> 
    </BatchNumbers> 
</CALL> 

Добавлено XSLT соответствует двум Steps выше

XSLT для Step1

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/BOM/BO"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 
<xsl:template match="/BOM/BO/Document_Lines"> 
<xsl:param name="Pos" select="position()"/> 
    <xsl:for-each select="row"> 
     <xsl:variable name="vPos1" select="position()-1"/> 
     <CALL id="{BaseEntry}"> 
      <Document_Lines> 
       <row> 
        <BaseEntry> 
         <xsl:value-of select="BaseEntry"/> 
        </BaseEntry> 
        <BaseLine> 
         <xsl:value-of select="BaseLine"/> 
        </BaseLine> 
        <BaseType> 
         <xsl:value-of select="BaseType"/> 
        </BaseType> 
        <ItemCode> 
         <xsl:value-of select="ItemCode"/> 
        </ItemCode> 
        <ShipDate> 
         <xsl:value-of select="ShipDate"/> 
        </ShipDate> 
        <Quantity> 
         <xsl:value-of select="Quantity"/> 
        </Quantity> 
        <U_SSAB_LMA_NPCS> 
         <xsl:value-of select="U_SSAB_LMA_NPCS"/> 
        </U_SSAB_LMA_NPCS> 
       </row> 
      </Document_Lines> 
      <BatchNumbers> 
       <xsl:for-each select="../../BatchNumbers/row[./BaseLineNumber=$vPos1]"> 
        <Row> 
         <BaseLineNumber><xsl:value-of select="position()-1"/></BaseLineNumber> 
        </Row> 
       </xsl:for-each> 
      </BatchNumbers> 
     </CALL> 
    </xsl:for-each> 
</xsl:template> 

XSLT для Step2

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:key name="groups" match="/BOM/CALL" use="@id"/> 
<xsl:template match="/BOM"> 
    <xsl:apply-templates select="CALL[generate-id() = generate-id(key('groups', @id))]"/> 
</xsl:template> 
<xsl:template match="/BOM/CALL"> 
    <CALL id="{@id}"> 
     <Document_Lines> 
      <xsl:for-each select="key('groups', @id)"> 
       <xsl:copy-of select="Document_Lines/*"/> 
      </xsl:for-each> 
     </Document_Lines> 
     <BatchNumbers> 
      <xsl:for-each select="key('groups', @id)"> 
       <xsl:copy-of select="BatchNumbers/*"/> 
      </xsl:for-each> 
     </BatchNumbers> 
    </CALL> 
</xsl:template> 

в конце концов, как вы можете себе Здесь я сделал это в два шага, на самом деле я хочу сделать это в одном .xsl и должен исправить BaseLineNumber.

Click here to see a full picture which visualized this question

+0

** 1. ** Пожалуйста, разместите вашу попытку спасти нас. ** 2. ** В XSLT 1.0 нет «split», так как вы собираетесь получать два выхода с одного входа? Используете ли вы процессор, который поддерживает это расширение (например, 'exsl: document')? –

+1

** 3. ** Я не мог понять, что связывает 'BatchNumbers/row' с определенным' Document_Lines/row'. Значения 'BaseLineNumber' не уникальны, а значения' Pieces', на которые вы обращали внимание, являются загадочными. –

+0

Благодарим вас за отзыв, см. Шаг 2 выше. Я приближаюсь к окончательному результату, но BaseLineNumber неверен, пожалуйста, проверьте последний , который содержит две строки под Document_Lines (всего три материала), поэтому BaseLineNumber должен быть 0,1 , 1. каждый BatchNumbers/Row означает один материал. – Jim

ответ

0

Я предполагаю, что вы хотите сделать что-то вроде этого:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="row-by-BaseEntry" match="Document_Lines/row" use="BaseEntry" /> 

<xsl:template match="/BOM"> 
    <root> 
     <xsl:for-each select="Document_Lines/row[count(. | key('row-by-BaseEntry', BaseEntry)[1]) = 1]"> 
      <xsl:variable name="curr-group" select="key('row-by-BaseEntry', BaseEntry)" /> 
      <output num="{position()}"> 
       <BOM> 
        <Header> 
         <row> 
          <xsl:copy-of select="Vendor"/> 
          <xsl:copy-of select="/BOM/Header/row/DocDate"/> 
         </row> 
        </Header> 
        <Document_Lines> 
         <xsl:copy-of select="$curr-group"/> 
        </Document_Lines> 
        <BatchNumbers> 
         <xsl:for-each select="$curr-group"> 
          <xsl:variable name="start" select="sum(preceding-sibling::row/Pieces) + 1" /> 
          <xsl:variable name="end" select="$start + Pieces" /> 
          <xsl:copy-of select="/BOM/BatchNumbers/row[position() >= $start and position() &lt; $end]"/>        
         </xsl:for-each> 
        </BatchNumbers> 
       </BOM> 
      </output> 
     </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 

Это создает группу для каждого отдельного BaseEntry, и присваивает партии строк к группе, основанной на счете Pieces в каждом члене группы.

Применительно к вашему входному примеру, результат будет:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <output num="1"> 
     <BOM> 
     <Header> 
      <row> 
       <Vendor>V1</Vendor> 
       <DocDate>20160101</DocDate> 
      </row> 
     </Header> 
     <Document_Lines> 
      <row> 
       <Vendor>V1</Vendor> 
       <BaseEntry>11003</BaseEntry> 
       <BaseLine>0</BaseLine> 
       <BaseType>22</BaseType> 
       <ItemCode>ITM00001</ItemCode> 
       <Quantity>1000</Quantity> 
       <Pieces>5.00000</Pieces> 
      </row> 
      <row> 
       <Vendor>V1</Vendor> 
       <BaseEntry>11003</BaseEntry> 
       <BaseLine>1</BaseLine> 
       <BaseType>22</BaseType> 
       <ItemCode>ITM00002</ItemCode> 
       <Quantity>100</Quantity> 
       <Pieces>1.00000</Pieces> 
      </row> 
     </Document_Lines> 
     <BatchNumbers> 
      <row> 
       <BatchNumber>B0-1</BatchNumber> 
       <Quantity>200</Quantity> 
       <BaseLineNumber>0</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B0-2</BatchNumber> 
       <Quantity>200</Quantity> 
       <BaseLineNumber>0</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B0-3</BatchNumber> 
       <Quantity>200</Quantity> 
       <BaseLineNumber>0</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B0-4</BatchNumber> 
       <Quantity>200</Quantity> 
       <BaseLineNumber>0</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B0-5</BatchNumber> 
       <Quantity>200</Quantity> 
       <BaseLineNumber>0</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B1-1</BatchNumber> 
       <Quantity>100</Quantity> 
       <BaseLineNumber>1</BaseLineNumber> 
      </row> 
     </BatchNumbers> 
     </BOM> 
    </output> 
    <output num="2"> 
     <BOM> 
     <Header> 
      <row> 
       <Vendor>V2</Vendor> 
       <DocDate>20160101</DocDate> 
      </row> 
     </Header> 
     <Document_Lines> 
      <row> 
       <Vendor>V2</Vendor> 
       <BaseEntry>11004</BaseEntry> 
       <BaseLine>0</BaseLine> 
       <BaseType>22</BaseType> 
       <ItemCode>ITM00008</ItemCode> 
       <Quantity>200</Quantity> 
       <Pieces>1.00000</Pieces> 
      </row> 
      <row> 
       <Vendor>V2</Vendor> 
       <BaseEntry>11004</BaseEntry> 
       <BaseLine>1</BaseLine> 
       <BaseType>22</BaseType> 
       <ItemCode>ITM00009</ItemCode> 
       <Quantity>1000</Quantity> 
       <Pieces>2.00000</Pieces> 
      </row> 
     </Document_Lines> 
     <BatchNumbers> 
      <row> 
       <BatchNumber>B2-1</BatchNumber> 
       <Quantity>200</Quantity> 
       <BaseLineNumber>2</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B3-1</BatchNumber> 
       <Quantity>500</Quantity> 
       <BaseLineNumber>3</BaseLineNumber> 
      </row> 
      <row> 
       <BatchNumber>B3-2</BatchNumber> 
       <Quantity>500</Quantity> 
       <BaseLineNumber>3</BaseLineNumber> 
      </row> 
     </BatchNumbers> 
     </BOM> 
    </output> 
</root> 

Я боюсь, что я не понимаю, требование в отношении BaseLineNumber.

Если вам нужно разделить результат на отдельные документы, я предлагаю вам задать отдельный вопрос об этом (и не забудьте объяснить, какой процессор вы используете).

+0

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

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