【问题标题】:Importing XML into Access with an XSL transform使用 XSL 转换将 XML 导入 Access
【发布时间】:2014-11-10 12:30:11
【问题描述】:

我已经看到了一些其他类似答案的答案,但我无法完全理解它。我有一个以属性为中心的 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>

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

【问题讨论】:

  • 您必须小心这一点,因为如果其中一个资源属性包含不是有效元素名称的字符串,您将收到致命错误。
  • 感谢您的提示。在无效字符串方面我应该特别注意什么?
  • 来自规范:“名称的第一个字符必须是NameStartChar,其他任何字符都必须是NameChars;” -- Short (unofficial) version:标签名称不能包含任何字符!"#$%&amp;'()*+,/;&lt;=&gt;?@[\]^`{|}~,也不能包含空格字符,并且不能以-. 或数字开头。
  • 啊,谢谢。这就解释了为什么我在协议名称中有空格时遇到问题。

标签: xml xslt ms-access-2013


【解决方案1】:

试试这个 XSLT。 templates 匹配 RESOURCEDATAPLANETARY 是根据您的转换需求定义的:

<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>

第三个模板&lt;xsl:template match="/PLANETARY"&gt; 创建一个Protocol 元素,添加@Protocol 值,并将模板应用于其节点(即,在本例中,将模板应用于其子元素)。

第四个模板&lt;xsl:template match="RESOURCEDATA"&gt; 创建一个元素,其名称为@resource 的值,值来自@value

来到前两个模板,第一个 (&lt;xsl:template match="@*" &gt;) 在应用于任何属性时将其转换为元素(以元素为中心)。

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

【讨论】:

  • 太棒了!它完美地工作!谢谢!我认为看到它应用于我自己的数据会帮助我更好地理解它,但显然不如我想象的那么好。下半部分或多或少清晰,但第二和第三个星团更神秘。在进一步打扰你之前,我会看看我能用谷歌搜索什么。
  • Lingamurthy,这很有帮助。再次感谢你。我还在网上找到了这个工具,它可以让您通过粘贴 XSLT 转换和 XML 代码来查看它的结果;这也有助于我理解你的所作所为:xslttest.appspot.com 很抱歉,我还没有足够的代表来投票给你,但我非常感谢。
  • Lingamurthy,是否可以让协议名称(示例中为“Solar1”)作为元素重复,以便在结果表中显示为列?
  • 一切皆有可能.. 这个问题不太清楚,但看起来更容易.. 请用您的请求 XML、预期输出和您尝试过的 XSLT 提出一个新问题,有人一定会帮助您..
猜你喜欢
  • 2020-05-18
  • 2012-02-01
  • 2017-09-19
  • 1970-01-01
  • 2019-12-20
  • 2012-08-12
  • 2019-03-22
  • 2022-01-07
相关资源
最近更新 更多