아이덴티티 변환
Identity transformdata 변환 |
---|
개념 |
변환 언어 |
기술과 변환 |
적용들 |
관련된 |
ID 변환은 원본 데이터를 변경하지 않고 대상 데이터로 복사하는 데이터 변환입니다.
ID 변환은 재사용 가능한 변환 라이브러리를 만드는 데 필수적인 프로세스로 간주됩니다.베이스 아이덴티티 변환의 다양한 라이브러리를 작성함으로써 다양한 데이터 변환 필터를 쉽게 유지할 수 있다.이러한 필터는 UNIX 쉘 파이프와 유사한 형식으로 체인으로 연결할 수 있습니다.
재귀 변환의 예
"재귀 포함 복사"를 사용하면 코드의 작은 부분을 변경하여 완전히 새로운 출력과 다른 출력을 생성하고 입력을 필터링 또는 업데이트할 수 있습니다.「재귀에 의한 동일성」을 이해하면, 필터를 이해할 수 있습니다.
XSLT 사용
(XSLT 버전 1.0의 경우) 가장 자주 인용되는 ID 변환의 예는 XSLT에서 표현되는 "copy.xsl" 변환입니다.이 변환에서는 xsl:copy[1] 명령을 사용하여 ID 변환을 수행합니다.
<xsl: 스타일시트 버전="1.0" xmlns: xsl="http://www.w3.org/1999/XSL/Transform"> <xsl: 개요 일치="@* node()"> <xsl:copy> <xsl: sysl-module 선택="@* node()"/> </xsl:복사> </xsl: 삭제> </xsl: 스타일시트>
이 템플릿은 모든 어트리뷰트(@*)와 기타 노드(node())를 대조하여 일치하는 각 노드를 복사한 후 컨텍스트노드의 모든 어트리뷰트 및 자녀 노드에 ID 변환을 적용합니다.이는 요소 트리를 재귀적으로 하강시키고 XPath 데이터 모델에서 중요하다고 간주되는 정보의 제한 범위 내에서 원래 파일에서 발견된 것과 동일한 구조의 모든 구조를 출력합니다.node()는 텍스트, 처리 명령, 루트 및 코멘트 및 요소와 일치하므로 모든 XML 노드가 복사됩니다.
ID 변환의 보다 명확한 버전은 다음과 같습니다.
<xsl: 스타일시트 버전="1.0" xmlns: xsl="http://www.w3.org/1999/XSL/Transform"> <xsl: 개요 일치="@* * processing-instruction() comment()"> <xsl:copy> <xsl: sysl-module 선택="* @* text() processing-instruction() comment()"/> </xsl:복사> </xsl: 삭제> </xsl: 스타일시트>
이 버전은 첫 번째 버전과 동일하지만 복사할 XML 노드의 유형을 명시적으로 열거합니다.두 버전 모두 대부분의 XML 사용에 불필요한 데이터(예: 주석)를 복사합니다.
XSLT 3.0
XSLT 3.0은[2] 다음 명령어의 no-no-match 속성을 지정합니다.xsl:mode
명시적인 템플릿규칙으로 구현되지 않고 아이덴티티 변환을 선언할 수 있는 명령입니다.구체적으로는:
<xsl: 스타일시트 버전="3.0" xmlns: xsl="http://www.w3.org/1999/XSL/Transform"> <xsl: 모드 일치하지 않음="복사" /> </xsl: 스타일시트>
는 기본적으로 이전의 템플릿 규칙과 동일합니다.상세한 것에 대하여는, XSLT 3.0 표준의 얕은[3] 카피의 설명을 참조해 주세요.
마지막으로, CDATA 섹션의 사용이나 속성의 순서 등 마크업 상세 정보는 XPath 데이터 모델의 일부가 아니기 때문에 출력에 반드시 보존되는 것은 아닙니다.출력에 CDATA 마크업을 표시하려면 (ID 변환 템플릿 자체가 아닌) ID 변환 템플릿을 포함하는 XSLT 스타일시트에서xsl:output
호출된 속성cdata-section-elements
.
cdata-section-elements
에 CDATA 섹션을 사용하여 텍스트노드 자녀 이름을 출력하는 요소의 이름을 나타냅니다.[1] 예를 들어 다음과 같습니다.
<xsl: 출력 방법="xml" 부호화='utf-8' cdata-section-discl="flash-name-1 element-name-2"/>
XQuery 사용
XQuery는 재귀 함수를 정의할 수 있습니다.다음 예제 XQuery 함수는 수정 없이 입력을 출력에 직접 복사합니다.

선언하다 기능. 로컬: 복사($요소 ~하듯이 요소()) { 요소 {노드명($요소)} {$요소/@*, 위해서 $어린아이 에 $요소/노드() 돌아가다 한다면 ($어린아이 사례 의 요소()) 그리고나서 로컬: 복사($어린아이) 또 다른 $어린아이 } };

타입스위치 스타일 변환을 사용하여 동일한 기능을 수행할 수도 있습니다.
쿼리 버전 "1.0"; (: 입력을 변경하지 않고 출력에 복사합니다. : ) 선언하다 기능. 로컬: 복사($입력 ~하듯이 아이템()*) ~하듯이 아이템()* { 위해서 $노드 에 $입력 돌아가다 타이프 스위치($노드) 사례. 문서 노드() 돌아가다 문서 { 로컬: 복사($노드/노드()) } 사례. 요소() 돌아가다 요소 {이름.($노드)} { (: 이 요소의 각 속성을 출력합니다). 위해서 $att 에 $노드/@* 돌아가다 기여하다 {이름.($att)} {$att} , (: 이 요소의 모든 서브패킷을 재귀적으로 출력합니다). 위해서 $어린아이 에 $노드 돌아가다 로컬: 복사($어린아이/노드()) } (: 그렇지 않으면 통과시킵니다.텍스트(), 댓글 및 PI에 사용됩니다. 체납 돌아가다 $노드 };
특수한 처리가 필요한 요소에 대한 케이스 스테이트먼트를 추가하는 것만으로 간단하게 변경할 수 있기 때문에 타입 스위치 변환이 바람직할 수 있습니다.
비재귀 변환
심플하고 알기 쉬운 2개의 "모두 복사" 변환.
XSLT 사용
<xsl: 스타일시트 버전="1.0" xmlns: xsl="http://www.w3.org/1999/XSL/Transform"> <xsl: 개요 일치="/"> <xsl: 복사 선택="."/> </xsl: 삭제> </xsl: 스타일시트>
XProc 사용
<p: 삭제 이름="실패" xmlns:p="http://www.w3.org/ns/xproc"> <p:controll/> </p: 삭제>
여기서 XProc ID에 대한 중요한 주의사항은 다음과 같은 하나의 문서 또는 일련의 문서를 입력으로 사용할 수 있다는 것입니다.
보다 복잡한 예
일반적으로 ID 변환은 로컬 변경을 할 수 있는 기준으로 사용됩니다.
명명된 요소 변환 제거
XSLT 사용
ID 변환은 지정된 노드를 제외한 입력 트리에서 출력 트리로 모든 것을 복사하도록 수정할 수 있습니다.예를 들어, 다음은 사회보장번호를 제외한 입력에서 출력으로 모든 것을 복사합니다.
<xsl: 개요 일치="@* node()"> <xsl:copy> <xsl: sysl-module 선택="@* node()"/> </xsl:복사> </xsl: 삭제> <!--모든 사회보장번호 삭제 --> <xsl: 개요 일치="퍼스널 SSNID"/>
XQuery 사용
선언하다 기능. 로컬: copy-filter-module($요소 ~하듯이 요소(), $요소명 ~하듯이 x: 문자열*) ~하듯이 요소() { 요소 {노드명($요소) } { $요소/@*, 위해서 $어린아이 에 $요소/노드()[것은 아니다.(이름.(.)=$요소명)] 돌아가다 한다면 ($어린아이 사례 의 요소()) 그리고나서 로컬: copy-filter-module($어린아이,$요소명) 또 다른 $어린아이 } };
이것을 호출하려면 다음과 같이 입력합니다.
$필터링된 출력의 := 로컬: copy-filter-module($입력, '퍼스널 SSNID')
XProc 사용
<p: 삭제 이름="실패" xmlns:p="http://www.w3.org/ns/xproc"> <p:controll/> <p: 삭제 일치="퍼스널 SSNID"/> </p: 삭제>
「 」를 참조해 주세요.
추가 정보
- XSLT Cookbook, O'Reilly Media, Inc., 2002년 12월 1일, Sal Mangano, ISBN0-596-00372-2
- Priscilla Walmsley, XQuery, O'Reilly Media, Inc., 8장 함수 – 재귀 함수 – 109페이지