1

CMS を使用して Web サイトを作成しています。ホームページで写真と説明をランダムに取得する必要があります。ページを更新するたびに新しいノードを取得する必要があります。

これは、XSL でノードを呼び出す方法です。

<xsl:for-each select ="TSPRoot/Blocks/Block[@ID=134]/Articles/Article[position() &lt; 4]">
          <div class="layout-08">
            <a class="title" href="detailed.aspx?id={ID}">
              <xsl:choose >
                <xsl:when test ="string-length(ImageURL) > 0">
                  <img src="_handlers/resizeimage.ashx?src={ImageURL}&amp;height=149&amp;width=206" title="{Headline}"/>
                </xsl:when>
                <xsl:otherwise>
                  <img src="_frontend/ux/images/en_logo.png" width="206" height="149" title="{Headline}"/>
                </xsl:otherwise>
              </xsl:choose>
            </a>
            <div class="bg">
              <a href="detailed.aspx?id={ID}"><xsl:value-of select ="Headline"/></a>
            </div>
          </div>
        </xsl:for-each>

これにより、最新の (3) ノードが取得されます。更新するたびにランダムな (3) ノードが必要です。

4

1 に答える 1

0

可能な解決策のいくつかのアイデアのみを提供します。技術的には、XSLT はメソッド乱数を提供しません。ただし、この問題は少なくとも 3 つの異なる方法で解決できます。

  1. XSLT テンプレートを実行する前に Java/C#/PHP コードで疑似乱数を生成し、生成された数を XSLT パラメーターとして渡します。
  2. 拡張機能を使用します: http://exslt.org/random/functions/random-sequence/index.html

  3. current-dateTime()(XSLT 2.0) 関数を乱数プロシージャのシードとして使用します。いくつかの文字列と数学演算を使用すると、それを目的の準乱数に変換できます。あなたのニーズには、このソリューションで十分だと思います。

編集 - 広告 ​​3。

私はこの考えでいくつかの実験をしました。そして、いくつかのサンプルコードを作成しました。このコードが実際に疑似乱数のシーケンスを生成することは知っていますが、質問のような単純な Web ページでは十分かもしれません。

次の XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:rnd="http://whatever.org/random">
    <xsl:output indent="yes" />
    <xsl:function name="rnd:pseudoRandomInternal">
        <xsl:param name="numSeed" as="xs:decimal"/>
        <xsl:variable name="squareSeed" select="xs:string($numSeed*$numSeed)"/>
        <xsl:variable name="oneDivSeed" select="substring($squareSeed, 3, string-length($squareSeed) - 3)"/>
        <xsl:variable name="cc" select="if (string-length($oneDivSeed) > 6) then 
            substring($oneDivSeed, string-length($oneDivSeed) - 6) else 
            $oneDivSeed"/>
        <xsl:value-of select="xs:decimal($cc)"/>
    </xsl:function>
    <xsl:function name="rnd:pseudoRandom" as="xs:decimal*">
        <xsl:param name="range" as="xs:integer"/>

        <xsl:choose>
            <xsl:when test="$range = 1">
                <xsl:variable name="seed" select="substring(xs:string(current-time()), 1, 12)" as="xs:string"/>
                <xsl:variable name="numSeed" select="xs:decimal(translate($seed, ':.+-', ''))"/>
                <xsl:sequence select="(rnd:pseudoRandomInternal($numSeed))" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="subSequence" select="rnd:pseudoRandom($range - 1)"/>
                <xsl:variable name="newValue" select="rnd:pseudoRandomInternal($subSequence[1])" as="xs:decimal*"/>
                <xsl:sequence select="($newValue, $subSequence)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:function>
    <xsl:template match="/">
        <xsl:variable name="rr" select="rnd:pseudoRandom(10)" as="xs:decimal*"/>

        <output>
        <xsl:for-each select="$rr">
            <item>
                <xsl:value-of select=". * 3 mod 11" />
            </item>
        </xsl:for-each>
        </output>
    </xsl:template>
</xsl:stylesheet>

次の出力が生成されました。

<output>
    <item>10</item>
    <item>9</item>
    <item>6</item>
    <item>9</item>
    <item>9</item>
    <item>10</item>
    <item>3</item>
    <item>5</item>
    <item>9</item>
    <item>4</item>
</output>
于 2013-06-20T10:06:41.597 に答える