Мой сценарий - xml-idoc, где в idoc у меня есть E1EDP01-POSEX, который повторяется со значением 000001. Я узнаю, как удалить повторяющийся узел, но перед этим мне нужно добавить значения в E1EDP01-MENGE (exposex = 000001 и menge = 2500, Posex = 000001 и menge3000), поэтому я хочу, чтобы Posex = 000001 и menge = 5500.
Как я использовал этот код
<xsl:template match="E1EDP01[not(generate-id() = generate-id(key('kPOSEX', POSEX)[000001]))]"/>
Принимает только значение первого узла. Ниже приведен тот же код
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Invoice>
<InvoiceDetail>
<ListOfInvoiceItemDetail>
<InvoiceItemDetail>
<InvoiceBaseItemDetail>
<LineItemNum>
<BuyerLineItemNum>000002</BuyerLineItemNum>
<SellerLineItemNum>000001</SellerLineItemNum>
</LineItemNum>
<LineItemType>
<LineItemTypeCoded>Item</LineItemTypeCoded>
</LineItemType>
<ItemIdentifiers>
<PartNumbers>
<SellerPartNumber>
<PartNum>
<PartID>100356381</PartID>
</PartNum>
</SellerPartNumber>
<BuyerPartNumber>
<PartNum>
<PartID>517801</PartID>
</PartNum>
</BuyerPartNumber>
</PartNumbers>
</ItemIdentifiers>
<TotalQuantity>
<Quantity>
<QuantityValue>40320.0</QuantityValue>
<UnitOfMeasurement>
<UOMCoded>EA</UOMCoded>
</UnitOfMeasurement>
</Quantity>
</TotalQuantity>
<LineItemReferences>
<InvoiceReferences>
<PurchaseOrderReference>
<PurchaseOrderNumber>
<Reference>
<RefNum>0045486186</RefNum>
</Reference>
</PurchaseOrderNumber>
<PurchaseOrderDate>20110825T040000.000Z</PurchaseOrderDate>
<PurchaseOrderLineItemNumber>000002</PurchaseOrderLineItemNumber>
</PurchaseOrderReference>
<ASNNumber>
<Reference>
<RefNum>0805548867</RefNum>
</Reference>
</ASNNumber>
<OtherInvoiceReferences>
<ListOfReferenceCoded>
<ReferenceCoded>
<ReferenceTypeCoded>Other</ReferenceTypeCoded>
<ReferenceTypeCodedOther>SalesOrderNumber</ReferenceTypeCodedOther>
<PrimaryReference>
<Reference>
<RefNum>0006543680</RefNum>
</Reference>
</PrimaryReference>
<SupportingReference>
<Reference>
<RefNum>000002</RefNum>
</Reference>
</SupportingReference>
</ReferenceCoded>
</ListOfReferenceCoded>
</OtherInvoiceReferences>
</InvoiceReferences>
</LineItemReferences>
</InvoiceBaseItemDetail>
<InvoicePricingDetail>
<ListOfPrice>
<Price>
<UnitPrice>
<UnitPriceValue>115.11</UnitPriceValue>
</UnitPrice>
</Price>
</ListOfPrice>
<Tax>
<TaxFunctionQualifierCoded>Tax</TaxFunctionQualifierCoded>
<TaxCategoryCoded>StandardRate</TaxCategoryCoded>
<TaxTypeCoded>Other</TaxTypeCoded>
<TaxTypeCodedOther>
<Identifier>
<Agency>
<AgencyCoded>Other</AgencyCoded>
<AgencyCodedOther>Not Specified</AgencyCodedOther>
</Agency>
<Ident>National Tax</Ident>
</Identifier>
</TaxTypeCodedOther>
<TaxPercent>10.000</TaxPercent>
<TaxAmount>464.12</TaxAmount>
</Tax>
<InvoiceCurrencyTotalValue>
<MonetaryValue>
<MonetaryAmount>4641.24</MonetaryAmount>
</MonetaryValue>
</InvoiceCurrencyTotalValue>
</InvoicePricingDetail>
</InvoiceItemDetail>
<InvoiceItemDetail>
<InvoiceBaseItemDetail>
<LineItemNum>
<BuyerLineItemNum>000001</BuyerLineItemNum>
<SellerLineItemNum>000002</SellerLineItemNum>
</LineItemNum>
<LineItemType>
<LineItemTypeCoded>Item</LineItemTypeCoded>
</LineItemType>
<ItemIdentifiers>
<PartNumbers>
<SellerPartNumber>
<PartNum>
<PartID>100351756</PartID>
</PartNum>
</SellerPartNumber>
<BuyerPartNumber>
<PartNum>
<PartID>462088</PartID>
</PartNum>
</BuyerPartNumber>
</PartNumbers>
</ItemIdentifiers>
<TotalQuantity>
<Quantity>
<QuantityValue>37632.0</QuantityValue>
<UnitOfMeasurement>
<UOMCoded>EA</UOMCoded>
</UnitOfMeasurement>
</Quantity>
</TotalQuantity>
<LineItemReferences>
<InvoiceReferences>
<PurchaseOrderReference>
<PurchaseOrderNumber>
<Reference>
<RefNum>0045486186</RefNum>
</Reference>
</PurchaseOrderNumber>
<PurchaseOrderDate>20110825T040000.000Z</PurchaseOrderDate>
<PurchaseOrderLineItemNumber>000001</PurchaseOrderLineItemNumber>
</PurchaseOrderReference>
<ASNNumber>
<Reference>
<RefNum>0805548867</RefNum>
</Reference>
</ASNNumber>
<OtherInvoiceReferences>
<ListOfReferenceCoded>
<ReferenceCoded>
<ReferenceTypeCoded/>
<PrimaryReference>
<Reference>
<RefNum>0006543680</RefNum>
</Reference>
</PrimaryReference>
<SupportingReference>
<Reference>
<RefNum>000003</RefNum>
</Reference>
</SupportingReference>
</ReferenceCoded>
</ListOfReferenceCoded>
</OtherInvoiceReferences>
</InvoiceReferences>
</LineItemReferences>
</InvoiceBaseItemDetail>
<InvoicePricingDetail>
<ListOfPrice>
<Price>
<UnitPrice>
<UnitPriceValue>119.79</UnitPriceValue>
</UnitPrice>
</Price>
</ListOfPrice>
<Tax>
<TaxFunctionQualifierCoded>Tax</TaxFunctionQualifierCoded>
<TaxCategoryCoded>StandardRate</TaxCategoryCoded>
<TaxTypeCoded>Other</TaxTypeCoded>
<TaxTypeCodedOther>
<Identifier>
<Agency>
<AgencyCoded>Other</AgencyCoded>
<AgencyCodedOther>Not Specified</AgencyCodedOther>
</Agency>
<Ident>National Tax</Ident>
</Identifier>
</TaxTypeCodedOther>
<TaxPercent>10.000</TaxPercent>
<TaxAmount>450.79</TaxAmount>
</Tax>
<InvoiceCurrencyTotalValue>
<MonetaryValue>
<MonetaryAmount>4507.94</MonetaryAmount>
</MonetaryValue>
</InvoiceCurrencyTotalValue>
</InvoicePricingDetail>
</InvoiceItemDetail>
<InvoiceItemDetail>
<InvoiceBaseItemDetail>
<LineItemNum>
<BuyerLineItemNum>000003</BuyerLineItemNum>
<SellerLineItemNum>000003</SellerLineItemNum>
</LineItemNum>
<LineItemType>
<LineItemTypeCoded>Item</LineItemTypeCoded>
</LineItemType>
<ItemIdentifiers>
<PartNumbers>
<SellerPartNumber>
<PartNum>
<PartID>100356381</PartID>
</PartNum>
</SellerPartNumber>
<BuyerPartNumber>
<PartNum>
<PartID>517801</PartID>
</PartNum>
</BuyerPartNumber>
</PartNumbers>
</ItemIdentifiers>
<TotalQuantity>
<Quantity>
<QuantityValue>60480.0</QuantityValue>
<UnitOfMeasurement>
<UOMCoded>EA</UOMCoded>
</UnitOfMeasurement>
</Quantity>
</TotalQuantity>
<LineItemReferences>
<InvoiceReferences>
<PurchaseOrderReference>
<PurchaseOrderNumber>
<Reference>
<RefNum>0045486186</RefNum>
</Reference>
</PurchaseOrderNumber>
<PurchaseOrderDate>20110825T040000.000Z</PurchaseOrderDate>
<PurchaseOrderLineItemNumber>000003</PurchaseOrderLineItemNumber>
</PurchaseOrderReference>
<ASNNumber>
<Reference>
<RefNum>0805548867</RefNum>
</Reference>
</ASNNumber>
<OtherInvoiceReferences>
<ListOfReferenceCoded>
<ReferenceCoded>
<ReferenceTypeCoded/>
<PrimaryReference>
<Reference>
<RefNum>0006543680</RefNum>
</Reference>
</PrimaryReference>
<SupportingReference>
<Reference>
<RefNum>000004</RefNum>
</Reference>
</SupportingReference>
</ReferenceCoded>
</ListOfReferenceCoded>
</OtherInvoiceReferences>
</InvoiceReferences>
</LineItemReferences>
</InvoiceBaseItemDetail>
<InvoicePricingDetail>
<ListOfPrice>
<Price>
<UnitPrice>
<UnitPriceValue>115.11</UnitPriceValue>
</UnitPrice>
</Price>
</ListOfPrice>
<Tax>
<TaxFunctionQualifierCoded>Tax</TaxFunctionQualifierCoded>
<TaxCategoryCoded>StandardRate</TaxCategoryCoded>
<TaxTypeCoded>Other</TaxTypeCoded>
<TaxTypeCodedOther>
<Identifier>
<Agency>
<AgencyCoded>Other</AgencyCoded>
<AgencyCodedOther>Not Specified</AgencyCodedOther>
</Agency>
<Ident>National Tax</Ident>
</Identifier>
</TaxTypeCodedOther>
<TaxPercent>10.000</TaxPercent>
<TaxAmount>696.19</TaxAmount>
</Tax>
<InvoiceCurrencyTotalValue>
<MonetaryValue>
<MonetaryAmount>6961.85</MonetaryAmount>
</MonetaryValue>
</InvoiceCurrencyTotalValue>
</InvoicePricingDetail>
</InvoiceItemDetail>
<InvoiceItemDetail>
<InvoiceBaseItemDetail>
<LineItemNum>
<BuyerLineItemNum>000001</BuyerLineItemNum>
<SellerLineItemNum>000004</SellerLineItemNum>
</LineItemNum>
<LineItemType>
<LineItemTypeCoded>Item</LineItemTypeCoded>
</LineItemType>
<ItemIdentifiers>
<PartNumbers>
<SellerPartNumber>
<PartNum>
<PartID>100351756</PartID>
</PartNum>
</SellerPartNumber>
<BuyerPartNumber>
<PartNum>
<PartID>462088</PartID>
</PartNum>
</BuyerPartNumber>
</PartNumbers>
</ItemIdentifiers>
<TotalQuantity>
<Quantity>
<QuantityValue>56448.0</QuantityValue>
<UnitOfMeasurement>
<UOMCoded>EA</UOMCoded>
</UnitOfMeasurement>
</Quantity>
</TotalQuantity>
<LineItemReferences>
<InvoiceReferences>
<PurchaseOrderReference>
<PurchaseOrderNumber>
<Reference>
<RefNum>0045486186</RefNum>
</Reference>
</PurchaseOrderNumber>
<PurchaseOrderDate>20110825T040000.000Z</PurchaseOrderDate>
<PurchaseOrderLineItemNumber>000001</PurchaseOrderLineItemNumber>
</PurchaseOrderReference>
<ASNNumber>
<Reference>
<RefNum>0805548867</RefNum>
</Reference>
</ASNNumber>
<OtherInvoiceReferences>
<ListOfReferenceCoded>
<ReferenceCoded>
<ReferenceTypeCoded/>
<PrimaryReference>
<Reference>
<RefNum>0006543680</RefNum>
</Reference>
</PrimaryReference>
<SupportingReference>
<Reference>
<RefNum>000005</RefNum>
</Reference>
</SupportingReference>
</ReferenceCoded>
</ListOfReferenceCoded>
</OtherInvoiceReferences>
</InvoiceReferences>
</LineItemReferences>
</InvoiceBaseItemDetail>
<InvoicePricingDetail>
<ListOfPrice>
<Price>
<UnitPrice>
<UnitPriceValue>119.79</UnitPriceValue>
</UnitPrice>
</Price>
</ListOfPrice>
<Tax>
<TaxFunctionQualifierCoded>Tax</TaxFunctionQualifierCoded>
<TaxCategoryCoded>StandardRate</TaxCategoryCoded>
<TaxTypeCoded>Other</TaxTypeCoded>
<TaxTypeCodedOther>
<Identifier>
<Agency>
<AgencyCoded>Other</AgencyCoded>
<AgencyCodedOther>Not Specified</AgencyCodedOther>
</Agency>
<Ident>National Tax</Ident>
</Identifier>
</TaxTypeCodedOther>
<TaxPercent>10.000</TaxPercent>
<TaxAmount>676.19</TaxAmount>
</Tax>
<InvoiceCurrencyTotalValue>
<MonetaryValue>
<MonetaryAmount>6761.91</MonetaryAmount>
</MonetaryValue>
</InvoiceCurrencyTotalValue>
</InvoicePricingDetail>
</InvoiceItemDetail>
</ListOfInvoiceItemDetail>
</InvoiceDetail>
<InvoiceSummary>
<NumberOfLines>4.0</NumberOfLines>
<InvoiceTotals>
<NetValue>
<MonetaryValue>
<MonetaryAmount>22872.94</MonetaryAmount>
</MonetaryValue>
</NetValue>
<GrossValue>
<MonetaryValue>
<MonetaryAmount>25160.23</MonetaryAmount>
</MonetaryValue>
</GrossValue>
<TaxValue>
<MonetaryValue>
<MonetaryAmount>2287.29</MonetaryAmount>
</MonetaryValue>
</TaxValue>
<TotalAmountPayable>
<MonetaryValue>
<MonetaryAmount>25160.23</MonetaryAmount>
</MonetaryValue>
</TotalAmountPayable>
</InvoiceTotals>
<ListOfTaxSummary>
<TaxSummary>
<Tax>
<TaxFunctionQualifierCoded>Tax</TaxFunctionQualifierCoded>
<TaxCategoryCoded>StandardRate</TaxCategoryCoded>
<TaxTypeCoded>Other</TaxTypeCoded>
<TaxTypeCodedOther>
<Identifier>
<Agency>
<AgencyCoded>Other</AgencyCoded>
<AgencyCodedOther>Not specified</AgencyCodedOther>
</Agency>
<Ident>NationalTax</Ident>
</Identifier>
</TaxTypeCodedOther>
<TaxPercent>10.000</TaxPercent>
<TaxAmount>2287.29</TaxAmount>
</Tax>
</TaxSummary>
</ListOfTaxSummary>
</InvoiceSummary>
</Invoice>
И выход
<?xml version="1.0" encoding="UTF-8"?>
<INVOIC01>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<E1EDP01 SEGMENT="1">
<POSEX>000002</POSEX>
<MENGE>40320.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>37632.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>119.79</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000003</POSEX>
<MENGE>60480.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>56448.0</MENGE>
<MENEE>EA</MENEE>
</E1EDP01>
</IDOC>
</INVOIC01>
Извините, если файл выглядит странно ... это первый раз, когда я отправляю выходной файл, вы можете увидеть E1EDP01 в этом POSEX и MENGE. Мне нужно удалить повторяющиеся значения в POSEX (EX это должно быть 000001 и должны быть добавлены значения MENGE)
Надеюсь, это имеет смысл.
3 ответа
Это преобразование .
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kByP" match="E1EDP01" use="POSEX"/>
<xsl:template match="node()|@*">
<xsl:param name="pNewValue"/>
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:with-param name="pNewValue" select="$pNewValue"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match=
"E1EDP01[generate-id()
=
generate-id(key('kByP', POSEX)[1])
]">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:with-param name="pNewValue" select=
"sum(key('kByP', POSEX)/MENGE)"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="E1EDP01"/>
<xsl:template match="MENGE/text()">
<xsl:param name="pNewValue"/>
<xsl:value-of select="$pNewValue"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному XML-документу (немного исправлено, чтобы сделать его правильно сформированным):
<INVOIC01>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1"/>
<E1EDP01 SEGMENT="1">
<POSEX>000002</POSEX>
<MENGE>40320.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>37632.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>119.79</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000003</POSEX>
<MENGE>60480.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>56448.0</MENGE>
<MENEE>EA</MENEE>
</E1EDP01>
</IDOC>
</INVOIC01>
дает желаемый, правильный результат :
<INVOIC01>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1"/>
<E1EDP01 SEGMENT="1">
<POSEX>000002</POSEX>
<MENGE>40320</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>94080</MENGE>
<MENEE>EA</MENEE>
<VPREI>119.79</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000003</POSEX>
<MENGE>60480</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
</IDOC>
</INVOIC01>
Объяснение :
Правило идентификации копирует каждый узел «как есть». Я добавил параметр с именем
pNewValue
, который используется только шаблоном, соответствующим любому дочернему текстовому узлу дляMENGE
- предоставить новое значение (сумму всехMENGE
в группе) для вывода.Для группировки используется мюнхенский метод .
В отличие от решения @empo нам не нужно знать названия дополнительных элементов и их порядок :)
Итак, вы хотите удалить дубликат POSEX из iDoc XML? Похоже, потому что вы используете
<xsl:template match="E1EDP01[not(generate-id() = generate-id(key('kPOSEX', POSEX)[000001]))]"/>
Я немного адаптировал это:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:key name="kPOSEX" match="E1EDP01" use="POSEX"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="E1EDP01[not(generate-id() = generate-id(key('kPOSEX', POSEX)[1]))]">
</xsl:template>
</xsl:stylesheet>
И применив его к вашему примеру iDoc XML, я получаю следующий результат:
<?xml version="1.0" encoding="UTF-8"?><INVOIC01>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1"/>
<E1EDP01 SEGMENT="1">
<POSEX>000002</POSEX>
<MENGE>40320.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>37632.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>119.79</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000003</POSEX>
<MENGE>60480.0</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
</IDOC>
</INVOIC01>
Дубликат (POSEX = 000001) удаляется. Вы этого хотели?
С уважением, Питер
Мне нужно удалить повторяющиеся значения в POSEX (EX это должно быть 000001 и должны быть добавлены значения MENGE)
Вы хотите сгруппировать по POSEX и суммировать значения MENGE для каждой группы.
Следующее преобразование выполняет задачу:
- Использование правила идентификации для упрощения генерации вывода
- Использование метода Meunchian для группировки элементов по запросу
- Использование ключа для вычисления требуемых сумм.
Я дополнительно отсортировал элементы по POSEX .
[XSLT 1.0]
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kPOSEX" match="E1EDP01" use="POSEX"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EDI_DC40">
<xsl:copy>
<xsl:apply-templates select="@*
|
E1EDP01[generate-id()
= generate-id(key('kPOSEX', POSEX)[1])]">
<xsl:sort select="POSEX" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="E1EDP01">
<xsl:copy>
<xsl:apply-templates select="@*|POSEX"/>
<MENGE>
<xsl:value-of select="sum(key('kPOSEX',POSEX)/MENGE)"/>
</MENGE>
<xsl:apply-templates select="MENEE|VPREI"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
С выходом:
<INVOIC01>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<E1EDP01 SEGMENT="1">
<POSEX>000001</POSEX>
<MENGE>94080</MENGE>
<MENEE>EA</MENEE>
<VPREI>119.79</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000002</POSEX>
<MENGE>40320</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<POSEX>000003</POSEX>
<MENGE>60480</MENGE>
<MENEE>EA</MENEE>
<VPREI>115.11</VPREI>
</E1EDP01>
</EDI_DC40>
</IDOC>
</INVOIC01>
Похожие вопросы
Новые вопросы
xml
XML (Extensible Markup Language) - это формат структурированного документа, определяющий правила кодирования текста. При использовании этого тега включайте дополнительные теги, такие как язык программирования, наборы инструментов, используемые технологии XML и другие теги, описывающие среду, в которой опубликована проблема. Гибкость XML обеспечивает широкий спектр применений для передачи человеческих и машинных данных, в том числе конкретных инструментов и библиотек.