2017-09-13 96 views
0

我要合併多個XML文件,我在網上搜索上沒有人做這種方式使...用XSLT合併XML文件的特定方式

讓我來解釋;

我在這裏的第一個XML:

<?xml version = "1.0" ?> 
<racine> 
    <info> 
     <price>50</price> 
     <physic> 
      <color>blue</color> 
      <height>1</height> 
     </physic> 
    </info> 
</racine> 

第二個:

<?xml version = "1.0" ?> 
<racine> 
    <info> 
     <price>100</price> 
     <physic> 
      <color>black</color> 
      <height>2</height> 
     </physic> 
    </info> 
</racine> 

,我想這個輸出;

<?xml version = "1.0" ?> 
<racine> 
    <info> 
     <price>50</price> 
     <physic> 
      <color>blue</color> 
      <height>1</height> 
     </physic> 
    </info> 
    <info> 
     <price>100</price> 
     <physic> 
      <color>black</color> 
      <height>2</height> 
     </physic> 
    </info> 
</racine> 

您有任何解決方案/想法?

謝謝,祝你有美好的一天!

+0

「我在網上搜索,在一個沒有人做這種方式」 - 這是令人鼓舞的是人搜索他們可以重用的代碼,但編程不僅僅是尋找其他人已經編寫的程序。在學習基礎知識之前,你真的不應該使用XSLT,而這個只需要絕對的基礎知識。 –

+0

@Michael謝謝你的建議,但是,我正在爲我的工作而努力,謝謝老闆,我沒有時間學習。 –

+0

我希望你的老闆不要求管道工和電工做他們沒有接受過培訓的工作。如果他這樣做,我擔心你的安全。 (說實話,我有時會擔心是否對沒有資格完成這項工作的人給予本網站建議是正確的。) –

回答

1

考慮到上面共享的輸入XML,可以使用以下應用於第一個輸入XML的XSL合併它們。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:param name="fileName" select="document('2.xml')" /> 
    <!-- identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="racine"> 
     <xsl:copy> 
      <!-- retain existing nodes of 1.xml as is --> 
      <xsl:apply-templates select="@* | node()" /> 
      <!-- copy required nodes from 2.xml --> 
      <xsl:apply-templates select="$fileName/racine/*" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

輸出

<racine> 
    <info> 
     <price>50</price> 
     <physic> 
      <color>blue</color> 
      <height>1</height> 
     </physic> 
    </info> 
    <info> 
     <price>100</price> 
     <physic> 
      <color>black</color> 
      <height>2</height> 
     </physic> 
    </info> 
</racine> 
+0

好的,謝謝,但是如果我必須用類似的整個文件夾XML? –

+0

一種方法是爲每個單獨的XML文件創建多個''標籤並複製適當的節點。在XSLT 1.0中,'document()'一次只支持1個文件。如果您可以使用XSLT 2.0,我認爲有一個'collection()'函數可能很方便,但我並沒有太多的意識到它或使用它。 –

0

它幾乎可以做作爲一個班輪:

<xsl:template name="main"> 
    <racine> 
    <xsl:copy-of select="(doc('doc1.xml')|doc('doc2.xml'))/racine/*"/> 
    </racine> 
</xsl:template>