XML(XSLT) + PHP 게시판 작업을 위한 글 3

XSLT는 변수의 재(再)정의가 불가능하다.

하지만 노드 loop인 for-each에서는 재사용은 가능하다. 물론 정의는 절대로 안된다.



앞서 말했듯이 XSLT에서는 Node인가 아닌가를 무척 따진다. 오죽하면 node용 loop가 있으려나..

for-each의 성격상 loop범위란 것을 해당 스크립트 상에서 카운트 시켜줄 필요없이 모두 뽑아낸다.

그에 postion() 이라는 XPath함수덕에 수치적으로나 위치적으로 구분을 지을 수 있었다.



하지만 그냥 1~10까지... XML 문서의 의존도를 완전히 벗어나서 XSLT만으로 뿌리려면 어떻게 해야할까... 이것을 해봄으로써 게시판의 맨밑에 있는 page 수 표시를 해볼 수 있다.(뭐.. 그렇기에 했지만...) 그러면서 부족한 실력이 바닥도 나고... 오히려 하다보니 XSLT의 실력이 조금 더 늘게 되었다. 이젠... "<xsl: " 을 치는동안 머릿속에서 다른 생각을 하니 말이다... (--);



앞으로 사용할 <xsl:template> element에 대해서 알아보자면 평범한 데이터들은 얼마든지 다른 사이트들에서 찾아볼수 있다. 하지만 변수를 count 하고자 하는 부분에 대한 설명을 다뤄준 부분이 적기 때문에 URL을 통해서 설명을 대신하겠다. 함 알아보자 template이 뭐하는 녀석인지...



참고 : http://www.w3schools.com/xsl/el_template.asp



여기서 template속성중 주목할 것이 있다.

반드시 문서의 최상위 레벨의 element라는 점이다.

(Note: <xsl:template> is a top-level element.)



자바를 잘 못해서 현란한 단어로 정확하게 까지 설명할순 없지만 클레스를 쓰기위해서 반드시 메인함수를 정의하듯이 template는 xslt 문서가 프로그램능력을 발휘하기 위해서 반드시 하나는 포함된다. 이는 xml문서를 가져오는 일종의 container이기도 하고 특정 직무를 수행하는 함수와도 같다.

뭐 후자의 성격인 함수라고 이해하는게 가장 빠르겠지만 누누히 말하지만 XML은 필령 프로그램과는 본질적으로 다르다. 이것은 데이터베이스성격의 문서이다. 프로그램 언어가 절대로 아님을 명심하자. xml을 잘 쓰기위한 도구가 xslt이다.



SQL과 PHP에 비교하자면 "select * tb_board WHERE ~" 의 sql 쿼리를 날린뒤에 이를 변수에 담고 #resource_id 값을 가진뒤에 result를 기다리는 바로 직전까지의 일을 수행해주는 것이 template라고 봐도 될 것이다.



데이터베이트역할과 이를 불러오는 역할을 동시에 만족하기 때문에 단지 PHP같은 언에 국한된 함수라고 보기좀 그러하다는 것일뿐... 뭐 변수를 쓰려다보니까 함수같긴 하지만... 어쨌든 XSLT를 씀에 있어서 DB구실을 하는 원본XML문서의 일원인가 아닌가의 구분은 명확하게는 점이다.



쓸데없는 말이 길었는데... 일단 예문을 보자.



<xsl:template match="/">

<table border="1">

<tr>

<td>

<xsl:call-template name="CC">
<xsl:with-param name="i" select="1"/>
</xsl:call-template>
</td>
</tr>
</table>

</xsl:template>





<xsl:template name="CC">
<xsl:param name="i"/>


<xsl:choose>

<xsl:when test="$i <= 10">

<b><xsl:value-of select="$i"/></b>



<xsl:call-template name="CC">
<xsl:with-param name="i" select="$i +1"/>
</xsl:call-template>


</xsl:when>
</xsl:choose>


</xsl:template>


두가지 색으로 일단 블럭을 나눠봤다.

보라색이나 파란색 둘다 문서상에서는 top-level을 유지하고 있다.

보래색 부분의 두껍게 되있는 부분을 보자 <xsl:template>과 짝을 이루는 <xsl:call-template>를 사용하고 있다. 그리고 <xsl:with-param> 을 사용했다.



파란색블럭을 보자 상단에 보라색과 같이 template을 불러왔다.

코드에 대해서 일일이 설명을 달진 않겠다. 결과는 예문을 보고 한번 해봤으면 하며... 경험해보건데 사용하는데 있어서 에러가 나는 부분만 적어보았다.


1. 함수를 정의하는 것과 같이 보라색블럭의 두꺼운곳에서 변수를 정의해준다. 파란색 블럭의 두번째 라인에서 부터 with-param에서 정의한 부분을 받는다.



2. 여기서는 select="" 를 통해서 아무값을 정의하지 않으면 템플릿을 call한 곳에서 넘겨주는 값을 받게 되있다.



3. call-template에서는 반드시 select="" 값을 주어야만 하며 Null 은 허용되지 않는다.



4. template안에서의 파라메터인 param은 같은 블럭안에서의 <xsl:variable> 이나 Top-level에서의 <xsl:variable>....... 단정지어 말하자면 영향을 받는 모든 변수선언과 중복되선 안된다. param 자체가 변수와 동일하다.



5. template을 정의하는 파란색 블럭에서보면 템플릿내부에 call을 또 해주었는데 이를 정의하지 않고 변수를 출력하는 수준에서 HTML태그나 문서와 섞어두기만 하면 불렀던 main template에서 그대로 출력이 된다. 하지만 변수 카운트 같이 조작을 원한다면 반드시 선언했던것과 동일한 param을 갖는 call-template를 실행해줘야만 한다.



6. 정의한 템플릿(파란색블럭) 에서 <xsl:param>은 템플릿 바로 밑에서 선언 해줘야만하며 넘겨주지 않는 변수의 이름으로 <xsl:param>을 만들 수 없다. 새로 정의하고 싶다면 <xsl:variable>을 써서 템플릿 내에서만 유효한 변수를 써줘야만 한다.



7. 보라색블럭에서 넘겨준 변수들중 변수카운팅을 위해 사용된 변수가 있다면 모든 값을 call-template에서 다시 되돌려주어야 만 한다.