admin write
blogblogblogbloglocation loglocation logtag listtag listguest bookguest book
rss feed

10rwebp #3

2007. 4. 19. 20:08

수정판 (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 &lt;= 20000'>low tax</xsl:when>
<xsl:when test='salary &gt;= 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 &lt; n'> F </xsl:if>
이 태그를 C언어로 옮기면 다음과 같다.

if(C < n) { F }

위의 태그에서 &lt;는 '<' 를, &gt;는 '>' 를 의미한다. 이렇게 쓰는 이유는 <나 >를 그대로 썼을 경우 태그의 시작/종료와 혼동이 되기 때문이다.

<xsl:choose>
<xsl:when test='C &lt; n1'> G </xsl:when>
<xsl:when test='C &gt 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 }