사용자 도구

사이트 도구


kb:xslt

XSLT

Extensible Stylesheet Language for Transformation

XML을 다른 포맷(다른 XML도 포함)으로 변환하는 데 사용되는 파일 형식(언어?)이다. 내부적으로 XSL, XPath, XSL-FO를 사용한다.

XML을 HTML로 변환하기

예를 들어 다음과 같은 XML 파일이 있다고 하자.

iteminfo.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>
    ...

이 파일에서 MACE 노드 안에 있는 내용들을 테이블 형식으로 예쁘게 보고 싶다고 하자. 그러기 위해서는 먼저 XSLT 파일을 작성해야한다.

transform.xsl

<?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> 

XSLT 엔진에는 여러 가지가 있으나, 일단 여기서는 파이썬 기반의 4suite 패키지를 이용한다. 4suite 내부의 모듈을 이용하기 위해서는 파이썬 소스를 만들어야 한다.

generate_html.py

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()

실행하면 아래와 같은 HTML 파일이 출력된다.

generated.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>

:!: 4suite에서 한글을 어떻게 처리할 수 있는지를 모르겠다. XML 파일 자체를 유니코드 기반으로 저장하면 되겠으나, 그렇지 않은 상황에서는 도대체 어떻게 해야하는 건지…

링크

kb/xslt.txt · 마지막으로 수정됨: 2014/11/07 13:40 (바깥 편집)