2

BizTalkのマッピングツールで解決しようとしているマッピングの問題があります。

次の入力ファイルについて考えてみます。

<person>
    <ID>APersonID</ID>
    <relatives>
        <relative>
            <name>Relative name 1</name>
        </relative>
        <relative>
            <name>Relative name 2</name>
        </relative>
    </relatives>
</person>

注: 相対要素のminOccursは0に設定され、相対要素のmaxOccursは無制限に設定されます。

この入力は、次の出力にマップする必要があります。

<relatives>
    <person>
        <ID>APersonID</ID>
        <relative>Relative name 1</relative>
    </person>
    <person>
        <ID>APersonID</ID>
        <relative>Relative name 2</relative>
    </person>
<relatives>

注:person要素のminOccurs1で、maxOccursunboundedです。

入力ファイルの相対要素を出力ファイルのperson要素にリンクするループ関数で動作するマッピングがありますが、次の入力ファイルが与えられる状況があります:

<person>
    <ID>APersonID</ID>
    <relatives />
</person>

どちらにマッピングする必要があります

<relatives>
    <person>
        <ID>APersonID</ID>
    </person>
<relatives>

私の現在のマッピングでは、この状況を処理できません。両方の状況が機能するように、誰かがマッピングを作成/編集する方法について提案できますか?

4

1 に答える 1

2

relatives/relative先に進む前に少なくとも1つ存在するかどうかをテストする必要があるため、最初のように見えるよりも少し複雑です。XSLTを使用する以外の方法は考えられません。マップからXSLTを抽出し、ビジュアル関数マッピングの代わりにXSLTを使用するようにBTMを変更する方法についてはこちらをご覧ください。

次のXSLT

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
    exclude-result-prefixes="msxsl var"
    version="1.0"
    xmlns:ns0="http://BizTalk_Server_Project5.Schema1">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
    <xsl:template match="/">
        <xsl:apply-templates select="/ns0:person" />
    </xsl:template>
    <xsl:template match="/ns0:person">
        <relatives>
            <xsl:variable name="personId" select="ns0:ID/text()" />
            <xsl:choose>
                <xsl:when test="not(ns0:relatives) or not(ns0:relatives/ns0:relative)">
                    <person>
                        <ID>
                            <xsl:value-of select="$personId" />
                        </ID>
                    </person>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:for-each select="ns0:relatives/ns0:relative">
                        <person>
                            <ID>
                                <xsl:value-of select="$personId" />
                            </ID>
                            <relative>
                                <xsl:value-of select="ns0:name/text()" />
                            </relative>
                        </person>
                    </xsl:for-each>
                </xsl:otherwise>
            </xsl:choose>
        </relatives>
    </xsl:template>
</xsl:stylesheet>

説明した出力を生成します。(明らかに、名前空間を一致するように変更します。私はあなたが持っていると仮定しました(そうでない場合は、プレフィックスelementFormDefault="qualified"を削除してください)ns0

于 2012-06-15T14:57:05.930 に答える