在XSLT转换中需要帮助 - 在目标节点的中间复制节点

时间:2016-10-10 04:23:11

标签: xml 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>jack786@out.com</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

<?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>`

我想对节点Body进行Identity转换,并且还要替换 源ID的文本值。在目标中我有一个 不同的根节点,我想只复制源的一部分 身体到目标。复制后,我想替换几个文本 身体里的价值观。没有发生复制和替换。

1 个答案:

答案 0 :(得分: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>