Freigeben über


Verwalten des Standardzuordnungsverhaltens mithilfe von <mapsource>

Sie können bestimmte Standardverhalten von BizTalk Mapper ändern, indem Sie Attribute des mapsource-Elements direkt in einer Zuordnungsquellendatei (.btm) ändern.

Optimieren der Codeerstellung mit dem Funktoid 'Wertezuordnung'

Wenn der Mapper XSLT-Code generiert, um das Funktoid Value Mapping aufzurufen, wird eine Variable verwendet, um das Ergebnis zu speichern. Sie können das OptimizeValueMapping-Flag verwenden, um das Wertzuordnungs-Funktoid so zu optimieren, dass eine Variable nur generiert wird, wenn die if Anweisung in Trueausgewertet wird. Wenn beispielsweise OptimizeValueMapping auf Nein festgelegt ist:

<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 kann optimiert werden, indem der Wertzuordnungs-Funktoidaufruf in den Textkörper der if Anweisung verschoben wird, um sicherzustellen, dass der Aufruf nur erfolgt, wenn er erforderlich ist. Das Festlegen von OptimizeValueMapping auf Ja ergibt den folgenden Code:

<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>  

Der Mapper führt diese Optimierung automatisch durch, wenn Sie das OptimizeValueMapping-Attribut des mapsource-Elements in der Datei der Kartenquelle (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">  

Anpassen an Schemas mit hohem Speicherbedarf

Wenn der Mapper ein Schema mit sehr hohem Speicherbedarf für die Instanz mit komplexen Strukturen und/oder rekursiven Knoten verwendet, kann das Testen, Überprüfen und Kompilieren der Zuordnung viel Zeit beanspruchen. Im schlimmsten Fall kann ein Fehler aufgrund von unzureichendem Arbeitsspeicher auftreten. Diese Problematik besteht sowohl für kleine, komplexe Schemas als auch für große Schemas.

Das Problem mit komplexen Schemas ist darauf zurückzuführen, dass der Mapper die gesamte Schemastruktur rekursiv laden muss, um nach Knoten zu suchen, für die entweder Links verbunden sind oder für die die Value-Eigenschaft festgelegt ist. Sie können dieses Problem beheben, indem Sie das GenerateDefaultFixedNodes-Flag des mapsource-Elements in den BTM-Dateien wie gezeigt auf Nein festlegen:

<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">  

Durch diese Einstellung muss der Mapper keine internen Compilerknoten erstellen, die jedem Schemaknoten eines Zielschemas zugeordnet sind. Nur verknüpfte Knoten werden vom Compiler berücksichtigt. Dies reduziert den Speicherbedarf erheblich und beschleunigt den Prozess beim Testen bzw. Überprüfen von Zuordnungen sowie beim Kompilieren oder Speichern von Zuordnungen.

Wenn das Flag GenerateDefaultFixedNodes jedoch auf Nein festgelegt ist, werden die im Zielschema festgelegten Standardfeldwerte nicht in der von der Zuordnung erzeugten instance beibehalten. Dies ist problematisch, wenn diese Werte in der Zielinstanz benötigt werden. Um dies zu umgehen, müssen die erforderlichen Werte in der Zuordnung explizit erneut festgelegt werden. Sie können das Flag GenerateDefaultFixedNodes auf RequiredDefaults festlegen, was bedeutet, dass alle erforderlichen Knoten berücksichtigt werden. Dies umfasst verknüpfte Knoten, Knoten mit Standardwerten, Knoten, bei denen die MinOccurs-Eigenschaft auf größer als oder gleich eins festgelegt ist, und Knoten, deren übergeordnete Elemente erforderlich sind.

Hinweis

Nachdem Sie GenerateDefaultFixedNodes auf Nein oder RequiredDefaults festgelegt haben, sollten Sie die Zuordnung testen und überprüfen, ob die Ausgabe identisch ist, wenn GenerateDefaultFixedNodes auf den Standardwert Ja festgelegt ist, in dem alle Knoten vom Compiler berücksichtigt werden.

Verwalten von 'for-each'-Anweisungen mit den Funktoiden 'Schleife', 'Bedingung' und 'Wertezuordnung'

Wenn Sie ein Schleifen-Funktoid , ein Bedingtes Funktoid oder ein Wertzuordnungs-Funktoid verwenden, wird eine xsl:for-each Anweisung in der kompilierten Zuordnung generiert. Wenn das untergeordnete Feld des Zielschemas unbegrenzte Höchstwerte aufweist, wird die xsl:for-each Anweisung im untergeordneten Feld platziert. Wenn das untergeordnete Feld keine unbegrenzten maximalen Vorkommen aufweist, wird die xsl:for-each -Anweisung auf das übergeordnete Feld des untergeordneten Felds gesetzt.

Da sich die Position der xsl:for-each Anweisung jedoch auf das Kartenergebnis auswirkt, können Sie die xsl:for-each Anweisung im untergeordneten Feld des Zielschemas platzieren, unabhängig davon, ob das maximale Vorkommen des untergeordneten Felds auf 1 festgelegt ist.

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

<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.

Beibehalten der Reihenfolge beim Zuordnen einer wiederholten Reihenfolgengruppe

Reihenfolgegruppen in XSD-Schemas stellen keinen Schleifenkontext zur Verfügung, da sie nicht in der Nachrichteninstanz vorhanden sind. Ohne die Möglichkeit, eine Reihenfolgengruppe in einer Schleife zu bearbeiten, kann der Compiler des Mappers keinen geeigneten XSLT-Code zum Einhalten der Segmentreihenfolge generieren. Dadurch geht in der Eingabeinstanz vorhandener relativer Kontext verloren, sodass die Ausgabeinstanzen nicht mehr für weitere Verarbeitungsschritte verwendet werden können, die vom relativen Kontext abhängig sind.

Sie können das PreserveSequenceOrder-Flag verwenden, um die Datensatzreihenfolge beizubehalten, wenn eine sich wiederholende Sequenz einer anderen sich wiederholenden 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 ist das Flag vorhanden, dessen Wert auf Nein festgelegt ist. Um die Segmentreihenfolge beizubehalten, müssen Sie den Wert in den BTM-Dateien explizit auf Ja 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">  

Der folgende Code zeigt ein Beispiel für eine Eingabeinstanz:

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

Wenn das PreserveSequenceOrder-Flag auf Nein festgelegt ist, sieht die Ausgabe instance wie folgt aus:

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

Wenn das PreserveSequenceOrder-Flag auf Ja festgelegt ist, sieht die Ausgabe instance wie folgt aus:

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

Weitere Informationen

Erstellen von Zuordnungen mit BizTalk-Mapper