ズンドコキヨシを XSL(と Scheme)でやってみた

  • 3
    Like
  • 3
    Comment
More than 1 year has passed since last update.

最近、流行りのズンドコ問題を、XSL でもやってみた。何にも新しいものぢゃないし、何のひねりもなくて、面白くも何ともないけどさ…。・ω・

XSL が純関数型言語だってことはもとより XSL の存在自体が普段は全く忘れられてるから、こんな時ぐらいは思い出してやらないと、かわいそぉ…。それぐらいの意味。(^^)

入力ファイル

ZunDoko.xml
<?xml version="1.0" encoding="utf-8" ?>
<ZunDoko/>

プレーン・テキストで出力するやつ

ZunDoko-Text.xsl
<?xml version='1.0' encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math"
>

  <xsl:output method="text" encoding="utf-8" />

  <xsl:template name="generateZunDokos">
    <xsl:param name="Zuns_length" select="0" />

    <xsl:choose>
      <xsl:when test="math:random() &lt; 0.5">
        <xsl:text>ズン&#x0A;</xsl:text>
        <xsl:call-template name="generateZunDokos">
          <xsl:with-param name="Zuns_length" select="$Zuns_length + 1" />
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$Zuns_length &lt; 4">
        <xsl:text>ドコ&#x0A;</xsl:text>
        <xsl:call-template name="generateZunDokos">
          <xsl:with-param name="Zuns_length" select="0" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>ドコ&#x0A;</xsl:text>
        <xsl:text>キ・ヨ・シ!&#x0A;</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="/">
    <xsl:call-template name="generateZunDokos">
      <xsl:with-param name="Zuns_length" select="0" />
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

適用結果(例)


$ xsltproc ZunDoko-Text.xsl ZunDoko.xml
ドコ
ドコ
 : (中略)
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ!
$ 

Scheme に逐語訳

XSL が余りにも読みづらいから、Scheme でも逐語訳的に書いてみた。多少は読みやい?(*´∀`*)


(define &#x0A (string #\newline))

(define (generateZunDokos Zuns_length) ; xsl:template
  (cond                                ;   xsl:choose
    ((< (random-real) 0.5)             ;     xsl:when (SRFI-27)
      (string-append
        "ズン" &#x0A                   ;       xsl:text ... /xsl:text
        (generateZunDokos              ;       xsl:call-template
          (+ Zuns_length 1)            ;         xsl:with-param/
        )                              ;       /xsl:call-template
      )
    )                                  ;     /xsl:when
    ((< Zuns_length 4)                 ;     xsl:when
      (string-append
        "ドコ" &#x0A                   ;       xsl:text ... /xsl:text
        (generateZunDokos              ;       xsl:call-template
          0                            ;         xsl:with-param/
        )                              ;       /xsl:call-template
      )
    )                                  ;     /xsl:when
    (else                              ;     xsl:otherwise
      (string-append
        "ドコ" &#x0A                   ;       xsl:text ... /xsl:text
        "キ・ヨ・シ!" &#x0A           ;       xsl:text ... /xsl:text
      )
    )                                  ;     /xsl:otherwise
  )                                    ;   /xsl:choose
)                                      ; /xsl:template

(generateZunDokos                      ; xsl:call-template
  0                                    ;   xsl:with-param/
)                                      ; /xsl:call-template

XHTMLで出力するやつ

ZunDoko-XHTML.xsl
<?xml version='1.0' encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math"
>

  <xsl:output method="xml" encoding="utf-8"
    doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
  />

  <xsl:template name="generateZunDokos">
    <xsl:param name="Zuns_length" select="0" />

    <xsl:choose>
      <xsl:when test="math:random() &lt; 0.5">
        <xsl:element name="li">ズン</xsl:element>
        <xsl:call-template name="generateZunDokos">
          <xsl:with-param name="Zuns_length" select="$Zuns_length + 1" />
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$Zuns_length &lt; 4">
        <xsl:element name="li">ドコ</xsl:element>
        <xsl:call-template name="generateZunDokos">
          <xsl:with-param name="Zuns_length" select="0" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="li">ドコ</xsl:element>
        <xsl:element name="li">キ・ヨ・シ!</xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="/">
    <xsl:element name="html">
      <xsl:attribute name="xml:lang">ja</xsl:attribute>
      <xsl:element name="header">
        <xsl:element name="meta">
          <xsl:attribute name="http-equiv">Content-Type</xsl:attribute>
          <xsl:attribute name="content">text/html;charset=utf-8</xsl:attribute>
        </xsl:element>
        <xsl:element name="title">ズンドコ</xsl:element>
      </xsl:element>
      <xsl:element name="body">
        <xsl:element name="h1">ズンドコ</xsl:element>
        <xsl:element name="ul">
          <xsl:call-template name="generateZunDokos">
            <xsl:with-param name="Zuns_length" select="0" />
          </xsl:call-template>
        </xsl:element>
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

適用結果(例)


$ xsltproc ZunDoko-XHTML.xsl ZunDoko.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"><header><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><title>ズンドコ</title></header><body><h1>ズンドコ</h1><ul><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ドコ</li><li>ドコ</li><li>ズン</li><li>ズン</li><li>ズン</li><li>ズン</li><li>ドコ</li><li>キ・ヨ・シ!</li></ul></body></html>
$