Programming/.NET

XSLT는 간단히 말해 기존 XML구조를 바꾸는 언어로서 XSLT파일을 생성한 뒤 XslCompiledTransform 클래스로 변환을 시도하면 XSLT에 정의된 구조대로 XML이 변환되는 것입니다.

 

이런 동작을 구현하기 위해 우선 다음과 같은 XML파일을 만들어 둡니다.

 

<?xml version="1.0"?>
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001 books.xsd">
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>
      An in-depth look at creating applications
      with XML.
    </description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>
      A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.
    </description>
  </book>
  <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>
      After the collapse of a nanotechnology
      society in England, the young survivors lay the
      foundation for a new society.
    </description>
  </book>
</catalog>

 

위 XML파일을 토대로 다음과 같은 구조의 XML을 도출하고자 합니다.

 

▶ 결과1-1

 

따라서 우선 위 구조에 해당하는 XSLT파일을 생성해야 하는데 Visual Studio의 Solution Explorer에서 새로운 아이템으로 xslt파일추가하도록 합니다.

 

 

그런다음생성된 xslt파일을 수정하여 원하는 구조를 정의하도록 합니다.

 

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="@* | node()">
    <xsl:element name="">
      <xsl:apply-templates select="//book"></xsl:apply-templates>
    </xsl:element>
  </xsl:template>
  <xsl:template match="book">
    <xsl:element name="제목">
      <xsl:value-of select="title"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

 

xslt는 변환대상이 되는 xml파일의 요소에 대응하는 템플릿구조로 이루어 집니다. 잠깐 위 xslt구조를 설명드리면 최상위 루트를 '책'으로 하고 <xsl:apply-templates select="//book"></xsl:apply-templates구문으로 xml의 book요소를 순회하도록 합니다. 이때 사용된 //book는 XPath식과 동일한 방식입니다. 그리고 순회중 발견된 book요소를 템플릿으로 정의한 '제목'이름의 요소아래 xml의 title요소값을 표시하도록 합니다.

 

또한 하위 요소선택시 //book와 동일하게 title/xxx 처럼 XPath식을 사용할 수 있으며 만약 xml에서가 아니라 직접 정의한 특정한 내용을 출력해야 하는 경우 <xsl:text>hi!!</xsl:text> 식으로 작성하도록 합니다.

 

XML과 XSLT파일이 준비되어 있으니 이제 실제 변환을 수행해야 하는데 이때는 XslCompiledTransform클래스를 사용합니다. XslCompiledTransform클래스는 2.0부터 새로 등장한 클래스로서 기존 1.1시절의 XslTransform클래스를 대체합니다

 

Response.ContentType = "text/xml";

string xslt_file = Server.MapPath("books.xslt");
string xml_file = Server.MapPath("books.xml");

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xslt_file);

XPathDocument xpd = new XPathDocument(xml_file);

xslt.Transform(xpd, new XmlTextWriter(Response.Output));

 

우선 XslCompiledTransform클래스의 객체를 생성하여 Load메소드로 위에서 작성된 xslt파일을 로드합니다. 그리고 XPathDocument클래스로 xml파일을 불러들여 XSLT의 Transform메소드를 호출해 해당 xml파일에 대한 변환을 수행합니다.

 

XslCompiledTransform클래스를 사용할때는 XmlDocument보다는 꼭 XPathDocument클래스를 사용해야 하는데 이유는 xslt파일안에 XPath가 구현되어 있기 때문입니다. XSLT안에서 XPath가 작동하는데는 XPathDocument가 사용되며 성능또한 훨등히 빠르게 동작합니다.

 

참고로 클래스사용시 new XslCompiledTransform(true)처럼 bool값을 true로 전달하고 Visual Studio에서 종단점을 설정해 보면 xslt파일이 처리되는 과정을 디버깅할 수 있습니다.

 

다시 결과1-1로 돌아가보면 보여지는 형태가 XML형식임을 알 수 있습니다. 하지만 XSLT파일을 변경하면 웹과 조화를 이룰 수 있는 HTML로도 출력이 가능합니다.

 

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="@* | node()">
    <table border="1">
      <tr>
        <th>책 목록</th>
      </tr>
      <xsl:apply-templates select="//book"></xsl:apply-templates>
    </table>
  </xsl:template>
  <xsl:template match="book">
    <tr>
      <td>
        <xsl:value-of select="title"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

 

XSLT에서 output method를 html로 바꾸고 템플릿에서 출력될 HTML를 위 예제와 같이 작성하기만 하면 됩니다.

 

참고로 이전 예제에서는 XML형식의 표시를 위해 aspx페이지에서 모든 HTML요소를 제거하고 cs코드에서 ContentType을 text/xml로 지정했는데 위 결과처럼 HTML형식으로 데이터를 표현하려면 HTML요소를 복구하고 text/xml지정구문을 제거해야 합니다.

 

또한 cs코드상에서 여전히 xml와 xslt파일을 읽고 출력하도록 했다면 결과표시의 위치가 다소 이상해 보일 수 있는데

 

 

 

동작구조상 cs단의 처리가 우선시 되어 나타나는 결과일 뿐입니다. 원하는 요소에 정확히 표시하려면 다음과 같이 XML컨트롤을 활용하시기 바랍니다.

 

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Xml ID="Xml1" runat="server" DocumentSource="~/books.xml" TransformSource="~/books.xslt" ></asp:Xml>
    </div>
    </form>
</body>
</html>

 

XslCompiledTransform클래스가 XSLT파일을 로드하면 이 파일에 대한 어셈블리를 생성한 후 처리를 진행하게 됩니다. 이렇게 해도 정상적으로 처리가 되지만 성능상 문제가 생겼다면 미리 XSLT에 대한 어셈블리를 생성하고 해당 dll을 참조하여 처리를 진행하는 것이 좋습니다. 이때 어셈블리 생성은 XSLTC 명령어를 사용합니다.

 

Visual Studio의 명령창을 열고 다음과 같이 xsltc명령을 내려주십시오.

 

 

xslt파일은 필요하다면 a.xslt b.xslt b.xslt 처럼 연속해서 나열할 수 있으며 마지막에 생성하고자 하는 어셈블리를 /out:-.dll 형식으로 넘겨주면 됩니다.

 

이제 생성된 dll을 Visual Studio 프로젝트에서 참조하고

 

 

코드를 다음과같이 바꿔줍니다.

 

Response.ContentType = "text/xml";

string xml_file = Server.MapPath("books.xml");

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(typeof(books));

XPathDocument xpd = new XPathDocument(xml_file);
xslt.Transform(xpd, new XmlTextWriter(Response.Output));

 

프로그램은 이제 파일이 아닌 dll 어셈블리에서 XSLT에 대한 데이터를 가져올 것입니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 예외처리  (0) 2016.05.11
[ASP.NET] 사이트 네비게이션 (sitemap)  (0) 2016.04.19
[ASP.NET] XSLT  (0) 2016.04.05
[ASP.NET] 공급자 모델 - 3  (0) 2016.03.30
[ASP.NET] 공급자 모델 - 2  (0) 2016.03.22
[ASP.NET] 공급자 모델 - 1  (0) 2016.03.17
0 0