2014-02-10 4 views
0

Я использую преобразование в 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> 

ответ

0

Это кажется простым расширением существующей таблицы стилей, вам просто нужно добавить шаблоны для PROPERTIES и ZPEL_PROPERTY_S

<xsl:template match="PROPERTIES"> 
    <amg:SAPOrderProperties> 
    <xsl:apply-templates select="ZPEL_PROPERTY_S"/> 
    </amg:SAPOrderProperties> 
</xsl:template> 

<xsl:template match="ZPEL_PROPERTY_S"> 
    <amg:OrderProperty> 
    <amg:ID><xsl:value-of select="ID" /></amg:ID> 
    <!-- etc. --> 
    </amg:OrderProperty> 
</xsl:template> 

и применять эти шаблоны на подходящее место

  <amg:DeliveryMode> 
      <xsl:value-of select="DELIVERYMODE"/> 
      </amg:DeliveryMode> 
      <xsl:apply-templates select="PROPERTIES" /> 
     </amg:SAPOrder> 
+0

Hi Ian, прямолинейно, я думал о более сложных решениях, таких как структуры управления контуром, xpaths и так o n, который я недостаточно хорошо понимаю. Спасибо за лучший ответ! – user3292620

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