본문 바로가기

Dev.../웹서비스

[펌] XSL 기초

XSL 기초

1. XSL 구조

2. XSLT 이해(1)

3. XSLT 이해(2)

4. XPath 이해

5. XSL Stylesheet 예제 (1)

6. XSL Stylesheet 예제 (2)

7. XSL Stylesheet 예제 (3)

8. XSL Stylesheet 예제 (4)

1. XSL 구조

들어 가기에 앞서..

XML이 인터넷상의 데이터 전송을 위해 설계되었다면, XSL은 이러한 XML문서를 처리하기 위해 설계되었다. XSL은 XML의 장점인 플랫폼 독립적이고, 언어 독립적이라는 점을 그대로 계승한 XML Application이라고 생각하면 쉽다. 이러한 XSL로 생성한 문서는 XSL 스타일 시트(StyleSheet)라고 불리며, DTD(Document Type Definition) 그리고, XML 문서와 함께 데이터로써의 가치를 지니게 된다.

1.1 XSL의 구성

XSL 은 크게 2 가지의 파트로 구성된다. 하나는 XML문서의 변환(Transformation)을 위한 언어, 다른 하나는 포맷팅 구문(Formatting Semantics)을 기술하기 위한 어휘(Vocabulary)로 이루어져있다. 변환을 위한 언어인 XSLT(XSL Transformations)는 XPath(XML Path Language)와 함께 사용하여 XSL의 기본 골격을 구성한다. 이러한 기본 골격위에 포맷팅을 위한 어휘를 사용하여 XML문서를 표현하기도 하지만, 다른 형태의 문서를 생성하기도 한다.

[그림 1] XSL 구성

그림1 에서 보이는 XSL 스타일 시트는 하나의 잘구성된(Well-Formed) XML 문서다. 최상위 엘리먼트(Element)인 xsl:sytlesheetxsl:template, xsl:apply-templates, fo:block은 모두 시작태그(Start-Tag)와 끝태크(End-Tag) 혹은 빈 태그(Empty Tag)로 구성되고, XML 원칙을 준수 하고 있다. XSL은 다양한 구성요소들을 포함하기 위해 네임스페이스(Namespaces)를 사용하여 각 구성요소의 엘리먼트들을 구분 및 처리 하도록 규정하고 있다. 네임스페이스에 사용되는 URI(Uniform Resource Identifier)는 스펙에 기술되어 있는 것을 사용한다.

 <xsl:stylesheet version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:fo="http://www.w3.org/1999/XSL/Format">  

xsl:stylesheet는 XSLT의 최상위 엘리먼트로 XSL 스타일 시트에서 유일하도록 규정하며, 엘리먼트에 해당하는 속성을 기술하여 스타일 문서의 추가 정보를 나타내도록 한다. 즉, xsl:을 접두사로 갖는 엘리먼트 이름은 "http://www.w3.org/1999/XSL/Transform"의 엘리먼트로서 처리하라는 의미를 갖는다. fo:를 접두사로 갖는 엘리먼트 이름은 "http://www.w3.org/1999/XSL/Format"의 엘리먼트로서 처리하라는 의미를 갖는다. 여기서 xsl:은 XSL의 기본골격 및 최상위 엘리먼트에 사용되며, fo:는 포맷팅을 위한 엘리먼트에 사용된다.

XSL의 기본은 룰(Rule)들로 구성된다.(즉, 룰기반 처리가 이루어 진다는뜻) 룰은 XSLT의 엘리먼트중 template을 사용하며, 템플리트룰(Tempalte Rule) 혹은 생성규칙(Construction Rule)으로 불린다. 템플리트룰은 xsl:template 엘리먼트에 match 속성의 값인 패턴(Pattern)이라고 불리는 표현에 따라 처리된다. 이러한 표현은 XPath를 사용하며, XPath는 입력트리(Source Tree)인 XML문서에 접근하기 위한 언어다. 템플리트룰 내부에서 사용되는 xsl:apply-templates는 템플리트룰들을 연결하여 하나의 결과트리(Result Tree)를 생성하는 역할을 한다.

 <xsl:template match="/">  <xsl:apply-templates select="block"/> </xsl:template>   or    <xsl:template match="block">  <fo:block>   <xsl:apply-templates/>  </fo:block> </xsl:template>  

[ 그림 2 ] XSLT/XPath/FO 관계

그림2 에서 처럼 XSLT는 룰의 영역내부에 포맷팅 객체나 변환후 결과를 위한 다른형식의 데이터를 포함할 수 있도록 되어있다. 또한 룰 처리를 위한 노드의 선택 및 처리 방법의 조건기술, 결과 트리에 삽입될 데이터 생성 등의 다양한 목적을 표현하기 위한 XPath를 기반으로 하고 있다.

2. XSLT 이해(1)

XSLT 표준안 상태에 대해..

XSLT는 1999년 11월 16일 현재 W3C(World Wide Web Consortium)에 XSLT 1.0 으로 권고(Recommendation) 되었고, 2000년 12월 12일 현재 XSLT 1.1 이 개발단계(Working Draft)에 있다.

2.1 XSLT 처리 개념

템플리트룰은 XSLT 지시(Instruction) 노드와 포맷팅 노드 등으로 구성된 단편적인 트리(Fragments Tree) 이다. 각 템플리트룰은 XPath 표현식을 포함한 XSLT 지시 노드와 관계되는 XML 엘리먼트 노드에 대한 접근 처리후, 결과트리인 단편트리가 생성된다. 또한 결과 단편 트리들은 템플리트룰중 연결을 위한 XSLT 지시 노드의 처리과정에 의해 하나의 트리 결과물로 산출된다.

[ 그림 1 ] XSLT 처리 개념

그림1의 XSLT 처리 개념도에서 XSL 스타일시트는 각각이 단편 트리로 구성된 템플리트룰들을 포함하고 있다. 템플리트룰의 지시노드는 XPath 표현 처리시 XML 문서인 입력 트리의 일부 노드에 접근한다. 템플리트룰의 단편 트리를 바탕으로, 또 다른 지시노드 처리에 의해 결과 트리를 하나의 단편 트리로 생성한다.

2.2 템플리트 매칭(Template Matching)

템플리트 매칭이란 쉽게 예기해서 입력 문서의 엘리먼트에 해당하는 템플리트룰을 적용시키는 것이다.

 <memo>  <to>홍길동</to>  <from>김돌쇠</from>  <say>안녕하세요.<say> </memo> <xsl:template match="memo">  ... </xsl:template>   

위의 XML 문서는 <memo>엘리먼트를 루트(root)로 하는 트리가 그림2 에서 보여진다. 트리는 기술된 엘리먼트의 순서에 의해 깊이 우선 탐색을 통한 접근이 이루어 지도록 한다. 또한, <memo>엘리먼트에 해당하는 템플리트룰이 정의되어 있다.

[ ! ] 모든 XML 문서의 루트 엘리먼트 위에는 최상위 루트가 존재한다. 즉, XML 내용의 루트가 아닌 XML 문서의 루트를 의미한다. / 를 사용하여 XML 문서의 루트를 표시한다.

XSLT 프로세서는 XML 문서의 루트에서 부터 XML 문서에 접근하여 템플리트를 매칭시킨다. 이는 매우 단순한 방법으로 매칭되는데, 현재 노드를 기준으로 하여 템플리트 매칭이 결정된다. 최초의 현재 노드는 문서의 루트인 / 이다. 때문에 XSLT 프로세서는 템플리트룰중에 / 을 패턴으로 하는 템플리트를 찾는다. 즉, 최초로 시작되는 템플리트룰은 다음과 같다.

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

위의 템플리트가 매칭된 후에 새로운 현재 노드를 선택하기 위해 <xsl:apply-templates/>를 사용했다. 이는 현재 노드(여기서는 / )의 자식 노드들을 반복적으로 선택후 템플리트룰을 적용하라는 의미다. 즉, / 의 자식 노드인 <memo> 가 선택되고 이에 해당하는 템플리트가 매칭된다.

<xsl:apply-templates/>가 현재 노드의 모든 자식 엘리먼트들을 반복적으로 선택하라는 의미 이외에 select 속성을 사용하여 매칭시킬 자식노드 및 특정 노드를 선택 할 수 있다. 즉, 다음과 같이 사용할 수 있다.

 <xsl:apply-templates select="memo"/> <xsl:apply-templates select="memo/from"/> <xsl:apply-templates select="."/>   

select 속성값으로 "memo" 는 절대경로로 나타내면 "/memo" 라는 의미로 현재노드는 <memo> 이고, "memo" 를 패턴으로 하는 템플리트를 매칭시킨다. 속성값으로 "memo/from" 는 현재 노드가 <from> 이고, "memo/from" 을 패턴으로 하는 템플리트를 매칭시킨다. (혹은 "from" 을 패턴으로 하는 템플리트를 매칭, 이는 우선순위에 준한다.) 속성값으로 "." 는 현재 노드 그 자체이므로, 무한 루프에 빠질수 있다.

2.3 템플리트 예제

다음은 2.2 의 XML 문서에 대한 완전한 XSL 스타일 시트를 보여준다.

 <xsl:stylesheet version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/">   <HTML>    <xsl:apply-templates/>   </HTML>  </xsl:template>  <xsl:template match="memo">   <xsl:apply-templates select="say"/>   <xsl:apply-templates select="from"/>   <xsl:apply-templates select="to"/>  </xsl:template>  <xsl:template match="say">   <H1>    <xsl:value-of select="."/>   </H1>  </xsl:template>  <xsl:template match="from">   <H2>    <xsl:value-of select="."/>   </H2>  </xsl:template>      <xsl:template match="to">   <H3>    <xsl:value-of select="."/>   </H3>  </xsl:template>    </xsl:stylesheet>   

다음 그림2는 위의 템플리트룰들이 처리되는 과정을 보인다.

[ 그림 2 ] 템플리트 매칭 과정

스타일시트는 5개의 템플리트룰을 트리 노드로 구성하고 있으며, 각 템플리트룰은 템플리트 매칭에 의해 그림2와 같이 연결된다. <xsl:value-of>select로 선택된 노드의 텍스트 노드의 값을 삽입한다.

최종 변환 결과는 다음과 같다.

 <HTML>  <H1>안녕하세요.</H1>  <H2>김돌쇠</H2>  <H3>홍길동</H3> </HTML>   

3. XSLT 이해(2)

3.1 XSLT 엘리먼트(XSLT Eelement)

Stylesheet Element [§2.2]

 <xsl:stylesheet  id = id   extension-element-prefixes = tokens   exclude-result-prefixes = tokens   version = number>   <!-- Content: (xsl:import*, top-level-elements) --> </xsl:stylesheet> <xsl:transform  id = id   extension-element-prefixes = tokens   exclude-result-prefixes = tokens   version = number>   <!-- Content: (xsl:import*, top-level-elements) --> </xsl:transform>     

[ ! ] xsl:stylesheetxsl:transform 는 동의어로 사용함

Stylesheet Inclusion [§2.6.1]

 <xsl:include href = uri-reference/>   

Stylesheet Import [§2.6.2]

 <xsl:import href = uri-reference/>   

Whitespace Stripping [§3.4]

 <xsl:strip-space elements = tokens/> <xsl:preserve-space elements = tokens/>   

Defining Template Rules [§5.3]

 <xsl:template   match = number   name = id   priority = tokens   mode = tokens>   <!-- Content: (xsl:param*, template) --> </xsl:template>   

Applying Template Rules [§5.4]

 <xsl:apply-templates select = node-set-expression   mode = qname/> <xsl:apply-templates   select = node-set-expression   mode = qname>   <!-- Content: (xsl:sort | xsl:with-param)* --> </xsl:apply-templates>   

Overriding Template Rules [§5.6]

 <xsl:apply-imports/>   

Named Templates [§6]

 <xsl:call-template name = qname/> <xsl:call-template   name = qname>   <!-- Content: xsl:with-param* --> </xsl:call-template>   

Namespace Alias [§7.1.1]

 <xsl:namespace-alias   stylesheet-prefix = prefix | "#default"   result-prefix = prefix | "#default"/>   

Creating Elements [§7.1.2]

 <xsl:element   name = { qname }   namespace = { uri-reference }   use-attribute-sets = qnames>   <!-- Content: template --> </xsl:element>   

Creating Attributes [§7.1.3]

 <xsl:attribute   name = { qname }   namespace = { uri-reference }>   <!-- Content: template --> </xsl:attribute>   

Named Attribute Sets [§7.1.4]

 <xsl:attribute-set   name = qname   use-attribute-sets = qnames>   <!-- Content: xsl:attribute* --> </xsl:attribute-set>   

Creating Text [§7.2]

 <xsl:text  disable-output-escaping = "yes" | "no">   <!-- Content: #PCDATA --> </xsl:text>   

Creating Processing Instructions [§7.3]

 <xsl:processing-instruction  name = { ncname }>   <!-- Content: template --> </xsl:processing-instruction>   

Creating Comments [§7.4]

 <xsl:comment>  <!-- Content: template --> </xsl:comment>   

Copying [§7.5]

 <xsl:copy  use-attribute-sets = qnames>   <!-- Content: template --> </xsl:copy>   

Generating Text [§7.6.1]

 <xsl:value-of  select = string-expression  disable-output-escaping = "yes" | "no"/>   

Attribute Value Templates [§7.6.2]

 <element attribute = "{expression}"/>   

Numbering [§7.7]

 <xsl:number   level = "single" | "multiple" | "any"   count = pattern   from = pattern   value = number-expression   format = { string }   lang = { nmtoken }   letter-value = { "alphabetic" | "traditional" }   grouping-separator = { char }   grouping-size = { number }/>   

Repetition [§8]

 <xsl:for-each  select = node-set-expression>   <!-- Content: (xsl:sort*, template) --> </xsl:for-each>   

Conditional Processing [§9]

 <xsl:if  test = boolean-expression>   <!-- Content: template --> </xsl:if>     <xsl:choose>  <!-- Content: (xsl:when+, xsl:otherwise?) --> </xsl:choose>    <xsl:when  test = boolean-expression>   <!-- Content: template --> </xsl:when>    <xsl:otherwise>  <!-- Content: template --> </xsl:otherwise>   

Sorting [§10]

 <xsl:sort   select = string-expression   lang = { nmtoken }   data-type = { "text" | "number" | qname-but-not-ncname }   order = { "ascending" | "descending" }   case-order = { "upper-first" | "lower-first" }/>   

Variables and Parameters [§11]

 <xsl:variable name = qname   select = expression/> <xsl:variable   name = qname>   <!-- Content: template --> </xsl:variable>     <xsl:param name = qname   select = expression/> <xsl:param   name = qname>   <!-- Content: template --> </xsl:param>  

Using Values of Variables and Parameters [§11.3]

 <xsl:copy-of  select = exprssion/>   

Passing Parameters to Templates [§11.6]

 <xsl:with-param name = qname  select = expression/> <xsl:with-param  name = qname>   <!-- Content: template --> </xsl:with-param>   
 <xsl:key  name = qname  match = pattern  use = expression/>   

Number Formatting [§12.3]

 <xsl:decimal-format   name = qname   decimal-separator = char   grouping-separator = char   infinity = string   minus-sign = char   NaN = string   percent = char   per-mille = char   zero-digit = char   digit = char   pattern-separator = char/>   

Messages [§13]

 <xsl:message   terminate = "yes" | "no">   <!-- Content: template --> </xsl:message>   

Fallback [§15]

 <xsl:fallback>   <!-- Content: template --> </xsl:fallback>   

Output [§16]

 <xsl:output   method = "xml" | "html" | "text" | qname-but-not-ncname   version = nmtoken   encoding = string   omit-xml-declaration = "yes" | "no"   standalone = "yes" | "no"   doctype-public = string   doctype-system = string   cdata-section-elements = qnames   indent = "yes" | "no"   media-type = string/>   
 Key xsl:stylesheet  Element version   반드시 요구되는 속성(Required attribute) version   선택적으로 존재하는 속성(Optional attribute) {expression}  Attribute value template template   템플리트내에서 어떤것도 허용 |   양자 택일 구분(or) ?   0번 혹은 한번 반복 *   0번 이상 반복 +   1번 이상 반복 #PCDATA   파싱된 문자 데이터 Attribute Value Type   boolean-expression  불 논리연산(Boolean)값을 돌려주는 표현 char   단일 문자 expression  표현 id   식별자(identifier)로 사용되는 XML 이름  ncname   qname에서 접두사(prefix)와 콜론(:)을 제외한 XML 이름 nmtoken   이름 토큰(Name token) node-set-expression 집합노드를 돌려주는 표현 number   리터럴 값(Literal value)으로 여기서는 1.0 을 사용 number-expression  숫자를 돌려주는 표현 pattern   XSLT pattern prefix   네임스페이스(Namespace) 접두사 qname   옵션인 접두사와 ncname을 포함하는 적격한 네임스페이스의 XML 이름 qname-but-not-ncname 접두사와 ncname을 포함하는 적격한 네임스페이스 이름 string-expression  문자열 표현 token   토큰 uri-reference  URI 참조   

3.2 XSLT 함수들(XSLT Functions)

node-set document( object, node-set? ) [§12.1]

node-set key( string, obejct ) [§12.2]

string format-number( number, string, string? ) [§12.3]

node-set current( ) [§12.4]

string unparsed-entity-uri( string ) [§12.4]

string generate-id( node-set? ) [§12.4]

object system-property( string ) [§12.4]

boolean element-available( string ) [§15]

boolean function-available( string ) [§15]

4. XPath 이해

XPath 표준안 상태에 대해..

XPath는 XSLT 1.0과 함께 1999년 11월 16일 현재 W3C(World Wide Web Consortium)에 XPath 1.0 으로 권고(Recommendation) 되어있다. XPath는 XSLT의 표현 언어(Expression language)로써 XSLT의 속성에서 사용된다.

XPath는 XML 문서의 특정 엘리먼트(속성,PI ..) 위치를 어떻게 기술하는지 등의 기본적인것을 제공하며, 간결하게 표현 할 수 있다. 또한 XPath는 XSLT와 XPointer에서 기반으로 사용되도록 설계되어 있다. 때문에 XPath는 문자열 기반의(String-based) 문법을 바탕으로 속성이나 URIs 에서 표현 가능하다. 그러나, XSLT와 XPointer에서 사용되는 XPath가 완전히 동일하지 않기때문에 핵심 함수(Core Function)를 두어 기능적으로 같도록 한다.

4.1 XPath 데이터 모델(Data Model)

XPath의 데이터 모델은 논리적인(Logical) 트리로서 XML 문서를 다룬다. 논리적 트리는 각 노드를 타입으로 구분하여, 타입에는 엘리먼트(Element), 속성(Attribute), 텍스트(text), 처리지시(Processing Instruction), 주석(Comment), 네임스페이스(Namespace), 루트(Root)가 있다. 실제 문서를 트리로 표현할때 물리적인 트리에 비해 논리적인 트리는 처리과정이 독립적일 수 있다.

[ 그림 1 ] XPath 데이터 모델

그림1 에서 좌측부분이 실제 문서를 물리적인 트리로 표현한 것이고, 우측이 논리적으로 트리를 표현한 것이다. /Root로, <doc>, <para>, <em> 엘리먼트들은 모두 E로 대응되고, <?Pub Caret?>PI로, "Some", "emphasis" 등의 문자열들은 Text로 대응된다. 이처럼 그림1은 물리적인 트리의 노드를 일반화시켜 논리적인 노드의 트리로 보여준다. XPath는 이러한 논리적 트리에서 노드들을 다루고, 핵심 함수들을 사용하여 세부적인 기능들을 이용하도록 설계되어 있다.

4.2 표현 구조(Expression Syntax)

XPath는 XSLT의 패턴(Pattern)에 사용되는 위치경로(Location Path)와 이를 포함하며 좀더 다양한 표현을 위한 표현법(Expressions)이 있다. 완전한 표현언어(Expression Language)는 위치경로와 위치경로 이상의 표현, 그리고 다양한 계산을 수행하고 객체(Object)를 비교하기 위한 연산자(operators), 다양한 타입 분석 및 관리를 위한 함수를 사용하여 표현할 수 있다.

[ ! ] XSLT 패턴에 사용되는 패턴언어(Pattern Language)는 XPath의 일부분으로 볼수 있지만, XSLT 템플리트 매칭에 제한적이고 약간의 표현만을 허용하는 XSLT 표준이다. 그러므로, XSLT 패턴 언어와 XPath 의 표현 언어(Expression Language)는 다르다고 볼 수 있다.

위치경로(Location Path)는 절대경로(Absolute Location Path)와 상대경로(Relative Location Path)로 표현될 수 있다. 절대경로는 문서 구조상 최상위 노드인 루트( /)에서 시작해 원하는 위치까지의 경로를 표현한다. 상대경로는 현재노드(Current Node)에서 시작해 원하는 위치까지의 경로를 표현한다.

경로는 단계(스텝:Step)들로 구성되며, step은 기초부(베이시스:Basis)와 술어부(프리디케이트:Predicate)로 구성된다. basis는 축(엑시스:Axis)과 노드검사(노드테스트:Node Test)로 구성되며, 생략가능한 predicate는 대괄호(square bracket)로 묶인 표현식으로 구성된다. axis는 13개의 축이름(엑시스네임:Axis Name)과 더블 콜론(::)으로 구성되고, node test는 엘리먼트 이름이나 노드 타입(Node Type : node, comment, text, processing-instruction)으로 구성된다.

Axis Name

Node Test

ancestor::ancestor-or-self::attribute::child::descendant::descendant-or-self::following::following-sibling::namespace::parent::preceding::preceding-sibling::self::   
nameURI:nameprefix:name*prefix:*node()comment()text()processing-instruction()processing-instruction(literal)   

[ ! ] attribute:: axis는 attribute 노드의 개념이고,namespace:: axis는 namespace 노드의 개념이다.. 다른 axes는 element 노드에 대응 되는 개념이다.

[ 그림 2 ] 위치경로(location path)

그림2는 위치경로의 간단한 예제를 보여준다. step은 "/"로 구분하고, 오른쪽에서 부터 왼쪽으로 읽어 매치시킨다. 즉, 가장 오른쪽이 현재노드를 나타낸다. 첫번째 step은 axis와 node test로 구성 되었고, axis name은 following을 사용했다. 두번째 step은 엘리먼트 이름과 Predicate로 구성되었다. 마지막 세번째 step은 엘리먼트 이름으로만 구성되어 있다.

[ 그림 3 ] Axes

그림3은 axes에 대해 해석한 그림이다. 현재노드(current node)이자 self:: axis name은 회색으로 표시된 노드를 가르킨다. 그림3의 좌측은 ancestor::, preceding-sibling::, following-sibling::, child:: axis name을 표시하며, 노드안의 숫자는 참조되는 순서다. 우측은 preceding::, following, descendant:: axis name을 표시한다. ancestor-or-self:: axis name은 현재노드를 포함한 ancestor:: 를 의미하며, descendant-or-self:: axis name은 현재노드를 포함한 descendant:: 를 의미한다. parent:: axis name은 현재노드의 부모 노드를 의미한다. attribute:: axis는 컨택스트 노드(Context node)의 attribute를 포함하며, namespace:: axis는 컨택스트 노드의 namespace를 포함한다.

[ ! ] 컨택스트 노드(Context Node) : XSLT나 XPointer의 XPath 표현 문맥상 결정되는 노드를 의미하며 노드(context node), 숫자(context position : context size), 연결된 변수 집합, 함수, 표현을 위해 선언된 네임스페이스 집합 등이 될 수 있다. 보통 현재노드를 의미한다.

4.3 단축법(Abbreviated Syntax)

XPath에는 표현의 간략화를 위해 필요없는 표현을 생략하거나 대치하는 방법을 사용한다.

가장 대표적인 child::는 디폴트(default)로 쓰이는 axis로써 보통 생략된다.

 div/para = child::div/child::para   

attribute:: axis 는 @ 로 대치되어 사용되기도 한다.

 para[@type="warning"] = child::para[attribute::type="warning"]    

모든 엘리먼트에 대응되는 표현으로 *를 사용하거나, 모든 어트리뷰트에 대응되는 @*를 사용하기도 한다.

 * = child::* @* = attribute::*  

현재 노드 즉, self::node()를 간략화 시킨 .을 사용하기도 한다.

 ./para  = self::node()/child::para   

부모 노드 즉, parent::node()를 간략화 시킨 ..을 사용하기도 한다.

 ../title = parent::node()/child::title   

특별히 //를 사용하여 컨트스트 노드의 모든 후손노드(/descendants-or-self::node())를 선택할 수 도 있다.

 .//para  = self::node()/descendant-or-self::node()/child::para   

루트노드는 /로 나타낸다.

 

4.4 기타 표현식

Booleans

or , and , = , != , <= , < , >= , >

Numbers

+ , - , div , mod

4.5 XPath Syntax Sample

단축하지 않은 표현(unabbreviated syntax) vs 단축 표현(Abbreviated Syntax)

child::para para컨택스트 노드의 모든 자식 노드중 para 엘리먼트인것 선택child::* *컨택스트 노드의 모든 자식 엘리먼트 선택child::text() text()컨택스트 노드의 모든 자식 텍스트 노드 선택  attribute::name @name컨택스트 노드의 name 어트리뷰트 선택attribute::* @*컨택스트 노드의 모든 어트리뷰트 선택child::chapter/descendant::para chapter//para컨택스트 노드의 자식 노드가 chapter 엘리먼트이고, chapter 엘리먼트의 후손 노드가 para 엘리먼트인것 선택child::*/child::para */para컨택스트 노드의 손자 노드가 para 엘리먼트인것 선택/descendant::para //para문서내의 모든 para 엘리먼트 선택/descendant::olist/child::item //olist/item문서내에서 olist 엘리먼트를 부모로 가지는 모든 item 엘리먼트 선택child::para[position()=1] para[1]컨택스트 노드의 모든 자식 노드중 첫번째 para 엘리먼트 선택 child::para[position()=last()] para[last()]컨택스트 노드의 모든 자식 노드중 마지막 para 엘리먼트 선택/child::doc/child::chapter[position()=5]/child::section[position()=2] /doc/chapter[5]/section[2]문서의 doc 엘리먼트의 5번째 자식 chpater 엘리먼트의 2번째 자식 section 엘리먼트 선택child::para[attribute::type="warning"] para[@type="warning"]컨택스트 노드의 type 얼트리뷰트 값이 'warning' 인 모든 자식 para 엘리먼트 선택child::para[attribute::type='warning'][position()=5] para[@type="warning"][5]컨택스트 노드의 type 얼트리뷰트 값이 'warning' 인 모든 자식 para 엘리먼트중 5 번째 para 엘리먼트 선택child::para[position()=5][attribute::type="warning"] para[5][@type="warning"]컨택스트 노드의 5번째 para 엘리먼트의 type 어트리뷰트 값이 'warning' 이라면 선택 child::chapter[child::title='Introduction'] chapter[title="Introduction"]컨택스트 노드의 모든 자식 chapter 엘리먼트중 자식 title 엘리먼트의 텍스트 노드 스트링 값이 'Introduction' 인것 선택child::chapter[child::title] chapter[title]컨택스트 노드의 모든 자식 chapter 엘리먼트중 자식이 title 엘리먼트 인것 선택