【发布时间】: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 节点应该在整个层次结构中的哪个位置。