使用XSL转换将XML导入Access

时间:2014-11-10 01:57:14

标签: xml xslt ms-access-2013

我已经看到了类似答案的其他一些答案,但我无法完全理解它。我有一个以属性为中心的XML文件,我需要将其导入Access,它只接受以元素为中心的格式。我似乎需要使用XSL文件进行转换,但我不清楚如何做到这一点。由于数据是专有的,我用科幻主题伪装了它。我需要做的是将第一个代码示例转换为与第二个代码相同的格式:

<PLANETARY Protocol="Solar 1">
  <COLONIES>
        <COLONYDATA site="10001" planet="Mars">
            <RESOURCEDATA resource="RadiationDanger" value="Low" />
            <RESOURCEDATA resource="ApplicantColonists" value="11" />
            <RESOURCEDATA resource="AcceptedColonists" value="3" />
        </COLONYDATA>
        <COLONYDATA site="10002" planet="Mars">
            <RESOURCEDATA resource="RadiationDanger" value="Low" />
            <RESOURCEDATA resource="ApplicantColonists" value="7" />
            <RESOURCEDATA resource="AcceptedColonists" value="1" />
        </COLONYDATA>
        <COLONYDATA site="11019" planet="Titan">
            <RESOURCEDATA resource="RadiationDanger" value="Low" />
            <RESOURCEDATA resource="ApplicantColonists" value="22" />
            <RESOURCEDATA resource="AcceptedColonists" value="16" />
        </COLONYDATA>
    </COLONIES>
  </PLANETARY>


<Protocol>
Solar1
    <COLONIES>
        <COLONYDATA>
            <site>10001</site>
            <planet>Mars</planet>
            <RadiationDanger>Low</RadiationDanger>
            <ApplicantColonists>11</ApplicantColonists>
            <AcceptedColonists>3</AcceptedColonists>
        </COLONYDATA>
        <COLONYDATA>
            <site>10002</site>
            <planet>Mars</planet>
            <RadiationDanger>Low</RadiationDanger>
            <ApplicantColonists>7</ApplicantColonists>
            <AcceptedColonists>1</AcceptedColonists>
        </COLONYDATA>
        <COLONYDATA>
            <site>11019</site>
            <planet>Titan</planet>
            <RadiationDanger>Low</RadiationDanger>
            <ApplicantColonists>22</ApplicantColonists>
            <AcceptedColonists>16</AcceptedColonists>
        </COLONYDATA>
    </COLONIES>
</Protocol>

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

试试这个XSLT。匹配templatesRESOURCEDATA的{​​{1}}根据您的转化需求进行定义:

PLANETARY

第三个模板<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*" > <xsl:element name="{name()}"> <xsl:value-of select="."/> </xsl:element> </xsl:template> <xsl:template match="node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="/PLANETARY"> <Protocol> <xsl:value-of select="@Protocol"/> <xsl:apply-templates select="node()"/> </Protocol> </xsl:template> <xsl:template match="RESOURCEDATA"> <xsl:element name="{@resource}"> <xsl:value-of select="@value"/> </xsl:element> </xsl:template> </xsl:stylesheet> 创建一个<xsl:template match="/PLANETARY">元素,添加Protocol值,并将模板应用于其节点(即,在这种情况下,将模板应用于其子元素)。 / p>

第四个模板@Protocol创建一个名称为<xsl:template match="RESOURCEDATA">的值的元素,以及@resource的值。

前两个模板,第一个模板(@value)在应用于任何属性时会将其转换为元素(以元素为中心)。

第二个模板<xsl:template match="@*" >匹配节点(在您的case元素中),复制标记,并为其属性和子元素应用模板(以递归方式)。