【问题标题】:Import XML files in MS Access using an XSL transformation [duplicate]使用 XSL 转换在 MS Access 中导入 XML 文件 [重复]
【发布时间】:2020-05-18 02:45:47
【问题描述】:

我正在尝试做的事情:有一个自动化系统可以生成 10k XML 文件。我想将所有这些文件读入 MS Access 数据库。为了导入文件(使用 VBA ImportXML 函数),我需要使用 XSL 样式表使用 VBA FormatXML 函数转换文件。

我用谷歌搜索了一些东西,但似乎我无法让它工作。这是 XML 文件的样子(基于保密原因,我无法显示真实文件,但结构看起来是这样的):

<?xml version="1.0" encoding="UTF-16"?>
<Album xmlns="x-schema:ConfigFileSchema.xml">
    <Informations>
        <General>
            <Name>Name of Album</Name>
            <Band>Name of Band</Band>
        </General>
        <Parameters>
            <Parameter>
                <ParamName>Length of Album</ParamName>
                <ParamValue>57:16</ParamValue>
            </Parameter>
            <Parameter>
                <ParamName>Year</ParamName>
                <ParamValue>2020</ParamValue>
            </Parameter>
        </Parameters>
        <Tracks>
            <Track>
                <Trackdef>
                    <TrackName>Name of Track</TrackName>
                    <TrackLength>3:30</TrackLength>
                </Trackdef>
                <Parameters>
                    <Parameter>
                        <ParamName>Features</ParamName>
                        <ParamValue>...</ParamValue>
                    </Parameter>
                    <Parameter>
                        <ParamName>Some other Parameters</ParamName>
                        <ParamValue>...</ParamValue>
                    </Parameter>
                    <Parameter>
                        <ParamName>Some other Parameters</ParamName>
                        <ParamValue>...</ParamValue>
                    </Parameter>
                </Parameters>
            </Track>
            <Track>
                <Trackdef>
                    <TrackName>Name of Track</TrackName>
                    <TrackLength>3:30</TrackLength>
                </Trackdef>
                <Parameters>
                    <Parameter>
                        <ParamName>Features</ParamName>
                        <ParamValue>...</ParamValue>
                    </Parameter>
                    <Parameter>
                        <ParamName>Some other Parameters</ParamName>
                        <ParamValue>...</ParamValue>
                    </Parameter>
                    <Parameter>
                        <ParamName>Some other Parameters</ParamName>
                        <ParamValue>...</ParamValue>
                    </Parameter>
                </Parameters>
            </Track>
        </Tracks>
    </Informations>
</Album>

我尝试进行一些非常简单的转换,以使 TransformXML 的输出 XML 看起来像这样:

<?xml version="1.0"?>
<Information>
    <Track>
        <Parameter>
            <ParamName>Features</ParamName>
            <ParamValue>...</ParamValue>
        </Parameter>
        <Parameter>
            <ParamName>Some other Parameters</ParamName>
            <ParamValue>...</ParamValue>
        </Parameter>
    </Track>
    <Track>
        <Parameter>
            <ParamName>Features</ParamName>
            <ParamValue>...</ParamValue>
        </Parameter>
        <Parameter>
            <ParamName>Some other Parameters</ParamName>
            <ParamValue>...</ParamValue>
        </Parameter>
    </Track>
</Information>

使用这个 XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/Album/Informations/Tracks/Track/Parameters">
        <Information>
            <xsl:for-each select="child::Parameter">
                <Parameter>
                    <xsl:copy-of select="child::ParamName"/>
                    <xsl:copy-of select="child::ParamValue"/>
                </Parameter>
            </xsl:for-each>
        </Information>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

遗憾的是它什么也没做,产生了一个空白文件。 我希望有人能指出我在这里做错了什么。

【问题讨论】:

  • 作为副本关闭。无意批评;你不可能知道有数百人以不同的方式问过同样的问题。但答案总是一样的:搜索“XSLT 默认命名空间”

标签: xml vba ms-access xslt


【解决方案1】:

您错过了所有元素都位于元素上定义的默认命名空间中的事实

<Album xmlns="x-schema:ConfigFileSchema.xml">

您还必须在 XSLT 中定义该名称空间才能正确访问其元素。这可以通过属性

来实现
xmlns:x="x-schema:ConfigFileSchema.xml"

在您的 xsl:stylesheet 元素上。要在输出中去掉这个命名空间,还要添加属性

exclude-result-prefixes="x"

xsl:stylesheet 元素。
所以整个样式表可能如下所示。要获得唯一参数,它取决于 TrackName 是否唯一,因为它用于创建键值。当然,您可以将其更改为另一个唯一值(但在两个地方都这样做 - 定义和用法)。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="x-schema:ConfigFileSchema.xml" exclude-result-prefixes="x">
    <xsl:output method="xml" indent="yes" />
    <xsl:key name="params" match="x:Parameters/x:Parameter" use="concat(x:ParamName,../../x:Trackdef/x:TrackName)" />

    <xsl:template match="text()" />

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

    <xsl:template match="/x:Album/x:Informations/x:Tracks/x:Track">
        <Track>
            <xsl:for-each select="x:Parameters/x:Parameter[generate-id() = generate-id(key('params',concat(x:ParamName,../../x:Trackdef/x:TrackName))[1])]">
                <Parameter>
                    <ParamName><xsl:value-of  select="x:ParamName"/></ParamName>
                    <ParamValue><xsl:value-of select="x:ParamValue"/></ParamValue>
                </Parameter>
            </xsl:for-each>
        </Track>
    </xsl:template>

</xsl:stylesheet>

它的输出是:

<?xml version="1.0"?>
<Information>
  <Track>
    <Parameter>
      <ParamName>Features</ParamName>
      <ParamValue>...</ParamValue>
    </Parameter>
    <Parameter>
      <ParamName>Some other Parameters</ParamName>
      <ParamValue>...</ParamValue>
    </Parameter>
  </Track>
  <Track>
    <Parameter>
      <ParamName>Features</ParamName>
      <ParamValue>...</ParamValue>
    </Parameter>
    <Parameter>
      <ParamName>Some other Parameters</ParamName>
      <ParamValue>...</ParamValue>
    </Parameter>
  </Track>
</Information>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2012-08-12
    相关资源
    最近更新 更多