У меня есть входящий 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
** 1. ** Пожалуйста, разместите вашу попытку спасти нас. ** 2. ** В XSLT 1.0 нет «split», так как вы собираетесь получать два выхода с одного входа? Используете ли вы процессор, который поддерживает это расширение (например, 'exsl: document')? –
** 3. ** Я не мог понять, что связывает 'BatchNumbers/row' с определенным' Document_Lines/row'. Значения 'BaseLineNumber' не уникальны, а значения' Pieces', на которые вы обращали внимание, являются загадочными. –
Благодарим вас за отзыв, см. Шаг 2 выше. Я приближаюсь к окончательному результату, но BaseLineNumber неверен, пожалуйста, проверьте последний, который содержит две строки под Document_Lines (всего три материала), поэтому BaseLineNumber должен быть 0,1 , 1. каждый BatchNumbers/Row означает один материал. –
Jim