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> 

結果
PhpFirefoxオペラMsxmlサファリ
id1690783id0xfd238240op5275038IDAKA0MBidp100503080
id1690785id0xfd2383d0op5275022IDAMA0MBidp100502144
id1690788id0xfd238470op5275006IDAOA0MBidp100502072
id1690789id0xfd2384c0op5274990IDAQA0MBidp100502936
id1690787id0xfd238510op5274974IDASA0MBidp100502792
id1690784id0xfd2640b0op5274958IDAUA0MBidp100502648
id1690782id0xfd2641f0op5274942IDAWA0MBidp125378088
id1690779id0xfd264240op5274926IDAYA0MBidp100502504
id1690777id0xfd264330op5274910IDA0A0MBidp125377944
id1690775id0xfd2643d0op5274894IDA2A0MBidp100503224

表を見ると、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); ?> 

Source: https://habr.com/ru/post/J141673/


All Articles