XSLT 와 XSL

Preview:

DESCRIPTION

XSLT 와 XSL. Contents. XSL 이란? XSLT 란? XSL 과 XSLT 비교 응용사례. XSL 이란?. XML 문서 구조를 표현할 수 있는 특징. 표현부분을 생략함으로써 장점 확보 확장성 호환성 … XSL 문서 Presentation 능력을 지닌 언어. ( eXtensible Stylesheet Language). Cont. Cont. 신나는 프로야구!. 두산 베어스 선수. 투수 : 진필중 포수 : 홍성흔 1루수: 우 즈 2루수 : 안경현 3루수 : 김동주 - PowerPoint PPT Presentation

Citation preview

xml programming 1

XSLT 와 XSL

xml programming 2

Contents

XSL 이란 ?

XSLT 란 ?

XSL 과 XSLT 비교

응용사례

xml programming 3

XSL 이란 ? XML 문서

구조를 표현할 수 있는 특징 . 표현부분을 생략함으로써 장점 확보

• 확장성• 호환성• …

XSL 문서 Presentation 능력을 지닌 언어 . (eXtensible Stylesheet Language)

xml programming 4

Cont.

xml programming 5

Cont.

신나는 프로야구 !

두산 베어스 선수

투수 : 진필중

포수 : 홍성흔

1 루수 : 우 즈

2 루수 : 안경현

3 루수 : 김동주

유격수 : 김민호

우익수 : 심재학

중견수 : 정수근

좌익수 : 장원진

xml programming 6

Cont.

baseball.xml 과 baseball.fo 비교

baseball.xml• <title> 신나는 프로야구 !</title>

baseball.fo• <fo:block text-align="center" font-weight="bold"

font-size="30pt" font-family="Helvetica, Arial, sans-serif" space-after="30pt" >

신나는 프로야구 !

</fo:block>

xml programming 7

어떻게 변환시킬 것인가 ? Transformation?

변환…

XSL 문서XML 문서

XSLT 문서

직접 XML 문서를 변환

HTML ,PDF…

XSLT Processor

xml programming 8

XSLT 란 ? XML to XSL

XML to XML

XML to Other Format… XML to HTML XML to WML XML to RTF

XML to etc…

xml programming 9

Example

XSL 문서XML 문서

XSLT 문서

XSLT Processor

다른 형태의XML 문서

HTML

WML

PDF

RTF, DOC, HWP…

각각의

Viewer

xml programming 10

XSLT 와 XSL 비교 Transformation?

변환…

Formatting? Presentation 능력을 지닌 언어

• HTML, PDF, HWP, DOC, RTF…

xml programming 11

… Formatting Language!!!

Presentation 능력을 지닌 언어 XSL, HTML, PDF, HWP, DOC, RTF…

Transformation Language!!! XML 문서를 다른 Formatting Language 로 바꾸는 역할을

하는 언어 . XSLT

xml programming 12

Cont.

XSL

XSL

XSLT

XPath

xml programming 13

XSLT 의 응용사례 Data 의 변환

XML

a.XSL

b.XSL

c.XSL

XSLTProcessor

xml programming 14

XSL model Template-driven model

XML 문서가 반복적인 구조로 이루어져 있을 경우 . 메일 머지나 주소록 출력의 경우에 XSL 을 적용하여

사용할 수 있다 .

Data-driven model XML 문서가 불규칙적인 data 로 이루어져 있을 경우 . Template fragments 들은 따로따로 각 section 을

처리하기 위해 정의되고 사용됨 .

xml programming 15

Getting started with XSL 간단한 예제

<?xml version=“1.0”?><?xml-stylesheet type=“text/xsl” href=“hello.xsl”?><greetingk>Hello world</greeting>

<?xml version=“1.0”?><xsl:stylesheet xmlns:xsl=“http://www.w3.org/1999/XSL/Transform” version=“1.0”><xsl:template match=“/”><html><head><title>Greeting</title></head><body><p>Words of greeting : <br><b><i><u><xsl:value-of select=“greeting”/></u></i></b></p></body></html></xsl:template><xsl:stylesheet>

xml programming 16

Template( 틀 ?) template 의 개념 .

xml programming 17

Template 스타일시트를 이루는 가장 기본적인 단위

<?xml version=“1.0” ?> <xsl:stylesheet version=“1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> <xsl:template match=“/”> <HTML> <BODY> <xsl:for-each select=“/strings/s”> <p><xsl:value-of select=“.”/></p> </xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet>

템플리트의 구성 템플리트가 적용될 소스 트리 부분 결과 트리로 삽입되어지는 부분

xml programming 18

Cont. 기본 템플리트

도큐먼트 루트에 대응하는 템플리트를 정해놓지 않았다면 , XSLT 는 미리 주어진 정해진 기본 템플리트를 적용한다 .

기본 템플리트• <xsl:template match=“*|/”> <xsl:apply-templates/> </xsl:template>

내장 템플리트• <xsl:template match=“text()|@*”> <xsl:value-of select=“.”/> </xsl:template>

결국 기본 템플리트를 적용하면 도큐먼트 안의 모든 요소에 적용되어 모든 값이 출력된다 .

xml programming 19

Document(=/)

<xsl:template match=“/”>

<html>

<head></head>

<body>

<xsl:apply-templates/>

</body>

</html>

</xsl:template>

강좌 이름 =“XML”

강사

이름

학생

toHTML.xsl

class.xml

<html>

<head></head>

<body>

</body>

</html>

XSLT 프로세서 결과물

xml programming 20

Document(=/)

<xsl:template match=“/”> … <xsl:apply-templates/> …</xsl:template>

<xsl:template match=“ 강좌” > <h1><p align=“CENTER”> <xsl:value-of select=“@ 이름” /> </p></h1> <table align=“center” border=“1”> <xsl:apply-templates/> </table></xsl:template>

강좌 이름 =“XML”

강사

이름

학생

toHTML.xsl

Lab.xml

<html>

<head></head>

<body>

</body>

</html>

Apply-templates

<h1><p align=“CENTER”>XML</p></h1><table align=“center” border=“1”>

</table>

XSLT 프로세서 결과물

Apply-templates

xml programming 21

XPath

XML 도큐먼트의 다른 부분을 가리키는 유연한 방법

지역 경로

XPath 의 함수들

xml programming 22

지역 경로

1. 도큐먼트 ( 루트 )1. <xsl:template match=“/”>

2. 엘레먼트 지정1. <xsl:template match=“/ 학생” >2. <xsl:template match=“ 학생” >

3. 경로표현1. <xsl:template match=“/ 학생 / 이름” >2. <xsl:template match=“ 학생 / 이름” >

xml programming 23

Cont.

4. . : self node

5. .. : parent node

6. 재귀적 내림 연산자1. // : 어느 곳에 있든지 상관없이 이름만으로 경로 지정2. <xsl:template match=“// 이름” >

xml programming 24

Cont.

1. [ ] 를 이용한 필터링1. <xsl:template match = “ 학생 [ 주소 ]”>2. <xsl:template match = “ 강사 [@ 담당과목 ]”>3. <xsl:template match = “ 학생 [@ 성별 =‘ 남자’ ]”>4. <xsl:template match = “ 학생 [ 주소 =‘ 경기도’ ]”>5. <xsl:template match = “ 이름 [.=‘ 이몽룡’ ]”>

6. / 학생 [@ 성별 =‘ 남자’ ]/ 이름 [. = ‘ 이몽룡’ ]

xml programming 25

Cont.

2. 와일드 카드 (*)1. <xsl:template match=“*”>2. <xsl:template match=“@*”>3. <xsl:for-each select=“*”>

xml programming 26

XPath 의 함수들※ 보통의 부모 / 자식 관계나 엘레먼트 / 어트리뷰트 관계로는

일치하지 않는 노드와 노드 집합을 찾는데 사용할 수 있다 .

노드 함수들

위치지정 함수들

산술 함수들

Boolean 함수들

문자열 함수들

xml programming 27

노드 함수들 name()

node()

processing-instruction()

comment()

text()

xml programming 28

Cont.

name() : 엘레먼트의 이름을 반환한다 . <xsl:template match=“name”> <xsl:for-each select=“*”> <p><xsl:value-of select=“name()”/></p> </xsl:for-each> </xsl:template>

node() 노드 자신을 반환한다 . 쓰지 않는다 .

xml programming 29

Cont. processing-instruction()

<xsl:template match=“processing-instruction()”> <xsl:value-of select=“.”/> </xsl:template>

<xsl:template match=“processing-instruction(‘stylesheet’)”> <xsl:value-of select=“.”/> </xsl:template>

comment() <xsl:template match=“comment()”> <xsl:value-of select=“.”/> </xsl:template>

xml programming 30

Cont.

text() <parent> This is some text. <child>And this is some more text</child> </parent>

<xsl:template match=“parent”> <xsl:value-of select=“.”/> </xsl:template>

<xsl:template match=“parent”> <xsl:value-of select=“text()”/> </xsl:template>

xml programming 31

Cont. <xsl:template match=“parent”> <xsl:value-of select=“.”/> </xsl:template>

• 결과 : This is some text.

And this is some more text

<xsl:template match=“parent”> <xsl:value-of select=“text()”/> </xsl:template>

• 결과 : This is some text.

xml programming 32

위치지정 함수들 position()

last()

count()

xml programming 33

Cont. position()

노드 집합 안에서 노드의 위치를 도큐먼트 순으로 얻기 위해 사용된다 .

예제• <nodes>

<node>a</node> <node>b</node>

<node>c</node></nodes>

• <xsl:template match=“/nodes/node”>• <xsl:template match=“/nodes/node[position()=2]”>• <xsl:template match=“/nodes/node[2]”>

xml programming 34

Cont. last()

제일 마지막 노드의 위치를 반환한다 . 제일 마지막 위치의 노드를 반환하는 것이 아니다 .

예제• <xsl:template match=“/nodes/node[position() = last()]”

count() 선택된 노드의 자식 노드 숫자를 반환한다 .

예제• <xsl:value-of select=“count(node)”/>

xml programming 35

산술 함수들 number()

sum()

xml programming 36

Cont.

number() Character 값을 숫자값으로 변환한다 . 예제

• <element>256</element>• <xsl:if test=“number(@Security)”>

sum() 선택된 노드들의 산술값을 더해서 반환한다 . 예제

• <xsl:value-of select=“sum(/nodes/node)”/>

xml programming 37

Boolean 함수들 boolean()

not()

true()

false()

xml programming 38

Cont.

Boolean() XPath 의 표현에 따라 true 또는 false 값을 반환한다 .

• 숫자인 경우• 0 -> false• 0 이외에 수 -> true

• 숫자가 아닌 경우• NaN

• 문자열인 경우• 길이가 0 이면 -> false• 길이가 0 보다 길면 -> true

• 노드인경우• 그 노드가 없으면 -> false• 그 노드가 있으면 -> true

xml programming 39

Cont. 예제

• <person> <name>YS</name>

<addr>KOREA</addr></person>

• <xsl:template match=“person”> <xsl:if test=“boolean(name)”> <!-- 여기서 작업을 처리한다 --> </xsl:if></xsl:template>

xml programming 40

Cont.

not() 결과 값을 반대로 변환해서 반환한다 . 예제

• not(boolean(name))

true(), false() 항상 true 값과 false 값을 반환한다 .

xml programming 41

문자열 함수들

string()

string-length()

concat()

contains()

starts-with()

substring()

substring-after()

substring-before()

translate()

xml programming 42

Cont.

string() 문자열로 바꿔서 반환한다 .

string-length() 공백을 포함한 문자열의 개수를 반환한다 .

concat() 두개이상의 문자열을 받아서 하나의 문자열로 결합한다 . concat(‘my name’, ‘ ‘, ‘is’, ‘ ‘, ‘YS’)

xml programming 43

Cont.

contains() 문자열내에 특정 문자열이 포함되었는지를 확인하여 boolean

값을 반환한다 . contain(“my name is YS”, “is YS”)

starts-with() 문자열이 특정 문자열로 시작되는 지를 확인하여 boolean

값을 반환한다 . Start(“my name is YS”, “my”)

xml programming 44

Cont.

substring() 문자열에서 일부 문자열을 반환한다 . Substring( 문자열 , 가져올문자의시작위치 , 가져올문자의갯수 ) 예제

• Substring(“my name is YS”, 5) “ame is YS”

• Substring(“my name is YS”, 5, 3) “ame”

substring-after() 문자열에서 처음 일치하는 특정한 문자뒤에 있는 문자열을 반환한다 . 예제 : Substring-after(“my name is YS”, “a”) “me is YS”

substring-before() 문자열에서 처음 일치하는 특정한 문자앞에 있는 문자열을 반환한다 . 예제 : Substring-before(“my name is YS”, “a”) “my n”

xml programming 45

Cont.

translate() 문자열을 변환한다 . 예제

• translate(‘QLSN’, ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’,

‘zyxwvutsrqpomnlkjihgfedcba’)

john 반환

예제 ( 대소문자 변환 )• translate(‘YSJUNG', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',

'abcdefghijklmnopqrstuvwxyz')

‘ysjung’ 반환

xml programming 46

Cont. 활용예제

예제 : 공백을 더하기 기호로 바꿀때• translate(‘This is string’, ‘ ‘, ‘+’)

예제 : XSLT 에서 활용사례• <xsl:value-of select= “Translate(., ‘abcdefghijklmnopqrstuvwxyz’, ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’)” />

xml programming 47

Cont. Note!!!

가령 매치되는 문자가 없을 경우에는 원래문자가 반환• translate(‘KING’, ‘ING’, ‘inG’)

‘KinG’

가령 변환대조 문장열의 길이가 다를 경우 , 빼버린다 .• translate(‘+bat+’, ‘abc+’, ‘ABC’)

‘BAT’ (‘+’ 는 매칭되는 변환결과가 없다 !!!)

가령 두번째가 세번째보다 길때 , 결과에 영향을 주지 않는다 .• Translate(‘zero’, ‘eroz’, ‘EROZA’)

‘ZERO’

xml programming 48

축을 중심으로한 관계

13 개의 정의된 축 self 축 child 축 descendant 축 descendant-or-self 축 parent 축 ancestor 축 ancestor-or-self 축 following-sibling 축 preceding-sibling 축 following 축 preceding 축 attribute 축 namespace 축

xml programming 49

Cont. self 축

현재노드를 가리킨다 . 예제

• self::node() .

child 축 현재노드의 자식들이 있는 축을 가리킨다 . 일반적으로 생략해서 사용 예제

• child::order ‘order’

descendant 축 현재노드의 자식들과 자식들의 자식들까지 포함한다 .

descendant-or-self 축 자신을 포함하고 자식들과 자식들의 자식들까지 포함한다 . ‘//’ 와 같은 의미

xml programming 50

Cont. parent 축

현재 노드의 부모를 포함한다 .

ancestor 축 현재 노드의 부모와 부모의 부모를 포함한다 .

ancestor-or-self 축 자신을 포함하고 , 현재 노드의 부모와 부모의 부모를 포함한다 .

following-sibling 축 현재 노드 뒤에 오는 형제 노드를 포함한다 .

preceding-sibling 축 현재 노드 앞에 오는 형제 노드를 포함한다 .

following 축 현재 노드뒤에 오는 형제 노드와 그 노드의 자식까지 포함한다 .

preceding 축 현재 노드 앞에 오는 형제 노드와 그 노드의 자식까지 포함한다 .

xml programming 51

Cont. attribute 축

속성들을 포함하는 축이다 . ‘@’ 와 같은 의미

namespace 축

xml programming 52

Cont.

사용 방법 축이름 :: 노드이름

예제 child::order (order) descendant-or-self::description (.//description) order/attribute::number (order/@number) //date/parent::order (//date/../order) /order/descendant::description //quantity/ancestor::order //description/following-sibling::quantity //quantity/preceding-sibling::description /order/date/following::* /order/item/preceding::*

실습하기 !!!

xml programming 53

쉬어가기 !

xml programming 54

XSLT 프로세서

XML 문서

XSLT 문서

결과문서명령 실행

템플릿

XML 소스트리 결과트리

XSLT 프로세서

xml programming 55

작업순서

1. XML 문서를 읽어 들여서 DOM Tree 를 구성한다 . 또한 XSLT문서를 읽어 들여서 템플릿 단위의 트리를 구성한다 .

2. 트리의 루트 노드부터 시작해서 XSLT 문서에서 가장 유사하게 매칭되는 템플릿이 있는지를 찾는다 .

3. 매칭되는 템플릿이 있으면 현재 노드에 적용한다 .

4. <apply-templates> 등을 만나면 하위 노드가 순서에 따라 현재 노드가 되어 2)번 작업부터 반복해 적용해 나간다 .

xml programming 56

XML 문서와 XSLT 의 결합

1. 내부에 포함된 경우

2. 참조로 연결된 경우

3. 연결없이 결합되는 경우

xml programming 57

결과 문서XSLT프로세서

XML 문서

XSLT 문서

xml programming 58

결과 문서XSLT프로세서

XML 문서

XSLT 문서

xml programming 59

XML 문서 결과 문서XSLT프로세서

XSLT 문서

xml programming 60

Template 스타일시트를 이루는 가장 기본적인 단위

<?xml version=“1.0” ?> <xsl:stylesheet version=“1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> <xsl:template match=“/”> <HTML> <BODY> <xsl:for-each select=“/strings/s”> <p><xsl:value-of select=“.”/></p> <xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet>

템플리트의 구성 템플리트가 적용될 소스 트리 부분 결과 트리로 삽입되어지는 부분

xml programming 61

Cont. 적용 우선 순위 ?

<doc>hi~~ <greeting> 안뇽 !!!</greeting> </do0c>

<!-- 무엇이 매칭될까 ?--> <xsl:template match="greeting"> <g1><xsl:value-of select="."/></g1> </xsl:template>

<xsl:template match="/doc/greeting"> <g2><xsl:value-of select="."/></g2> </xsl:template>

xml programming 62

XLST 의 구성 요소들 <xsl:stylesheet> <xsl:template> <xsl:apply-templates> <xsl:value-of> <xsl:output> <xsl:element> <xsl:attribute> <xsl:attribute-set> <xsl:text> <xsl:if> <xsl:choose> <xsl:for-each> <xsl:copy-of> <xsl:copy> <xsl:sort>

xml programming 63

<xsl:stylesheet> <xsl:stylesheet version=“1.0”

xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”>

루트 엘리먼트의 역할을 한다 .

네임스페이스를 정확히 기재해야 함• XSLT 프로세서가 XSLT 태그를 구별하는 방법

verions 과 xmlns:xsl 은 반드시 필요한 요소

xml programming 64

<xsl:template> XSLT 스타일시트를 구성하는 기본 엘레먼트

<xsl:template match=“Xpath pattern” name=“template name” priority=“number” mode=“mode name”>

XSLT 스타일시트를 구성하는 기본 엘레먼트

xml programming 65

Cont. match 가 가리키는 부분은 expression 이 아닌 pattern!!!

priority 는 우선순위 지정

name 은 Named Template 를 만드는데 사용 . Match 와 같이 일치되는 부분에서 실행되어지는 것이 아니라 이름으로 호출되어 진다 . Named Template 에서 다시 설명 .

mode 는 소스 트리의 같은 부분이 한 번 이상 처리되어야 할 때 사용한다 . 뒤쪽 Mode 부분에서 다시 설명 .

xml programming 66

<xsl:apply-templates> 템플리트 안에서 다른 템플리트를 호출할 때 사용한다 .

<xsl:apply-templates select=“Xpath expression” mode=“mode name”>

Select

• 특정하게 처리하고자 하는 node 를 지정할 때 사용된다 .

• 생략되었을 경우에 처리되는 node 는 현재 node 의 자식들 .

• 어트리뷰트나 네임스페이스의 경우 처리되지 않음 .• 처리하고자 할 경우• <xsl:apply-templates select=“@*”/>

Mode 는 뒤에서 설명 ^^

xml programming 67

<xsl:value-of> Select 속성에 지정된 Xpath expression 에 정해진 값을

찾기 위해 문맥 노드를 탐색하여 결과 트리에 삽입한다 .

<xsl:value-of select=“Xpath expression” disable-output-escaping=“yes or no”

Select 의 예제 :• <xsl:value-of select=“.”>• <xsl:value-of select=“customer/@id”>

xml programming 68

Cont. Disable-output-escaping 은 “ &amp;” 나 “ &lt” 와 같은

이스케이프 문자대신 , “&” 나 “ <“ 문자를 출력하도록 지시 .• 기본적으로 “ no” 로 설정 -> 그대로 출력• “yes” -> 변환하여 출력

<xsl:value-of select="." disable-output-escaping="no" />

• &amp;

<xsl:value-of select="." disable-output-escaping=“yes" />• &

실습해보기 !!!

xml programming 69

<xsl:output> XSLT 는 XML 이나 HTML, 그리고 Text 로 출력할 수 있다 . <xsl:output> 은 사용할 방법을 지정할 수 있게 한다 . 만약 이 엘레먼트가 스타일시트에 포함된다면 반드시

<xsl:template> 자식이 되어야 한다 .

<xsl:output method=“xml or html or text” version=“version” encoding=“encoding” omit-xml-declaration=“yes or no” standalone=“yes or no” cdata-section-elements=“CDATA section” indent=“yes or no”/>

xml programming 70

Cont. <xsl:output> 이 포함되지 않았을 경우 , 기본 출력 방법은 ?

만약 결과 트리의 루트가 <html>( 대소문자모두 ) 라면 ?• HTML

그렇지 않다면 ?• XML

xml programming 71

Cont. method

• XML, HTML, TEXT 등 출력형태 지정

version : XML 일 때만 사용 encoding : XML 일 때만 사용 standalone : XML 일 때만 사용

omit-xml-declaration• XML 선언부를 생략할 수 있다 . ( 기본값 “ no”)

cdata-section-elements• 해당되는 값을 cdata section 에 넣는다 . (??? XSLT 가 잘 지원 못함 )

indent• 보기 좋은 공백을 만들어 준다 .

xml programming 72

<xsl:element> Element 를 만들 수 있는 기능을 제공

<xsl:element name=“element name” use-attribute-sets=“attribute set names”>

Name• 엘레먼트의 태그 이름을 정해 준다

사용 예제• <xsl:element name=“ 이름” > 홍길동 </xsl:element>• < 이름 > 홍길동 </ 이름 >

xml programming 73

Cont. 동적 생성

• <xsl:element name=“{.}”>My text</xsl:element> Xpath expression

예제• <xsl:template match=“name”> <xsl:element name=“{.}”> 인간성좋음 </xsl:element> </xsl:template>

• <name> 홍길동 </name>

결과• < 홍길동 > 인간성좋음 </ 홍길동 >

xml programming 74

Cont. 실습

Attribute 를 가지고 있는 XML 문서를 Element 를 가진 XML문서로 바꾸어 보자 .

<?xml version="1.0"?><people> <name first="John" middle="Fitzgerald Johansen" last="Doe"/> <name first="Franklin" middle="D." last="Roosevelt"/> <name first="Alfred" middle="E." last="Neuman"/> <name first="John" middle="Q." last="Public"/> <name first="Jane" middle="" last="Doe"/></people>

xml programming 75

Cont.

<?xml version="1.0" encoding="UTF-16"?><people> <name> <first>John</first> <middle>Fitzgerald Johansen</middle> <last>Doe</last> </name> <name> <first>Franklin</first> <middle>D.</middle> <last>Roosevelt</last> </name>

<name> <first>Alfred</first> <middle>E.</middle> <last>Neuman</last> </name>

<name> <first>John</first> <middle>Q.</middle> <last>Public</last> </name>

<name> <first>Jane</first> <middle></middle> <last>Doe</last> </name></people>

xml programming 76

<xsl:attribute> Attribute 를 만들 수 있는 기능을 제공

<xsl:attribute name=“attribute name”>

name• Attribute 의 이름을 정해 준다

사용 예제• <name> <xsl:attribute name=“번호” >123</xsl:attribute> 홍길동 </name>

• <name 번호 =“123”> 홍길동 </name>

xml programming 77

Cont. 동적 생성의 예

• <name> <xsl:attribute name=“{.}”>123</xsl:attribute> 홍길동 </name>※ 엘레먼트뒤에서 사용되었다 .

잘못된 예• <name> 홍길동 <xsl:attribute name=“{.}”>123</xsl:attribute> </name>※ PCDATA 의 어트리뷰트가 되려고 한다 !!??

xml programming 78

<xsl:attribute-set> Attribute 그룹을 만드는 기능 제공

<xsl:attribute-set name=“IdSize”> <xsl:attribute name=“id”>123</xsl:attribute> <xsl:attribute name=“Size”>100</xsl:attribute> </xsl:attribute-set>

xml programming 79

Cont.

실습 엘레먼트만 가지고 있는 문서를 어트리뷰트를 가지도록

만들어라 .

xml programming 80

Cont.

<?xml version="1.0" encoding="UTF-16"?><people> <name> <first>John</first> <middle>Fitzgerald Johansen</middle> <last>Doe</last> </name>

<name> <first>Franklin</first> <middle>D.</middle> <last>Roosevelt</last> </name>

<name> <first>Alfred</first> <middle>E.</middle> <last>Neuman</last> </name>

<name> <first>John</first> <middle>Q.</middle> <last>Public</last> </name>

<name> <first>Jane</first> <middle></middle> <last>Doe</last> </name></people>

xml programming 81

Cont.

다음과 같이 바꾸어라 .

<?xml version="1.0"?><people> <name first="John" middle="Fitzgerald Johansen" last="Doe"/> <name first="Franklin" middle="D." last="Roosevelt"/> <name first="Alfred" middle="E." last="Neuman"/> <name first="John" middle="Q." last="Public"/> <name first="Jane" middle="" last="Doe"/></people>

xml programming 82

<xsl:text> 단순한 Text(PCDATA) 를 결과 트리에 삽입하는 기능 제공

<xsl:text disable-output-escaping=“yes or no” />

예제• <xsl:value-of select=“’john’”/> <xsl:value-of select=“’Fitzgerald Johansen’”/>• <xsl:value-of select=“’Deo’”>

• 결과 : johnFitzgeraldJohansenDoe

• 원하는 결과• john Fitzgerald Johansen Doe

xml programming 83

<xsl:if> Boolean 값에 의해 참이면 실행되고 , 거짓이면 실행되지

않는다 .

<xsl:if test = “Boolean expression”>

Test 에는 boolean 값이 온다 .

예제• <xsl:if test=“name” >Name 을 만났다 !!!</xsl:if>• <xsl:if test="@ 성별 = '남자 ' ">• <xsl:if test=“first[.= ‘ 길동’ ]”>• <xsl:if test=“ 이름 [@ 성별 = 남자 ]” >

실습하기 !!!

xml programming 84

<xsl:choose>

Boolean 값에 의해 여러개중에 하나가 선택되어져 실행된다 . 무조건 한번 실행되어지면 choose 는 제어권을 잃는다 .

<xsl:choose> <xsl:when test = “boolean expression”> <xsl:when test = “boolean expression”> <xsl:otherwise> </xsl:choose>

예제• <xsl:choose> <xsl:when test = “number[. &gt; 2000]A big number </xsl:when> <xsl:when test = “number[. &gt; 1000]A medium

number</xsl:when> <xsl:otherwise>A small number</xsl:otherwise> <xsl:choose>

xml programming 85

<xsl:for-each> Select 의 Xpath expression 에 일치하는 모든 노드에

대해서 실행 . 템플리트 내에 위치 .

<xsl:for-each select=“name”> This is name element. </xsl:for-each>

위 예제의 경우 모든 name 에서 다 실행된다 .

템플리트 내에 또다른 템플리트를 가지고 있는 것과 같이 동작한다 .

xml programming 86

Cont. 실습

다음의 XSLT 문서를 for-each 를 사용해서 고치시오 .

<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" indent="yes"/>

<xsl:template match="/"> <people> <xsl:apply-templates select="/people/name"/> </people></xsl:template>

<xsl:template match="name"> <name> <xsl:apply-templates select="@*"/> </name></xsl:template>

<xsl:template match="@*"> <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element></xsl:template></xsl:stylesheet>

xml programming 87

<xsl:copy-of> 소스 트리의 일부를 취해서 결과 트리에 복사해준다 .

<xsl:copy-of select = “Xpath expression”/>

select속성에 노드를 지정하면 , 선택된 노드와 atrribute, 자식 노드등을 결과트리에 담는다 .

실습하기 !!!

xml programming 88

<xsl:copy> <xsl:copy-of> 와 유사하나 선택된 노드만 복사한다 . 선택된

노드안에 들어갈 어트리뷰트나 자식노드를 지정할 수 있다 .

<xsl:copy use-attribute-sets=“att set names”>

현재 노드의 자식이나 attribute 가 복사되지 않는다 . 대신 들어갈 자식노드나 attribute 를 지정할 수 있다 .

xml programming 89

Cont. 예제

• <name> <first>YS</first> <last>Jung</last></name>

• <xsl:template match=“name”> <xsl:copy /></xsl:template>

결과• <name/>

xml programming 90

Cont. 예제

• <name> <first>YS</first> <last>Jung</last></name>

• <xsl:template match=“name”> <xsl:copy> <xsl:value-of select = “.”/> </xsl:copy></xsl:template>

결과• <name>

YS Jung</name>

xml programming 91

<xsl:sort> 자식 엘레먼트를 정렬할 수 있는 기능 제공

<xsl:sort select=“Xpath expression” lang=“lang” data-type=“text or number” order=“ascending or descending” case-order=“upper-first or lower-first”/>

xml programming 92

Cont. Select 는 정렬하는데 기준으로 사용하는 부분을 정의

data-type 은 숫자인지 문자인지를 지정 ( 기본값 Text)• Text 의 경우

• 1, 10, 11, 5• Number 인 경우

• 1, 5, 10, 11

order 는 결과의 정렬이 오름차순인지 내림차순인지를 지정 ( 기본값 오름차순 )

Case-order 는 대문자가 먼저인지 , 소문자가 먼저인지를 결정• Upper-first

• A, B, a, b• Lower-first

• a A b B

xml programming 93

모드 (mode) <xsl:template> <xsl:apply-templates>

템플리트를 만들때 , mode 속성을 지정하고 이름을 준다 .• <xsl:template match=“name” mode=“TOC”/>• <xsl:template match=“name” mode=“body”/>

이 템플리트를 호출할 때는 mode 를 지정할 수 있다 .• <xsl:apply-templates select=“name” mode=“TOC”/>

xml programming 94

Cont.

<?xml version="1.0"?><XSL> <title>XSLT - The Gory Details</title> <section>Templates <paragraph> We have been introduced briefly to the concept of <important>templates</important>. These are really the heart and soul of XSLT. Style sheets are simply a collection of these templates, which are applied to the input document to create the output document. </paragraph> <paragraph> Let's take another look at a previous...</paragraph> </section> <section> XSLT's Order of Operations <paragraph> If a style sheet can have...</paragraph> <paragraph>Actually...</paragraph> </section></XSL>

xml programming 95

Cont.

xml programming 96

Cont. 실습

XML 문서를 화면과 같이 보이게 하는 XSLT 문서 만들어 보기 !

xml programming 97

<xsl:variable> 상수정의

• <xsl:variable name=“PI”>3.14</xsl:variable>

• <xsl:variable name=“name” select=“/people/name”/>• 이경우에는 Content 를 가질 수 없다 .

사용예• <math pi=“{$PI}”/>

• <xsl:value-of select=“$PI”/>

• $를 붙여서 사용한다 . 그러면 Xpath 를 사용하는 어느곳에서든지 상수를 사용할 수 있다 .

xml programming 98

Cont. 확장된 사용예

• <xsl:variable name=“space”> <xsl:text> </xsl:text></xsl:variable>

<xsl:variable name=“name”> <name> <xsl:value-of select=“/name/first”/> <xsl:value-of select=“$space”/> <xsl:value-of select=“/name/last”/> </name></xsl:variable>

<xsl:copy-of select=“$name”/>

실습하기 !!!

xml programming 99

Cont.

전역 상수

지역 상수

상수의 유효 영역 (scope)

예제• <xsl:stylesheet version=“1.0” xmlns:xsl=“…”>

<xsl:output method=“text”/>

<xsl:variable name=“age”>29</xsl:variable>

<xsl:template match=“/”> <xsl:variable name=“name”>YS</xsl:variable> <xsl:value-of select=“concat($name, ‘ is ‘, $age)”/> <xsl:template>

</xsl:stylesheet>

실행결과• YS is 29

xml programming 100

Cont. 예제

• <xsl:stylesheet version=“1.0” xmlns:xsl=“…”> <xsl:output method=“text”/>

<xsl:variable name=“name”>YS</xsl:variable>

<xsl:template match=“/”> <xsl:variable name=“name”>DJ</xsl:variable> <xsl:value-of select=“$name”/> </xsl:template>

</xsl:stylesheet>

결과• DJ

xml programming 101

Named Templates

Named Template를 호출한다 .

Xpath 에 일치되는 템플리트가 호출되는 것이 아니라 이름을 가지고 지정한 템플리트가 호출되게 하는 방법이다 .

예제• <xsl:template match=“/”>

<xsl:for-each select=“name”> <xsl:call-template name=“bold”/> </xsl:for-each>

<xsl:for-each select=“not-name”> <xsl:call-template name=“bold”/> </xsl:for-each></xsl:template>

<xsl:template name=“bold”> <B><xsl:value-of select=“.”/></B></xsl:template>

템플리트에서 name 과 match 를 동시에 사용할 수 있다 .

xml programming 102

Parameter

비교 <xsl:template name=“name”>

First Name : <xsl:value-of select=“first”/> Last Name : <xsl:value-of select=“last”/></xsl:template>

<xsl:template name=“name”> <xsl:param name=“first”><xsl:value-of select=“first”/></xsl:param> <xsl:param name=“last”><xsl:value-of select=“last”/></xsl:param> First Name : <xsl:value-of select=“$first”/> Last Name : <xsl:value-of select=“$last”/></xsl:template>

xml programming 103

Cont.

<xsl:template match="/"> <xsl:for-each select="name"> <!-- 여기가 새로운 부분 시작 -->

<xsl:call-template name="name"> <xsl:with-param name="first"><xsl:value-of select="given"/></xsl:with-

param> <xsl:with-param name="last"><xsl:value-of select="family"/></xsl:with-

param> </xsl:call-template> <!-- 여기가 새로운 부분 마지막 --> </xsl:for-each> </xsl:template>

<xsl:template name=“name”> <xsl:param name=“first”><xsl:value-of select=“first”/></xsl:param> <xsl:param name=“last”><xsl:value-of select=“last”/></xsl:param> First Name : <xsl:value-of select=“$first”/> Last Name : <xsl:value-of select=“$last”/></xsl:template>

Param 보다 with-param 이 우선순위가 높다 .

Recommended