我已经阅读了一些类似的主题(非常感谢所有先前的努力记录)并将我的大部分解决方案拼凑在一起,但是,我对一件事情感到困惑。我有一个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>
答案 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>