http://blog.naver.com/ngmaster?Redirect=Log&logNo=120039667441 1. XSL (eXtensible Stylesheet Language) 여기서 FO는 Formatting Object를 말합니다. 아래처럼 두개의 구조가 있다고 합시다. <root> XSML에는 XXL파일이 변환작업을 하며 XXL확정자를 가진 파일을 거치면 다른 파일로 거듭나게 됩니다. a. XML 선언문 2) MS 선언문(비표준) b. XML 문서 기본 (*.xsl) </xsl:stylesheet> c. XSL 문서 적용 (XML 문서에 삽입) 2. XPath 1) / : 가상의 루트 노드 (사실 언어마다 차이가 있습니다. 모든 자원의 근원이 되는 위치이며, 가장 최상위라고 생각하시면 됩니다.) 2) * : 노드 전체 노드라고 표현이 되는건 엘리먼트하고 속성 두 가집니다. 3) . : 노드 자신 여기서는 디렉토리 자신을 말합니다. 4) /a/b/c 루트 노드의 자식 a의 자식 b의 자식 c를 가르킵니다. ------------------------------ 5) a : 노드 자신 (상대경로) 6) //a : 모든 노드 중 a노드 7) a[b] : b노드를 자식으로 갖는 a노드 8) a[b='c'] : 자식 b노드가 c텍스트를 갖는 a노드 9) a[b='c']/d : 자식 b노드가 c텍스트를 갖는 a노드의 자식 d노드 10) a/@b : a노드의 속성 b a가 b라는 속성을 갖는 a노드를 찾습니다. 12) a[@b='c'] : b속성값 c를 갖는 a노드 13) a[@b='c']/d : b속성값 c를 갖는 a노드의 자식 d노드 14) a/@* : a의 모든 속성노드 3. XPath 함수 <booklist> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" /> <xsl:template match="/">
XSLT (XSL Tranformation) : XML문서를 또 다른 XML문서나 비XML문서로 변환 (문서구조 변환)
XSL:FO : 문서 포멧을 변환 (XML -> DOC, XML -> PDF)
a구조
<a>aa</a>
</root>
b구조
<데이터>
<자료>aa</자료>
</데이터>
위의 코드를 짠다면 위의 <root>와 아래의 <데이터>는 전혀 다른 테이블이지만 데이터 "aa"는 같다는 걸 알 수 있습니다.
XSLT는 복수개의 데이터를 가져와서 새로운 형태를 만드는 것도 가능합니다.
우리가 보통 XSML작업할 때 많이 하는건 하나의 XML->HTML 이나 XML->다른 종류로 바꿀 때 많이 사용합니다.
간단하게 이러한 작업들을 '문서변환작업'이라고 합니다.
우리는 데이터를 뽑아내고 찾은 데이터를 새로운 엘리먼트로 만들고 속성을 만들어서 가져온 데이터를 옮겨놓는 작업을 하게 됩니다. 원본이 되는 구조를 보통 "Source Tree"라고 하며 새로운 구조를 "Result Tree" 라고 합니다. 그리고 XSLT 엔진이 이 작업을 해줍니다.
1) 공식 선언문(표준) - 가능하면 이 표준을 사용하도록 합시다.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
1) XSL도 XML문서 이기에 선언문을 가집니다.
<?xml version="1.0" encoding="ecu-kr"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<?xml-stylesheet href="XSL파일" type="text/xsl"?>
XML 문서의 노드 접근 표현식
XPath 표현에선 가장 최상위 엘리먼트를 "/"로 표현
독립적으로는 사용하지 못하며 누군가에 섞여서 사용 되어집니다. 문서변환작업이나 dom이라는 곳에서 노드를 찾을 때 사용됩니다.
예를 들어 <root></root>가 있다고 하면 <root>보다 더 상위에 있는 루트입니다.
정확히 구분하면 속성노드 / 엘리먼트노드라고 부릅니다.
가상루트 밑에 자식 a가 있고 그 밑에 자식이 b이며 그 밑에 자식이 c란 말입니다.
아래와 같은 구조에서 c를 찾기 위한 표현입니다.
<a>
<b>
<c></c>
</b>
</a>
<a>
<d>
<e></e>
</d>
<b>
<c></c>
</b>
</a>
/a 와는 다릅니다. 문서의 어디에 위치하고 있느냐에 따라서 달라집니다.
src="img/aaa"의 표현은 ./img/aaa의 줄임말이며 현재 디렉토리의 하위디렉토리를 찾습니다.
src="/img/aaa"의 표현은 무조건 홈디렉토리 밑에 있는 하위디렉토리를 찾습니다.
첫 노드만 탐색하며 위치 및 계층에 상관없이, 즉 코딩 순서대로 a라는 엘리먼트를 찾다가 a를 먼저 찾으면 작업을 완료합니다.
<a b="1">........ 이 녀석에 접근가능하다는 거야. 이제 속성데이터에도 접근가능~
11) a[@b] : b속성을 갖는 a노드
15) a/* : a의 모든 자식엘리먼트
- name() : 노드명 반환 (ex. a/b/c/name())
- text() : PCDATA 반환(단, 자신의 PCDATA만..)
- position() : 노드의 위치 지정(ex. //a[posion()=2])
- last() : 노드집합의 마지막 노드
- count() : 노드집합의 갯수
- sum() : 노드집합의 데이터 합
- contains() : 데이터 검색
- stars-width() : 특정 문자열로 시작하는지 유무
nodeXML.xml 파일 만들기
<?xml-stylesheet href="ex02.xsl" type="text/xsl"?>
<book>XML.NET</book>
</booklist>
nodeXSL.xsl 파일 만들기
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<도서목록>
<도서><xsl:value-of select="/booklist/book" /></도서>
</도서목록>
</xsl:template>
</xsl:stylesheet>
XSL의 탬플릿 룰 <?xml version="1.0" encoding="UTF-8"?> XSL 파일 <?xml version="1.0" encoding="euc-kr"?> 그래서 book의 자식인 title을 반환시키고 또 book의 자식인 author를 반환시킵니다. 한번 반환을 하면 다시 이쪽으로 제어가 이동하고 다시 book를 또 찾습니다. 세번째 방법 (book의 내용중 2번째 이상인 경우만 가져옵니다.) </body> book의 자식인 속성 @id를 가져오고자 할 때 book의 자식인 속성 @kind를 가져오고자 할 때 book의 자식인 속성 @price를 가져오고자 할 때 밑의 구문은 독립적으로 사용을 못하며 누군가 호출을 해야만 사용가능 합니다.
문서의 특정 구조를 다른 구조를 바꾸는 방법.
XSL이란 결국 탬플릿들의 집합이며 탬플릿 자체가 사용이 되는건 XML > [*.XSL] > 변환 문서
거의 대부분 match란 속성을 갖고 이 녀석은 XPath 표현으로 원본의 XML 특정노드를 찾아서 output 시켜줍니다.
XML 파일
<?xml-stylesheet type="text/xsl" href="temXSL.xsl"?>
<booklist>
<book id="b1" kind="">
<title>C#.NET</title>
<author>홍길동</author>
<publisher>길동출판사</publisher>
<price>100</price>
</book>
<book id="b2" kind="">
<title>ASP.NET</title>
<author>마징가</author>
<publisher>징가출판사</publisher>
<price>200</price>
</book>
<book id="b3" kind="">
<title>XML.NET</title>
<author>슈퍼맨</author>
<publisher>퍼맨출판사</publisher>
<price>300</price>
</book>
<book id="b4" kind="">
<title>ADO.NET</title>
<author>베트맨</author>
<publisher>트맨출판사</publisher>
<price>400</price>
</book>
<book id="b5" kind="">
<title>NG.NET</title>
<author>소심맨</author>
<publisher>심맨출판사</publisher>
<price>500</price>
</book>
</booklist>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>문서변환</title>
</head>
<body>
<h2 style="color:blue">Our Book List</h2>
<table border="1" width="300px">
<tr>
<td>id</td>
<td>title</td>
<td>author</td>
<td>kind</td>
<td>price</td>
</tr>
<tr>
<td><xsl:value-of select="booklist/book[position()=2]/id" /></td>
<td><xsl:value-of select="booklist/book[position()=2]/title" /></td>
<td><xsl:value-of select="booklist/book[position()=2]/author" /></td>
<td><xsl:value-of select="booklist/book[position()=2]/kind" /></td>
<td><xsl:value-of select="booklist/book[position()=2]/price" /></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
첫번째 방법 (book의 내용을 모두 가져옴)
template을 전역적인 위치에 선언이 가능.
어딘가에 있는 글로벌 수준에 선언된 book을 찾아가며 이 위치에 반환.
위에서부터 읽어오다가 밑의 구문을 만나면 바깥에 선언된 book을 찾아와서 반환.
제어가 book쪽으로 가서 book부분을 읽어들이며, 중요한 것은 value of로 읽는데 상대경로가 title이고 title은 book의 자식입니다.
이 때는 자동으로 두번째 book을 가르키며, 이런식으로 5번 체크합니다.
마치 '메소드'와 같이 이용되는걸 알 수 있으며, XSLT 변환작업의 종류중 가장 많이 사용합니다.
<xsl:apply-templates select="booklist/book" />
두번째 방법 (book의 내용중 author가 '홍길동'인것만 가져옵니다.)
<xsl:apply-templates select="booklist/book[author='홍길동']" />
같은 값이 여러 표현으로 쓰여야 할때 mode로 각각에 이름을 부여하고 호출시에 구분자인 mode 값을 바꿔가며 호출하면 간단히 여러가지의 표현을 할 수 있습니다.
<xsl:apply-templates select="booklist/book[position() > 2]" mode="modeA"/>
</body>
</table>
<br />
네임값을 갖은 템플릿을 부르는 방법
apply랑 다른점은 반복이 없이 한번만 호출되며 노드에 대한 표시가 없습니다.
즉, 문서변환작업이 아닌 새로운 문서에서 일부분을 분리시키고자 할 때 사용합니다.
<xsl:call-template name="tCompany" />
</html>
</xsl:template>
항상 시작 탬플릿을 제외한 노드는 상대경로를 가집니다.
<xsl:template match="book" mode="modeA">
<tr>
<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="author" /></td>
<td><xsl:value-of select="@kind" /></td>
<td><xsl:value-of select="@price" /></td>
</tr>
</xsl:template>
<xsl:template match="book" mode="modeB">
<tr>
<td>제목 : <xsl:value-of select="title" /></td>
<td>저자 : <xsl:value-of select="author" /></td>
</tr>
</xsl:template>
<xsl:template name="tCompany">
<hr />
Copyright ....
</xsl:template>
</xsl:stylesheet>
http://www.adobe.com/kr/devnet/dreamweaver/articles/xsl_overview.html
http://korea.internet.com/channel/content.asp?kid=17&cid=193&nid=20586