エントリー
この記事では、サードパーティのアプリケーションや拡張機能を使用せずに、XSLTを使用してランダム(擬似ランダムランダムソート)ソートを作成する試みを紹介します。
最初は、タスクはPHP th XSLTプロセッサのソートを行うことでした。 しかし、私はもっと普遍的な何かをしたかった。
試作機
まず、ソートをテストするためのサンプルが必要です。 複雑さには対処せず、単純に記述します。
Data.xmlデータファイル
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="view.xsl"?> <root> <item id="1"/><item id="2"/><item id="3"/><item id="4"/><item id="5"/><item id="6"/><item id="7"/><item id="8"/><item id="9"/><item id="10"/> </root>
ランダム性を生成する
何かをランダムにソートするには、手元にランダムなものが必要です。 そして、要素の一意の識別子を文字列として返すgenerate-id()関数ほど優れたものはありませんでした。
手元にあるさまざまなプロセッサで得られるものを見てみましょう。
View.xsl変換ファイル
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:for-each select="/root/item"> <xsl:value-of select="generate-id()"/><br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
結果
Php | Firefox | オペラ | Msxml | サファリ |
id1690783 | id0xfd238240 | op5275038 | IDAKA0MB | idp100503080 |
id1690785 | id0xfd2383d0 | op5275022 | IDAMA0MB | idp100502144 |
id1690788 | id0xfd238470 | op5275006 | IDAOA0MB | idp100502072 |
id1690789 | id0xfd2384c0 | op5274990 | IDAQA0MB | idp100502936 |
id1690787 | id0xfd238510 | op5274974 | IDASA0MB | idp100502792 |
id1690784 | id0xfd2640b0 | op5274958 | IDAUA0MB | idp100502648 |
id1690782 | id0xfd2641f0 | op5274942 | IDAWA0MB | idp125378088 |
id1690779 | id0xfd264240 | op5274926 | IDAYA0MB | idp100502504 |
id1690777 | id0xfd264330 | op5274910 | IDA0A0MB | idp125377944 |
id1690775 | id0xfd2643d0 | op5274894 | IDA2A0MB | idp100503224 |
表を見ると、2つの問題が見えます。識別子は特定の順序で進み、各XSLTプロセッサは独自の方法で識別子を生成します。 私はソフトについて書くことができないし、目立った。
ランダムソート
シーケンスをランダムに変換し、異なるアルゴリズムをテストし、アルコール消費量と眠れぬ夜を試みた失敗した試みについては説明しません。 結果として何が起こったのかを書きます。
View.xsl変換ファイル
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:for-each select="/root/item"> <xsl:sort select="translate(generate-id(), 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '0192834765019283476501928347650192834765019283476501') mod 3.1415" data-type="number"/> <xsl:value-of select="@id"/><br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
ここでの主な要素は、「xsl:sort」要素の「select」属性です。 分析を開始しましょう:現在の要素の一意の識別子を取得し(「generate-id()」関数を使用)、すべてのアルファベット値をデジタルに置き換え(「translate()」関数を使用)、結果を法Piで除算します(なぜPiなのか、最初に頭に浮かんだもの)。
完璧でエレガントなソリューションに引き付けられませんが、それは動作します。
特定の数のランダム要素を出力します。
テーブルを修正して、セットから一定数のランダム要素を表示します。 現在の要素「位置()」の番号を決定する関数は、これに役立ちます。 4つのランダムな要素を導き出します。
View.xsl変換ファイル
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:for-each select="/root/item"> <xsl:sort select="translate(generate-id(), 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '0192834765019283476501928347650192834765019283476501') mod 3.1415" data-type="number"/> <xsl:if test="position() < 5"> <xsl:value-of select="@id"/><br/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>.
少しのPHP
PHPは記事の冒頭で述べたので、この言語で変換するためのコードになります。
<?php $data = new DOMDocument('1.0', 'UTF-8'); $data->load('data.xml'); $view = new DOMDocument('1.0', 'UTF-8'); $view->load('view.xsl'); $xsl = new XSLTProcessor(); $xsl->importStyleSheet($view); echo $xsl->transformToXML($data); ?>