Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML文件导入Access并创建祖父母/父/子关系_Xml_Ms Access_Xslt_Import - Fatal编程技术网

将XML文件导入Access并创建祖父母/父/子关系

将XML文件导入Access并创建祖父母/父/子关系,xml,ms-access,xslt,import,Xml,Ms Access,Xslt,Import,首先,我对访问很熟悉,我了解XML的一般概念,但我对XSLT完全是新手,所以如果我的解释/术语表达得不好,请原谅我的帖子 我有一个XML源文件,我必须将其导入Access数据库,并链接所有祖父母/父母/子女/子女/…关系,以便进行报告。我在这里读过类似的文章(非常感谢之前所做的所有工作),并拼凑了一个XSLT文件,在创建的所有表之间创建链接(使用[unique]SchoolNumber字段的学校链接到学生,使用[unique]SID字段的学生链接到它的各个孩子) 但是,如何使名称节点数据在各自的

首先,我对访问很熟悉,我了解XML的一般概念,但我对XSLT完全是新手,所以如果我的解释/术语表达得不好,请原谅我的帖子

我有一个XML源文件,我必须将其导入Access数据库,并链接所有
祖父母/父母/子女/子女/…
关系,以便进行报告。我在这里读过类似的文章(非常感谢之前所做的所有工作),并拼凑了一个XSLT文件,在创建的所有表之间创建链接(使用[unique]SchoolNumber字段的学校链接到学生,使用[unique]SID字段的学生链接到它的各个孩子)

但是,如何使名称节点数据在各自的表中正确对齐,这让我感到困惑。在XML文件中,Name属性用于学生节点和监护人节点,因此它创建一个名称表,并将学生和监护人名称字段放在一个名称表中。姓名表应仅包含学生姓名(第一名、中间名、最后一名),监护人表应具有 监护人姓名(名字、姓氏)以及其他监护人字段(关系、电话、[PhoneType])

此外,在XML中,Guardian Phone属性包含一个嵌套元素
type=“HOME”
,该元素应包含在生成的Guardian表中。源XML(我对此没有控制权)如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:SchoolUpload xmlns:ns1="http://ontario.ca">
    <ns1:School>
        <ns1:SchoolNumber>123456789</ns1:SchoolNumber>
        <ns1:Students>
            <ns1:Student>
                <ns1:SID>10101010</ns1:SID>
                <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:StreetAddress>15 Main Street</ns1:StreetAddress>
                    <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>
    <?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:SID"/>
      <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:SID"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

123456789
10101010
学生1
中间的
姓
红色
蓝色
M
1991-10-29
EN
主要的,重要的
守护者
母亲
111-111-1111
次要的
守护者
父亲
222-222-2222
大街15号
圭尔夫
在…上
N5N5N5
333-333-3333
我拼凑的XSLT文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:SchoolUpload xmlns:ns1="http://ontario.ca">
    <ns1:School>
        <ns1:SchoolNumber>123456789</ns1:SchoolNumber>
        <ns1:Students>
            <ns1:Student>
                <ns1:SID>10101010</ns1:SID>
                <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:StreetAddress>15 Main Street</ns1:StreetAddress>
                    <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>
    <?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:SID"/>
      <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:SID"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


使用XSLT文件将XML导入Access会导致Access创建6个表(学校、学生、姓名、监护人、地址、别名),所有这些都可以链接。但是,我不知道如何实现我试图实现的最终结果。在此之前,我非常感谢能够提供的任何反馈。

考虑将嵌套的名称和别名节点展平,以将它们直接呈现给学生和监护人。您可以通过一个仅包含
和没有
。而且由于它们共享相同的元素名称,因此在AliasName的新子元素将AliasNameFirst和AliasNameLast的父别名连接到元素名称的情况下,会使用两个不同的模板

并且由于MS Access的XML方法是以元素为中心的,并且忽略属性,所以考虑将属性迁移到元素。由于@类型多次出现,请使用<代码> XSL:调用模板< /代码>以避免重复。在以下调整后的XSLT中,只有四个表应该导入:学校、学生、监护人和地址。



Hi Parfait。首先,感谢您的时间和反馈(非常感谢)。我知道您使用“phonetype”方法/调用将该属性转换/添加到学生和监护人节点(非常酷)。我注意到“展平”Name和AliasName字段的效果是用别名.First和Alias.Last(分别)覆盖Student.First和Student.Last属性的值。Student.Middle值不受影响(我假设)因为没有Guardian.Middle属性.TBC…我“取消”了AliasName节点,并将Student.SID值复制到AliasName节点,该节点创建了一个AliasName表,并通过SID属性链接到Student表。这是一个可行的解决方案,但是,我想知道是否有办法展平AliasName字段(根据您的解决方案)并将其第一个和最后一个子属性重命名为其他属性,例如AliasFirst和AliasLast?最终结果是学生表将包含第一个、中间个、最后一个、AliasFirst和AliasLast字段。请参阅更新的XSLT脚本。我没有想到名称和AliasName共享相同的子名称。老实说,我是通过实践学习的!最佳教程对我来说,是潜入一个问题,并使用StackOverflow发布问题。对于VBA(所有MS Office应用程序),读入库中进行所有XML处理。数据库/电子表格等表格数据是二维的(逐列),只有一种格式类型的XML可以有各种嵌套。XSLT有助于迁移。顺便说一句,请为将来的读者保持这一点。事实上,如果答案有帮助,请单击旁边的勾号接受答案并确认解决方案。