2

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 を楽しみにしています。:) 私が抱えていたもう 1 つの質問は、オリジナルがテキスト (00009.99000000) として XML に保存されている場合に数値の価格を $9.99 の通貨にフォーマットする方法でしたが、私はこれに取り組むことができます。

4

3 に答える 3

1

/ ieで xpath クエリを開始して、ルートに戻ることができます。/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
        xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
    >
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/fmp:FMPXMLRESULT">
        <PRODUCTRECS>
            <xsl:apply-templates select="fmp:RESULTSET/fmp:ROW" />
        </PRODUCTRECS>
    </xsl:template>

    <xsl:template match="fmp:RESULTSET/fmp:ROW">
        <PRODUCT>
            <xsl:apply-templates select="fmp:COL" />
        </PRODUCT>
    </xsl:template>

    <xsl:template match="fmp:COL">
        <xsl:variable name="currentPosition" select="position()" />
        <xsl:element name="{/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD[position() = $currentPosition]/@NAME}">
            <xsl:value-of select="fmp:DATA"/>
        </xsl:element>
    </xsl:template>


</xsl:stylesheet>
于 2009-07-13T18:27:39.353 に答える
1

これで始められるはずです:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:fm="http://www.filemaker.com/fmpxmlresult">
    <xsl:template match="/fm:FMPXMLRESULT">
        <PRODUCTRECS>
            <xsl:apply-templates select="fm:RESULTSET/fm:ROW"/>
        </PRODUCTRECS>
    </xsl:template>

    <xsl:template match="fm:ROW">
        <PRODUCT>
        <!--
            Use this if the element containing the NAME="FileMaker Pro" attribute is the one you want to use
            for each row name.
            <xsl:element name="{name(/fm:FMPXMLRESULT/*[@NAME='FileMaker Pro'])}">-->
            <xsl:for-each select="fm:COL/fm:DATA">
                <xsl:variable name="currentPos" select="position()"/>
                <xsl:element name="{/fm:FMPXMLRESULT/fm:METADATA/fm:FIELD[position()=$currentPos]/@NAME}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:for-each>
        <!--</xsl:element>-->
        </PRODUCT>
    </xsl:template>
</xsl:stylesheet>

また、他の部分または場合によってはnumber() 関数だけについては、 xsl:numberを参照してください。

于 2009-07-13T18:34:07.653 に答える