2016-11-17 112 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代码时遇到了很大的麻烦,但我已经做了一次尝试。 –

相关问题