XSLTでのランダムな並べ替えとランダムな要素の出力

エントリー



この記事では、サードパーティのアプリケーションや拡張機能を使用せずに、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() &lt; 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); ?>
      
      






All Articles