2016-11-17 111 views
0

我想使用XSLT 1.0合併兩個表。使用XSLT從兩個XML文件獲取數據併合併爲一個?

我有XML中的兩個數據庫表的表示。第一個表是一組鍵 - 值對:

Table1.xml

<table> 
    <row> 
    <column name="key">key1</column> 
    <column name="value">val1</column> 
    </row> 
    <row> 
    <column name="key">key2</column> 
    <column name="value">val2</column> 
    </row> 
</table> 

第二個表有數據的行:

Table2.xml

<table> 
    <row> 
    <column name="A">a1</column> 
    <column name="B">b1</column> 
    <column name="C">c1</column> 
    </row> 
    <row> 
    <column name="A">a2</column> 
    <column name="B">b2</column> 
    <column name="C">c2</column> 
    </row> 
</table> 

我想採取其中一個鍵值對,並添加插入作爲一個新的列在每一行,所以th它只能到此爲止了:

的Output.xml

<table> 
    <row> 
    <column name="A">a1</column> 
    <column name="B">b1</column> 
    <column name="C">c1</column> 
    <column name="key1">val1</column> 
    </row> 
    <row> 
    <column name="A">a2</column> 
    <column name="B">b2</column> 
    <column name="C">c2</column> 
    <column name="key1">val1</column> 
    </row> 
</table> 
+0

歡迎S.O.你到目前爲止嘗試過哪些XSLT,結果與你想要的有什麼不同? – LarsH

+1

「*我正在嘗試使用其中一個鍵值對*」什麼決定哪一個? –

+1

歡迎來到Stack Overflow!請查看我們的[SO問題清單](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)來幫助你提出一個好問題,從而得到一個很好的答案。 –

回答

0

我想選擇的行鍵是「key1」,並在輸出表中創建一個新的 列。

假設你正在處理的文件Table2.xml,你可以這樣做:

XSLT 1.0

<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="val" select="document('Table1.xml')/table/row[column[1]='key1']/column[2]" /> 

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

<xsl:template match="row"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <column name="key1"> 
      <xsl:value-of select="$val" /> 
     </column> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

這工作就像一個魅力。非常感謝你的幫助。 –

1

這裏是解決方案的兩個主要成分:

<xsl:variable name="kvp"> 
    <xsl:variable name="row" select="doc('table1.xml')/table/row[1]"/> 
    <column name="{$row/column[1]}"> 
    <xsl:value-of select="$row/column[2]"/> 
    </column> 
</xsl:variable> 

<xsl:template match="row"> 
    <row> 
    <xsl:copy-of select="*"/> 
    <xsl:copy-of select="$kvp"/> 
    </row> 
</xsl:template> 
+1

這是XSLT 2.0語法。 OP使用XSLT 1.0。 –

+1

現在XSLT 2.0已經有十年了,我在記憶如何編寫XSLT 1.0代碼時遇到了很大的麻煩,但我已經做了一次嘗試。 –

相關問題