관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

XSL 템플릿 본문

프로그래밍/XML

XSL 템플릿

님투 2009. 1. 3. 08:46
반응형

XSL의 탬플릿 룰
문서의 특정 구조를 다른 구조를 바꾸는 방법. 
XSL이란 결국 탬플릿들의 집합이며 탬플릿 자체가 사용이 되는건
XML > [*.XSL] > 변환 문서
거의 대부분 match란 속성을 갖고 이 녀석은 XPath 표현으로 원본의 XML 특정노드를 찾아서 output 시켜줍니다.


XML 파일

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="temXSL.xsl"?>
<booklist>
 <book id="b1" kind="">
       <title>C#.NET</title>
       <author>홍길동</author>
       <publisher>길동출판사</publisher>
       <price>100</price>
 </book>
 <book id="b2" kind="">
       <title>ASP.NET</title>
       <author>마징가</author>
       <publisher>징가출판사</publisher>
       <price>200</price>
 </book>
 <book id="b3" kind="">
       <title>XML.NET</title>
       <author>슈퍼맨</author>
       <publisher>퍼맨출판사</publisher>
       <price>300</price>
 </book>
 <book id="b4" kind="">
       <title>ADO.NET</title>
       <author>베트맨</author>
       <publisher>트맨출판사</publisher>
       <price>400</price>
 </book>
 <book id="b5" kind="">
       <title>NG.NET</title>
       <author>소심맨</author>
       <publisher>심맨출판사</publisher>
       <price>500</price>
 </book>
</booklist>

   

XSL 파일

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
          <html>
     <head>
      <title>문서변환</title>
     </head>
     <body>
          <h2 style="color:blue">Our Book List</h2>
          <table border="1" width="300px">
        <body>
         <tr>
               <td>id</td>
               <td>title</td>
               <td>author</td>   
               <td>kind</td>
               <td>price</td>
         </tr>
         <tr>
               <td><xsl:value-of select="booklist/book[position()=2]/title" /></td>
               <td><xsl:value-of select="booklist/book[position()=2]/author" /></td>
         </tr>     
    
       
첫번째 방법 (book의 내용을 모두 가져옴)
template을 전역적인 위치에 선언이 가능.
어딘가에 있는 글로벌 수준에 선언된 book을 찾아가며 이 위치에 반환.
위에서부터 읽어오다가 밑의 구문을 만나면 바깥에 선언된 book을 찾아와서 반환.
제어가 book쪽으로 가서 book부분을 읽어들이며, 중요한 것은 value of로 읽는데 상대경로가 title이고 title은 book의 자식입니다. 

그래서 book의 자식인 title을 반환시키고 또 book의 자식인 author를 반환시킵니다.

한번 반환을 하면 다시 이쪽으로 제어가 이동하고 다시 book를 또 찾습니다.
이 때는 자동으로 두번째 book을 가르키며, 이런식으로 5번 체크합니다.
마치 '메소드'와 같이 이용되는걸 알 수 있으며, XSLT 변환작업의 종류중 가장 많이 사용합니다. 
         <xsl:apply-templates select="booklist/book" />
         
두번째 방법 (book의 내용중 author가 '홍길동'인것만 가져옵니다.)
         <xsl:apply-templates select="booklist/book[author='홍길동']" />

세번째 방법 (book의 내용중 2번째 이상인 경우만 가져옵니다.)
같은 값이 여러 표현으로 쓰여야 할때 mode로 각각에 이름을 부여하고 호출시에 구분자인 mode 값을 바꿔가며 호출하면 간단히 여러가지의 표현을 할 수 있습니다.
         <xsl:apply-templates select="booklist/book[position() > 2]" mode="modeA"/>
        </body>
       </table>
       <br />


네임값을 갖은 템플릿을 부르는 방법
apply랑 다른점은 반복이 없이 한번만 호출되며 노드에 대한 표시가 없습니다.
즉, 문서변환작업이 아닌 새로운 문서에서 일부분을 분리시키고자 할 때 사용합니다.
         <xsl:call-template name="tCompany" />

     </body>
    </html>
</xsl:template>
   


항상 시작 탬플릿을 제외한 노드는 상대경로를 가집니다.
    <xsl:template match="book" mode="modeA">
         <tr>
        <td><xsl:value-of select="@id" /></td>

         book의 자식인 속성 @id를 가져오고자 할 때


        <td><xsl:value-of select="title" /></td>
        <td><xsl:value-of select="author" /></td>       
        <td><xsl:value-of select="@kind" /></td>

         book의 자식인 속성 @kind를 가져오고자 할 때


        <td><xsl:value-of select="@price" /></td>

         book의 자식인 속성 @price를 가져오고자 할 때


         </tr>
    </xsl:template>
    <xsl:template match="book" mode="modeB">
         <tr>
        <td>제목 : <xsl:value-of select="title" /></td>
        <td>저자 : <xsl:value-of select="author" /></td>       
         </tr>
    </xsl:template>    

   

    밑의 구문은 독립적으로 사용을 못하며 누군가 호출을 해야만 사용가능 합니다.    
    <xsl:template name="tCompany">
        <hr />
        Copyright ....   
    </xsl:template>
</xsl:stylesheet>

 

반응형

'프로그래밍 > XML' 카테고리의 다른 글

XSL과 XPath  (0) 2009.01.03
AJAX ? XML 처리를 이용해서 RSS리더기 만들기  (0) 2007.11.03
W3C(XML)  (0) 2007.10.28
Comments