사용자 도구

사이트 도구


kb:xslt

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:xslt [2014/11/07 13:40] (현재)
줄 1: 줄 1:
 +====== XSLT ======
 +Extensible Stylesheet Language for Transformation
 +
 +XML을 다른 포맷(다른 XML도 포함)으로 변환하는 데 사용되는 파일 형식(언어?​)이다. 내부적으로 XSL, XPath, XSL-FO를 사용한다.
 +
 +
 +====== XML을 HTML로 변환하기 ======
 +예를 들어 다음과 같은 XML 파일이 있다고 하자.
 +
 +**iteminfo.xml**
 +<code xml>
 +<?xml version="​1.0"​ encoding="​Windows-1252"?>​
 +<​ItemInfos>​
 +    <​MACE>​
 +        <​Item>​
 +            <​Type>​1</​Type>​
 +            <​Name>​Light Club</​Name>​
 +            <​Price>​1</​Price>​
 +            <​RequiredLevel>​1</​RequiredLevel>​
 +            <​RequiredJob>​KT_PANZER_NEWBIE,​KT_PANZER,​KT_HIGHER_PANZER,​KT_DARK_PANZER</​RequiredJob>​
 +            <​Slot></​Slot>​
 +            <​Traits>​
 +                <Element ItemTrait="​MIN_DAMAGE" ​  ​Amount="​2"/>​
 +                <Element ItemTrait="​MAX_DAMAGE" ​  ​Amount="​5"/>​
 +                <Element ItemTrait="​TOHIT" ​       Amount="​4"/>​
 +                <Element ItemTrait="​MIN_RANGE" ​   Amount="​20"/>​
 +                <Element ItemTrait="​CRITICAL" ​    ​Amount="​5"/>​
 +            </​Traits>​
 +            <​MaxStack>​1</​MaxStack>​
 +        </​Item>​
 +        ...
 +    <​MACE>​
 +    <​SWORD>​
 +    ...
 +    </​SWORD>​
 +    ...
 +</​code>​
 +
 +이 파일에서 MACE 노드 안에 있는 내용들을 테이블 형식으로 예쁘게 보고 싶다고 하자. 그러기 위해서는 먼저 XSLT 파일을 작성해야한다.
 +
 +**transform.xsl**
 +<code xml>
 +<?xml version="​1.0"?> ​
 +<​xsl:​stylesheet version="​1.0" ​
 +xmlns:xsl = "​http://​www.w3.org/​1999/​XSL/​Transform"> ​
 +<​xsl:​template match="/​ItemInfos"> ​
 +<​HTML> ​
 +<​HEAD> ​
 +    <​TITLE>​ItemInfo</​TITLE> ​
 +</​HEAD> ​
 +<​BODY> ​
 +    <​H1>​MACE</​H1>​
 +    <table border="​1"​ cellpadding="​0"​ cellspacing="​0">​
 +    <tr>
 +        <​th>​Type</​th>​
 +        <​th>​Name</​th>​
 +        <​th>​Price</​th>​
 +        <​th>​Required Level</​th>​
 +        <​th>​Required Job</​th>​
 +        <​th>​Slot</​th>​
 +        <​th>​Traits</​th>​
 +        <​th>​Max Stack</​th>​
 +    </tr>
 +    <​xsl:​for-each select="​MACE/​Item">​
 +        <tr>
 +            <​td><​xsl:​value-of select="​Type"/></​td>​
 +            <​td><​xsl:​value-of select="​Name"/></​td>​
 +            <​td><​xsl:​value-of select="​Price"/></​td>​
 +            <​td><​xsl:​value-of select="​RequiredLevel"/></​td>​
 +            <​td><​xsl:​value-of select="​RequiredJob"/></​td>​
 +            <​td><​xsl:​value-of select="​Slot"/></​td>​
 +            <td>
 +                <table border="​0"​ cellpadding="​0"​ cellspacing="​0">​
 +                <​xsl:​for-each select="​Traits/​Element">​
 +                    <tr>
 +                    <​td><​xsl:​value-of select="​@ItemTrait"/></​td>​
 +                    <​td><​xsl:​value-of select="​@Amount"/></​td>​
 +                    </tr>
 +                </​xsl:​for-each>​
 +                </​table>​
 +            </td>
 +            <​td><​xsl:​value-of select="​MaxStack"/></​td>​
 +        </tr>
 +    </​xsl:​for-each>​
 +    </​table>​
 +</​BODY> ​
 +</​HTML> ​
 +</​xsl:​template> ​
 +</​xsl:​stylesheet> ​
 +</​code>​
 +
 +XSLT 엔진에는 여러 가지가 있으나, 일단 여기서는 파이썬 기반의 [[http://​4suite.org | 4suite]] 패키지를 이용한다. 4suite 내부의 모듈을 이용하기 위해서는 파이썬 소스를 만들어야 한다.
 +
 +**generate_html.py**
 +<code python>
 +from Ft.Xml.Xslt import Processor ​
 +from Ft.Xml import InputSource ​
 +from Ft.Lib import Uri
 + 
 +def transform(xml_name,​ xsl_name): ​
 +    xml_uri = Uri.OsPathToUri(xml_name)
 +    xsl_uri = Uri.OsPathToUri(xsl_name)
 +    prc = Processor.Processor() ​
 +    prc.appendStylesheet(InputSource.DefaultFactory.fromUri(xsl_uri))
 +    return prc.run(InputSource.DefaultFactory.fromUri(xml_uri)) ​
 + 
 +if __name__ == '​__main__': ​
 +    f = file("​generated.html",​ "​w"​)
 +    f.write(transform('​iteminfo.xml',​ '​transform.xsl'​))
 +    f.close()
 +</​code>​
 +
 +실행하면 아래와 같은 HTML 파일이 출력된다.
 +
 +**generated.html**
 +<code html>
 +<​HTML>​
 +  <​HEAD>​
 +    <meta content="​text/​html;​ charset=iso-8859-1"​ http-equiv="​Content-Type">​
 +    <​TITLE>​ItemInfo</​TITLE>​
 +  </​HEAD>​
 +  <​BODY>​
 +    <​H1>​MACE</​H1>​
 +    <table cellpadding="​0"​ cellspacing="​0"​ border="​1">​
 +      <tr>
 +        <​th>​Type</​th>​
 +        <​th>​Name</​th>​
 +        <​th>​Price</​th>​
 +        <​th>​Required Level</​th>​
 +        <​th>​Required Job</​th>​
 +        <​th>​Slot</​th>​
 +        <​th>​Traits</​th>​
 +        <​th>​Max Stack</​th>​
 +      </tr>
 +      <tr>
 +        <​td>​1</​td>​
 +        <​td>​Light Club</​td>​
 +        <​td>​1</​td>​
 +        <​td>​1</​td>​
 +        <​td>​KT_PANZER_NEWBIE,​KT_PANZER,​KT_HIGHER_PANZER,​KT_DARK_PANZER</​td>​
 +        <​td></​td>​
 +        <td>
 +          <table cellpadding="​0"​ cellspacing="​0"​ border="​0">​
 +            <tr>
 +              <​td>​MIN_DAMAGE</​td>​
 +              <​td>​2</​td>​
 +            </tr>
 +            <tr>
 +              <​td>​MAX_DAMAGE</​td>​
 +              <​td>​5</​td>​
 +            </tr>
 +            <tr>
 +              <​td>​TOHIT</​td>​
 +              <​td>​4</​td>​
 +            </tr>
 +            <tr>
 +              <​td>​MIN_RANGE</​td>​
 +              <​td>​20</​td>​
 +            </tr>
 +            <tr>
 +              <​td>​CRITICAL</​td>​
 +              <​td>​5</​td>​
 +            </tr>
 +          </​table>​
 +        </td>
 +        <​td>​1</​td>​
 +      </tr>
 +      ...
 +    </​table>​
 +  </​BODY>​
 +</​HTML>​
 +</​code>​
 +
 +:!: 4suite에서 한글을 어떻게 처리할 수 있는지를 모르겠다. XML 파일 자체를 유니코드 기반으로 저장하면 되겠으나,​ 그렇지 않은 상황에서는 도대체 어떻게 해야하는 건지...
 +
 +
 +====== 링크 ======
 +  * [[http://​www.w3schools.com/​xsl/​ | XSLT tutorial]]
 +
 +----
 +  * see also [[XML]]
  
kb/xslt.txt · 마지막으로 수정됨: 2014/11/07 13:40 (바깥 편집)