다음을 통해 공유


InfoPath 양식의 사용자 지정 병합 사용

Microsoft InfoPath 2010 편집기의 양식 병합 기능은 여러 양식의 데이터를 한 양식으로 결합하기 위해 디자인되었습니다. 이 기능은 데이터 집계라고도 합니다. 양식 병합 기능을 사용하도록 설정한 경우 파일 탭, 저장 및 보내기, 가져오기 및 연결양식 병합양식 병합 단추를 차례로 클릭하고 하나 이상의 양식을 선택하여 현재 열려 있는 양식과 병합할 수 있습니다. 현재 열려 있는 양식은 대상 양식이라고 하고 양식 병합 대화 상자에서 선택한 양식은 원본 양식이라고 합니다.

양식 병합의 결과로 얻어지는 데이터 집계에는 원본 및 대상 양식에 들어 있는 데이터가 모두 포함될 수도 있고, 원본 데이터의 일부만 포함될 수도 있습니다. 기본 작업은 다음과 같습니다.

  • 반복 요소의 경우 데이터가 대상 문서의 일치하는 위치에 삽입됩니다. 대상 요소의 MaxOccurs 특성이 1보다 큰 경우에 이 작업이 수행됩니다.

  • 반복되지 않는 요소, 즉 MaxOccurs가 "1"인 요소의 경우에는 원본 요소의 특성이 대상 요소의 기존 특성에 추가됩니다.

사용자 지정 변환 만들기

양식을 병합할 때 기본 작업은 동일한 XML 스키마를 기반으로 하는 양식에 대해 잘 작동합니다. 그러나 경우에 따라 다른 스키마를 기반으로 하는 양식을 병합하거나, 동일한 스키마를 기반으로 하는 양식에 대한 기본 병합 작업을 재정의할 수도 있습니다. 이러한 시나리오에서는 병합 작업에 대한 집계 지침을 포함하는 XSLT(XSL 변환)를 만들 수 있습니다. 이 변환은 병합 시에 적용되어 가져올 정보와 이 정보를 대상 문서로 통합하는 방법을 지정하는 주석을 함께 포함하는 DOM 문서를 만듭니다. 이러한 주석은 https://schemas.microsoft.com/office/InfoPath/2003/aggregation 네임스페이스의 XML 특성입니다.

XML 특성 및 해당 특성의 값은 각 노드를 대상 XML 문서와 병합하는 방법에 대한 집계 지침으로 사용됩니다. 다음 섹션에서는 이러한 특성에 대해 설명합니다.

select

agg:select 특성에는 대상 요소를 식별하는 절대 XPath 식이 포함됩니다.

insert

agg:action 특성의 "insert" 값은 agg:select 특성을 사용하여 지정되는 대상 요소의 자식으로 원본 요소를 삽입하도록 InfoPath에 지시합니다. 원본 요소의 자식은 삽입 작업에 포함됩니다. selectChild 특성을 사용하면 노드 삽입 작업을 위한 특정 위치를 선택할 수 있습니다. order 특성은 원본 요소를 기존 대상 요소 앞에 삽입할지 아니면 뒤에 삽입할지를 지정하는 데 사용됩니다. order 특성이 없는 경우 기본값은 "after"입니다.

<my:field1 agg:select="/my:myFields/my:field1"
 agg:action="insert" agg:order="before">Some Value</my:field1>

replace

agg:action 특성의 "replace" 값은 select 특성에서 참조하는 각 대상 요소를 원본 요소로 바꾸도록 InfoPath에 지시합니다.

<my:field1 agg:select="/my:myFields/my:field1"
 agg:action="replace">Some Value</my:field1>

mergeAttributes

agg:action 특성의 값이 "mergeAttributes"인 경우 원본 요소의 특성이 select 특성에서 참조하는 각 대상 요소의 특성과 병합됩니다.

<my:PMAwS agg:action="mergeAttributes"
 agg:select="/my:Root/my:PMAwS">

delete

agg:action 특성의 값이 "delete"인 경우 select 특성에서 참조하는 각 대상 요소가 대상 문서에서 삭제됩니다.

<my:field1 agg:select="/my:myFields/my:field1"
 agg:action="delete"/>

https://schemas.microsoft.com/office/InfoPath/2003/aggregation 네임스페이스에서 지정한 특성과 함께 https://schemas.microsoft.com/office/infopath/2003/aggregation-target 네임스페이스를 사용하면 IXMLDOMDocument 인터페이스를 구현하는 XSL 개체를 나타낼 수 있습니다. 이 인터페이스의 가장 유용한 멤버 중 하나는 get-documentElement 메서드입니다.

get-documentElement

target:get-documentElement 함수는 대상 문서의 문서 개체 모델에 대한 액세스를 제공합니다. 이 함수는 대상 문서의 현재 콘텐츠에 따라 병합 작업의 작동 방식을 변경하는 데 사용할 수 있습니다.

<xsl:when test="function-available('target:get-documentElement')">
    <xsl:variable name="target" select="target:get-documentElement()" />
    <xsl:if test="not(boolean($target/my:Customer[Name="MyName"]))">
        <my:Customer agg:action="insert" agg:select="/my:MergeForms" />
    </xsl:if>
</xsl:when>

사용자 지정 병합을 만들기 위한 단계

  1. 데이터를 병합할 XML 원본 문서의 종류를 선택합니다. 각 종류의 원본 문서에 대한 대표 예제를 수집합니다.

  2. 기존 InfoPath 양식에 대해 각 종류의 XML 원본 문서에 대한 XML 스키마를 파생합니다. 이 단계는 Backstage의 게시 탭에 있는 원본 파일 내보내기 명령을 사용하여 XML 스키마를 내보내면 쉽게 수행할 수 있습니다. InfoPath에서 만들지 않은 XML 문서의 경우에는 Microsoft Visual Studio와 같은 도구를 사용하여 예제 XML 문서에서 스키마를 만들거나, InfoPath에서 XML 문서를 기반으로 예제 양식을 만든 다음 InfoPath가 해당 문서 구조에서 파생하는 스키마를 내보낼 수 있습니다.

  3. 각 종류의 XML 원본 문서에서 병합할 데이터를 확인합니다. 이 단계는 원본 및 대상 양식 모두에 대한 요구 사항에 거의 전적으로 종속됩니다. 일부 양식의 경우 원본 양식에서 모든 데이터를 복사할 수 있습니다. 또 다른 일부 양식의 경우에는 양식의 원본으로 사용하는 XML 문서에서 한두 개의 요소만 복사할 수도 있습니다. 병합할 데이터를 확인할 때는 원본 및 대상 문서 모두에 대해 특별한 주의를 기울여 두 양식 간에 요소가 논리적으로 매핑되도록 해야 합니다.

  4. 각 종류의 원본 문서에 대해 XSL 변환을 만듭니다. 양식 병합을 구성할 때 이 단계가 대부분의 시간을 차지합니다. XSL 변환의 목적은 원본 XML 문서를 대상 양식과 병합할 수 있는 형식으로 변환하는 것입니다. 변환을 디자인할 때는 XML 위치 경로의 병합을 사용할지 아니면 InfoPath 집계 지침의 병합을 사용할지를 결정합니다.

    Visual Studio는 XSL 변환을 만들 수 있는 편리한 도구입니다. Visual Studio에서는 구문 색 지정 및 문서 개요 기능을 제공합니다. 또한 XSL 요소에 닫는 태그를 자동으로 제공하므로 중복 입력 및 찾기 어려운 맞춤법 오류를 줄이는 데 도움이 될 수 있습니다. 메모장과 같은 텍스트 편집기를 사용하여 XSL 변환을 만들 수도 있습니다.

    항등 변환, 즉 다음과 같이 입력되는 것과 동일한 XML 파일을 출력하는 XSL 변환으로 시작합니다.

    <?xml version="1.0"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:agg="https://schemas.microsoft.com/office/infopath/2003/aggregation" 
    xmlns:target="https://schemas.microsoft.com/office/infopath/2003/aggregation-target" 
    xmlns:my="https://schemas.microsoft.com/office/infopath/2003/myXSD/2003-05-29T20:30:47"> 
    
      <xsl:template match="/"> 
          <xsl:copy> 
          <xsl:apply-templates select="@* | node()" /> 
          </xsl:copy> 
      </xsl:template> 
    
      <xsl:template match="@* | node()"> 
          <xsl:copy> 
          <xsl:apply-templates select="@* | node()" /> 
          </xsl:copy> 
      </xsl:template> 
    
    </xsl:stylesheet>
    

    그런 다음 특별한 처리를 추가할 요소에 대해 재정의 서식 파일 섹션을 추가합니다. 예를 들어 다음 서식 파일은 <src:Task> 요소를 <my:field1> 요소로 변경하고 agg:action 특성의 값을 "replace"로 설정합니다.

    <xsl:template match="src:Task"> 
        <my:field1 agg:select="/my:myFields/my:field1" agg:action="replace"> 
           <xsl:value-of select="."/> 
        </my:field1> 
    </xsl:template>
    
  5. 양식 서식 파일에 XSL 변환 파일 및 스키마 파일을 추가합니다. InfoPath에서 해당 데이터를 병합할 수 있도록 각 종류의 원본 문서에 대한 스키마를 파생하고 각 문서 종류를 변환할 XSL 변환을 만든 후에는 이러한 파일을 양식에 리소스로 추가합니다. 데이터 탭에서 리소스 파일을 클릭하고 리소스 파일 대화 상자에서 추가를 클릭한 다음 해당 스키마 또는 XSL 변환 파일을 찾고 확인을 클릭합니다. 만든 각 스키마 파일 및 XSL 변환에 대해 이 작업을 수행합니다.

    추가하는 스키마에서 targetNamespace 특성을 사용하는 경우 InfoPath가 스키마의 네임스페이스를 인식하도록 양식의 .xsf 파일에 속성 요소를 추가해야 합니다. 이 파일에 액세스하려면 파일 탭에서 게시를 클릭한 다음 원본 파일 내보내기를 클릭합니다. 해당 파일의 위치를 선택하고 확인을 클릭합니다. 그런 다음 디자인하고 있는 InfoPath 양식 서식 파일을 닫습니다.

    추출한 파일에 대해 지정한 위치로 이동하여 파일 확장명이 .xsf인 파일을 찾습니다. 일반적으로 이 파일의 이름은 manifest.xsf입니다. 메모장에서 파일을 열어 스키마에 해당하는 <xsf:file> 태그를 찾고 다음 예와 같이 "namespace" 속성 요소를 추가하여 targetNamespace를 지정합니다.

    <xsf:file name="IndvTasks.xsd"> 
       <xsf:fileProperties> 
          <xsf:property name="fileType" type="string" value="Resource" /> 
          <xsf:property name="namespace" type="string" 
            value="urn:office-microsoft-com:InfoPath-designer-aggregation-IndStatusReport" /> 
       </xsf:fileProperties> 
    </xsf:file>
    
  6. 사용자 지정 병합을 지원하도록 양식을 준비하는 마지막 단계는 양식과 연결된 .xsf 파일에서 importParameters 요소를 업데이트하는 것입니다. 먼저 .xsf 파일에서 <xsf:importParameters> 태그를 찾습니다. 양식을 위해 만든 각 스키마/XSL 변환 쌍에 대해 다음과 같이 xsf:importSource 요소를 xsf:importParameters 요소에 추가합니다. <xsf:importParameters enabled="yes"> <xsf:importSource name="" schema="IndvTasks.xsd" transform="ImportTasks.xsl"></xsf:importSource> </xsf:importParameters>xsf:importSource 요소의 name 특성에는 원본 XML 문서에서 찾을 수 있는 양식 서식 파일의 이름이 포함됩니다. 일반적으로 이 특성은 비워 둘 수 있습니다. schema 특성에는 이전 단계에서 양식 서식 파일에 추가한 스키마 파일의 이름이 포함됩니다. 마지막으로 transform 특성에는 스키마에 맞게 양식을 변환하는 데 사용할 XSL 변환의 이름이 포함됩니다. 사용자 지정 변환은 Merge 이벤트와 함께 사용하거나 단독으로 사용할 수 있습니다.

코드에서 사용자 지정 병합 만들기

Merge 이벤트 처리기를 양식과 연결된 .xsf 파일에 있는 importParameters 요소의 해당 useScriptHandler 특성과 함께 사용하면 코드를 통해 사용자 지정 병합을 만들 수 있습니다. Backstage에서 사용할 수 있는 양식 옵션 대화 상자의 고급 범주에서 사용자 지정 코드를 사용하여 병합 확인란을 선택한 다음 편집 단추를 클릭하면 관리 코드에서 Merge 이벤트를 사용하도록 설정할 수 있습니다.