ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • XSLT로 긴 아이디 만들기
    TeX과 친구들 2025. 8. 20. 17:47

    어떤 형식의 XML 파일을 다른 형식으로 변환해 달라는 요청을 받았다. 그 일의 대부분이 특정 속성을 제거하거나 일정한 값으로 바꾸는 것이어서 어렵지 않다.

    <foo id="_00T8bP1A66Zi0Q81C6ng3Juwj">

    문제는 해시처럼 긴 아이디를, 반드시 필요한 것인지, 중요한 것인지 확실하지 않지만, 만들어내야 한다는 것이다.  XSLT에서 제공되는 generate-id() 함수는 (데이터가 많아질수록 더 늘어나는지 모르겠지만) 다섯 자 내지 여덟 자 길이의 아이디를 만들어낸다. 알파벳 문자들과 숫자들의 수의 총합이 62이니, 1과 62 사이의 번호를 24 번 뽑아내야 하는데, 기대와 다르게 XSLT가 그런 함수들을 제공하지 않는다. Saxon EE가 fn:random-number-generator()를 제공한다고 하는데, 내게는 그것을 구매할 (가장 싼 것조차) 기십만 원이 없다.

    꼼수를 생각해냈다. 

    1. generate-id()를 이용하여 대여섯 자를 뽑는다.
    2. 얻은 글자들을 string-to-codepoints()를 이용하여 숫자들로, 정확히 말해 코드 값으로 변환한다.
    3. 대소문자와 숫자들을 서로 다르게 뒤섞은 문자열들을 이용하여 코드 값들을 문자로 바꾼다.
    4. 그리고 그것들을 합친 다음에 24 자 길이만큼 잘라낸다.

    좀 더 자세히 말하자면, 랜덤 발생기 대신 현재 시각을 시도해 봤지만, 컴퓨터 성능이 너무 좋아서인지 다른 값들을 얻을 수 없었다. 그래서 generate-id() 말고 대안이 없다는 결론을 내렸다. ea5fd라는 값을 얻었다 치자. 필요한 글자 수가 스물넷이니, 다른 열아홉 자가 더 필요하다. 하지만, 현재 시각과 마찬가지로, 현재 노드에 대해서는 동일한 아이디를 생성하니 generate-id()를 대여섯 번 더 돌리는 것이 무의하다.  "ea5fd ea5fd ea5fd ea5fd ea5fd"와 같이 반복된 문자열만 얻을 뿐이다. 하지만 같은 문자열이더라도 다른 문자 맵을 적용하면 고유한 문자열을 만들어낼 수 있지 않겠나? 그것이 꼼수의 핵심이다.

    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
    ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

     

    'TeX과 친구들' 카테고리의 다른 글

    readhanja 루아텍 패키지  (0) 2025.09.01
    VS Code에서 한자 찾기  (0) 2025.08.29
    紙榜  (0) 2025.02.12
    DokuWiki와 Andreas Gohr  (0) 2024.08.21
    jsx와 xslt  (0) 2024.04.18

    댓글

Designed by Tistory.