수정판 (12 : 20)
- WEB306과는 다름
- Employees2.xml (04/16) -
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="employees.xsl"?>
<employees>
<employee id="123">
<name>Munson</name>
<salary payperiod="weekly">23500</salary>
<department>Development
<title>Developer</title>
</department>
</employee>
<employee id="124">
<name>Brown</name>
<salary payperiod="weekly">51000</salary>
<department>Human Resources
<title>Recruiter</title>
</department>
</employee>
<employee id="125">
<name>Philips</name>
<salary payperiod="bi-weekly">45000</salary>
<department>Development
<title>Tester</title>
</department>
</employee>
<employee id="126">
<name>Smith</name>
<salary payperiod="monthly">72000</salary>
<department>User Education
<title>Editor</title>
</department>
</employee>
</employees>
- employees.xsl (04/16) -
made by K05078 (quoted by K05076, K05081, K05088, K05094, L05133, J05141, J05143, J05144, H05150, etc.)
<?xml version='1.0'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<!-- http://10rwebd.tistory.com -->
<xsl:template match='/'>
<html>
<body>
<table>
<tr><th>ID</th><th>name</th><th>salary</th><th>department</th><th>title</th><th>tax</th></tr>
<xsl:apply-templates select='employees/employee'>
<!-- xsl:sort select='salary' data-type='number' order='descending'/ -->
</xsl:apply-templates>
<!--xsl:apply-templates select='employees/employee[@id="125"]' mode='sin90'/-->
</table>
</body> </html>
</xsl:template>
<xsl:template match='//employee'>
<tr>
<td><xsl:value-of select='@id'/></td>
<td><xsl:value-of select='name'/></td>
<td><xsl:value-of select='salary'/></td>
<td><xsl:value-of select='department'/></td>
<td><xsl:value-of select='department/title'/></td>
<td>
<xsl:choose>
<xsl:when test='salary <= 20000'>low tax</xsl:when>
<xsl:when test='salary >= 50000'>high tax</xsl:when>
<xsl:otherwise>normal tax</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
- Result -
ID | name | salary | department | title | tax |
---|---|---|---|---|---|
123 | Munson | 23500 | Development Developer | Developer | normal tax |
124 | Brown | 51000 | Human Resources Recruiter | Recruiter | high tax |
125 | Philips | 45000 | Development Tester | Tester | normal tax |
126 | Smith | 72000 | User Education Editor | Editor | high tax |
- 상세 설명 -
<xsl:template match='/'> ... </xsl:template>
: template 중 가장 상위의 것으로, match가 / 이라는 것은 전체를 의미한다.
<html> <body> 등, 세부적인 내용이 아닌, 보통 처음 또는 끝에 정의되어야 할 부분이 들어간다. (head와 foot 등)
다른 template를 불러오는 데에는 <xsl:apply-templates select='A/B'> ... </xsl:apply-templates> 를 사용하는데, 이는 함수 호출과 비슷하다. xsl:apply-templates 태그 안에 <xsl:sort select='정렬할 속성명' type='어떤 형태인가(number, text 등)' order='오름차순(ascending) 정렬인지 내림차순(descending) 정렬인지' /> 를 넣으면 select에서 지정해준 속성에 따라 전체를 정렬하여 준다.
apply-templates에서 select 안에는 XML 파일에서 정의한 태그의 이름을 쓰는데, A/B 란 최상위 태그가 A이고 그 바로 아래 태그가 B라는 뜻이다.
xsl:template와 xsl:apply-templates에는 mode라는 속성을 넣을 수 있는데, 같은 match를 가진 템플릿이 여러 개 있는 경우 mode를 사용하여 선택할 수 있다.
match가 'A/B[@C="D"]' 로 써진 경우 A 최상위 태그 아래의 B 태그의 속성 C가 D인 내용만 불러오는 기능을 가지고 있다. D에 씌여진 따옴표는 그 밖의 따옴표와 겹쳐서는 안된다. '를 사용했을 경우 ", "를 사용했을 경우 '로 써야 겹치지 않는다.
<xsl:template match='//B'> ... </xsl:template>
: XML 파일에서 입력한 내용을 출력하기 위한 template이다. match에는 최상위 태그 A를 생략하고 //B 식으로 써 준다.
XML 파일에 입력되어 있는 내용을 출력할 때는 <xsl:value-of select='C'> 식으로 써 준다. 여기서 C는 B 태그 아래에 있는 하위 태그로, XML 파일에 보면 <C> 내용 </C> 식으로 나와 있는데, 여기에서 '내용'을 가져온다.
만약 XML 문서에 <B id='D'> 라고 되어 있을 때 D를 가져오고 싶을 때에는, '@id' 라고 써 주면 된다. 만약 B 하위의 <C id='E'> 라고 되어 있는 경우, 'C/@id' 라고 쓰면 된다.
(조건문)
<xsl:if test='C < n'> F </xsl:if>
이 태그를 C언어로 옮기면 다음과 같다.
if(C < n) { F }
위의 태그에서 <는 '<' 를, >는 '>' 를 의미한다. 이렇게 쓰는 이유는 <나 >를 그대로 썼을 경우 태그의 시작/종료와 혼동이 되기 때문이다.
<xsl:choose>
<xsl:when test='C < n1'> G </xsl:when>
<xsl:when test='C > n2'> H </xsl:when>
<xsl:when test='C = n3'> I </xsl:when>
<xsl:otherwise> I </xsl:otherwise>
</xsl:choose>
이 태그를 C언어로 옮기면 다음과 같다.
if(C < n1) { G }
else if (C > n2) { H }
else if (C == n3) { I }
else { J }