0

少しトリッキーなマッピング要件があります。BizTalk マッパーを使用して、BizTalk アプリケーションで着信 xml をあるフォームから別のフォームに変換する作業を行っています。このソリューションは、XSLT を使用するか、BizTalk Functoid に組み込まれて実行できます。

ソース スキーマは次のようになります。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://BizTalkTestProject.SourceSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://BizTalkTestProject.SourceSchema">
    <xs:element name="Coverages">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Coverage" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Category" type="xs:string"/>
                            <xs:element name="BillingChargeType" type="xs:string"/>
                            <xs:element name="ASLCode" type="xs:string"/>
                            <xs:element name="EffectiveDate" type="xs:string"/>
                            <xs:element name="DeltaAmount" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

宛先スキーマは次のようになります。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://BizTalkTestProject.DestinationSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://BizTalkTestProject.DestinationSchema">
    <xs:element name="Categories" type="CategoriesType"/>
    <xs:complexType name="CategoriesType">
        <xs:sequence>
            <xs:element name="Premium" type="CommonElementsType" maxOccurs="unbounded"/>
            <xs:element name="Tax" type="CommonElementsType" maxOccurs="unbounded"/>
            <xs:element name="Fee" type="CommonElementsType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="CommonElementsType">
        <xs:sequence>
            <xs:element name="CategoryDetail" type="CategoryDetailType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="CategoryDetailType">
        <xs:sequence>
            <xs:element name="Type" type="xs:string"/>
            <xs:element name="AnnualStatementLine" type="xs:string"/>
            <xs:element name="Amount" type="xs:string"/>
            <xs:element name="ChangeEffectiveDate" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

着信 xml データの例:

    <ns0:Coverages xmlns:ns0="http://BizTalkTestProject.SourceSchema">
    <Coverage>
        <Category>premium</Category>
        <BillingChargeType>premium BillingChargeType 2</BillingChargeType>
        <ASLCode>premium ASLCode 2</ASLCode>
        <EffectiveDate>2002-02-02</EffectiveDate>
        <DeltaAmount>22.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>premium</Category>
        <BillingChargeType>premium BillingChargeType 1</BillingChargeType>
        <ASLCode>premium ASLCode 1</ASLCode>
        <EffectiveDate>2001-01-01</EffectiveDate>
        <DeltaAmount>11.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>premium</Category>
        <BillingChargeType>premium BillingChargeType 1</BillingChargeType>
        <ASLCode>premium ASLCode 2</ASLCode>
        <EffectiveDate>2001-01-01</EffectiveDate>
        <DeltaAmount>121.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>premium</Category>
        <BillingChargeType>premium BillingChargeType 1</BillingChargeType>
        <ASLCode>premium ASLCode 1</ASLCode>
        <EffectiveDate>2002-02-02</EffectiveDate>
        <DeltaAmount>112.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>premium</Category>
        <BillingChargeType>premium BillingChargeType 3</BillingChargeType>
        <ASLCode>premium ASLCode 3</ASLCode>
        <EffectiveDate>2003-03-03</EffectiveDate>
        <DeltaAmount>33.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>premium</Category>
        <BillingChargeType>premium BillingChargeType 1</BillingChargeType>
        <ASLCode>premium ASLCode 1</ASLCode>
        <EffectiveDate>2001-01-01</EffectiveDate>
        <DeltaAmount>5.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>tax</Category>
        <BillingChargeType>tax BillingChargeType 4</BillingChargeType>
        <ASLCode>tax ASLCode 4</ASLCode>
        <EffectiveDate>2004-04-04</EffectiveDate>
        <DeltaAmount>44.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>tax</Category>
        <BillingChargeType>tax BillingChargeType 5</BillingChargeType>
        <ASLCode>tax ASLCode 5</ASLCode>
        <EffectiveDate>2005-05-05</EffectiveDate>
        <DeltaAmount>55.00</DeltaAmount>
    </Coverage>
    <Coverage>
        <Category>fee</Category>
        <BillingChargeType>fee BillingChargeType 6</BillingChargeType>
        <ASLCode>fee ASLCode 6</ASLCode>
        <EffectiveDate>2006-06-06</EffectiveDate>
        <DeltaAmount>66.00</DeltaAmount>
    </Coverage>
</ns0:Coverages>

予期される出力 xml は次のようになります。

    <ns0:Categories xmlns:ns0="http://BizTalkTestProject.DestinationSchema">
    <Premium>
        <CategoryDetail>
            <Type>premium BillingChargeType 2</Type>
            <AnnualStatementLine>premium ASLCode 2</AnnualStatementLine>
            <Amount>22.00</Amount>
            <ChangeEffectiveDate>2002-02-02</ChangeEffectiveDate>
        </CategoryDetail>
        <CategoryDetail>
            <Type>premium BillingChargeType 1</Type>
            <AnnualStatementLine>premium ASLCode 1</AnnualStatementLine>
            <Amount>16.00</Amount>
            <ChangeEffectiveDate>2001-01-01</ChangeEffectiveDate>
        </CategoryDetail>
        <CategoryDetail>
            <Type>premium BillingChargeType 1</Type>
            <AnnualStatementLine>premium ASLCode 2</AnnualStatementLine>
            <Amount>121.11</Amount>
            <ChangeEffectiveDate>2001-01-01</ChangeEffectiveDate>
        </CategoryDetail>
        <CategoryDetail>
            <Type>premium BillingChargeType 1</Type>
            <AnnualStatementLine>premium ASLCode 1</AnnualStatementLine>
            <Amount>112.22</Amount>
            <ChangeEffectiveDate>2002-02-02</ChangeEffectiveDate>
        </CategoryDetail>
        <CategoryDetail>
            <Type>premium BillingChargeType 3</Type>
            <AnnualStatementLine>premium ASLCode 3</AnnualStatementLine>
            <Amount>33.00</Amount>
            <ChangeEffectiveDate>2003-03-03</ChangeEffectiveDate>
        </CategoryDetail>
    </Premium>
    <Tax>
        <CategoryDetail>
            <Type>tax BillingChargeType 4</Type>
            <AnnualStatementLine>tax ASLCode 4</AnnualStatementLine>
            <Amount>44.00</Amount>
            <ChangeEffectiveDate>2004-04-04</ChangeEffectiveDate>
        </CategoryDetail>
        <CategoryDetail>
            <Type>tax BillingChargeType 5</Type>
            <AnnualStatementLine>tax ASLCode 5</AnnualStatementLine>
            <Amount>55.00</Amount>
            <ChangeEffectiveDate>2005-05-05</ChangeEffectiveDate>
        </CategoryDetail>
    </Tax>
    <Fee>
        <CategoryDetail>
            <Type>fee BillingChargeType 6</Type>
            <AnnualStatementLine>fee ASLCode 6</AnnualStatementLine>
            <Amount>66.00</Amount>
            <ChangeEffectiveDate>2006-06-06</ChangeEffectiveDate>
        </CategoryDetail>
    </Fee>
</ns0:Categories>

マッピング要件は次のとおりです。 1. ソース xml の Category 要素の値が「Premium」の場合、Categories/Premium の下の宛先にマッピングする必要があります。2. ソース xml の Category 要素の値が「Tax」の場合、Categories/Tax の下の宛先にマップされる必要があります。3. ソース xml の Category 要素の値が「Fee」の場合、Categories/Fee の下の宛先にマップされる必要があります。4. 出力には、Category、BillingChargeType、ALSCode、EffectiveDate ごとに異なるレコード セットのみが含まれている必要があります。5.出力には、宛先ノード「Amount」のソースノード「DeltaAmount」の集計値が、Category、BillingChargeType、ALSCode、およびEffectiveDateごとに含まれている必要があります

サンプル xml には、「Premium」ノードの集計例が含まれています。

<BillingChargeType>premium BillingChargeType 1</BillingChargeType>
<ASLCode>premium ASLCode 1</ASLCode>
<EffectiveDate>2001-01-01</EffectiveDate>

上記の 3 つのノードを持つ 2 つのカバレッジ レコード セットがあります。その二つの違いは

<DeltaAmount>11.00</DeltaAmount> and <DeltaAmount>5.00</DeltaAmount>

予想される出力では、1 つのみが DeltaAmount ノード = 16 でマップされていることがわかります。

apply-templates と for-each ループを使用して key、distinct、generate-id を使用して xslt でマッピングを試みましたが、必要な結果が得られませんでした。だから私はあなたの助けを求めるためにここにいます。さらに情報が必要な場合はお知らせください。

ご覧いただきありがとうございます。ご協力いただきありがとうございます。ムクンド

4

2 に答える 2

1

誰かが興味を持っている場合のために、以下は回答のコピーです。私は他のスレッドの誰かから得ました。

<?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:ns0="http://BizTalkTestProject.SourceSchema">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="group" match="/ns0:Coverages/Coverage" use="concat(BillingChargeType,Category,ASLCode,EffectiveDate)"/>  
   <xsl:template match="/ns0:Coverages">
     <ns0:Categories xmlns:ns0="http://BizTalkTestProject.DestinationSchema">      
       <xsl:for-each select="Coverage[count(. | key('group', concat(BillingChargeType, Category,ASLCode,EffectiveDate))[1]) = 1]">
         <xsl:choose>
           <xsl:when test="./Category ='premium'">
               <ns0:Premium>
                 <ns0:CategoryDetail>
                   <Type>
                     <xsl:value-of select="./BillingChargeType"/>
                   </Type>
                   <AnnualStatementLine>
                     <xsl:value-of select="./ASLCode"/>
                   </AnnualStatementLine>
                   <Amount>
                     <xsl:value-of select="format-number(sum(key('group', concat(BillingChargeType, Category,ASLCode,EffectiveDate))/DeltaAmount),'#,###.00')"/>
                   </Amount>
                   <ChangeEffectiveDate>
                     <xsl:value-of select="./EffectiveDate"/>
                   </ChangeEffectiveDate>

                </ns0:CategoryDetail>
               </ns0:Premium>            
           </xsl:when>
           <xsl:when test="./Category ='tax'">            
               <Tax>
                 <CategoryDetail>

                  <Type>
                     <xsl:value-of select="./BillingChargeType"/>
                   </Type>
                   <AnnualStatementLine>
                     <xsl:value-of select="./ASLCode"/>
                   </AnnualStatementLine>
                   <Amount>
                     <xsl:value-of select="format-number(sum(key('group', concat(BillingChargeType, Category,ASLCode,EffectiveDate))/DeltaAmount),'#,###.00')"/>
                   </Amount>
                   <ChangeEffectiveDate>
                     <xsl:value-of select="./EffectiveDate"/>
                   </ChangeEffectiveDate>

                </CategoryDetail>
               </Tax>

          </xsl:when>
           <xsl:when test="./Category ='fee'">            
               <fee>
                 <CategoryDetail>

                  <Type>
                     <xsl:value-of select="./BillingChargeType"/>
                   </Type>
                   <AnnualStatementLine>
                     <xsl:value-of select="./ASLCode"/>
                   </AnnualStatementLine>
                   <Amount>
                     <xsl:value-of select="format-number(sum(key('group', concat(BillingChargeType, Category,ASLCode,EffectiveDate))/DeltaAmount),'#,###.00')"/>
                   </Amount>
                   <ChangeEffectiveDate>
                     <xsl:value-of select="./EffectiveDate"/>
                   </ChangeEffectiveDate>
                 </CategoryDetail>
               </fee>            
           </xsl:when>
         </xsl:choose>
       </xsl:for-each>
     </ns0:Categories>
   </xsl:template>
 </xsl:stylesheet>
于 2012-05-22T19:30:29.633 に答える
0

マップでグローバル変数を使用したり、メソッドの上のスクリプト関数でリストまたは配列を宣言したりできます。これを使用して、すでにマップしたカテゴリを追跡できます。

このメソッドは、出力ノードのプレミアムと税金に接続するブール値を返します。カテゴリを取得し、コレクションをチェックします。見つかった場合はfalseを返し、そうでない場合は追加してtrueを返します。

System.Collections.Generic.List<string> categories;

public string AddToArray(string cat)
{
    if (categories == null)
    {
        categories = new System.Collections.Generic.List<string>();
    }

    if(!categories.Contains(cat))
    {
        categories.Add(cat);
        return true;
    }

    return false;
 }
于 2012-05-17T19:11:29.207 に答える