<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<BODY>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Address</TD>
<TD>Tel</TD>
<TD>Fax</TD>
<TD>Email</TD>
</TR>
<xsl:for-each select="PEOPLE/PERSON">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:value-of select="ADDRESS"/></TD>
<TD><xsl:value-of select="TEL"/></TD>
<TD><xsl:value-of select="FAX"/></TD>
<TD><xsl:value-of select="EMAIL"/></TD>
</TR>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
위는 XSL문서의 예이다.
XML문서를 보면 다음과 같다.
<?xml version="1.0" ?>
<?xml:stylesheet type="text/xsl" href="people.xsl"?>
<PEOPLE>
<PERSON>
<NAME>Mark Wilson</NAME>
<ADDRESS>911 Somewhere Circle, Canberra, Australia</ADDRESS>
<TEL>(++612) 12345</TEL>
<FAX>(++612) 12345</FAX>
<EMAIL>Mark.Wilson@somewhere.com</EMAIL>
</PERSON>
<PERSON>
<NAME>Tracey Wilson</NAME>
<ADDRESS>121 Zootle Road, Cape Town, South Africa</ADDRESS>
<TEL>(++2721) 531 9090</TEL>
<FAX>(++2721) 531 9090</FAX>
<EMAIL>Tracey.Wilson@somewhere.com</EMAIL>
</PERSON>
<PERSON>
<NAME>Jodie Foster</NAME>
<ADDRESS>30 Animal Road, New York, USA</ADDRESS>
<TEL>(++1) 3000 12345</TEL>
<FAX>(++1) 3000 12345</FAX>
<EMAIL>Jodie.Foster@somewhere.com</EMAIL>
</PERSON>
<PERSON>
<NAME>Lorrin Maughan</NAME>
<ADDRESS>1143 Winners Lane, London, UK</ADDRESS>
<TEL>(++94) 17 12345</TEL>
<FAX>(++94) 17 12345</FAX>
<EMAIL>Lorrin.Maughan@somewhere.com</EMAIL>
</PERSON>
<PERSON>
<NAME>Steve Rachel</NAME>
<ADDRESS>90210 Beverly Hills, California, USA</ADDRESS>
<TEL>(++1) 2000 12345</TEL>
<FAX>(++1) 2000 12345</FAX>
<EMAIL>Steve.Rachel@somewhere.com</EMAIL>
</PERSON>
</PEOPLE>
XML문서의 빨간색 부분에서 위 XML 파일의 총체적인 스킨구시을 하는 XSL파일을 css쓰듯 불러들이고 있다.
XSL파일을 보면 HTML코드가 보인다. XSL파일을 통해서 자기 구미에 맞게 XML파일을 뿌려낼 수 있다.
다음은 결과물...
Name Address Tel Fax Email
Mark Wilson 911 Somewhere Circle, Canberra, Australia (++612) 12345 (++612) 12345 Mark.Wilson@somewhere.com
Tracey Wilson 121 Zootle Road, Cape Town, South Africa (++2721) 531 9090 (++2721) 531 9090 Tracey.Wilson@somewhere.com
Jodie Foster 30 Animal Road, New York, USA (++1) 3000 12345 (++1) 3000 12345 Jodie.Foster@somewhere.com
Lorrin Maughan 1143 Winners Lane, London, UK (++94) 17 12345 (++94) 17 12345 Lorrin.Maughan@somewhere.com
Steve Rachel 90210 Beverly Hills, California, USA (++1) 2000 12345 (++1) 2000 12345 Steve.Rachel@somewhere.com
여기까진 XML에 관심있는 사람은 누구나 다 알것이다.
내가 이 글을 쓰는 이유는 XSL파일에 XPath를 사용한 검색이나 조작에 대해서 주목하고 있기 때문이다.
맨위에 XSL파일을 보면 다음과 같은게 있다.
<xsl:for-each select="PEOPLE/PERSON">
이것을 쉽게 설명하자면...
for-each는 기타 언어들이 사용하는 for-each와 같다... 일단은 loop의 개념이고
select="" 를 통해서 대상을 지목했다.
여기서 보면 "PEOPLE/PERSON" 이 있는데
여기서 슬레쉬(/) 가 의미하는건 OS개념의 디렉토리 구분 문자와 같다.
윈도우 탐색기를 열어보면 디렉토리의 tree식 개층구조를 볼 수 있는데 그와 같다고 생각하면된다.
위는 <xsl:for-each select="/PEOPLE/PERSON"> 다음과 같이 써도 무방한데 이는 최상위에서 처음으로 만나는 부모노드가 PEOPLE이기 때문이다.
물론 PEOPLE까지만 부르고 for-each 태그안에서 다시한번 PERSON의 이름으로 templet 을 선택해서 다시 뿌려줘도 된다.
어쨌든 xsl 문서내에 위와 같은 개층형 구문을 자주 보게 될 것인데... 이것이 전적으로 XML의 SQL인 XPath의 문법적 약속이다. 검색의 개념으로 받아들이면 "root에서 PEOPLE을 찾고 그밑에 PERSON을 찾아라..." 라는 SQL쿼리를 실행했다고 보면된다.
이는 정도적 XPath문법은 아니다. 보기쉽게 축약한 것인데... 보다 엄격한 XPath 형은 다음과 같다.
<xsl:for-each select="child::PEOPLE/descendant::PERSON">
Root의 자식(child) 구분자(::) PEOPLE /(다음노드) 후손(descendant) 구분자(::) PERSON