将复杂 XML 数据导入多个 FileMaker 表
importing complex XML data into multiple FileMaker tables
我了解导入 FileMaker 的基础知识(csv,xml),我对 XSLT 也略知一二。
我有一个包含列表的数据集,我需要将其导入 FileMaker。为此有 3 个 table——主要 table、数据点 table 和位置 table。我的数据如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<result>
<data mode="test" ram="on">
33,869
34,115
46,074
225,233, E
226,122, E
235,763, E
237,408, E
237,722, E
242,503
256,271
273,741
</data>
<statistics>
<positions>
<position id="1" unit="c">0,00</position>
<position id="2" unit="c">5,05</position>
<position id="3" unit="c">14,30</position>
<position id="4" unit="c">23,47</position>
</positions>
</statistics>
</result>
如何一次性将这个XML导入FM?我知道我需要将它转换为 fmpxml 结果,但我读过的所有内容都假定 XML 本质上是一个奇特的 CSV - 没有 related/sub-rows.
的单独行
是的,positions 数据已正确 XML'化,data 数据以换行符分隔,我知道这不是 XML 方式,但这是我接收数据的方式。
我可以做些什么来让我的用户轻松实现这一点?如果绝对必要,我可以在 FileMaker 之外预处理数据,但我想尽可能避免这种情况。
(从这个问题中分离出来 - Export and Import date from/into current record only in FileMaker 18 - 其中包含这个问题的简化版本和一个不相关的其他问题,有人说我应该一次问一个问题)
导入过程仍然如我在回答您 link 的问题时所描述的那样。您需要在导入期间指定一个 XSLT 文件,以将您的 XML 转换为 FileMaker 的架构。这对于一个简单的源文件来说不是很难,但仍然是必要的。
要将 positions
导入具有 PositionID
、Unit
和 Value
字段的 table,您可以使用以下样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.filemaker.com/fmpxmlresult">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/result">
<FMPXMLRESULT>
<METADATA>
<FIELD NAME="PositionID"/>
<FIELD NAME="Unit"/>
<FIELD NAME="Value"/>
</METADATA>
<RESULTSET>
<xsl:for-each select="statistics/positions/position">
<ROW>
<COL>
<DATA>
<xsl:value-of select="@id"/>
</DATA>
</COL>
<COL>
<DATA>
<xsl:value-of select="@unit"/>
</DATA>
</COL>
<COL>
<DATA>
<xsl:value-of select="."/>
</DATA>
</COL>
</ROW>
</xsl:for-each>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
要将 data
导入具有两个目标字段(不确定如何称呼它们)的 table,您可以使用:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.filemaker.com/fmpxmlresult">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/result">
<FMPXMLRESULT>
<METADATA>
<FIELD NAME="A"/>
<FIELD NAME="B"/>
</METADATA>
<RESULTSET>
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="data"/>
</xsl:call-template>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:param name="sep" select="', '"/>
<xsl:variable name="token" select="normalize-space(substring-before(concat($text, $delimiter), $delimiter))" />
<xsl:if test="$token">
<ROW>
<COL>
<DATA>
<xsl:value-of select="substring-before(concat($token, $sep), $sep)" />
</DATA>
</COL>
<COL>
<DATA>
<xsl:value-of select="substring-after($token, $sep)" />
</DATA>
</COL>
</ROW>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
以下是为用户简化三重导入的方法:
- 创建全局容器
- 将其放在布局上(或专门用于此过程的临时布局上)
- 在您的脚本中使用“插入文件”脚本步骤让用户选择文件
- 将其设置为始终插入引用,无压缩,无选择
- 然后你可以GetAsText容器并将路径提取到变量$filePath
- 之后,您可以使用变量 $filePath 指定后续导入中的文件,并将它们设置为 运行,无需对话框。
瞧!
我不知道为什么这个答案被否决了。这是一个建议如何解决相应的问题,一次选择一个源文件,但执行两次导入,正如发帖者在他对上述解决方案的反应中所问的那样。
我了解导入 FileMaker 的基础知识(csv,xml),我对 XSLT 也略知一二。
我有一个包含列表的数据集,我需要将其导入 FileMaker。为此有 3 个 table——主要 table、数据点 table 和位置 table。我的数据如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<result>
<data mode="test" ram="on">
33,869
34,115
46,074
225,233, E
226,122, E
235,763, E
237,408, E
237,722, E
242,503
256,271
273,741
</data>
<statistics>
<positions>
<position id="1" unit="c">0,00</position>
<position id="2" unit="c">5,05</position>
<position id="3" unit="c">14,30</position>
<position id="4" unit="c">23,47</position>
</positions>
</statistics>
</result>
如何一次性将这个XML导入FM?我知道我需要将它转换为 fmpxml 结果,但我读过的所有内容都假定 XML 本质上是一个奇特的 CSV - 没有 related/sub-rows.
的单独行是的,positions 数据已正确 XML'化,data 数据以换行符分隔,我知道这不是 XML 方式,但这是我接收数据的方式。
我可以做些什么来让我的用户轻松实现这一点?如果绝对必要,我可以在 FileMaker 之外预处理数据,但我想尽可能避免这种情况。
(从这个问题中分离出来 - Export and Import date from/into current record only in FileMaker 18 - 其中包含这个问题的简化版本和一个不相关的其他问题,有人说我应该一次问一个问题)
导入过程仍然如我在回答您 link 的问题时所描述的那样。您需要在导入期间指定一个 XSLT 文件,以将您的 XML 转换为 FileMaker 的架构。这对于一个简单的源文件来说不是很难,但仍然是必要的。
要将 positions
导入具有 PositionID
、Unit
和 Value
字段的 table,您可以使用以下样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.filemaker.com/fmpxmlresult">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/result">
<FMPXMLRESULT>
<METADATA>
<FIELD NAME="PositionID"/>
<FIELD NAME="Unit"/>
<FIELD NAME="Value"/>
</METADATA>
<RESULTSET>
<xsl:for-each select="statistics/positions/position">
<ROW>
<COL>
<DATA>
<xsl:value-of select="@id"/>
</DATA>
</COL>
<COL>
<DATA>
<xsl:value-of select="@unit"/>
</DATA>
</COL>
<COL>
<DATA>
<xsl:value-of select="."/>
</DATA>
</COL>
</ROW>
</xsl:for-each>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
要将 data
导入具有两个目标字段(不确定如何称呼它们)的 table,您可以使用:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.filemaker.com/fmpxmlresult">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/result">
<FMPXMLRESULT>
<METADATA>
<FIELD NAME="A"/>
<FIELD NAME="B"/>
</METADATA>
<RESULTSET>
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="data"/>
</xsl:call-template>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:param name="sep" select="', '"/>
<xsl:variable name="token" select="normalize-space(substring-before(concat($text, $delimiter), $delimiter))" />
<xsl:if test="$token">
<ROW>
<COL>
<DATA>
<xsl:value-of select="substring-before(concat($token, $sep), $sep)" />
</DATA>
</COL>
<COL>
<DATA>
<xsl:value-of select="substring-after($token, $sep)" />
</DATA>
</COL>
</ROW>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
以下是为用户简化三重导入的方法:
- 创建全局容器
- 将其放在布局上(或专门用于此过程的临时布局上)
- 在您的脚本中使用“插入文件”脚本步骤让用户选择文件
- 将其设置为始终插入引用,无压缩,无选择
- 然后你可以GetAsText容器并将路径提取到变量$filePath
- 之后,您可以使用变量 $filePath 指定后续导入中的文件,并将它们设置为 运行,无需对话框。
瞧!
我不知道为什么这个答案被否决了。这是一个建议如何解决相应的问题,一次选择一个源文件,但执行两次导入,正如发帖者在他对上述解决方案的反应中所问的那样。