XSLT에 대해 잘 정리해두신 블로그글을 보고 공부겸 정리해보았습니다. 출처는 글 하단에 있습니다.
XSLT : eXtensible Stylesheet Language Transformations // 하나 이상의 template으로 구성된 집합체
뜻 : XML에 기반한 Stylesheet 언어, XML을 위한 스타일 언어<->CSS는 HTML을 위한 스타일 언어
XSL : Style Sheets for XML. XSL은 이 데이터를 사용자에게 어떻게 보이게(Display) 할지 결정
XML : 데이터를 저장하기 위한 구조를 정의하는 문서
만든 곳 : W3C
XSL의 종류 : XSLT, Xpath, XSL-FO, Xquery
-
XSLT - a language for transforming XML documents
(XML을 XML, HTML, XHTML, Result-tree 등 다른 구조의 문서로 변환시키기 위한 언어, XSL의 핵심) -
XPath - a language for navigating in XML documents
(XML의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어) -
XSL-FO - a language for formatting XML documents (discontinued in 2013)
(XML데이터를 출력하기 위한 목적으로 설계된 언어(현재는 CSS3로 대체하여 사용)) -
XQuery - a language for querying XML documents(XML문서의 쿼리를 위한 언어)
작용 : XML 문서를 다른 XML 문서나 브라우저가 인식하는 다른 타입의 문서(HTML, XHTML 등)로 변환,
요소 및 특성을 결과에 추가, 제거, 재정렬, 플랫폼테스트, 그리고 요소 숨김 등
브라우저 : 최근 브라우저들은 XSLT와 XPath를 지원
주의점 : xml과 xsl 둘다 맨 윗줄에 선언부 필요 (주석이 들어가면 실행안됨)
변환 규칙 : <template>요소를 이용해 표현. 문서를 변환하기 위한 명령어와 내용이 포함
template 사용 시 변환 규칙을 적용할 XML 요소를 찾기 위해 XPath 속성에 해당하는 match 속성을 사용
변환 과정 : XSL 문서와 XML 문서(Source tree)가 XSLT 프로세서에 의해 합쳐지고, XSLT 프로세서는 다른 구조의 XML 문서(Result tree)로 변환
장점 : 독립적인 프로그래밍, 수정이 빠름
이유 : XML을 변경할 필요가 없이 xsl 파일만을 변경해 Output을 변경 가능
사용 방법 :
- xml 선언
<?xml version="1.0"?>
- 문서를 XSL 스타일 시트로 선언하는 ROOT 요소
<xsl:stylesheet> 또는 <xsl:transform>
- XSLT 네임스페이스를 선언 : XSLT 요소, 속성에 접근
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- XML문서를 XHTML로 변환 : XSL에 아래 XML 링크를 추가
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl" ?>
<xsl:template> 요소
순서 : XSLT 프로세서가 XSLT 문서에서 가장 먼저 찾는 요소
역할 : XML 문서의 어느 부분(특정 node)을 어떻게 변환할 것인지 결정 (입력문서의 전체/일부인지, 출력 문서의 어디에 삽입되어야 하는 지)
속성 : match, name, priority, mode
-
match 속성 - XML 문서의 위치를 지정하기 위해 XPath 표현식을 사용
템플릿 규칙을 입력하기 위해 반드시 문서의 root(/)를 지정-
<xsl:template match="/”> //XML문서 루트( = XML 문서 전체)와 매치
-
<xsl:template match=”/student”> //XML문서 루트의 자식 요소인 요소와 매치합니다.
-
<xsl:template match="/*">
//문서의 가장 바깥쪽 요소만 일치하고 컨텍스트를 해당 요소로 설정
<xsl:template match="*">
//어디서나 모든 요소와 일치하고 컨텍스트노드를 해당 요소로 설정
<xsl:template match="/">
//문서 루트 자체와만 일치하고 컨텍스트로 설정
<A />
// 첫 번째 규칙 (일치하는 /*)이 일치하고 컨텍스트 노드는 A입니다.
// 세 번째 규칙 (일치하는 /)도 일치하지만 컨텍스트 노드 A의 하위 항목이 됩니다.
-
name 속성 - 템플릿에 이름을 지정하는 속성. 이 속성을 사용한 템플릿은 요소로 호출 가능
-
priority 속성 - 적용 가능한 템플릿이 여러 개 정의됐을 때 우선순위를 지정하는 속성. 값이 클수록 우선순위가 높음
-
mode 속성 - XML 에서 동일한 부분에 적용할 템플릿이 여러 개일 때 원하는 템플릿만 호출
소스 트리의 동일한 부분을 여러 번 처리해야 할 경우에도 사용
<xsl:apply-template> 요소
XSLT에서 template 자식요소는 자동으로 처리되지 않아 자식 요소를 처리하려면 요소를 정의해야 함
-
기본 템플릿인 <xsl:apply-templates/> 만 정의하는 경우 :
XML 문서에서 현재 요소의 모든 자식요소에 대해 매치되는 template을 찾아서 적용
노드탐색방법은 DFS(Depth Fisrt Search)을 사용 -
<xsl:apply-templates select="???"/>처럼 select 속성을 이용하는 경우 :
특정 자식 요소만 선택되거나 자식 요소가 아닌 다른 요소가 선택
<xsl:value-of> 요소
역할: 선택된 노드의 값 추출
<xsl:for-each> 요소
역할 : 지정된 노드 집합의 선택된 모든 XML 요소를 반복
select 속성 : XML 파일의 출력을 filtering 가능 (필터링 연산자 : =, !=, <, >)
<xsl:for-each select = “catalog/cd[artist = ‘Bob Dylan’]”>
<xsl:sort> 요소
역할 : 출력 정렬
사용 : xsl:for-each요소 내에 xsl:sort요소를 추가
문법 :
select = string-expression
// 노드를 정렬하기 위해 기준이 되는 키(key) : 어떤 XML 요소를 정렬할 것인지를 선택
lang = { nmtoken }
// 정렬 순서를 결정하는데 사용되는 영문자
data-type = { “text” | “number” | qname-but-not-ncname }
// 텍스트의 타입
order = { “ascending” | “descending” }
// 정렬 순서 기본 설정은 오름차순(ascending)
case-order = { “upper-first” | “lower-first” } />
// 대소문자에 의한 문자열의 정렬 순서. 기본 설정은 upper-first ( A, a, B, b, C, c 의 순 )
<xsl:if> 요소
역할 : XML파일 내용에 대해 test라는 조건을 수행
<xsl:if test="price > 10">
<xsl:choose>요소
<xsl:when> 및 <xsl:otherwise>와 함께 사용되어 여러 조건을 나타내며 if문과 else처럼 사용
클라이언트에서 XSLT
XSLT는 브라우저 안에서 문서를 XHTML로 바꿀수도 있고, 이제까지 XSL style sheet를 XML 파일에 추가하고 브라우저가 변환을 수행하도록 했는데 XML 파일에 XSL 링크를 포함시키는 건 크롬 등 XSLT가 먹히지 않는 브라우저도 있기 때문에 추천하지 않음.
따로 XAMPP라는 걸 이용해야 되며 보안때문에 그렇다고 하는데 아마도 대부분은 서버에서 변환하고 주기 때문
좀 더 좋은 해결책은 JavaScript를 사용하여 변환을 수행하는 것이며 JavaScript를 사용하면 브라우저 별 테스트 수행, 브라우저와 사용자 요구에 따라 다른 스타일 시트 사용이 가능
목표 : XSLT의 목표 중 하나는 데이터를 한 형식에서 다른 형식으로 변환하여 다양한 브라우저와 사용자 요구 사항들을 지원하는 것
자바스크립트와 XSLT를 이용하여 XHTML로 변환
<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
{
xhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
else
{
xhttp = new XMLHttpRequest();
}
xhttp.open("GET", filename, false);
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11
xhttp.send("");
return xhttp.responseXML;
}
function displayResult()
{
//XML과 XSL을 로드한다.
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
{
//XSL을 XML에 적용시킨다.
ex = xml.transformNode(xsl);
//스타일이 적용된 XML을 ID가 example인 최근 문서에 적용한다.
document.getElementById("example").innerHTML = ex;
}
// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
//객체를 생성해서 XSLT를 import한다.
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
document.getElementById("example").appendChild(resultDocument);
}
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html>
서버에서 XSLT
모든 종류의 브라우저에서 XML 데이터를 사용할 수 있도록
server에서 XML 문서를 변환하여 XHTML로 브라우저로 재전송
-
전의 설명에서는 변환을 위해 JavaScript와 XML Parser를 사용했지만 XML parser가 없는 브라우저에서는 작동하지 않음. 모든 종류의 브라우저에서 XML 데이터를 사용할 수 있도록 하기 위해 서버에서 XML 문서를 XHTML로 변환하고 작업이 끝난 그 파일을 브라우저로 보내면 가능
-
브라우저에서 했던 작업과 마찬가지로 데이터를 서버에서 어떠한 형식을 다른 형식으로 변환하여 다양한 브라우저와 사용자 요구 사항들을 지원하는 것이 목표
-
XML 파일에는 XSL 파일에 대한 참조가 없으므로 XML 파일은 다양한 XSL style sheet를 사용하여 변환될 수 있음
XML 데이터를 이용한 JSP 연동
JSTL(자바 표준태그 라이브러리) 중 xml태그를 이용하여 XML을 JSP 와 연동
<%-- JSTL을 사용하기 위한 태그 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
출처
'Markup Language > XML' 카테고리의 다른 글
[JS] string 형태의 xml을 xml로 파싱 (0) | 2021.01.18 |
---|---|
XPath 위치 경로 (0) | 2021.01.14 |
XSLT XPATH 노드 접근 표현식 (0) | 2020.09.18 |
마크업언어 XML(Extensible Markup Language) 개념 (0) | 2019.11.05 |