-
누군가 XSL를 언급한다면 그가 의미하는 것이 십중팔구 XSLT일 것이다. 프로그래밍 언어에 비해 장황해 보이는 구문이 거북함을 일으킨다. 레이텍과 파이선의 순차적 처리에 익숙한 나에게, XSL 파일에 선언된 여러 템플릿들이 순차적으로 처리되는 것이 아니라는 것이 가장 난해했다. 일 년 넘게, "찍기" 방법론을 사용하여, XSLT를 붙잡고 있다 보니, 템플릿과 다른 기본적인 요소들의 개념을 이해하게 되었다. 돌이켜 생각해보니, 좋은 선생이 서너 시간 할애하여 기반 이론을 가르쳐주었다면 훨씬 더 빨리 익혔을 것이다. 항상 조급증이 문제다. XML의 특성에 대한 이해 없이, 당장 무언가 돌려서 결과를 보고자 하는 것이 오히려 성장을 더디게 한다.
엑셀 시트를 XML로 바꾸어야 할 일이 종종 있어서 파이선으로 변환기를 하나 만들었다.

1) 언어 코드를 언어 이름으로, 즉 EN을 English로 바꾸고 싶다. (엑셀에서 진작 바꾸지 그랬어? 미리 작성해둔 아래와 같은 XML 파일을 이용하여 바꿀 것이다.)
<language id="Kazakh.Kazakhstan"><alias>Kazakh</alias><Endonym>Қазақ тілі</Endonym><LocaleCode>kk-KZ</LocaleCode><TwoLetterCode>kk</TwoLetterCode><ThreeLetterCode>kaz</ThreeLetterCode><CountryCode>KAZ</CountryCode><direction>LTR</direction><FolderName>KK</FolderName></language>2) 그 다음에 항목들을 언어 이름을 기준으로 오름차순으로 정렬하고 싶다. 단 key, English, Korean이 먼저 와야 한다.
다른 방법을 쓰자면 어떻게 할 수 있을까? 엑셀 시트를 TSV 파일로 저장한 다음에 VS Code에서 여러 차례 찾기-바꾸기를 하면 ... 쉽지 않겠다. 익숙해지니 XSLT가 이제는 꽤 매력적인 것으로 보인다. XSLT는 저런 작업을 수월하게 처리한다.
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:xs="http://www.w3.org/2001/XMLSchema"exclude-result-prefixes="xs"><xsl:output method="xml" encoding="UTF-8" indent="yes" /><xsl:variable name="langdb" select="document('languages.xml')"/><xsl:key name="FindAlias" match="language" use="FolderName" /><xsl:template match="@*|node()" mode="#all"><xsl:copy><xsl:apply-templates select="@*|node()" mode="#current" /></xsl:copy></xsl:template><xsl:template match="/"><xsl:variable name="FirstEntire"><xsl:apply-templates mode="FirstStep" /></xsl:variable><xsl:apply-templates select="$FirstEntire/*" /></xsl:template><xsl:template match="item" mode="FirstStep"><item><xsl:for-each select="*"><xsl:choose><xsl:when test="name() = 'key'"><xsl:copy-of select="."/></xsl:when><xsl:otherwise><xsl:variable name="alias" select="key('FindAlias', name(), $langdb)/alias"/><xsl:element name="{$alias}"><xsl:apply-templates /></xsl:element></xsl:otherwise></xsl:choose></xsl:for-each></item></xsl:template><xsl:template match="item"><item><xsl:apply-templates select="key|English|Korean"/><xsl:apply-templates select="* except (key, English, Korean)"><xsl:sort select="name()" /></xsl:apply-templates></item></xsl:template></xsl:stylesheet>'TeX과 친구들' 카테고리의 다른 글
Python에서 immutable object와 mutable object (0) 2025.09.23 readhanja 루아텍 패키지 (0) 2025.09.01 VS Code에서 한자 찾기 (0) 2025.08.29 XSLT로 긴 아이디 만들기 (0) 2025.08.20 紙榜 (0) 2025.02.12