使用XSL合并多个xml文件

时间:2015-11-13 20:33:07

标签: xml xslt merge

我正在尝试将2-3个xml文件合并到一个文件中供我的系统处理。我已经回顾了其他一些帖子,并得出了一个我认为可以使用文档工作的代码,但它似乎没有达到预期的效果。我是一个真正的新手,所以帮助真的很感激。我的计划代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/OrderRequest">
    <xsl:copy>
        <xsl:apply-templates select="OrderRequest"/>
        <xsl:apply-templates select="document('2.xml')/*/OrderRequest"/>
        <xsl:apply-templates select="document('3.xml')/*/OrderRequest"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

这是我的xml文件结构的示例。很多数据,但我在OrderRequest下需要的所有数据

<cXML xml:lang="en-US" payloadID="2015-11-06Orders" timestamp="2015-11-06T13:30:11-05:00">
<Header>
 <From>
   <Credential domain="NetworkId">
    <Identity>Order Admin</Identity>
   </Credential>
 </From>
 <To>
   <Credential domain="NetworkId">
    <Identity>fulfillment</Identity>
   </Credential>
 </To>
<Sender><Credential domain="NetworkId"><Identity>admin group</Identity><SharedSecret>hidden</SharedSecret>
</Credential>
<UserAgent>Procurement Sys</UserAgent>
</Sender>
</Header>
<Request>
<OrderRequest>
<OrderRequestHeader orderID="PO12345" orderDate="2015-11-05T13:30:44-05:00" requisitionID="">
<Total><Money currency="USD">34.00</Money>
</Total>
<Shipping>
<Money currency="USD">0.00</Money>
<Description xml:lang="en-US">Next day</Description>
</Shipping>
<Contact>
<Name xml:lang="en">Smith, Bob A.</Name>
<Phone name="default">
<TelephoneNumber>
<CountryCode isoCountryCode="US">1</CountryCode>
<AreaOrCityCode>413</AreaOrCityCode>
<Number>5551234</Number>
<Extension></Extension>
</TelephoneNumber>
</Phone>
</Contact>
</OrderRequestHeader>
<ItemOut quantity="2" lineNumber="1">
<ItemID>
<SupplierPartID>TEX TI30XIIS</SupplierPartID>
</ItemID>
<ItemDetail>
<UnitPrice>
<Money currency="USD">17.00</Money></UnitPrice>
<Description xml:lang="en">Scientific Calculator, Dual Power,2Line, 3-1/5"x6-1/10"x3/4"</Description>
<UnitOfMeasure>EA</UnitOfMeasure>
<Classification domain="UNSPSC">44120000</Classification>
</ItemDetail>
<ShipTo>
<Address isoCountryCode="US" addressID="0001">
<Name xml:lang="en">Sample Location</Name>
<PostalAddress name="default">
<DeliverTo>Smith, Bob</DeliverTo>
<DeliverTo>AR Dept.</DeliverTo>
<Street>Sample Business</Street>
<Street>101 Main St.</Street>
<City>Great Barrington</City>
<State>MA</State>
<PostalCode>01230</PostalCode>
<Country isoCountryCode="US">United States</Country>
</PostalAddress>
<Email name="default"></Email>
<Phone name="default">
<TelephoneNumber>
<CountryCode isoCountryCode="US">1</CountryCode>
<AreaOrCityCode></AreaOrCityCode>
<Number></Number>
<Extension></Extension>
</TelephoneNumber>
</Phone>
</Address>
</ShipTo>
<Distribution>
<Accounting name="General"></Accounting>
<Charge>
<Money currency="USD">34.00</Money>
</Charge>
</Distribution>
</ItemOut>
</OrderRequest>
</Request>
</cXML>

由于

1 个答案:

答案 0 :(得分:0)

如果您的XML示例正确,则第一个模板(match="/OrderRequest")永远不会匹配,因为OrderRequest不是根元素。

我认为您应该匹配Request并更新您的xsl:apply-templates ...

  <xsl:template match="Request">
    <xsl:copy>
      <xsl:apply-templates select="@*|OrderRequest"/>
      <xsl:apply-templates select="document('2.xml')/*/*/OrderRequest"/>
      <xsl:apply-templates select="document('3.xml')/*/*/OrderRequest"/>
    </xsl:copy>
  </xsl:template>

其他一切似乎都没问题。