我希望我不会因为提到 Filemaker 而失去任何人。我正在尝试将它的 XML 导出转换为 SSIS 可用的东西。FM 的原生 XML 导出在同一 XML 文件的不同部分中具有字段名称和数据。这列出了我需要它做什么,我目前做了什么,以及底部的原始 FM 导出以供参考。今天早上之前我还没有看到过 XML 翻译,所以请耐心等待:D。我可以根据需要发布更多信息。
<!-- What we actually want example -->
<?xml version="1.0" encoding="UTF-8"?>
<PRODUCTRECS>
<PRODUCT>
<name>Dr. Zim</name>
<address>1234 Internet Way</address>
<city/><state/><zip/>
</PRODUCT>
...
</PRODUCTRECS>
XSLt 有没有办法在我们翻译时读取顶部的字段名称并将字段名称放在实际数据周围?目前,我只是用这样的 IF 语句来选择位置(它有效,但非常依赖和混乱):
<!-- Current nightmare code, check for each individually and print it out -->
<xsl:template match="fmp:FMPXMLRESULT">
<PRODUCTRECS>
<xsl:for-each select="fmp:RESULTSET/fmp:ROW">
<PRODUCT>
<xsl:for-each select="fmp:COL">
<xsl:if test="position()=1">
<name><xsl:value-of select="fmp:DATA"/></name>
</xsl:if>
...
</xsl:for-each>
</PRODUCT>
</xsl:for-each>
</PRODUCTRECS>
</xsl:template>
这是 Filemaker 默认输出的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="01-01-2009" NAME="FileMaker Pro" VERSION="10.0v3"/>
<DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="filename.fp7" RECORDS="10" TIMEFORMAT="h:mm:ss a"/>
<METADATA>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="name" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="address" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="city" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="state" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="zip" TYPE="TEXT"/>
</METADATA>
<RESULTSET FOUND="10">
<ROW MODID="0" RECORDID="1">
<COL><DATA>Dr. Zim</DATA></COL>
<COL><DATA>1234 Internet Way</DATA></COL>
<COL><DATA></DATA></COL>
<COL><DATA></DATA></COL>
<COL><DATA></DATA></COL>
...
</ROW>
...
</RESULTSET>
</FMPXMLRESULT>
期待那里的大师 XSLTers。:) 我遇到的另一个问题是,当原件以 9.99 美元的货币存储为 XML 中的文本 (00009.99000000) 时,如何格式化数字价格,但我可以处理这个问题。