ピラミッドを作る (xvcd)
昨日の ピラミッドを作る (xslt) を xfy/xvcd 用に、変更してみた。
もっと記述は簡潔にできるとは思う。
でも xslt, xvcd いずれにしても ruby を始めとした他のスクリプト言語での回答のように短くかくことは無理だなぁ...
xvcd でループを書く場合は、ruby で書いて 結果だけ xvcd から呼び出すのが実用的とおもう。
$ cat 3.xml
<?xml version="1.0" encoding="UTF-8" ?>
<?com.xfy vocabulary-connection href="3.xvcd" ?>
<sample:item xmlns:sample="http://xmlns.xfy.com/sample/pry">10</sample:item>
$ cat 3.xvcd
<?xml version="1.0" encoding="UTF-8"?>
<xvcd:xvcd
version="1.0"
xmlns:xvcd="http://xmlns.xfy.com/xvcd"
xmlns:sample="http://xmlns.xfy.com/sample/pry"
xmlns="http://www.w3.org/1999/xhtml">
<xvcd:vocabulary name="pyr" match="sample:item" call-template="root"/>
<xvcd:template name="root">
<html>
<head><title>ピラミッド</title></head>
<body>
ピラミッドの高さは?:<xvcd:text-of select="./text()" filler="0"/>
<pre>
<xvcd:variable name="stars">
<xvcd:call-template name="stars-str">
<xvcd:with-param name="n" select="./text()"/>
</xvcd:call-template>
</xvcd:variable>
<xvcd:call-template name="pyr">
<xvcd:with-param name="n" select="./text()" />
<xvcd:with-param name="padding" select="''" />
<xvcd:with-param name="stars" select="$stars" />
</xvcd:call-template>
</pre>
</body>
</html>
</xvcd:template>
<!-- 再帰処理のルーチン -->
<xvcd:template name="stars-str">
<xvcd:param name="n" />
<xvcd:if test="$n = 1">
<xvcd:text>*</xvcd:text>
</xvcd:if>
<xvcd:if test="$n > 1">
<xvcd:call-template name="stars-str">
<xvcd:with-param name="n" select="$n - 1"/>
</xvcd:call-template>
<xvcd:text>**</xvcd:text>
</xvcd:if>
</xvcd:template>
<!-- 再帰処理のルーチン -->
<xvcd:template name="pyr">
<xvcd:param name="n" />
<xvcd:param name="padding" />
<xvcd:param name="stars" />
<xvcd:if test="$n >= 1">
<xvcd:call-template name="pyr">
<xvcd:with-param name="n" select="$n - 1"/>
<xvcd:with-param name="padding" select="concat($padding,' ')" />
<xvcd:with-param name="stars" select="substring($stars, 1, string-length($stars) -2)" />
</xvcd:call-template>
<!-- '
' -->
<xvcd:value-of select="concat($padding, $stars, $padding)"/>
<br/>
</xvcd:if>
</xvcd:template>
</xvcd:xvcd>
« ピラミッドを作る (xslt) | トップページ | xfy/xvcd の svg でタイマーイベントを扱う »
この記事へのコメントは終了しました。
コメント