다음을 통해 공유


mapsource를 사용하여 <기본 매퍼 동작 관리>

지도 원본(.btm) 파일에서 직접 mapsource 요소의 특성을 수정하여 BizTalk Mapper의 특정 기본 동작을 수정할 수 있습니다.

값 매핑 펑토이드 코드 생성 최적화

매퍼가 값 매핑 펑토이드를 호출하는 XSLT 코드를 생성하면 변수를 사용하여 결과를 저장합니다. OptimizeValueMapping 플래그를 사용하여 값 매핑 기능을 최적화하면 if 문이 True로 평가될 때에만 변수가 생성되도록 할 수 있습니다. 예를 들어 OptimizeValueMapping아니요로 설정된 경우:

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

이 코드는 값 매핑 펑토이드 호출을 문의 본문 if 으로 이동하여 호출이 필요한 경우에만 발생하도록 하여 최적화할 수 있습니다. OptimizeValueMappingYes로 설정하면 다음 코드가 생성됩니다.

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

지도 원본(.btm) 파일에 있는 mapsource 요소의 OptimizeValueMapping 특성을 Yes로 설정하면 Mapper가 이 최적화를 자동으로 수행합니다.

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

대규모 자원을 요구하는 스키마 수용

매퍼가 복잡한 구조 및/또는 재귀 노드가 있는 매우 큰 인스턴스 공간이 있는 스키마를 사용하는 경우 맵을 테스트하거나, 맵의 유효성을 검사하거나, 맵을 컴파일하는 데 시간이 오래 걸리거나, 더 나쁜 경우 "메모리 부족" 오류가 발생할 수 있습니다. 이 오류는 크고 작은 스키마뿐만 아니라 복잡한 스키마에서도 발생할 수 있습니다.

복잡한 스키마의 문제는 매퍼가 연결된 링크가 있거나 Value 속성이 설정된 노드를 찾는 전체 스키마 트리를 재귀적으로 로드해야 하기 때문입니다. 다음과 같이 .btm 파일에서 mapsource 요소의 GenerateDefaultFixedNodes 플래그를 No로 설정하여 이 문제를 완화할 수 있습니다.

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

이 설정을 사용하면 매퍼가 대상 스키마의 각 스키마 노드와 연결된 내부 컴파일러 노드를 만들 필요가 없습니다. 컴파일러에서 연결된 노드만 고려합니다. 이렇게 하면 메모리 사용량이 크게 줄어들고 "테스트 맵" 또는 "맵 유효성 검사" 작업을 수행하거나 맵을 컴파일하거나 맵을 저장할 때 프로세스 속도가 향상됩니다.

그러나 GenerateDefaultFixedNodes 플래그가 아니요로 설정된 경우 대상 스키마에 설정된 기본 필드 값은 맵에서 생성된 인스턴스에서 유지되지 않습니다. 이는 대상 인스턴스에서 이러한 값이 필요한 경우 문제입니다. 이를 피하려면 필요한 값을 맵에서 명시적으로 다시 설정해야 합니다. GenerateDefaultFixedNodes 플래그를RequiredDefaults로 설정할 수 있습니다. 즉, 모든 필수 노드가 고려됩니다. 여기에는 연결된 노드, 기본값이 있는 노드, MinOccurs 속성이 1보다 크거나 같게 설정된 노드 및 부모가 필요한 노드가 포함됩니다.

비고

GenerateDefaultFixedNodesNo 또는 RequiredDefaults로 설정한 후 맵을 테스트하고 GenerateDefaultFixedNodes가 컴파일러에서 모든 노드를 고려하는 기본값인 Yes로 설정된 경우와 출력이 동일한지 확인해야 합니다.

루프, 조건부 및 값 매핑 펑토이드를 사용한 for-each 사용 관리

Looping 펑토이드, 조건부 펑토이드, 또는 값 매핑 펑토이드를 사용하면 컴파일된 맵 안에 xsl:for-each 문이 생성됩니다. 대상 스키마의 자식 필드에 최대 발생 횟수가 무제한일 경우, xsl:for-each 명령문은 자식 필드에 위치합니다. 자식 필드에 무한한 최대 발생 횟수가 없으면, xsl:for-each 문장은 자식 필드의 부모 필드에 배치됩니다.

그러나 xsl:for-each 문의 위치가 맵 결과에 영향을 미치기 때문에 대상 스키마의 자식 필드의 최대 발생 횟수가 1로 설정되었는지 여부에 관계없이 xsl:for-each 문을 자식 필드에 배치하는 것이 바람직할 수 있습니다.

map(.btm) 파일에서 TreatElementsAsRecords 특성의 값을 수정하여 xsl:for-each 문의 배치를 다음과 같이 제어할 수 있습니다.

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

이 특성을 Yes로 설정하면 자식 필드의 최대 발생 횟수1로 설정되었는지 관계없이 xsl:for-each 문은 대상 스키마의 자식 필드에 배치됩니다.

반복 시퀀스 그룹을 매핑할 때 순서 유지

XSD 스키마의 시퀀스 그룹은 메시지 인스턴스에 표시되지 않으므로 반복 컨텍스트를 제공하지 않습니다. 시퀀스 그룹에 대한 루프 가능성이 없으면 매퍼 컴파일러는 세그먼트 순서를 유지하기 위해 적절한 XSLT를 생성하지 않습니다. 따라서 입력 인스턴스에 있는 상대 컨텍스트가 손실되어 출력 인스턴스가 상대 컨텍스트에 따라 달라지는 추가 처리에 쓸모가 없습니다.

반복 시퀀스를 다른 반복 시퀀스에 매핑할 때 PreserveSequenceOrder 플래그를 사용하여 레코드 순서를 유지할 수 있습니다. 기본적으로 플래그 값은 플래그가 없는 이전 BizTalk Server 버전에서 만든 기존 맵의 기능을 유지하기 위해 아니요 로 설정됩니다. 새로 만든 맵에서 플래그는 값이 No로 설정된 상태로 표시됩니다. 세그먼트 순서를 유지하려면 다음과 같이 .btm 파일에서 값을 Yes 로 명시적으로 설정해야 합니다.

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

다음은 샘플 입력 인스턴스입니다.

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

PreserveSequenceOrder 플래그를 아니요로 설정하면 출력 인스턴스는 다음과 같이 표시됩니다.

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

PreserveSequenceOrder 플래그를 Yes로 설정하면 출력 인스턴스는 다음과 같습니다.

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

또한 참조하십시오

BizTalk 매퍼를 사용하여 맵 만들기