简体   繁体   English

使用XSLT从两个XML文件中获取数据并合并到一个文件中?

[英]Using XSLT to take data from two XML files and merge into one?

I'm trying to merge two tables using XSLT 1.0. 我正在尝试使用XSLT 1.0合并两个表。

I have a representation of two DB tables in XML. 我用XML表示了两个数据库表。 The first table is a set of key-value pairs: 第一个表是一组键值对:

Table1.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>

The second table has rows of data: 第二个表具有数据行:

Table2.xml 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>

I am trying to take one of the key-value pairs and add insert it as a new column in every row so that it ends up with this: 我正在尝试采用一对键值对并将其添加为每一行中的新列,以便最终得到以下结果:

Output.xml 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>

Here are the two main ingredients of the solution: 这是解决方案的两个主要成分:

<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>

I want to select the row where the key is "key1" and create a new column from it in the output table. 我想选择键为“ key1”的行,并在输出表中从中创建一个新列。

Assuming you are processing the Table2.xml file, you can do: 假设您正在处理Table2.xml文件,则可以执行以下操作:

XSLT 1.0 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM