admin write
blogblogblogbloglocation loglocation logtag listtag listguest bookguest book
rss feed

10rwebp #4

2007. 4. 20. 12:28

지난주에 만들었던 booklist
employee에는 없는 새로운 개념이 다수 있으니 참고

- booklist.xml -

<?xml version="1.0" encoding="euc-kr"?>

<!-- XSL 문서 적용 -->
<?xml-stylesheet type="text/xsl" href="booklist.xsl"?>

<booklist>
   
  <book id="b1" kind="computer">
    <title>JSP And Servlet</title>
    <author>이규미</author>
    <publisher>인포북</publisher>
    <price>25000</price>
  </book>

  <book id="b2" kind="computer">
    <title>Inside XML</title>
    <author>신민철</author>
    <publisher>디지털북스</publisher>
    <price>35000</price>
  </book>

  <book id="b3" kind="language">
    <title>쉽게 배우는 영어</title>
    <author>채규태</author>
    <publisher>시사영어사</publisher>
    <price>20000</price>
  </book>

  <book id="b4" kind="computer">
    <title>XML 전자상거래</title>
    <author>이종호</author>
    <publisher>정보문화사</publisher>
    <price>28000</price>
  </book>

  <book id="b5" kind="소설">
    <title>사랑과 전쟁</title>
    <author>이사랑</author>
    <publisher>전쟁문화사</publisher>
    <price>15000</price>
  </book>

  <book id="b6" kind="수필">
    <title>사랑을 느끼세요</title>
    <author>이사랑</author>
    <publisher>사랑출판사</publisher>
    <price>15000</price>
  </book>

  <book id="b7" kind="잡지">
    <title>월간 중앙</title>
    <author>중앙일보기자</author>
    <publisher>중앙일보사</publisher>
    <price>18000</price>
  </book>

  <book id="b8" kind="잡지">
    <title>주간 경제지</title>
    <author>조선일보기자</author>
    <publisher>조선일보사</publisher>
    <price>27000</price>
  </book>
</booklist>



- booklist.xsl -

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match='/'>
<html>
<body>
<h2><font color='blue'>Our Book's List</font></h2>
<table border='1' cellspacing='0' width='80%'>
<tr bgcolor='#ffff66'><th>title</th><th>kind</th><th>author</th><th>publisher</th><th>price</th></tr>

<xsl:apply-templates select='booklist/book'>
<xsl:sort select='price' data-type='number' order='ascending' />
</xsl:apply-templates>
<!--xsl:apply-templates select='booklist/book[@kind="잡지"]' mode='b'/-->
</table>
<p><xsl:call-template name='company'/></p>
</body></html>
</xsl:template>

<xsl:template match='//book'>
<tr>
<td><font color=''><xsl:value-of select='title'/></font></td>
<td><font color=''><xsl:value-of select='@kind'/></font></td>
<td><font color=''><xsl:value-of select='author'/></font></td>
<td><font color=''><xsl:value-of select='publisher'/></font></td>
<td><font color=''><xsl:value-of select='price'/></font></td>
</tr>
</xsl:template>
<!--
<xsl:template match='//book' mode='b'>
<tr>
<td><font color='red'><xsl:value-of select='title'/></font></td>
<td><font color='red'><xsl:value-of select='author'/></font></td>
</tr>
</xsl:template> -->
<xsl:template name='company'>
<font color='blue'>옥동자 소프트웨어</font>
</xsl:template>
</xsl:stylesheet>


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 }