将XML导入Access数据库(转换多属性子节点)

时间:2017-03-10 06:49:48

标签: xml ms-access xslt-1.0

我已经阅读了一些类似的主题(非常感谢所有先前的努力记录)并将我的大部分解决方案拼凑在一起,但是,我对一件事情感到困惑。我有一个Student属性,包含两个Name属性,用于两个单独的上下文(学生和学生/监护人)。我将唯一的学生ID与Student上下文的Name属性相关联,但是,导入到Access会将Student和Guardian属性的Name值整合到同一个表中。此外,Guardian属性在表中表示,但它与Name属性断开连接。我的XML文件结构如下(请注意:我无法控制其输入结构;它是由外部系统提供给我的):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:SchoolUpload xmlns:ns1="http://ontario.ca">
    <ns1:Metadata>
        <ns1:CreateDate>2017-03-09</ns1:CreateDate>
        <ns1:CreateTime>22:45:53</ns1:CreateTime>
        <ns1:CreatedBy>Dave P</ns1:CreatedBy>
        <ns1:ContactPhone type="WORK">123-345-5678</ns1:ContactPhone>
        <ns1:ContactEmail>davep@email.com</ns1:ContactEmail>
    </ns1:Metadata>
    <ns1:School>
        <ns1:SchoolNumber>123456789</ns1:SchoolNumber>
        <ns1:Name>School Name</ns1:Name>
        <ns1:Students>
            <ns1:Student>
                <ns1:OEN>10101010</ns1:OEN>
                <ns1:Grade>GR9</ns1:Grade>
                <ns1:Class>9E</ns1:Class>
                <ns1:Name>
                    <ns1:First>Student1</ns1:First> 
                    <ns1:Middle>Middle</ns1:Middle>
                    <ns1:Last>Surname</ns1:Last>
                </ns1:Name>
                <ns1:AliasName>
                    <ns1:First>Red</ns1:First>
                    <ns1:Last>Blue</ns1:Last>
                </ns1:AliasName>/>
                <ns1:Gender>M</ns1:Gender>
                <ns1:BirthDate>1991-10-29</ns1:BirthDate>
                <ns1:Language>en</ns1:Language>
                <ns1:Guardian>
                    <ns1:Name>
                        <ns1:First>Primary</ns1:First>
                        <ns1:Last>Guardian</ns1:Last>
                    </ns1:Name>
                    <ns1:Relationship>MOTHER</ns1:Relationship>
                    <ns1:Phone type="HOME">111-111-1111</ns1:Phone>
                </ns1:Guardian>
                <ns1:Guardian>
                    <ns1:Name>
                        <ns1:First>Secondary</ns1:First>
                        <ns1:Last>Guardian</ns1:Last>
                    </ns1:Name>
                    <ns1:Relationship>FATHER</ns1:Relationship>
                    <ns1:Phone type="HOME">222-222-2222</ns1:Phone>
                </ns1:Guardian>
                <ns1:Address>
                    <ns1:Unit>2404</ns1:Unit>
                    <ns1:StreetNumber>1515</ns1:StreetNumber>
                    <ns1:StreetName>Main</ns1:StreetName>
                    <ns1:StreetType>Street</ns1:StreetType>
                    <ns1:City>Guelph</ns1:City>
                    <ns1:Province>ON</ns1:Province>
                    <ns1:PostalCode>N5N5N5</ns1:PostalCode>
                </ns1:Address>
                <ns1:Phone type="HOME">333-333-3333</ns1:Phone>
            </ns1:Student>
        </ns1:Students>
    </ns1:School>
</ns1:SchoolUpload>

我正在使用的XSLT文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:ns1="http://ontario.ca"  exclude-result-prefixes="ns1">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

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

 <xsl:template match="ns1:Student">
    <xsl:copy>      
      <xsl:copy-of select="ancestor::ns1:School/ns1:SchoolNumber"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ns1:Student/ns1:Name">
    <xsl:copy>      
      <xsl:copy-of select="ancestor::ns1:Student/ns1:OEN"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ns1:AliasName|ns1:Guardian|ns1:Address">
    <xsl:copy>      
      <xsl:copy-of select="ancestor::ns1:Student/ns1:OEN"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

以上代码导致Access创建8个表(学校,链接到学生,后来链接到各种与学生相关的表),但是,我完全不知道如何 将Guardian的First [name]和Last [name]放入Guardian表中(因为这两个属性被放入Name表(与Student关联)。创建的Guardian表应包含以下字段:OEN,人际关系,电话[和类型],第一[卫报的名字]和最后一个[卫报的名字]。)

编辑:Guardian节点的转换后的XML看起来像:

<ns1:Guardian>  
   <ns1:FirstName>Primary</ns1:FirstName>
   <ns1:LastName>Guardian</ns1:LastName>
   <ns1:Relationship>MOTHER</ns1:Relationship>
   <ns1:Phone>111-111-1111</ns1:Phone>
   <ns1:PhoneType>HOME</ns1:PhoneType>
</ns1:Guardian>

1 个答案:

答案 0 :(得分:0)

我猜你想改变(!):

<xsl:template match="ns1:Student">
    <xsl:copy>      
      <xsl:copy-of select="ancestor::ns1:School/ns1:SchoolNumber"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

为:

 <xsl:template match="ns1:Student">
    <xsl:copy>      
      <xsl:copy-of select="ancestor::ns1:School/ns1:SchoolNumber"/>
      <xsl:apply-templates select="*[not(self::ns1:Guardian)]"/>
    </xsl:copy>
    <xsl:apply-templates select="ns1:Guardian"/>
 </xsl:template>