7

XSLT のランダム関数について質問があります。

次のような非常に単純化された XML ファイルがあります。

<node id="1198">
  <node id="1201">
    <data alias="name">Flemming</data>
    <data alias="picture">1200</data>
  </node>
  <node id="1207">
    <data alias="name">John</data>
    <data alias="picture">1205</data>
  </node>
  <node id="1208">
    <data alias="name">Michael</data>
    <data alias="picture">1206</data>
  </node>
</node>

ノードIDの1つを無作為に取得し、それを「choosenNode」という変数に入れるXSLTが必要です。このように、ID が 1207 のノードが選択された場合:

<xsl:variable name="choosenNode" value="1207" />

これどうやってするの?XSLTにランダム関数はありますか? ところで、XSLT が含まれるすべてのページで変数を更新したいと考えています。

そして、私は Umbraco CMS で働いています。

ありがとう、キム

4

5 に答える 5

7

Umbraco では、次のようなことができます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltMath">

<xsl:output method="xml" omit-xml-declaration="yes"/>

<xsl:param name="currentPage"/>

<!-- This should probably be a macro parameter so you can use this elsewhere-->
<xsl:variable name="parentNode" select="1048"/>

<xsl:template match="/">

        <xsl:variable name="numberOfNodes" select="count(umbraco.library:GetXmlNodeById($parentNode)/node)"/>

        <xsl:variable name="randomPosition" select="floor(Exslt.ExsltMath:random() * $numberOfNodes) + 1"/>

        <xsl:variable name="randomNode" select="umbraco.library:GetXmlNodeById($parentNode)/node [position() = $randomPosition]"/>

        <!--
          You now have the node in the $randomNode variable
          If you just want the id then you can do an XPath query on the variable
          or you can modify the XPath above to get the property you are after rather than
          the whole node
        -->

    <xsl:value-of select="$randomNode/@nodeName" />

</xsl:template>
</xsl:stylesheet>

お役に立てれば。

ティム

于 2009-09-07T15:13:41.547 に答える
0

必要なのは乱数ジェネレーターだけです。XSLTには何もないため、乱数はXSLTの外部で提供される必要があります。これを行うには、外部ライブラリからメソッドを呼び出す必要があります。このライブラリの実装は、Windows(.NETまたはWIN32)またはLinuxとXSLTプロセッサのどちらを使用しているかによって異なります。XSLTは数学を実行できますが、乱数ジェネレーターを含む日付/時刻関連の関数が多くありません。

ただし、XSLTには、一意のIDを生成するgenerate-id()と呼ばれるXPath関数があります。これをなんとかして数字に変換できれば、乱数を作成するために使用される可能性がありますが、予測可能であり、一部の数値は他の数値よりも頻繁に発生する可能性があります。私はそれを使用しません。

MSXSLを使用してスタイルシートを処理する場合は、JavaScriptを含めて、スタイルシート内に乱数を生成できます。(または、.NETを使用する場合はC#スクリプト。)

子ノードの数がわかれば、ノード自体を取得するのは簡単です。ランダムな位置にあるノードを要求するだけです。/ node / node [5]のようなものは、5番目のノードを返します。

于 2009-09-07T12:51:57.570 に答える
0

xslt で乱数を取得するのは簡単なことではありません。

それを行うことができるものがありますが、おそらく乱数発生器のシードを提供する必要があります http://fxsl.sourceforge.net/articles/Random/Casting%20the%20Dice%20with%20FXSL-htm.htm

おそらく、xsl 変換を行うために使用しているプロセッサには、外部関数で xsl 式を拡張する機能があります。その場合、ランダム関数の外を使用できるかもしれません。

于 2009-09-07T12:19:57.467 に答える
0

以下は、XSLT プロセッサが EXSLT 拡張機能 (xsltproc など) をサポートしていることを前提としています。

これは、ランダムに選択された「ノード」の内容を返します (「ノード」の子、つまり「ノード/ノード」要素でなければなりません)。

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math"
  extension-element-prefixes="math" >

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="node">
  <xsl:variable name='selected'>
    <xsl:value-of select="ceiling(math:random() * count(node))"/>
  </xsl:variable>
  <xsl:copy-of select="node[position() = $selected]"/>
</xsl:template>
</xsl:stylesheet>

これは、選択したノードのコンテンツを処理するのに役立つスニペットです。

<xsl:variable name="randomNode" select="node[position() = $selectNode]"/>
<id><xsl:value-of select="$randomNode/@id"/></id>
<name><xsl:value-of select="$randomNode/data[@alias='name']"/></name>
<picture><xsl:value-of select="$randomNode/data[@alias='picture']"/></picture>

上記は変数の xslt 定義を返さないことに注意してください。その変数を使用して、選択したノードをコピーします。

xsl:variable 要素の 'value' 属性を設定するには、次のような属性テンプレートを試してください。

<xsl:variable name='chosenNode' value='{node[position() = $selected]/@id}'/>
于 2012-08-28T21:23:20.117 に答える
0

このソリューションは、xsltproc およびテキスト ユーティリティを使用するシェル スクリプトで機能します。

RandomElement=$(xsltproc style.xsl file.xml | tr ' ' '\n' | sort -uR | head -n 1)

style.xslファイルが必要な要素セットを選択し、その値を出力テキスト ファイルの行ごとに 1 つずつ返すと想定されています。コマンドは、tr各要素を別々の行に配置する必要があります。は、スタイル シート コマンドsort -uRによって選択された要素の一意のランダム リストを生成する必要があります。style.xsl次にhead -n 1、一意のランダム リストの最初の行を引き出します。

于 2012-08-28T19:55:54.350 に答える