2016-10-10 3 views
0

は私がはXSLT変換でお困り - コピーノードをターゲットノードの途中で

入力XML以下のような要件があります

<even:OrderEvent xmlns:are="http://www.org.com/EBO/AreaV2" xmlns:com="http://www.org.com/CommonV3" xmlns:com1="http://www.org.com/CommonV2" xmlns:com2="http://www.org.com/Common" xmlns:com3="http://www.org.com/CommonV4" xmlns:con="http://www.org.com/EBO/ConceptV2" xmlns:cor="http://www.org.com/EBO/CorporationV2" xmlns:div="http://www.org.com/EBO/DivisionV2" xmlns:emp="http://www.org.com/EBO/EmployeeV2" xmlns:even="http://www.org.com/EBO/Order/EventsV4" xmlns:gif="http://www.org.com/EBO/GiftCardItemV3" xmlns:gues="http://www.org.com/EBO/GuestV3" xmlns:loc="http://www.org.com/EBO/LocationV2" xmlns:loc1="http://www.org.com/EBO/LocationV3" xmlns:loy="http://www.org.com/EBO/LoyaltyAccountV1" xmlns:mar="http://www.org.com/EBO/MarketingV1" xmlns:men="http://www.org.com/EBO/MenuItem" xmlns:off="http://www.org.com/EBO/OfferV1" xmlns:ord="http://www.org.com/Message/OrderServiceV3" xmlns:ord1="http://www.org.com/EBO/OrderV3" xmlns:pay="http://www.org.com/EBO/PaymentItemV3" xmlns:reg="http://www.org.com/EBO/RegionV2" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tax="http://www.org.com/EBO/TaxItemV3"> 
    <even:Body> 
     <even:OrderType>GC</even:OrderType> 
     <ord1:Order currencyCode="USD"> 
      <!--Optional:--> 
      <ord1:OrderClassification>STANDARD</ord1:OrderClassification> 
      <!--Optional:--> 
      <ord1:OrderIDs/> 
      <!--Optional:--> 
      <ord1:BusinessDate>2016-09-02T01:45:12.145-04:00</ord1:BusinessDate> 
      <!--Optional:--> 
      <ord1:Revision>0</ord1:Revision> 
      <!--Optional:--> 
      <ord1:OrderStatus>CONFIRMED</ord1:OrderStatus> 
      <!--Optional:--> 
      <ord1:OrderItems/> 
      <ord1:BillingInformation> 
       <!--Optional:--> 
       <com1:Name> 
        <!--Optional:--> 
        <com1:FirstName>Jack</com1:FirstName> 
        <!--Optional:--> 
        <com1:LastName>Myka</com1:LastName> 
       </com1:Name> 
       <!--Optional:--> 
       <com:ContactInformation DoNotContact="false"> 
        <!--Optional:--> 
        <com:Addresses DoNotContact="false"> 
         <!--1 or more repetitions:--> 
         <com:Address CorrelationID="83" DoNoContact="false"> 
          <!--Optional:--> 
          <com:AddressKind>Other</com:AddressKind> 
          <!--Optional:--> 
          <com:Line1>55 brd st</com:Line1> 
          <!--Optional:--> 
          <com:Line2>new york</com:Line2> 
          <!--Optional:--> 
          <!--Optional:--> 
          <com:CityName>New York</com:CityName> 
          <!--Optional:--> 
          <com:StateProvinceCode>NY</com:StateProvinceCode> 
          <!--Optional:--> 
          <com:CountyName>USA</com:CountyName> 
          <!--Optional:--> 
          <com:CountryCode>US</com:CountryCode> 
          <!--Optional:--> 
          <com:PostalCode>10004</com:PostalCode> 
         </com:Address> 
        </com:Addresses> 
        <!--Optional:--> 
        <com:Emails DoNotContact="true"> 
         <!--Zero or more repetitions:--> 
         <com:Email CorrelationID="38" IsDMAOptout="true" IsDeliverable="true" IsPrimary="true"> 
          <com1:EmailAddress>[email protected]</com1:EmailAddress> 
         </com:Email> 
        </com:Emails> 
       </com:ContactInformation> 
       <com:CompanyName>Farmers</com:CompanyName> 
       <com2:SourceIDs> 
        <!--1 or more repetitions:--> 
        <com2:SourceID> 
         <!--Optional:--> 
         <com2:ID>5636546348</com2:ID> 
         <com2:Source>DP</com2:Source> 
        </com2:SourceID> 
       </com2:SourceIDs> 
      </ord1:BillingInformation> 
      <ord1:CreateDate>2016-09-02T01:45:12.145-04:00</ord1:CreateDate> 
      <!--Optional:--> 
      <ord1:ModifyDate>2016-09-02T01:45:12.145-04:00</ord1:ModifyDate> 
     </ord1:Order> 
    </even:Body> 
</even:OrderEvent> 

XSLT USED

<?xml version="1.0" encoding="UTF-8" ?> 
    <xsl:stylesheet exclude-result-prefixes="xsd xsi oracle-xsl-mapper xsl EventsV4 tns oraxsl xp20 xref mhdr oraext dvm socket" version="1.0" xmlns:CommonV2="http://www.org.com/CommonV2" xmlns:EventsV4="http://www.org.com/EBO/Order/EventsV4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:template match="/"> 
     <tns:PublishOrderEventRequest> 
      <EventsV4:OrderEvent> 
      <xsl:apply-templates select="EventsV4:OrderEvent/EventsV4:Body"/> 
      </EventsV4:OrderEvent> 
     </tns:PublishOrderEventRequest> 
     </xsl:template> 
     <xsl:template match="/EventsV4:OrderEvent/EventsV4:Body"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
     </xsl:template> 
     <xsl:template match="/orderV3:BillingInformation/*:SourceIDs/*:SourceID/*:ID/text()"> 
      12345 
     </xsl:template> 
    </xsl:stylesheet>` 

私はノード本体のアイデンティティ変換を行いたいし、 をSouのテキスト値に置き換えたいrce ID。ターゲットに私は のルートノードを持っていて、ターゲットに BODYというソースの一部だけをコピーしたいのです。コピーした後、私はBODY内のいくつかのテキスト の値を置き換えたいと思います。コピーと置き換えは起こっていません。

答えて

0

- 名前空間の宣言を修正しました。

より多くのプレフィックスが@exclude-result-prefixesにあり、xmlns:..で宣言されています。たぶん、ミニ化された例がないかもしれません。

- ロケーションパス/ XPathの

Location Pathsを見てください。 /orderV3:BillingInformationは、ルートノードorderV3:BillingINformationを選択することを意味します。しかし、あなたの正しいルートはeven:OrderEventです。だから、あなたはその特定のパターンで先導/をスキップする必要があります。

- アイデンティティ・コピーテンプレート

Identity Copy Wikiを見てください。

- 若干変更XSLT

が正しい名前空間宣言を必要とします。

<xsl:stylesheet 
    exclude-result-prefixes="xsi xsl EventsV4 tns" 
    version="1.0" 
    xmlns:CommonV2="http://www.org.com/CommonV2" 
    xmlns:EventsV4="http://www.org.com/EBO/Order/EventsV4" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tns="http://todo" 
    xmlns:orderV3="http://www.org.com/EBO/OrderV3"> 

    <xsl:template match="/"> 
     <tns:PublishOrderEventRequest> 
      <EventsV4:OrderEvent> 
       <xsl:apply-templates select="EventsV4:OrderEvent/EventsV4:Body"/> 
      </EventsV4:OrderEvent> 
     </tns:PublishOrderEventRequest> 
    </xsl:template> 

    <xsl:template match="/EventsV4:OrderEvent/EventsV4:Body"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="orderV3:BillingInformation/*:SourceIDs/*:SourceID/*:ID/text()"> 
     <xsl:text>12345</xsl:text> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題