XSLT

Programming/JAVA 2006. 4. 13. 08:26

XSLT

스타일

  • 문서 구조 및 내용과 포맷(스타일 또는 레이아웃)의 분리
    • DTD + DI (문서) + Stylesheet
    • 문서 구조와 내용의 변경 없이 다양한 모습의 표현이 가능 => 스타일시트만 변경
    • 매체의 종류/특성에 따라 문서 표현 형태를 변환하여 출력 => 스타일시트만 변경
  • 스타일 표준안
    • DSSSL(Document Style Semantics and Specification Language)
      • 1996 ISO 표준,DTD + DI + Stylesheet 분리 개념,for SGML 문서
    • CSS(Cascading Style Sheet)
      • 1996 CSS1, 1998 CSS2, Stylesheet for HTML, XML 에도 적용 가능
    • XSL(eXtensibleStylesheet Language)
      • 1999 XSLT, 2001 XSL, Stylesheet for XML, DSSSL과 유사한 개념
  • XSL(eXtensible Stylesheet Language)의 구성
    • XSLT(XSL Transformations) : 1999.11 버전1.0 (현재 2.0 WD)
    • XPath(XML Path Language) : 1999.11 버전1.0 (현재 2.0 WD)
    • XSL-FO(XSL Formatting Objects) : 2001.10 버전1.0

      사용자 삽입 이미지

XSL 기본 개념
        
사용자 삽입 이미지

  • XSL 의 적용 : 변환 및 스타일의 적용
        
    사용자 삽입 이미지
  • 브라우저(Explorer) 내장 
    • Explorer 6.0 에 내장된 버전 (MSXML 3.0) : XSLT 1.0
    • Explorer 5.x 에 내장된 버전 : WD-xsl 버전 ** 사용시 주의 **

XSLT 기초 예제

  • 예제 1 (문서 출력)
    XML 문서 (ex01.xml)   XSLT 문서 (ex01.xsl)
    <?xml version="1.0" encoding="EUC-KR" ?>
    <?xml-stylesheet   type="text/xsl" 
                              href="ex01.xsl"?>

    <memo>
       <header> 
          <date> 2002. 4. 15. </date>
            <name lang="kr"> 홍길동 </name>
       </header> 
       <body>
          <p> XML 규격제정을 위한 회의가 있으니 참석하여 주시기 바랍니다. </p>
          <p> 회의 참석 여부를 알려 주시기 바랍니다. </p>
       </body>
    </memo>
    <?xml version="1.0" encoding="EUC-KR" ?>

    <xsl:stylesheet version="1.0" 
          xmlns:xsl="http://www.w3.org/1999
    /XSL/Transform">


    <xsl:template match="/">
       <HTML>
          <BODY> <H2>1st Example (H2 지정)</H2> 
                        단순히 변환 (지정 없음)
          </BODY>
       </HTML>
    </xsl:template>

    </xsl:stylesheet>
  • XML 문서에 스타일시트 적용
    • <?xml-stylesheet  type="text/xsl"   href="ex01.xsl"?>
  • XSL 문서의 구조 : 스타일시트 선언
    •  XSL 파일도 역시 하나의 XML 문서
      • xml 선언문
      • 스타일시트 요소 : 루트 요소

       <xsl:stylesheet  version = "1.0"
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      • 교재의 상세한 속성 설명은 생략
    • IE5.0 브라우저에서 실행시에는
      • <xsl:stylesheet  xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    • <xsl:stylesheet>요소의 가능한 자식요소
      • xsl:import,xsl:include, xsl:strip-space, xsl:preserve-space
      • xsl:output, xsl:key, xsl:decimal-format, xsl:namespace-alias
      • xsl:attribute-set, xsl:variable, xsl:param,xsl:template
  • XSLT 기초 예제 2 (문서 변환) 
    ex02.xml   ex02.xsl 
    <?xml version="1.0" encoding="EUC-KR"?>
    <방명록>
       <성명>
          <성>홍</성>
          <이름> 길동 </이름>
       </성명>
       <전자우편>gildong@email.com</전자우편>
       <내용 종류="HTML">안녕하세요? 만나서 반갑습니다. </내용>
    </방명록>
    <?xml version="1.0" encoding="EUC-KR" ?>
    <xsl:stylesheet  version="1.0"  xmlns:xsl= "http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
      <memo>
        <header>
          <xsl:apply-templates select="방명록/성명" />
        </header>
        <body>
          <par><xsl:value-of select="방명록/내용"/></par>
        </body>
      </memo>
    </xsl:template>

    <xsl:template match="성명">
      <name>
       <xsl:value-of select="이름" /> 
      </name>
    </xsl:template>

    </xsl:stylesheet>

    변환 결과 소스
    <?xml version="1.0" encoding="UTF-16"?>
    <memo>
    <header>
    <name> 길동 </name>
    </header>
    <body>
    <par>안녕하세요? 만나서 반갑습니다.</par>
    </body>
    </memo>

기본적인 변환 요소

  • 변환 템플릿을 정의하는 요소

      <xsl:template  match="XSL 패턴">... 변환 템플릿 ...</xsl:template>

    • 소스문서(트리)에서 일치하는 패턴찾기(XSL 패턴 또는 XPath 패턴)
      • 변환 대상의 패턴 지정 및 변환 규칙 정의
    • 속성 : name, priority, mode
  • 요소 내용의 문자열로 변환
      <xsl:value-of  select = "XSL패턴" />
    • 해당 요소의 텍스트 값으로 변환하기
    • <xsl:value-of   select="." /> : 현재 노드의 값으로 변환
  • 변환 템플릿을 적용하는 요소
      <xsl:apply-templates  select = "XSL패턴" />
    • select 에서 변환 대상을 지정 : 대상 패턴을 찾아서 해당하는 변환 규칙을 적용
    • <xsl:apply-templates /> : 모든 자식 요소에 대하여 변환
      • 예) 차이 ?
    <xsl:template match="/">
       <
    name>
         <xsl:apply-templates />
       </
    name>
    </xsl:template>
    <xsl:template match="/">
       <
    name>
         <xsl:apply-templates select="방명록/성명" />
       </
    name>
    </xsl:template>
  • XSLT 작동 원리 :소스트리(Source Tree) 와 결과트리(Result Tree)
    Source Tree   
    사용자 삽입 이미지

     
    <방명록>
       <성명>
          <성>홍</성>
          <이름> 길동 </이름>
       </성명>
       <전자우편>gildong@email.com</전자우편>
       <내용 종류="HTML">안녕하세요? 만나서 반갑습니다. </내용>
    </방명록>
     
    Result Tree 
    <xsl:template match="/">
    사용자 삽입 이미지

    <xsl:template match="성명">

    사용자 삽입 이미지

    최종

    사용자 삽입 이미지

     

     

     

    <memo>
    <header>
     
       ( ..."방명록/성명"... )
    </header>
    <body>
    <par>
      ( ..."방명록/내용"... )</par>
    </body>
    </memo>

    <memo>
    <header>
    <name>
    (..."이름"...)</name>
    </header>
    <body>
    <par>
    안녕하세요? 만나서 반갑습니다. </par>
    </body>
    </memo>

    <memo>
    <header>
    <name>
    길동</name>
    </header>
    <body>
    <par>
    안녕하세요? 만나서 반갑습니다. </par>
    </body>
    </memo>

     

     

     

     

    주의 :
    <xsl:apply-templates/>의 경우
     
    사용자 삽입 이미지

           

    <memo>
    <header>
     
     (.."방명록/성명"..)
     
     (.."방명록/전자우편"..)
     
     (.."방명록/내용"..)
    </header>
    <body>
    <par>
    안녕하세요? 만나서 반갑습니다. </par>
    </body>
    </memo>

     

    최종 :

    <memo>
    <header>
    <name> 길동 </name> gildong@email.com 안녕하세요? 만나서 반갑습니다.
    </header>
    <body>
    <par>
    안녕하세요? 만나서 반갑습니다. </par>
    </body>
    </memo>

결과 트리의 정렬 및 번호

  • 정렬하기
      <xsl:sort  select = "XSL 패턴"  order = "ascending | descending"    
                    data-type = "text | number"   
    case-order = "upper-first | lower-first"/>
    • XSL 패턴에 대해 오름차순 | 내림차순으로 정렬
      • <xsl:apply-templates> 또는 <xsl:for-each>내에서 사용
    • 정렬 예: 데이터가 1, 20, 5, 110 인 경우
      • data-type="text" 이면 1, 110, 20, 5 의 순
      • data-type="number" 이면 1, 5, 20, 110 의 순
    • case-order :대문자 또는 소문자가 먼저?
      • case-order ="upper-first" 이면 A, a, B, b, C, c 의 순
      • case-order ="lower-first" 이면  a, A, b, B, c, C 의 순
  • 번호 매기기

      <xsl:number  format="기호 토큰"  ... />

    • 포맷토큰 : 중간 번호부터 시작 가능
      • 1, 2, 3, 4, ... 01, 02, 03, 04, ... A, B, C, D, ... a, b, c, d, ... I, II, III, IV, ... i, ii, iii, iv, ...

 실습 예제

  • 메모 예제
    메모 스타일 2 메모 스타일 3

    <?xml version="1.0" encoding="EUC-KR" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
      <HTML>
        <BODY>
          <b>[성명]</b>  <xsl:value-of 
                select="memo/header/name"/>
          <br /> <b>[메모]</b> <xsl:value-of
                select="memo/body"/>

        </BODY>
     </HTML>
    </xsl:template>

    </xsl:stylesheet>

    ...
    <xsl:template match="/">
      <HTML> <BODY>
        <xsl:apply-templates
                select="memo/header/name"/>
        <xsl:apply-templates
                select="memo/body" />

      </BODY> </HTML>
    </xsl:template>
     
    <xsl:template match="header/name">
      <b>[성명]</b> <xsl:value-of select="."/>
    </xsl:template>
     
    <xsl:template match="body">
      <br /><b>[메모]</b><xsl:value-of select="."/>
    </xsl:template>
    ...

    메모 스타일 4 (문제점?) 메모 스타일 5 (문제점?)

    <xsl:template match="/">
      <HTML>
        <BODY>
    <xsl:apply-templates />
        </BODY>
      </HTML>
    </xsl:template>
     
    <xsl:template match="memo/header/name">
      <b>[성명]</b> <xsl:value-of select="."/>
    </xsl:template>
     
    <xsl:template match="memo/body">
       <br /><b>[메모]</b>
       <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="/">
      <HTML>
        <BODY>
    <xsl:apply-templates />
        </BODY>
      </HTML>
    </xsl:template>
     
    <xsl:template match="memo//name">
        <b>[성명]</b> <xsl:value-of select="."/>
    </xsl:template>
     
    <xsl:template match="//body">
         <br /> <b>[메모]</b>
         <xsl:value-of select="."/>
    </xsl:template>

    메모 스타일 6 메모 스타일 7

    <xsl:template match="/">
      <HTML>
        <BODY><xsl:apply-templates />
        </BODY>
      </HTML>
    </xsl:template>
     
    <xsl:template match="memo/header">
      <b>[성명]</b>
      <xsl:value-of select="name"/>
    </xsl:template>
     
    <xsl:template match="memo/body">
      <br /> <b>[본문]</b>
      <xsl:value-of select="."/> <br/>
    </xsl:template>

    <xsl:template match="/">
      <HTML>
        <BODY><xsl:apply-templates
                            select="memo//name"/>
            <xsl:apply-templates select="//body"/
    >
        </BODY>
      </HTML>
    </xsl:template>
     
    <xsl:template match="name">
        <b>[성명]</b> <xsl:value-of select="."/>
    </xsl:template>
     
    <xsl:template match="body">
         <br /> <b>[메모]</b> <xsl:value-of select="."/>
    </xsl:template>

  • 주소록 예제
    표 만들기 1 (문제점?) 표 만들기 3

    <?xml version="1.0" encoding="EUC-KR" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
      <HTML><BODY>
      <table border="1">
        <tr>
        <th>이름</th><th>전화</th><th>사진</th>
        </tr>
        <xsl:apply-templates/>
      </table>
      </BODY></HTML>
    </xsl:template>
     
    <xsl:template match="name">
      <td><xsl:value-of select="."/></td>
    </xsl:template>

    <xsl:template match="tel">
      <td><xsl:value-of select="."/></td>
    </xsl:template>
     
    <xsl:template match="pic">
      <td><xsl:value-of select="@img"/></td>
    </xsl:template>
     
    <xsl:template match="entry">
      <tr><xsl:apply-templates/></tr>
    </xsl:template>
     
    </xsl:stylesheet>

    ...
    <xsl:template match="/">
      <HTML><BODY>
      <table border="1">
        <tr> <th>no</th><th>이름</th><th>전화
          </th><th>사진</th> </tr>
        <xsl:apply-templates select="//entry">
             
    <xsl:sort select="name"/>
        </xsl:apply-templates>

      </table>
      </BODY></HTML>
    </xsl:template>
     
    <xsl:template match="entry">
      <tr valign="top">
        <td>
    <xsl:number format="01"/></td>
        <td><xsl:apply-templates select="name"/></td>
        <td><xsl:apply-templates select="tel"/></td>
        <td><xsl:apply-templates select="pic"/></td>

      </tr>
    </xsl:template>
     
    <xsl:template match="name">
       <xsl:value-of select="."/><br/>
    </xsl:template>
    <xsl:template match="tel">
       <xsl:value-of select="."/><br/>
    </xsl:template>
    <xsl:template match="pic">
       <xsl:value-of select="@img"/><br/>
    </xsl:template>

     


Posted by 영웅기삼
,