Freigeben über


Verwalten des Standardzuordnungsverhaltens mithilfe von <Mapsource>

Sie können bestimmte Standardverhaltensweisen von BizTalk Mapper ändern, indem Sie Attribute des Mapsource-Elements direkt in einer Map Source-Datei (BTM) ändern.

Optimieren der Generierung von Functoid-Code für die Wertzuordnung

Wenn der Mapper XSLT-Code generiert, um den Wertzuordnungs-Functoid aufzurufen, wird eine Variable verwendet, um das Ergebnis zu speichern. Sie können das OptimizeValueMapping-Flag verwenden, um das Wertzuordnungsfunktors zu verbessern, sodass eine Variable nur generiert wird, wenn die if-Anweisung zu True ausgewertet wird. Zum Beispiel: Bei OptimizeValueMapping auf Nein festgelegt:

<xsl:variable name="var:v5" select="ScriptNS0:FormatMessage(…)" />  
<xsl:if test="string($var:v4)='true'">  
     <xsl:variable name="var:v6" select="string($var:v5)" />  
     <ns0:text>  
          <xsl:value-of select="$var:v6" />  
     </ns0:text>  
</xsl:if>  

Dieser Code könnte optimiert werden, indem der Aufruf des Wertzuordnungs-Functoids in den Körper der if Anweisung verschoben wird, um sicherzustellen, dass der Aufruf nur erfolgt, wenn er erforderlich ist. Wenn Sie OptimizeValueMapping auf "Ja " festlegen, wird der folgende Code zurückgegeben:

<xsl:if test="string($var:v4)='true'">  
     <xsl:variable name="var:v5" select="ScriptNS0:FormatMessage(…)" />  
     <xsl:variable name="var:v6" select="string($var:v5)" />  
     <ns0:text>  
          <xsl:value-of select="$var:v6" />  
     </ns0:text>  
</xsl:if>  

Die Mapper führt diese Optimierung automatisch aus, wenn Sie das OptimizeValueMapping-Attribut des Mapsource-Elements in der Map-Quelldatei (BTM) wie gezeigt auf "Ja " festlegen:

<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="Yes" GenerateDefaultFixedNodes="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">  

Anpassung von Schemas mit großem Umfang

Wenn der Mapper ein Schema verwendet, das einen sehr großen Instanzbedarf mit tiefen komplexen Strukturen und/oder rekursiven Knoten aufweist, kann das Testen der Karte, das Validieren der Karte oder das Kompilieren der Karte lange dauern oder im schlimmeren Fall zu einem Fehler "Nicht genügend Arbeitsspeicher" führen. Dies kann mit kleinen, komplexen Schemas sowie mit großen Schemas geschehen.

Das Problem mit komplexen Schemas liegt daran, dass der Mapper die gesamte Schemastruktur rekursiv laden muss, um nach Knoten zu suchen, die entweder mit ihnen verbunden sind oder die Value-Eigenschaft darauf festgelegt ist. Sie können dieses Problem verringern, indem Sie das GenerateDefaultFixedNodes-Flag des Mapsource-Elements in den BTM-Dateien auf "Nein " festlegen, wie gezeigt:

<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="No" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">  

Bei dieser Einstellung muss der Mapper keine internen Compilerknoten erstellen, die jedem Schemaknoten eines Zielschemas zugeordnet sind. Vom Compiler werden nur verknüpfte Knoten berücksichtigt. Dadurch wird der Speicherverbrauch erheblich reduziert und der Prozess beschleunigt, wenn ein "Testplan"- oder "Kartenüberprüfungsvorgang" ausgeführt wird, die Karte kompiliert oder die Karte gespeichert wird.

Wenn das Flag GenerateDefaultFixedNodes jedoch auf Nein festgelegt ist, bleiben die im Zielschema festgelegten Standardwerte der Felder in der von der Zuordnung erzeugten Instanz nicht erhalten. Dies ist ein Problem, wenn diese Werte in der Zielinstanz erforderlich sind. Um dies zu umgehen, müssen die erforderlichen Werte explizit in der Karte festgelegt werden. Sie können das Flag "GenerateDefaultFixedNodes" auf "RequiredDefaults" festlegen, was bedeutet, dass alle erforderlichen Knoten berücksichtigt werden. Dadurch werden verknüpfte Knoten, Knoten mit Standardwerten, Knoten mit der MinOccurs-Eigenschaft auf größer oder gleich 1 festgelegt, und Knoten, deren übergeordnete Knoten erforderlich sind.

Hinweis

Nachdem Sie GenerateDefaultFixedNodes auf No oder RequiredDefaults festgelegt haben, sollten Sie die Karte testen und überprüfen, ob die Ausgabe dieselbe ist wie bei GenerateDefaultFixedNodes, wenn es auf seinen Standardwert Ja gesetzt ist, bei dem alle festen Knoten vom Compiler berücksichtigt werden.

Verwendung von for-each-Funktionen verwalten mit Schleifen-, bedingten- und Wertzuordnungssfunktionen

Wenn Sie ein Looping-Functoid , ein bedingtes Funktoid oder ein Wertzuordnungs-Funktoid verwenden, wird eine xsl:for-each Anweisung in der kompilierten Karte generiert. Wenn das untergeordnete Feld des Zielschemas über keine begrenzte maximale Anzahl von Vorkommen verfügt, wird die xsl:for-each Anweisung beim untergeordneten Feld platziert. Wenn das untergeordnete Feld nicht über maximal zulässige Vorkommen verfügt, wird die xsl:for-each Anweisung an das übergeordnete Feld des untergeordneten Felds gesetzt.

Da sich die Position der xsl:for-each Anweisung jedoch auf das Kartenergebnis auswirkt, soll die xsl:for-each Anweisung möglicherweise im untergeordneten Feld des Zielschemas platziert werden, unabhängig davon, ob das maximale Vorkommen des untergeordneten Felds auf 1 festgelegt ist.

Sie können die Platzierung des xsl:for-each-Anweisungselements steuern, indem Sie den Wert des TreatElementsAsRecords-Attributs in der Zuordnungsdatei (.btm) ändern, wie unten gezeigt:

<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">  

Wenn dieses Attribut auf "Ja" festgelegt ist, wird die xsl:for-each Anweisung im untergeordneten Feld des Zielschemas platziert, unabhängig davon, ob das maximale Vorkommen des untergeordneten Felds auf 1 festgelegt ist.

Die Reihenfolge beim Zuordnen einer wiederholten Sequenzgruppe beibehalten

Sequenzgruppen in XSD-Schemas stellen keinen Schleifenkontext bereit, da sie nicht in der Nachrichteninstanz dargestellt werden. Ohne Schleifenmöglichkeiten für die Sequenzgruppe generiert der Mapper-Compiler nicht die entsprechende XSLT, um die Segmentreihenfolge beizubehalten. Daher geht der relative Kontext, der in der Eingabeinstanz vorhanden ist, verloren, wodurch die Ausgabeinstanzen für die weitere Verarbeitung, die vom relativen Kontext abhängig ist, nutzlos sind.

Sie können das Flag "PreserveSequenceOrder " verwenden, um die Datensatzreihenfolge beizubehalten, wenn eine wiederholte Sequenz einer anderen wiederholten Sequenz zugeordnet wird. Standardmäßig ist der Wert des Flags auf "Nein " festgelegt, um die Funktionalität vorhandener Karten beizubehalten, die in früheren BizTalk Server-Versionen erstellt wurden, in denen das Flag nicht vorhanden ist. In den neu erstellten Karten wird die Kennzeichnung mit dem Wert "Nein" angezeigt. Um die Segmentreihenfolge beizubehalten, müssen Sie den Wert explizit auf "Ja " in den BTM-Dateien festlegen, wie gezeigt:

<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="Yes" PreserveSequenceOrder="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">  

Es folgt eine Beispieleingabeinstanz:

<Name>Person1</Name>  
<Gender>Male</Gender>  
<Address>Bellevue</Address>  
<Name>Person2</Name>  
<Gender>Female</Gender>  
<Address>Redmond</Address>  

Wenn das Flag "PreserveSequenceOrder " auf "Nein" festgelegt ist, sieht die Ausgabeinstanz wie folgt aus:

<Name>Person1</Name>  
<Name>Person2</Name>  
<Gender>Male</Gender>  
<Gender>Female</Gender>  
<Address>Bellevue</Address>  
<Address>Redmond</Address>  

Wenn das Flag "PreserveSequenceOrder " auf "Ja" festgelegt ist, sieht die Ausgabeinstanz wie folgt aus:

<Name>Person1</Name>  
<Gender>Male</Gender>  
<Address>Bellevue</Address>  
<Name>Person2</Name>  
<Gender>Female</Gender>  
<Address>Redmond</Address>  

Siehe auch

Erstellen von Karten mithilfe von BizTalk Mapper