Mark Up/XML XSLT
  • 728x90
    반응형

    XSLT






    XSL 이란?



    XML 문서는 다양한 장치에서 데이터를 저장하고 전달할 목적으로 만들어졌다.

    하지만 각각의 장치는 내부적으로 자신만의 고유한 데이터 구조를 사용하고 있다.


    따라서 각각의 장치가 전달받은 XML 문서를 자신이 사용하는 데이터 구조로 변환할 때 사용할 규칙이 필요하다.

    이러한 변환 규칙에 대한 명세를 작성할 수 있는 언어가 바로 XML(eXtensibl Stylesheet Language)이다.

    CSS가 HTML 문서를 위한 스타일 시트 언어라면, XSL은 XML 문서를 위한 스타일 시트 언어이다.



    XSL의 구성



    XSL은 XML 문서의 변환과 표현을 정의하는 세 개의 언어로 구성된다.


    1. XSLT : XSL Transformations를 의미하며, XML 문서를 다른 구조의 문서로 변환시키기 위한 언어이다.
    2. XPath : XML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어이다.
    3. XSL-FO : XML 데이터를 출력하기 위한 목적으로 설계된 언어이다.

    Tip : XSL-FO는 2012년에 발표된 2.0 버전을 마지막으로, 2013년부터는 더 이상의 업데이트를 진행하고 있지 않다.

    따라서 현재는 CSS3로 대체하여 사용하고 있다.



    XSLT 란?



    XSLT는 XML 문서를 XHTML 문서나 또 다른 XML 타입의 문서로 변환하기 위해 사용하는 언어이다.

    XSLT는 W3C 표준 권고안으로, XSL에서 가장 중요한 언어이다.

    위와 같은 변환과정에서 XSLT는 XPath를 이용하여 XML 문서에서 필요한 정보를 찾는 역할을 한다.


    현재 대부분의 주요 웹 브라우저는 XSLT와 XPath를 모두 지원하고 있다.

    가장 최신 버전의 XSLT는 2015년에 발표된 XSLT 3.0 후보 권고안이다.

    XSLT 3.0에 대한 더 자세한 정보를 원한다면, 아래 링크 W3C 공식 사이트에서 확인할 수 있다.

    https://www.w3.org/TR/xslt-30/



    XSLT 변환 과정



    XSLT의 변환 과정은 다음과 같이 크게 두 가지 과정으로 이루어진다.


    1. 변환(Transformation) : XML 문서를 다른 구조의 XML 문서로 변환하는 과정이다.
    2. 서식 설정(formatting) : XML 문서를 특정 데이터 구조의 비 XML 문서로 변환하는 과정이다.


    XSLT 변환



    변환될 데이터를 가지고 있는 XML 문서와 변환에 대한 규칙을 가지고 있는 XSLT 문서만 있으면 변환을 진행할 수 있다.


    XML 문서를 잘 구성된(well-formed) HTML 문서로 바꾸는 과정을 순서대로 살펴본다.


    data.xml

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

    <programming_languages>

    <language>

    <name>HTML</name>

    <category>web</category>

    <developer>W3C</developer>

    <version status="working draft">5.1</version>

    <priority rating="1">high</priority>

    </language>

    ...

    <language>

    <name korean="파이썬">Python</name>

    <category>application</category>

    <developer>Python</developer>

    <version status="stable">3.52</version>

    <priority rating="4">middle</priority>

    </language>

    </programming_languages>



    1 단계 : XSLT 문서 작성



    xml_xslt_01.xsl

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

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

    <xsl:output method="html"/>

    <xsl:template match="/">


    <html>

    <body>

    <h2 style="text-align:center">프로그래밍 언어</h2>

    <table border="1" style="width: 50%; margin: auto">

    <tr>

    <th>이름</th>

    <th>종류</th>

    <th>개발사</th>

    <th>버전</th>

    <th>중요도</th>

    </tr>

    <xsl:for-each select="programming_languages/language">

    <tr>

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

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

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

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

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

    </tr>

    </xsl:for-each>

    </table>

    </body>

    </html>

    </xsl:template>

    </xsl:stylesheet>



    2 단계 : XML 문서에 XSLT 문서를 연결



    xml_xslt_01.xml

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

    <?xml-stylesheet type="text/xsl" href="xml_xslt_01.xsl"?>

    <programming_languages>

        <language>

            <name>HTML</name>

            <category>web</category>

            <developer>W3C</developer>

            <version status="working draft">5.1</version>

            <priority rating="1">high</priority>

        </language>

        <language>

            <name>CSS</name>

            <category>web</category>

            <developer>W3C</developer>

            <version status="stable">3.0</version>

            <priority rating="3">middle</priority>

        </language>

        <language>

            <name korean="자바">Java</name>

            <category>application</category>

            <developer>Oracle</developer>

            <version status="stable">8.91</version>

            <priority rating="2">high</priority>

        </language>

        <language>

            <name korean="파이썬">Python</name>

            <category>application</category>

            <developer>Python</developer>

            <version status="stable">3.52</version>

            <priority rating="4">middle</priority>

        </language>

    </programming_languages>



    루트 요소



    XSLT 문서의 루트(root) 요소는 <xsl:stylesheet>요소나<xsl:transform>요소로 표현할 수 있다.

    또한, 루트 요소의 시작 태그에는 W3C XSLT 네임스페이스를 반드시 같이 명시해줘야 한다.


    예제 1

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

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

    ...

    </xsl:stylesheet>


    예제 2

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

    <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Tranform">

    ...

    </xsl:transform>


    위의 두 예제는 정확히 같은 동작을 수행하기 때문에 어느 쪽을 사용해도 같은 결과를 얻을 수 있다.



    템플릿 작성



    XSLT 프로세서가 XSLT 문서에서 가장 먼저 찾는 요소는 바로 템플릿 요소이다.


    템플릿(template)은 특정 노드가 일치할 때 해당 노드에 적용할 규칙들을 포함하고 있다.

    이러한 템플릿은 루트 노드에 포함된 콘텐츠를 어떻게 처리하고 변환할 것인지를 나타낸다.


    XSLT 문서에서 템플릿(template)은 <xsl:template>요소로 표현할 수 있다.

    match 속성에는 속성값으로 템플릿과 연결할 XML 요소의 범위를 나타내는 XPath 표현식을 명시한다.


    다음 예제는 XML 문서 전체를 템플릿과 연결해주는 예제이다.


    예제

    <xml:template match="/">



    템플릿 적용



    <xsl:apply-template>요소는 특정 노드나 특정 노드의 자식 노드에 템플릿을 적용할 때 사용한다.

     

    다음 예제는 <name>요소와 <category>요소에만 각각 별도의 템플릿을 적용하는 예제이다.


    xml_xslt_02.xsl

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

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

        <xsl:output method="html"/>

     

        <xsl:template match="/">

            <html>

                <body>

                    <h2 style="text-align:center">프로그래밍 언어</h2>

                    <xsl:apply-templates/>

                </body>

            </html>

        </xsl:template>

     

        <xsl:template match="language">

            <p>

                <xsl:apply-templates select="name"/>

                <xsl:apply-templates select="category"/>

            </p>

        </xsl:template>

     

        <xsl:template match="name">

            언어 이름 : <strong>

            <xsl:value-of select="."/></strong><br/>

        </xsl:template>

     

        <xsl:template match="category">

            카테고리 : <span style="color: green">

            <xsl:value-of select="."/></span><br/>

        </xsl:template>

     

    </xsl:stylesheet>


    예제

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

    <?xml-stylesheet type="text/xsl" href="xml_xslt_02.xsl"?>

    <programming_languages>

        <language>

            <name>HTML</name>

            <category>web</category>

            <developer>W3C</developer>

            <version status="working draft">5.1</version>

            <priority rating="1">high</priority>

        </language>

        <language>

            <name>CSS</name>

            <category>web</category>

            <developer>W3C</developer>

            <version status="stable">3.0</version>

            <priority rating="3">middle</priority>

        </language>

        <language>

            <name korean="자바">Java</name>

            <category>application</category>

            <developer>Oracle</developer>

            <version status="stable">8.91</version>

            <priority rating="2">high</priority>

        </language>

        <language>

            <name korean="파이썬">Python</name>

            <category>application</category>

            <developer>Python</developer>

            <version status="stable">3.52</version>

            <priority rating="4">middle</priority>

        </language>

    </programming_languages>



    노드의 반복 처리



    <xsl:for-each> 요소는 선택된 각 노드에 반복해서 템플릿을 적용해 준다.

    이 요소는 select 속성으로 전달받은 XPath 표현식에 따라 선택된 노드의 개수만큼 반복해서 템플릿을 적용한다.


    다음 예제는 <programming_languages> 요소의 자식 요소인 <language>요소의 개수만큼 반복해서 템플릿을 적용하는 예제이다.


    예제

    <xsl:for-each select="programming_languages/language">

    ...

    </xsl:for-each>



    노드의 값 출력



    <xsl:value-of>요소는 선택된 노드에서 데이터를 추출해 준다.

    이 요소는 select 속성으로 전달받은 XPath 표현식에 따라 선택된 노드의 값을 텍스트로 추출하여 해당 위치에 삽입한다.


    다음 예제는 <name<요소의 값을 추출하여 텍스트로 삽입하는 예제이다.


    예제

    <xsl:value-of select="name"/>



    노드의 정렬



    <xsl:sort> 요소는 노드들의 정렬 기준을 명시할 때 사용한다.


    <xsl:sort> 요소를 작성하는 문법은 다음과 같다.


    문법

    <xsl:sort

    select = string-expression

    lang = { nmtoken }

    data-type = { "text" | "number"  qname-but-not-ncname }

    order = { "ascending" | "descending" }

    case-order = { "upper-first" | "lower-first" } />


    • select : 노드를 정렬하기 위해 기준이 되는 키(key)를 명시한다.
    • lang : 정렬 순서를 결정하는데 사용되는 영문자를 명시한다.
    • data-type : 텍스트의 타입을 명시한다.
    • order : 정렬 순서를 명시하며, 기본 설정값은 오름차순(ascending)이다.
    • case-order : 대소문자에 의한 문자열의 정렬 순서를 명시하며, 기본 설정값은 대문자가 먼저(upper-first)이다.
    다음 예제는 <name> 요소의 텍스트 값을 비교하여 오름차순으로 정렬하는 예제이다.

    xml_xslt_03.xsl

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

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

    <xsl:output method="html"/>

    <xsl:template match="/">


    <html>

    <body>

    <h2 style="text-align:center">이름에 따른 오름차순 정렬<h2>

    <xsl:for-each select="programming_languages/language">

    <xsl:sort select="name" data-type="text" order="ascending"/>

    <xsl:value-of-select="name"/><br/>

    </xsl:for-each>

    </body>

    </html>

    </xsl:template>

    </xsl:stylesheet>


    예제에서 사용되는 xml_xslt_03.xml 파일의 코드는 다음과 같다.


    예제

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

    <?xml-stylesheet type="text/xsl" href="xml_xslt_03.xsl"?>

    <programming_languages>

    <language>

    <name>HTML</name>

    <category>web</category>

    <developer>W3C</developer>

    <version status="working draft">5.1</version>

    <priority rating="1">high</priority>

    </language>

    <language>

    <name>CSS</name>

    <category>web</category>

    <developer>W3C</developer>

    <version status="stable">8.91</version>

    <priority rating="2">high</priority>

    </language>

    <language>

    <name korean="파이썬">python</name>

    <category>application</category>

    <developer>Python</developer>

    <version status="stable">3.52</version>

    <priority rating="4">middle</priority>

    </language>

    </programming_languages>



    노드의 조건부 처리



    <xsl:if>요소는 노드의 값이 특정 조건에 해당할 때만 동작한다.

    이 요소는 test속성으로 전달받은 표현식이 참인 경우에만 실행된다.


    다음 예제는 버전이 5 이상인 언어만을 출력하는 예제이다.


    xml_xslt_04.xsl

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

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

    <xsl:output method="html"/>

    <xsl:template match="/">


    <html>

    <body>

    <h2 style="text-align:center">버전이 5.0 이상인 언어</h2>

    <xsl:for-each select="programming_languages/language">

    <xsl:if test="version &gt; 5">

    <xsl:value-of select="name"/> : ver.

    <xsl:value-of select="version"/><br/>

    </xsl:if>

    </xsl:for-each>

    </body>

    </html>


    </xsl:template>

    </xsl:stylesheet>


    예제에서 사용되는 xml_xslt_04.xml 파일의 코드는 다음과 같다.


    문법

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

    <?xml-stylesheet="text/xsl" href="xml_xslt_04.xsl"?>

    <programming_languages>

    <language>

    <name>HTML</name>

    <category>web</category>

    <developer>W3C</developer>

    <version status="working draft">5.1</version>

    <priority rating="1">high</priority>

    </language>

    <language>

    <name>CSS</name>

    <category>web</category>

    <developer>W3C</developer>

    <version status="stable">3.0</version>

    <priority rating="3">middle</priority>

    </language>

    <language>

    <name korean="자바">Java</name>

    <category>application</category>

    <developer>Oracle</developer>

    <version status="stable">8.91</version>

    <priority rating="2">high</priority>

    </language>

    <language>

    <name korean="파이썬">Python</name>

    <category>application</category>

    <developer>Python</developer>

    <version status="stable">3.52</version>

    <priority rating="4">middle</priority>

    </language>

    </programming_languages>



    노드의 다중 조건부 처리



    <xsl:choose>요소는 <xsl:when>과 <xsl:otherwise>요소와 함께 다중 조건문을 작성할 때 사용한다.

    <xsl:when>요소는 test 속성으로 전달받은 표현식이 참인 경우에만 실행된다.

    전달받은 표현식이 거짓인 경우에는 <xsl:when>요소는 실행되지 않으며, 대신에 <xsl:otherwise>요소가 실행된다.


    다음 예제는 <priority> 요소의 rating 속성값이 2 이상인 경우와 그렇지 않은 경우에 다른 텍스트를 출력해 주는 예제이다.


    xml_xslt_05.xsl

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

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

    <xsl:output method="html"/>

    <xsl:template match="/">


    <html>

    <body>

    <h2 style="text-align:center">노드의 다중 조건부 처리</h2>

    <xsl:for-each select="programmin_languages/language">

    <xsl:choose>

    <xsl:when test="priority[@rating &gt; 2]">

    <xsl:value-of select="name"/> : 나중에 꼭 공부해요!<br/>

    </xsl:when>

    <xsl:otherwise>

    <xsl:value-of select="name"/> : 우선은 이 과목부터 공부하죠!<br/>

    </xsl:otherwise>

    </xsl:choose>

    </xsl:for-each>

    </body>

    </html>

    </xsl:template>

    </xsl:stylesheet>


    예제에서 사용되는 xml_xslt_05.xml 파일의 코드는 다음과 같다.


    예제

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

    <?xml-stylesheet type="text/xsl" href="xml_xslt_05.xsl"?>

    <programming_languages>

        <language>

            <name>HTML</name>

            <category>web</category>

            <developer>W3C</developer>

            <version status="working draft">5.1</version>

            <priority rating="1">high</priority>

        </language>

        <language>

            <name>CSS</name>

            <category>web</category>

            <developer>W3C</developer>

            <version status="stable">3.0</version>

            <priority rating="3">middle</priority>

        </language>

        <language>

            <name korean="자바">Java</name>

            <category>application</category>

            <developer>Oracle</developer>

            <version status="stable">8.91</version>

            <priority rating="2">high</priority>

        </language>

        <language>

            <name korean="파이썬">Python</name>

            <category>application</category>

            <developer>Python</developer>

            <version status="stable">3.52</version>

            <priority rating="4">middle</priority>

        </language>

    </programming_languages>


    출처: tcpschool.com


    728x90
    반응형

    'Mark Up > XML' 카테고리의 다른 글

    XML/XPath  (0) 2018.11.09
    XML 노드  (0) 2018.11.05
    XML DOM  (0) 2018.11.05
    XML 구조  (0) 2018.11.02
    XML 기초  (0) 2018.10.29
상단으로