Я использую преобразование в SAP для создания XML-файла. Я уже достиг этого, ссылаясь только на явные узлы. Теперь требовалось бы улучшить существующий результат XML путем динамического добавления новых узлов на основе нескольких тегов, которые могут различаться по количеству. Вот исходный XML:динамические узлы xml с использованием xslt
<!-- edited with XMLSpy v2011 rel. 3 sp1 (http://www.altova.com)-->
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<MSAPO01>
<LOGICALID>SAP-AMG</LOGICALID>
<COMPONENT>Whatever</COMPONENT>
<CONFIRMATION>Always</CONFIRMATION>
<CREATIONDATE/>
<BOID/>
<SYNC_CONFIRM>Never</SYNC_CONFIRM>
<SYNC_ACTION>Change</SYNC_ACTION>
<DATAAREA>
<item>
<ACTION>Change</ACTION>
<STATUS_HEAD>Z00</STATUS_HEAD>
<CREATIONDATE/>
<VBELN>0050023362</VBELN>
<POSNR>000001</POSNR>
<SHIPTO>C001991</SHIPTO>
<QUALITY>C</QUALITY>
<MTSMTO>MTO</MTSMTO>
<INTEXP>IN</INTEXP>
<NTGEW>22.520 </NTGEW>
<GEWEI>TO</GEWEI>
<DELIVERYMODE>Librex</DELIVERYMODE>
<PROPERTIES>
<ZPEL_PROPERTY_S>
<ID>ACTION</ID>
<DESCRIPTION>Action code</DESCRIPTION>
<DATAVALUE>007</DATAVALUE>
<DATATYPE>CHAR</DATATYPE>
<UM/>
<ANY>002</ANY>
</ZPEL_PROPERTY_S>
<ZPEL_PROPERTY_S>
<ID>AUGRU</ID>
<DESCRIPTION>Order reason (reason for the business transaction)</DESCRIPTION>
<DATAVALUE>01</DATAVALUE>
<DATATYPE>CHAR</DATATYPE>
<UM/>
<ANY/>
</ZPEL_PROPERTY_S>
<ZPEL_PROPERTY_S>
<ID>ZTERM</ID>
<DESCRIPTION>Terms of payment key</DESCRIPTION>
<DATAVALUE>0401</DATAVALUE>
<DATATYPE>CHAR</DATATYPE>
<UM/>
<ANY/>
</ZPEL_PROPERTY_S>
<ZPEL_PROPERTY_S>
<ID>QUALF</ID>
<DESCRIPTION>IDOC qualifier reference document</DESCRIPTION>
<DATAVALUE>001</DATAVALUE>
<DATATYPE>CHAR</DATATYPE>
<UM/>
<ANY>Z022</ANY>
</ZPEL_PROPERTY_S>
<ZPEL_PROPERTY_S>
<ID>QUALF</ID>
<DESCRIPTION>IDOC qualifier reference document</DESCRIPTION>
<DATAVALUE>002</DATAVALUE>
<DATATYPE>CHAR</DATATYPE>
<UM/>
<ANY>Z023</ANY>
</ZPEL_PROPERTY_S>
</PROPERTIES>
</item>
</DATAAREA>
</MSAPO01>
</asx:values>
</asx:abap>
Узел «Свойства» определяется динамически (в цифрах и содержание). Мой оригинальный XSLT является:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.siemens.com/ad/mes/b2mt-1.0" xmlns:amg="[email protected]" xmlns:bml="http://www.wbf.org/xml/b2mml-v02" xmlns:oag="http://www.openapplications.org/oagis"
xmlns:sit="http://www.siemens.com/ad/mes/b2mml-v02-SITExt-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://www.siemens.com/ad/mes/b2mt-1.0 C:\DATA_EXCHANGE\B2MT\B2MT_Schemas\AMG_ProductionSchedule.xsd">
<xsl:template match="MSAPO01">
<SyncProductionSchedule>
<oag:ApplicationArea>
<oag:Sender>
<oag:LogicalId>
<xsl:value-of select="LOGICALID"/>
</oag:LogicalId>
<oag:Component>
<xsl:value-of select="COMPONENT"/>
</oag:Component>
<oag:Confirmation>
<xsl:value-of select="CONFIRMATION"/>
</oag:Confirmation>
</oag:Sender>
<oag:CreationDateTime>
<xsl:value-of select="CREATIONDATE"/>
</oag:CreationDateTime>
<oag:BODId>
<xsl:text>0000000000017092</xsl:text>
</oag:BODId>
</oag:ApplicationArea>
<DataArea>
<xsl:comment> WorkOrder </xsl:comment>
<oag:Sync>
<xsl:attribute name="confirm">
<xsl:value-of select="SYNC_CONFIRM"/>
</xsl:attribute>
<oag:SyncCriteria>
<oag:SyncExpression>
<xsl:attribute name="action">
<xsl:value-of select="SYNC_ACTION"/>
</xsl:attribute>
</oag:SyncExpression>
</oag:SyncCriteria>
</oag:Sync>
<xsl:apply-templates select="DATAAREA"/>
</DataArea>
</SyncProductionSchedule>
</xsl:template>
<xsl:template match="DATAAREA">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="DATAAREA/item">
<bml:ProductionSchedule>
<bml:ID>
<xsl:text>Default</xsl:text>
</bml:ID>
<bml:ProductionRequest>
<bml:ID>
<xsl:value-of select="concat(VBELN,'/',POSNR)"/>
</bml:ID>
<bml:Any>
<sit:ProductionRequestExtension>
<sit:Quantity>
<bml:QuantityString>
<xsl:value-of select="NTGEW"/>
</bml:QuantityString>
<bml:DataType>
<xsl:text>float</xsl:text>
</bml:DataType>
<bml:UnitOfMeasure>
<xsl:value-of select="GEWEI"/>
</bml:UnitOfMeasure>
</sit:Quantity>
<sit:ProducedQuantity>
<xsl:value-of select="PROD_QTY"/>
</sit:ProducedQuantity>
</sit:ProductionRequestExtension>
<amg:ProductionRequestExtension>
<amg:SAPOrder>
<amg:SAPOrderID>
<xsl:value-of select="VBELN"/>
</amg:SAPOrderID>
<amg:SAPOrderItem>
<xsl:value-of select="POSNR"/>
</amg:SAPOrderItem>
<amg:SAPStatusHead>
<xsl:value-of select="STATUS_HEAD"/>
</amg:SAPStatusHead>
<amg:SoldTo>
<xsl:value-of select="SOLDTO"/>
</amg:SoldTo>
<amg:SoldToName>
<xsl:value-of select="NAME_SOLDTO"/>
</amg:SoldToName>
<amg:ShipTo>
<xsl:value-of select="SHIPTO"/>
</amg:ShipTo>
<amg:Quality>
<xsl:value-of select="QUALITY"/>
</amg:Quality>
<amg:DistributionChannel>
<xsl:value-of select="INTEXP"/>
</amg:DistributionChannel>
<amg:DeliveryMode>
<xsl:value-of select="DELIVERYMODE"/>
</amg:DeliveryMode>
</amg:SAPOrder>
</amg:ProductionRequestExtension>
</bml:Any>
</bml:ProductionRequest>
</bml:ProductionSchedule>
</xsl:template>
</xsl:transform>
, пожалуйста, помогите мне с динамической частью в XSLT-файле, чтобы получить следующий результат, независимо от числа свойств. Вывод XML должен выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2011 rel. 3 sp1 (http://www.altova.com) -->
<SyncProductionSchedule xmlns="http://www.siemens.com/ad/mes/b2mt-1.0" xmlns:amg="[email protected]" xmlns:bml="http://www.wbf.org/xml/b2mml-v02" xmlns:oag="http://www.openapplications.org/oagis" xmlns:sit="http://www.siemens.com/ad/mes/b2mml-v02-SITExt-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<oag:ApplicationArea>
<oag:Sender>
<oag:LogicalId>SAP-AMG</oag:LogicalId>
<oag:Component>Whatever</oag:Component>
<oag:Confirmation>Always</oag:Confirmation>
</oag:Sender>
<oag:CreationDateTime>2014-02-10T12:52:32</oag:CreationDateTime>
<oag:BODId>0000000000017092</oag:BODId>
</oag:ApplicationArea>
<DataArea>
<!-- WorkOrder -->
<oag:Sync confirm="Never">
<oag:SyncCriteria>
<oag:SyncExpression action="Change"/>
</oag:SyncCriteria>
</oag:Sync>
<bml:ProductionSchedule>
<bml:ID>Default</bml:ID>
<bml:ProductionRequest>
<bml:ID>0050023362/000001</bml:ID>
<bml:Any>
<sit:ProductionRequestExtension>
<sit:Quantity>
<bml:QuantityString>22.520 </bml:QuantityString>
<bml:DataType>float</bml:DataType>
<bml:UnitOfMeasure>TO</bml:UnitOfMeasure>
</sit:Quantity>
<sit:ProducedQuantity>0.000 </sit:ProducedQuantity>
</sit:ProductionRequestExtension>
<amg:ProductionRequestExtension>
<amg:SAPOrder>
<amg:SAPOrderID>0050023362</amg:SAPOrderID>
<amg:SAPOrderItem>000001</amg:SAPOrderItem>
<amg:SAPStatusHead>Z00</amg:SAPStatusHead>
<amg:SoldTo>C001991</amg:SoldTo>
<amg:Quality>C</amg:Quality>
<amg:DistributionChannel>IN</amg:DistributionChannel>
<amg:DeliveryMode>Librex</amg:DeliveryMode>
<!-- New Node - OrderProperty -> Begin -->
<amg:SAPOrderProperties>
<amg:OrderProperty>
<amg:ID>ACTION</amg:ID>
<amg:Description>Action code</amg:Description>
<amg:Value>
<amg:ValueString>007</amg:ValueString>
<amg:DataType>CHAR</amg:DataType>
<amg:UnitOfMeasure>n/a</amg:UnitOfMeasure>
<amg:Any>002</amg:Any>
</amg:Value>
</amg:OrderProperty>
<amg:OrderProperty>
<amg:ID>AUGRU</amg:ID>
<amg:Description>Order reason (reason for the business transaction)</amg:Description>
<amg:Value>
<amg:ValueString>01</amg:ValueString>
<amg:DataType>CHAR</amg:DataType>
<amg:UnitOfMeasure>n/a</amg:UnitOfMeasure>
<amg:Any/>
</amg:Value>
</amg:OrderProperty>
<amg:OrderProperty>
<amg:ID>ZTERM</amg:ID>
<amg:Description>Terms of payment key</amg:Description>
<amg:Value>
<amg:ValueString>0401</amg:ValueString>
<amg:DataType>CHAR</amg:DataType>
<amg:UnitOfMeasure>n/a</amg:UnitOfMeasure>
<amg:Any/>
</amg:Value>
</amg:OrderProperty>
<amg:OrderProperty>
<amg:ID>QUALF</amg:ID>
<amg:Description>IDOC qualifier reference document</amg:Description>
<amg:Value>
<amg:ValueString>001</amg:ValueString>
<amg:DataType>CHAR</amg:DataType>
<amg:UnitOfMeasure>n/a</amg:UnitOfMeasure>
<amg:Any>Z022</amg:Any>
</amg:Value>
</amg:OrderProperty>
<amg:OrderProperty>
<amg:ID>QUALF</amg:ID>
<amg:Description>IDOC qualifier reference document</amg:Description>
<amg:Value>
<amg:ValueString>001</amg:ValueString>
<amg:DataType>CHAR</amg:DataType>
<amg:UnitOfMeasure>n/a</amg:UnitOfMeasure>
<amg:Any>Z023</amg:Any>
</amg:Value>
</amg:OrderProperty>
</amg:SAPOrderProperties>
<!-- New Node - OrderProperty -> End -->
</amg:SAPOrder>
</amg:ProductionRequestExtension>
</bml:Any>
</bml:ProductionRequest>
</bml:ProductionSchedule>
</DataArea>
</SyncProductionSchedule>
Hi Ian, прямолинейно, я думал о более сложных решениях, таких как структуры управления контуром, xpaths и так o n, который я недостаточно хорошо понимаю. Спасибо за лучший ответ! – user3292620