2014-09-03 91 views
-1

我是XSLT的新手,我需要幫助將兩個不同的XML文檔合併爲一個。使用XSLT合併兩個diff XMLS(1.0)

XML1.xml

<customers> 
    <customer> 
     <Person name="Ram" Id="101"/> 
     <address>flat 4</address> 
    </customer> 
    <customer> 
     <Person name="Raghav" Id="102"/> 
     <address>flat 9</address> 
    </customer> 
</customers> 

XML2.xml

<Products> 
    <Product> 
     <name>Onida Tv</name> 
     <consumer>Ram</consumer> 
    </Product> 
    <Product> 
     <name>washing machine</name> 
     <consumer>Ram</consumer> 
    </Product> 
    <Product> 
     <name>Water purifier</name> 
     <consumer>Raghav</consumer> 
    </Product> 
    <Product> 
     <name>iPhone</name> 
     <consumer>Raghav</consumer> 
    </Products> 
</Products> 

希望的XML輸出:

<customers> 
    <customer> 
     <Person name="Ram" Id="101"/> 
     <address>flat 4</address> 
     <products> 
      <name>washing machine</name> 
      <name>Onida TV</name> 
     </products> 
    </customer> 
    <customer> 
     <Person name="Raghav" Id="102"/> 
     <address>flat 9</address> 
     <products> 
      <name>iPhone</name> 
      <name>Water purifier</name> 
     </products> 
    </customer> 
</customers> 

第二XML將被認爲是在該上下文中外部。我需要爲每個客戶添加相應的產品。我怎樣才能做到這一點?

+0

請註明XSLT 1.0或2.0。 - 注意:「Ram」與「Ram」不同;你確定這就是你的數據看起來的樣子嗎? – 2014-09-03 09:28:20

+0

第二次看,它不可能,因爲它不是格式良好。這個''不是XML。 – 2014-09-03 09:35:43

+0

嗨@ michael.hor257k,我已更新查詢 – user3698644 2014-09-03 10:36:12

回答

0

試試這樣說:

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="lookup-document" select="document('XML2.xml')" /> 
<xsl:key name="product-by-consumer" match="Product" use="consumer" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="customer"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:variable name="name" select="Person/@name" /> 
     <products> 
      <!-- switch context to the other document in order to use key --> 
      <xsl:for-each select="$lookup-document"> 
       <xsl:copy-of select="key('product-by-consumer', $name)/name"/> 
      </xsl:for-each> 
     </products> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

注意,這個假設客戶名稱是唯一的。

+0

也許您應該對原始XML進行修改,爲每個產品提供一個消費者ID(我猜這是真正唯一的),而不是消費者的名稱,並對此ID進行轉換。 – Kilazur 2014-09-03 10:56:34

+0

@Kilazur也許你應該解決這個問題? – 2014-09-03 11:16:01