我已尝试修改@Gord Thompson的@AMB解决方案
符合我的目的,但它没有将所需的父值插入子/子子节点。以下是我的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 & 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>
希望有人能发现问题
答案 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>