【问题标题】:Import XML into Access database (transform multi-attributed child nodes)将 XML 导入 Access 数据库(转换多属性子节点)
【发布时间】:2017-03-11 04:10:50
【问题描述】:

我已经阅读了一些类似的主题(非常感谢之前记录的所有努力)并将我的大部分解决方案拼凑在一起,但是,我被一件事难住了。我有一个包含两个名称属性的学生属性,用于两个不同的上下文(学生和学生/监护人)。我将唯一的学生 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 个表(School,链接到 Student,随后链接到各种与 Student 相关的表),但是,我完全不知道如何将 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>

【问题讨论】:

  • 你知道转换的结果应该是什么样子吗?如果是,请将其添加到您的问题中。
  • 你好迈克尔。谢谢您的答复。我已经编辑了我上面的帖子(粗体/斜体)来描述转换应该如何出现。我希望很清楚。最好的问候,戴夫。
  • 恐怕这并不能告诉我太多;请发布您期望作为转换结果获得的确切 XML 代码。
  • 你好迈克尔。我是 XML 的新手(我刚刚负责将 XML 源数据导入 Access 数据库,以便随后进行查询等),所以请原谅我的拙劣解释。无论如何,我希望上面的编辑能够澄清。再次感谢您的跟进。 D.
  • 恐怕我对Access一无所知。为了帮助您获得想要的结果,我需要查看您想要的确切(和完整)结果。目前,我无法确定 Guardian 节点应该在整个层次结构中的哪个位置。

标签: xml ms-access xslt-1.0


【解决方案1】:

我猜(!)你想改变:

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

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多