如何将带有嵌套节点层(父/子/子关系)的XML导入Access?

时间:2015-12-10 04:18:24

标签: xml xslt

我已尝试修改@Gord Thompson的@AMB解决方案

https://stackoverflow.com/questions/30029303/how-to-import-xml-with-nested-nodes-parent-child-relationships-into-access#=

符合我的目的,但它没有将所需的父值插入子/子子节点。以下是我的XML示例:

<?xml version="1.0" encoding="utf-8"?>
<CueSheets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
<Header>
    <ReportType>C</ReportType>
    <ReportPeriodStartDate>20110101</ReportPeriodStartDate>
    <ReportPeriodEndDate>20150814</ReportPeriodEndDate>
</Header>
<CueSheet>
    <NewOrUpdate>N</NewOrUpdate>
    <EbiquityId>7234709</EbiquityId>
    <EbiquityFilename>7234709_1.mpg</EbiquityFilename>
    <AdTitle>2015- Available Now At The Warehouse.</AdTitle>
    <AdDescription>Artists listed. Retailers listed.</AdDescription>
    <AdDuration>00:00:15</AdDuration>
    <FirstTransmissionDate>20150212</FirstTransmissionDate>
    <FirstTransmissionStation>FOUR</FirstTransmissionStation>
    <Brand>Summer Mix Tape</Brand>
    <Product>cd release</Product>
    <Cue>
        <TrackSequenceNumber>1</TrackSequenceNumber>
        <TrackTitle>Freaks (radio edit)</TrackTitle>
        <Artists>
            <Artist>Timmy Trumpet &amp; Savage</Artist>
        </Artists>
        <ProductionMusic>N</ProductionMusic>
        <ARID>52359527</ARID>
        <TimeIn>00:00:00</TimeIn>
        <TimeOut>00:00:04</TimeOut>
        <Duration>00:00:04</Duration>
    </Cue>
    <Cue>
        <TrackSequenceNumber>2</TrackSequenceNumber>
        <TrackTitle>I'm An Albatraoz</TrackTitle>
        <Artists>
            <Artist>AronChupa</Artist>
        </Artists>
        <Composers>
            <Composer>Aron Ekberg</Composer>
        </Composers>
        <ProductionMusic>N</ProductionMusic>
        <RecordLabels>
            <RecordLabel>Sony Music</RecordLabel>
        </RecordLabels>
        <ARID>54949472</ARID>
        <TimeIn>00:00:04</TimeIn>
        <TimeOut>00:00:09</TimeOut>
        <Duration>00:00:05</Duration>
    </Cue>
    <Cue>
        <TrackSequenceNumber>3</TrackSequenceNumber>
        <TrackTitle>Geronimo</TrackTitle>
        <Artists>
            <Artist>Sheppard</Artist>
        </Artists>
        <Composers>
            <Composer>George Sheppard</Composer>
            <Composer>Amy Sheppard ,Jay Bovino</Composer>
        </Composers>
        <ProductionMusic>N</ProductionMusic>
        <RecordLabels>
            <RecordLabel>UMI Decca Records</RecordLabel>
        </RecordLabels>
        <ISRCs>
            <ISRC>AU-IYA-14-00002</ISRC>
        </ISRCs>
        <ARID>204313468</ARID>
        <TimeIn>00:00:09</TimeIn>
        <TimeOut>00:00:15</TimeOut>
        <Duration>00:00:06</Duration>
    </Cue>
    <Complete>Y</Complete>
</CueSheet>
</CueSheets>

和我对XSL的尝试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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

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

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

<xsl:template match="Cue">
    <Cue>
        <EbiquityID><xsl:value-of select="../../EbiquityID"/></EbiquityID>
        <xsl:apply-templates select="@*|node()"/>
    </Cue>
</xsl:template>

<xsl:template match="Artists">
    <Artists>
        <EbiquityID><xsl:value-of select="../../../EbiquityID"/></EbiquityID>
        <xsl:apply-templates select="@*|node()"/>
    </Artists>
</xsl:template>

<xsl:template match="Composers">
    <Composers>
        <EbiquityID><xsl:value-of select="../../../EbiquityID"/></EbiquityID>
        <xsl:apply-templates select="@*|node()"/>       
    </Composers>
</xsl:template>

<xsl:template match="RecordLabels">
    <RecordLabels>
        <EbiquityID><xsl:value-of select="../../../EbiquityID"/></EbiquityID>
        <xsl:apply-templates select="@*|node()"/>       
    </RecordLabels>
</xsl:template>

<xsl:template match="ISRCs">
    <ISRCs>
        <EbiquityID><xsl:value-of select="../../../EbiquityID"/></EbiquityID>
    </ISRCs>
</xsl:template>

我猜测它与#34; ../"的数量有关,已经尝试了更多/更少的变化并且无法获得它工作。希望有人可以提前帮助,谢谢。

在测试@ Michael的建议后更新:

我已将您的建议纳入其中但仍然无法使用,这里是最新的xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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

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

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

<xsl:template match="Cue | Artists | Composers | RecordLabels | ISRCs">
<xsl:copy>
    <EbiquityID>
        <xsl:value-of select="$ebiquityId"/>
    </EbiquityID>
    <xsl:apply-templates/>
</xsl:copy>
</xsl:template>

希望有人能发现问题

1 个答案:

答案 0 :(得分:0)

如果你不确定要上升多少级别,你可以简单地使用:

<EbiquityID>
    <xsl:value-of select="ancestor::CueSheet/EbiquityId"/>
</EbiquityID>

或者,更好的是,由于您多次访问此节点,请将其放入样式表顶部的变量中。

另请注意,您可以使用一个模板:

<xsl:template match="Cue | Artists | Composers | RecordLabels">
    <xsl:copy>
        <EbiquityID>
            <xsl:value-of select="$ebiquityId"/>
        </EbiquityID>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

而不是4。

除上述外:XML区分大小写。 EbiquityID未选择EbiquityId

完整解决方案

以下内容适用<EbiquityID><Cue>模板及其所有子模板。然后,您可以在功能区上使用MS Access'XML导入向导或自动VBA方法Application.ImportXML。此外,<Header>节点已删除,因为它似乎不适合您的数据库结构。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Header"/>    

<xsl:template match="Cue|Artists|Composers|RecordLabels|ISRCs">
    <xsl:copy>    
        <EbiquityID>
            <xsl:value-of select="ancestor::CueSheet/EbiquityId"/>
        </EbiquityID>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>