Today
-
Total
-
  • [XSLT 예제] 간단한 조건문 처리하기
    Coding/etc 2019. 9. 6. 14:06

    Question


    편의점 알바인 라이언은 매일 창고 재고목록을 파악하고 남은 수량이 30개보다 적은 상품은 주문 발주를 넣습니다. 다음 창고 재고목록표를 보고 라이언이 발주를 넣어야 할 상품 목록을 출력하세요.

    (*XSLT 단일조건문(if)을 활용하기)

    기대 결과


    xml파일 실행 시 다음과 같은 화면이 출력되어야 합니다.

     


     

    XSLT에서 간단한 조건문을 처리할 때는 <xsl:if>요소를 사용합니다. 이 요소는 test 후의 조건식이 참인 경우에만 실행됩니다. 따라서,

     

    <xsl:if test ="조건식">

    조건식이 true일때만 실행되는 구문

    </xsl:if>

     

    의 구조를 띕니다. 지금 같은 경우는 수량이 30개보다 적은 상품의 이름 요소를 출력하게끔 하면 되겠군요.

     

    우선 xml파일로 데이터 포맷을 작성합니다. 위의 표를 참고하여 만들면 되겠군요.

     

    <product.xml>

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="xslt_if.xsl"?>
    <products_list>
      <product>
        <name>당근</name>
        <category>vegetable</category>
        <amount>55</amount>
      </product>
      <product>
        <name>복숭아</name>
        <category>fruit</category>
        <amount>40</amount>
      </product>
      <product>
        <name>우유</name>
        <category>dairyproduct</category>
        <amount>25</amount>
      </product>
      <product>
        <name>사과</name>
        <category>fruit</category>
        <amount>15</amount>
      </product>
      <product>
        <name>자두</name>
        <category>fruit</category>
        <amount>35</amount>
      </product>
      <product>
        <name>요거트</name>
        <category>dairyproduct</category>
        <amount>60</amount>
      </product>
      <product>
        <name>오이</name>
        <category>vegetable</category>
        <amount>10</amount>
      </product>
    </products_list>

     

    이제 우리는 이 데이터 포맷에서, 수량을 나타내는 amount 요소를 검사하여 30이하인 product의 name 요소가 화면에 출력되게끔 하면 됩니다. 이제 이 xml문서와 href 속성으로 Link될 "xslt_if.xsl"를 작성합니다.

     

    <xslt_if.xsl>

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html"/>
      <xsl:template match="/">
    
        <html>
          <body>
            <h2>상품 목록</h2>
            <xsl:for-each select="products_list/product">
              <xsl:if test="amount &lt; 30">
                <xsl:value-of select="name"/>
                <br/>
              </xsl:if>
            </xsl:for-each>
          </body>
        </html>
      </xsl:template>
    
    </xsl:stylesheet>
    

     

    우리는 결과를 html 형식으로 출력할 것이기 때문에 

    <xsl:output method="html"/>로 지정해 줍니다.

     

    또한 xml의 일정 범위를 지정할 게 아니라 전체를 연결해 줄 것이기 때문에

    <xsl:template match="/">로 지정해 줍니다.

     

    그 다음에는 자유롭게 <html>양식을 써 주면 됩니다. 

     

    <xsl:for-each select>는 선택된 각 노드에 반복하여 템플릿을 적용해 주는 요소입니다.

    우리는 product.xml 파일에서 상품 리스트를 <product_list>요소로 지정하고

    그 자식 요소로 product 하나하나를 작성해 주었습니다. 따라서

    <xsl:for-each select="products_list/product">를 지정해 준다면, 이 템플릿은

    모든 product 노드에 반복되어 적용될 것입니다.

     

    이제는 조건문을 통하여 원하는 노드만 출력하게 해야하는데요. 위에서 설명했듯이

    <xsl:if test= 다음에는 조건문이 와야합니다. 일반적으로 amount < 30을 조건문으로 지정해주면 될 것 같지만,

    xml에서 '<'와 '>'는 태그 표시를 하는 xml 예약문자로, 그냥 사용할 수 없습니다. 

    xml에서는

    '<' = &lt;

    '>' = &gt;

    로 대체하여 사용합니다. 

    (그 밖에도 <![CDATA[   ]]> 를 사용하는 방법도 있으나 이번 예제에서는 저렇게 대체하여 사용하겠습니다)

     

    그렇다면 test 다음 조건식은 amount < 30이 와야하기 때문에 

    <xsl:if test="amount &lt; 30">

    으로 작성해 줍니다. 이제 이 <xsl:if> 태그 안에 조건에 부합할 경우 실행할 구문을 입력해 주면 됩니다.

    우리는 이름 요소를 출력하기로 했죠? 그렇기 때문에

    <xsl:value-of select="name"/>으로 'name' 요소에 해당하는 것을 출력해 줍니다.

    다른 상품과 구분하기 위하여 <br/>로 개행해 주면 더 깔끔하게 출력되겠네요.

     

     

    이제 웹 브라우저에서 product.xml을 실행해 보면 기대 결과와 같은 화면이 출력될 것입니다!

     

     

    product.xml
    0.00MB
    xslt_if.xsl
    0.00MB

     

     

    'Coding > etc' 카테고리의 다른 글

    [XSLT 예제] HTML 테이블 그리기  (0) 2019.09.17
    [XSLT 예제] 다중 조건문 수행하기  (1) 2019.09.09
    XML 기본 문법  (0) 2019.09.04
    XML의 정의와 기본 특징  (0) 2019.09.04
    [C#]Unity - 대화 애니메이션 구현하기  (1) 2019.03.25

    댓글