Access XML import:将外键添加到子表

时间:2015-09-16 11:52:07

标签: xml ms-access

我有一个XML文件,我想在MS访问中导入。问题是它有多个嵌套节点,这意味着访问为每个不同类型的节点创建一个新表。现在的问题是我们不能在不同的表之间创建任何关系,我们甚至无法破译他们在数据库中的关系。无论如何都有解决这个问题的方法吗? xml由我使用的软件生成。一个示例XML数据,它将导致我面临的问题类型:

<Envelope>
    <Sale>
        <CustomerName>a</CustomerName>
        <InvoiceNo>1</InvoiceNo>
        <item>
            <ItemName>I1</ItemName>
            <QTY>10</QTY>
            <Amount>25</Amount>
        </item>
        <item>
            <ItemName>I2</ItemName>
            <QTY>15</QTY>
            <Amount>14</Amount>
        </item>
    </Sale>
    <Sale>
        <CustomerName>b</CustomerName>
        <InvoiceNo>2</InvoiceNo>
        <item>
            <ItemName>I3</ItemName>
            <QTY>10</QTY>
            <Amount>72</Amount>
        </item>
        <item>
            <ItemName>I4</ItemName>
            <QTY>21</QTY>
            <Amount>43</Amount>
        </item>
    </Sale>
    <Sale>
        <CustomerName>c</CustomerName>
        <InvoiceNo>3</InvoiceNo>
        <item>
            <ItemName>I5</ItemName>
            <QTY>13</QTY>
            <Amount>53</Amount>
        </item>
        <item>
            <ItemName>I6</ItemName>
            <QTY>37</QTY>
            <Amount>27</Amount>
        </item>
    </Sale>
    <Sale>
        <CustomerName>d</CustomerName>
        <InvoiceNo>4</InvoiceNo>
        <item>
            <ItemName>I7</ItemName>
            <QTY>45</QTY>
            <Amount>67</Amount>
        </item>
        <item>
            <ItemName>I8</ItemName>
            <QTY>12</QTY>
            <Amount>98</Amount>
        </item>
    </Sale>
</Envelope>

1 个答案:

答案 0 :(得分:1)

如果[InvoiceNo]可以作为[Sale]表的主键,那么您需要做的就是执行 XML转换,以便在导入时将[InvoiceNo]添加到[item]表。如果将以下内容保存为“LinkItemsToSales.xslt”...

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

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

    <xsl:template match="item">
        <item>
            <InvoiceNo><xsl:value-of select="../InvoiceNo"/></InvoiceNo>
            <xsl:apply-templates select="@*|node()"/>
        </item>
    </xsl:template>

</xsl:stylesheet>

然后您可以使用“导入XML”对话框中的“转换...”按钮将该文件指定为要应用的转换。导入完成后,[InvoiceNo]将出现在[item]表中,如下所示:

InvoiceNo  ItemName  QTY  Amount
---------  --------  ---  ------
1          I1        10   25    
1          I2        15   14    
2          I3        10   72    
2          I4        21   43    
3          I5        13   53    
3          I6        37   27    
4          I7        45   67    
4          I8        12   98