Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSL转换将XML导入Access_Xml_Xslt_Ms Access 2013 - Fatal编程技术网

使用XSL转换将XML导入Access

使用XSL转换将XML导入Access,xml,xslt,ms-access-2013,Xml,Xslt,Ms Access 2013,我已经看到了一些类似答案的其他答案,但我不能完全理解它。我有一个以属性为中心的XML文件,需要导入Access,它只接受以元素为中心的格式。似乎我需要使用XSL文件进行转换,但我不清楚如何进行转换。由于数据是专有的,我用科幻主题来掩饰它。我需要做的是将第一个代码示例转换为与第二个相同的格式: <PLANETARY Protocol="Solar 1"> <COLONIES> <COLONYDATA site="10001" planet="Mar

我已经看到了一些类似答案的其他答案,但我不能完全理解它。我有一个以属性为中心的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
10001
火星
低
11
3.
10002
火星
低
7.
1.
11019
泰坦
低
22
16

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

试试这个XSLT<代码>模板匹配
资源数据
行星
根据您的转换需要定义:

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

第三个模板
创建
协议
元素,添加
@Protocol
值,并将模板应用于其节点(即,在本例中,将模板应用于其子元素)

第四个模板
创建了一个名为
@resource
的值以及
@value
中的值的元素

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


第二个模板,
匹配节点(在您的案例元素中),复制标记,并为属性和子元素应用模板(以递归方式)。

!它工作得很好!非常感谢。我认为将其应用于我自己的数据将有助于我更好地理解它,但显然没有我想象的那么好。下半部分大致清晰,但第二和第三个星团更神秘。在进一步打扰你之前,我会看看我能搜索到什么。Lingamurthy,这很有帮助。再次感谢你。我还在网上找到了这个工具,通过粘贴XSLT和XML代码,您可以看到XSLT转换的结果;这也有助于我理解您所做的事情:很抱歉,我没有足够的代表投票支持您,但我非常感谢。Lingamurthy,是否可以让协议名称(“示例中的Solar1”)作为元素重复,以便在结果表中显示为列?一切都是可能的。。这个问题不太清楚,但看起来容易些。。请使用您的请求XML、预期输出和尝试过的XSLT提出一个新问题,肯定会有人帮您解决。对此,您必须小心,因为如果其中一个资源属性包含的字符串不是有效的元素名称,则会出现致命错误。感谢您提供的提示。在无效字符串方面有什么特别需要注意的吗?根据规范:“名称的第一个字符必须是a,任何其他字符都必须是;”--:标记名不能包含任何字符
!“#$%&'()*+,/;?@[\]^`{124;}
,也不能以
-
或数字开头。啊,谢谢。这解释了为什么我在协议名中有空格时遇到问题。