본문 바로가기

Develop/XML & XSL

XSL 강좌, 레퍼런스,간단한 정리

XSL 강좌, 레퍼런스,간단한 정리


CSS 에서는 엘리먼트의 데이터만 출력 가능하다.

CSS 에서는 한글을 지원하지 않기 때문에 엘리먼트 명을 한글로 하지 않도록 한다.

 

스타일 시트(CSS)의 문제점과 XSL

1.CSS 는 출력내용을 XML문서 구조 그대로 출력한다.

2.CSS 는 XML 문서에 없는 내용이나 계산된 결과 출력 불가능

3.CSS 는 XML 문서의 모든 내용 출력 불가능

 

XSL (Extensible Stylesheet Language)

1.XSLT (XSL Transformation)

  A.XML 문서의 구조를 다른 구조로 변환시키는 마크업 언어

    ex) XML -> HTML, XML -> WML, XML -> XML

2.XPath (XML Path Language)

  A.XML 문서 내에서 특정 파트(element, attribute)를 찾아가기 위해 사용되는 경로 표기 언어

  B.XSLT와 XPointer를 사용하기 위해 설계

3.XSL-FO (XSL Formatting Objects)

  A.Formatter를 통해서 XML 문서를 비 XML 문서로 변환

  B.변환될 XML 문서는 XSL-FO 마크업 언어로 작성되어야 한다.

 

 

XSL 처리과정

1.Transformation : XML 문서에서 다른 구조의 XML 문서로 구조를 변환하는 과정

2.Formatting : XML 문서를 비 XML 문서로 변환하는 과정

 

Transformation

- 특정 마크업 언어로 작성된 XML 문서를 다른 마크업 언어로 작성된 XML 문서로 바꾸는 것을 말한다.

- XSL 변환기의 결과물은 파일형태의 문서가 아니라, 메모리 상에서 트리를 이루는 DOM 객체들로 생성된다.(Result tree)

- 처리과정을 담당하는 XSL Transformer 는 XSL Processor 프로그램에 포함

 

Formatting

- XML 권고안 문법을 따라 작성된 텍스트 형식의 파일이 아닌 특정 포맷 형식으로 작성된 문서로 XML 문서를 변환

- XML 문서는 XSL-FO 언어로 작성해야 한다.

- 처리과정을 담당하는 XSL Formatter 는 XSL Processor 프로그램에 포함

- 만약 XML 문서가 XSL-FO 언어로 작성되어 있지 않다면, XSL 변환기를 거쳐서 XSL-FO 문서구조로 변경하고 Formatting 과정을 처리

 

XSL Processor

- XSL 변환기와 Formatter 기능이 함께 있는 프로그램을 뜻한다.

- 하지만 현재 나와있는 XSL Processor 는 XSL 변환 기능만 구현 (XSL-FO 권고안이 XSL 변환기에서 사용하는 XSLT 보다 늦게 권고안으로 채택)

 

XSL 문서의 루트 엘리먼트

  1.루트 엘리먼트

    A.stylesheet (주로 사용)

      - transform 을 사용할 수도 있다.(차이는 없음)

    B.접두사는 관례상 xsl를 사용

    C.xmlns:xsl=http://www.w3.org/1999/XSL/Transform

    D.<?xml version="1.0" encoding="euc-kr" ?>

      <xsl:stylesheet version="1.0" 

        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        자식 엘리먼트 (최상위 엘리먼트)

      </xsl:stylesheet>

     

  2.루트 엘리먼트의 자식 엘리먼트

    A.최상위 엘리먼트라고도 한다.

    B.XSL 문서의 결합과 관련된 최상위 엘리먼트

    - Import

    - Include

    C.Result Tree 문서 종류를 결정하는 최상위 엘리먼트

     - Output

    D.Result Tree 엘리먼트 내용을 담고 있는 최상위 엘리먼트

      - *template

    E.기타 최상위 엘리먼트

      - strip-space

      - preserver-space

      - key

      - decimal-format

      - variable

      - param

      - attribute-set

 






 

1.output 엘리먼트

  - Result Tree의 문서 종류를 지정

  - 종류 뿐만 아니라 XML  선언 등 기타 설정도 가능

  - <xsl:output 속성명="값" 속성명="값…"/>

  - method : 문서 종류를 지정 (xml, html, text…) 생략되었을 경우 루트 엘리먼트가 html 이면 html이 기본값, 루트엘리먼트가 html이 아니면 xml이 기본값이다.

  - version : XML 문서일 경우 version 표기

  - encoding : 인코딩 방식 지정

  - standalone : 외부 문서 참조 (yes, no)

  - indent : 화이트 스페이스 포함여부 (yes, no)

  - doctype-public : public 식별자 지정

  - doctype-system : system 식별자 지정

  - *method가 생략될 경우 Result Tree의 루트 엘리먼트가 네임스페이스 접두사가 없는 html 일 경우 method="html" 이고 그 외에는 전부 method="xml"이 기본값이다.


2.Template Rule

  - 어떤 구조를 다른 구조로 바꾸는 방법

  - XML 문서에서는 원본 XML 문서의 특정 노드(엘리먼트)를 다른 구조의 노드(엘리먼트)로 바꾸는 실제 내용이 기술된다.

  - 여러 개의 Template Rule로 원본 XML 노드 구조를 새로운 노드 구조로 바꾸는 처리를 한다.

  - Template는 엘리먼트 단위로 변환을 적용하며 변환 대상은 노드와 노드셋이다.

  - 노드 및 노드셋

    - 트리 구조에서 사용되는 용어 (매듭부분)

    - XML 문서 구조가 트리구조라 XML 문서의 구성요소를 노드라 표현

    - 루트노드 (Root Node) : XML 문서 자체를 뜻하는 노드

    - 엘리먼트 노드 (Element Node) : 루트 엘리먼트를 포함해서 자식 엘리먼트를 뜻하는 노드

    - 텍스트 노드 (Text Node) : 데이터 부분을 뜻하는 노드

    - 노드셋 (NodeSet) : 같은 엘리먼트 이름을 가지고 있는 노드들…

  - Template Rule 정의

    - 보통 XML 문서에서 변환될 대상 노드 숫자만큼 Template Rule 정의

    - <?version="1.0" encoding="UTF-8"?>

      <xsl:stylesheet 

           version="1.0" 

           xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

           <!-- Template Rule -->

           <xsl:template match="원본 XML문서의 대상 노드 지정">

                대상 노드 대신에 대치되는 새로운 노드 내용

           </xsl:template>

           <!-- Template Rule -->

           <xsl:template match="원본 XML문서의 대상 노드 지정">

                대상 노드 대신에 대치되는 새로운 노드 내용

           </xsl:template>

      </xsl:stylesheet>

    - Template 하위로 다른 Template가 바로 올 수 없고 하위에 넣으려면 독립된 Template를 만든 후 참조해서 넣어야 한다.

    - match 속성 값 : 원본 XML문서에서 변환되어야 할 대상 노드를 지정하는 패턴(Pattern)이 온다.패턴에는 XPath 표현식 중 한 개의 노드 또는 노드셋을 가리키는 표현식이 온다.

    - / : 문서 자체를 뜻하는 루트 노드

    - /노드명/…/노드명 : 특정 경로를 가지는 노드 or 노드들

    - //노드명 or 노드명 : 경로와는 상관없이 동일한 이름의 노드 or 노드들

    - /노드명/노드명[@속성명='속성값'] : 특정 속성값을 가지는 노드 or 노드들

    - /노드명/노드명[@속성명!='속성값'] : 특정 속성값을 가지지 않는 노드 or 노드들

    - ex) <xsl:template match="/">...</xsl:template>

         <xsl:template match="//book">...</xsl:template>

         <xsl:template match="book">...</xsl:template>

         <xsl:template match="/booklist/book/title">...</xsl:template>

         <xsl:template match="/booklist/book[@kind='computer']">...</xsl:template>


  - Template Rule 적용

    - 해당 Template Rule을 통해 변환된 내용을 Result Tree의 어는 부분에 포함할 것인지 알려준다.

    - XSL 변환기가 XSL문서를 해석해서 원본 XML 문서를 변환시킬 때 제일 먼저 Template Rule의 match 속성에 루트 노드("/")가 지정된 Template를 찾아서 적용시킨다.

    - <xsl:template match="/">...</xsl:template>

    - 위의 Template Rule이 일종의 시작 Template Rule이다.

    - 시작 Template Rule이 포함하고 있는 내용

      1.Result Tree의 루트 엘리먼트 및 기타 자식 엘리먼트

      2.다른 Template Rule의 적용

        A.ex)

          <xsl:template match="/">

            <루트엘리먼트>

              <엘리먼트>

                다른 Template Rule 적용

                  …

                다른 Template Rule 적용

                  …

              </엘리먼트>

            </루트엘리먼트>

          </xsl:template>

        B.다른 Template Rule 적용 : xsl:apply-templates

          <xsl:apply-templates select="원본 XML 문서의 대상 노드 지정"/>

            i.xsl:apply-templates의 select에서 참조되는 Template를 가리키는 것이 아니라 원본의 대상 노드를 가리키는 것에 주의.이유는 아래 적용순서를 이해하면 된다.

        C.xsl:apply-templates 적용순서

            i. select 속성에 지정된 대상 노드를 찾는다.

            ii. 대상 노드를 match 값으로 가지고 있는 Template Rule을 찾아서 적용한다.

            iii. 적용 후 변환된 내용을 xsl:apply-templates 엘리먼트와 대치 시킨다.

            ** 만약 select 속성이 생략되면 모든 Template Rule을 적용시켜 변환된 내용을 xsl:apply-templates 엘리먼트와 대치시킨다.

        D.Template Rule의 name 속성

            i. name 속성이 지정된 Template Rule은 원본 XML 문서 노드를 변환시키는 것이 목적이 아니라 XSL 문서 내에서 반복해서 자주 적용되는 내용을 재사용하기 위해서 사용한다.XSL 문서 작성량을 줄이기 위한 수단.

            ii. Template Rule은 반드시 match 또는 name 둘 중 하나를 기술해야 한다.

            iii.<xsl:template name="Template Rule 명">

                반복되는 내용

                </xsl:template>

            iv.Template Rule 명은 QName을 기술한다.다른 Template Rule에서 참조할 때 사용

            v.참조 방법은 xsl:apply-templates 대신에 xsl:call-template를 사용한다.

            vi.<xsl:call-template name="Template Rule 명"/>

        E.Template Rule priority 속성

            i.원본 XML 문서의 대상 노드를 변환시키는 Template Rule이 여러 개가 있을 경우 우선순위가 높은 Template Rule을 적용시키도록 하는 속성값

            ii.<xsl:template match="노드 XPath" priority="우선순위 번호">

                …

              </xsl:template>

            iii.우선순위 번호 : 음수 or 양수의 실수 값이 온다.높은 수가 우선순위가 높다.

            iv.**name 속성을 갖는 Template에는 적용불가, 적용(match) Template에서만 사용한다.

            v.응용 – 게시판의 공지나 최근 글을 강조하고자 할 때…

                  게시판 답변글을 표현할 때…

                  여러 카테고리의 아이템을 같이 출력할 때 등…

        F.Template Rule의 mode 속성

            i.일반적으로 match 속성 값이 동일한 Template Rule을 여러 개 두는 경우는 별로 없다.경우에 따라 변환 내용을 달리해야 하는 경우 Template Rule을 여러 개 정의해서 적용하는 것도 가능

            ii.mode 이름으로 구별해서 각각의 Template Rule을 적용

            iii.<xsl:template match="노드 XPath" mode="모드명">

                …

                </xsl:template>

            iv.name 속성을 갖는 template에는 적용 불가.적용(match) template 에서만 사용한다.

            v.실제 구분해서 적용하려면 xsl:apply-templates에서 mode를 기술한다.

            vi.<xsl: apply-templates select="노드 XPath" mode="모드명"/>

            vii.응용 : 조건별 서식, 홀짝수 구분, 부분합 표시 등…





원본 XML문서의 내용 가져오기

  1.엘리먼트의 content 내용 및 속성 값 가져오기

    A.원본 XML문서에서 엘리먼트 content 내용 가져오기

    B.<xsl:template match="원본 XML 문서 대상 노드 지정">

        <xsl:value-of select="대상 노드의 자신 or 자식 노드명[note1]"/>

      </xsl:template>

    [1] 위의 Template의 match안에 있는 XPath를 기준으로 한 상대경로로 표기

    C.<xsl:value-of select=" "/>은 대상 노드의 자식 노드의 content 내용을 가져와서 그 자리에 대치시키는 엘리먼트이다.

    D.대치되는 content 내용이 숫자일 경우 포맷팅도 가능…

      <xsl:value-of select="format-number(자식노드명,'포맷형식')"/>

    E.가져올 데이터가 속성값일 경우…

      <xsl:value-of select="@대상 노드의 속성명"/>

    F.value-of의 select에 절대경로를 쓰면 처음 나온 값만을 반복해서 똑같이 나오게 된다.반복되면서 각각의 값을 가져오려면 반드시 상대경로로 기술해야 한다.

  2.엘리먼트 및 속성을 복사해서 가져오기

    A.원본 XML 문서를 다른 구조의 XML문서로 변환할 때 일부 노드들은 결과 트리에서 구조변경 없이 그대로 사용되어질 경우.

    B.일부분을 복사해서 결과트리에 붙여 사용한다.

    C.<xsl:template match="원본 XML 문서 대상 노드 지정">

        <xsl:copy-of select="복사할 자식 노드명 or @속성명"/>

      </xsl:template>

   

 

정렬하기

  - 원본 XML 노드의 값을 정렬된 상태로 결과트리를 생성할 때

  - xsl:sort

  - <xsl:apply-templates match="원본 XML 문서 대상 노드 지정">

      <xsl: sort

           select="정렬 대상이 될 노드명 or @속성명"

           data-type="정렬 대상 데이터 유형('text' | 'number')"

           order="정렬 방식 ('ascending' | 'descending')"

           />

  </xsl:apply-templates>

  - 먼저 원본 XML 문서의 대상 노드를 정렬시티고, 그 후에 Template Rule을 적용시켜 변환한다.

  - Data-type의 기본값은 text 이다.숫자정렬이면 반드시 number로 지정

  - ** xsl:sort는 xsl:apply-templates 나 xsl:for-each의 자식 엘리먼트로만 사용 가능하다 (반복되는 형태에서만 가능)

  - <xsl:apply-templates select="원본 XML 문서 대상 노드 지정">

      <!-- 1차 정렬 -->

      <xsl: sort select=" "/>

      <!-- 2차 정렬 -->

      <xsl: sort select=" "/>

    </xsl:apply-templates>

   

번호 매기기

  - XSL 변환기가 Result Tree를 만들 때 자동으로 번호를 삽입할 수 있는 기능

  - xsl:number

  - <xsl:template match="원본 XML 문서 대상 노드 지정">

      <xsl:number format="번호 형식"/>

    </xsl:template>

  - 번호 형식 : 1, a, A, i, I, (1), [1], 1), - 1 -…

 

제어 엘리먼트

  1.xsl:if

    A.프로그래밍 언어에서 if문과 동일

    B.조건식을 평가하여 true면 변환내용을 적용하고 false이면 변환내용을 적용하지 않는다.

    C.<xsl:template match="원본 XML 문서 대상 노드 지정">

        <xsl:if test="조건식">

            변환 내용

        </xsl:if>

      </xsl:template>

    D.조건식 : 참과 거짓을 반환하는 XPath 표현식이 온다.

      i.노드명="문자열" : 컨텐트 내용이 문자열이면 true

      ii.@속성명="속성값" : 속성값이 일치하면 true

      iii.@속성명!="속성값" : 속성값이 불일치하면 true

      iv.starts-with(노드명, "문자열") : 노드의 content내용이 "문자열"로 시작하면 true

      v.contains(노드명, "문자열") : 노드의 content내용이 "문자열"을 포함하면 true

  2.xsl:choose

    A.여러 조건식을 평가해서 참을 돌려주는 조건식을 포함한 변화 내용만 적용

    B.<xsl:template match="원본 XML 문서 대상 노드 지정">

        <xsl:choose>

            <xsl:when test="조건식1">

                변환 내용1

            </xsl:when>

            <xsl:when test="조건식2">

                변환 내용2

            </xsl:when>

                …

            <xsl:otherwise test="조건식3">

                변환 내용3

            </xsl:otherwise>

        </xsl:choose>

      </xsl:template>

    C.otherwise는 생략가능

  3.xsl:for-each

    A.대상노드의 숫자만큼 반복해서 변환내용을 적용시킨다.

    B.Template Rule과 비슷한 동작을 한다.

    C.<xsl:template match="원본 XML 문서 대상 노드 지정">

        <xsl:for-each select=" 원본 XML 문서 대상 노드 지정 ">

            <!—정렬 -->

            <xsl:sort ../>

            변환 내용 기술

        </xsl:for-each>

      </xsl:template>

    D.외부 Template Rule을 사용하지 않아도 된다.정렬도 가능하다.단, 재사용은 할 수 없다.Template 보다 빠르다.

 

변수 & 파라미터

  - xsl:variable

  - <xsl:variabe name="변수명" select="변수값"/>

  - <xsl:variabe name="변수명">변수값</xsl:variable>

  - 변수값은 select 속성이나 엘리먼트 데이터 값으로 할당 가능

  - ** 변수값이 문자열일 경우 반드시 " "로 묶어 준다.그렇지 않으면 노드명으로 인식한다.

  - 빈 문자값

  - <xsl:variabe name="변수명"/>

  - <xsl:variabe name="변수명" select="' '"/>

  - 변수값이 단순 문자열이고 Result Tree의 엘리먼트 컨텐트 내용으로 사용될 때…

  <엘리먼트><xsl:value-of select="$변수명"/></엘리먼트>

  - 변수값이 단순 문자열이고 Result Tree의 속성값으로 사용될 때…

  속성명="{$변수명}"

  - 변수값이 단순 문자열이고 XPath 표현식에서 사용될 때…

  [노드명=$변수명] or [@속성명=$변수명]

  - 변수값이 Result Tree의 일부분을 이루는 엘리먼트들로 구성되었을 경우…

  <엘리먼트><xsl:copy-of select="$변수명"/></엘리먼트>

  - 변수의 사용 범위

  1.글로벌 변수 : 최상위 엘리먼트로 작성(stylesheet의 자식), 모든 Template Rule 에서 사용 가능

  2.로컬 변수 : Template Rule 내에서 작성, 해당 Template Rule 안에서만 사용 가능


  젬스송(http://www.zvon.org/xxl/XSLTutorial/)


출처 - http://dev.itstar.co.kr/jamessong/?document_srl=589

'Develop > XML & XSL' 카테고리의 다른 글

XSL (eXtensible Stylesheet Language) 이란?  (0) 2016.11.21
xsl arabic RTL 적용 관련  (0) 2016.11.21
XSL 간단정리  (0) 2016.11.21