XSLT:从范围中选择一个随机项并输出其属性

时间:2017-11-07 17:56:06

标签: xml xslt

使用XSLT 1.0我需要定义一个分配给变量的项目列表,并拉出一个随机项目并在HTML块中引用它的属性。

我认为我基本上需要:

1)定义项目列表
2)随机选择一个 3)将随机选择的项目的属性拉出到我的HTML

Output HTML部分目前是伪代码,但这是我目前所拥有的。我很感激任何指示或建议让这个工作。

<?xml version="1.0" encoding="UTF-8"?>
<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 name="item">

    <!-- List of items -->
    <xsl:variable name="items" as="element()*">
        <item name="item-one" link="http://www.website.com" />
        <item name="item-two" link="http://www.website.com" />
        <item name="item-two" link="http://www.website.com" />
    </xsl:variable>

    <!-- Select item at random and assign to variable -->
    <xsl:variable name="random-item">
        <xsl:value-of select="$items[(floor(math:random()*2) mod 2) + 1]" />
    </xsl:variable>

    <!-- Output -->
    <div class="item">
        <a href="${item-link}" >
            <picture>
                <source srcset="/images/${item-name}.gif" media="(min-width: 1280px)" />
                <source srcset="/images/${item-name}.gif" media="(min-width: 768px)" />
                <img src="/images/${item-name}.gif" />
            </picture>
        </a>
    </div>

</xsl:template>

感谢。

1 个答案:

答案 0 :(得分:0)

这是我最终想出来的。在此更新,因为它可能对其他人有用。

<?xml version="1.0" encoding="UTF-8"?>
<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 name="item">

    <!-- List of items -->
    <xsl:variable name="items">
        <item name="item-one" link="http://www.website.com">Item 1</item>
        <item name="item-two" link="http://www.website.com">Item 2</item>
        <item name="item-three" link="http://www.website.com">Item 3</item>
    </xsl:variable>

    <!-- Intermediate inline data model. All that's available in XSLT 1.0 -->
    <xsl:param name="array" select="document('')/*/xsl:variable[@name='items']/*" />

    <!-- Random number (based on number of items in list above) -->
    <xsl:variable name="random-number" select="(floor(math:random()*3) mod 3) + 1" />

    <!-- Item attributes (of the randomly selected item) -->
    <xsl:variable name="item-name" select="$array[number($random-number)]/@name" />
    <xsl:variable name="item-link" select="$array[number($random-number)]/@link" />
    <xsl:variable name="item-alt" select="$array[number($random-number)]" />

    <!-- Output (using attribute value templates) -->
    <div class="item">
        <a href="{$item-link}" >
            <picture>
                <source srcset="/images/{$item-name}.png" media="(min-width: 1280px)" />
                <source srcset="/images/{$item-name}.png" media="(min-width: 768px)" />
                <img src="/images/{$item-name}" alt="{$item-alt}" />
            </picture>
        </a>
    </div>

</xsl:template>

此示例已经过测试并正常运行