【问题标题】:Conditional XSL loop over XML.XML 上的条件 XSL 循环。
【发布时间】:2014-04-03 01:01:21
【问题描述】:

我想通过我的 XML 文件使用 XSL 创建一个循环,该循环仅处理评分高于 5 的游戏:

<game_id id="101">
        <game_name>Minecraft</game_name>
        <game_price currency="€">23.99</game_price>
        <game_type type="Sandbox" />
        <game_art>minecraft.jpg</game_art>
        <game_platform>
            <platform platform="XboxOne">XboxOne</platform>
            <platform platform="Ps4">Ps4</platform>
            <platform platform="PC">PC</platform>
            <platform platform="Mac">Mac</platform>
        </game_platform>
        <game_desc>Simple block based game</game_desc>
        <game_dev>Mojang</game_dev>
        <game_rating rating="9">5/10 </game_rating>
        <game_review>
            <para para="1">The game involves players creating and destroying various types of blocks in a three dimensional environment. 
                        The player takes an avatar that can destroy or create blocks, forming fantastic structures, 
                        creations and artwork across the various multiplayer servers in multiple game modes
                        </para>
            <para para="x"></para>
            <para para="x"></para>
        </game_review>
    </game_id>

我一直在尝试创建循环,但我的尝试失败了:

<xsl:choose>
        <xsl:when test="game_id/game_rating =  '5'">
            <h1><xsl:value-of select="game_name"></xsl:value-of></h1>
            <hr />
                <img> <xsl:attribute name="src"> <xsl:value-of select="game_art"/></xsl:attribute></img>

                    <p><strong>Price:</strong> <xsl:value-of select="game_price"></xsl:value-of></p>

                    <xsl:for-each select="game_platform/platform">
                    <p><strong>Platform:</strong> <xsl:value-of select="node()"></xsl:value-of></p>
                    </xsl:for-each>

                    <p><strong>Game Desc: </strong> <xsl:value-of select="game_desc"></xsl:value-of></p>

                    <p><strong>Game Dev: </strong> <xsl:value-of select="game_dev"></xsl:value-of></p>

                    <p><strong>Game Rating: </strong> <xsl:value-of select="game_rating"></xsl:value-of></p>

                    <h4>Game Reveiw</h4>
                    <xsl:for-each select="game_review/para"> 
                        <p><xsl:value-of select="node()"></xsl:value-of></p>
                    </xsl:for-each>
                </xsl:when>

            </xsl:choose>

任何帮助将不胜感激。

【问题讨论】:

  • 不需要循环(也不可取):使用 谓词 代替。
  • 我不理解你的 XML:&lt;game_rating rating="9"&gt;5/10 &lt;/game_rating&gt; - 评级是9 还是5/10
  • 如果要循环,请使用 BASIC 中的 FOR 语句。

标签: xml loops xslt


【解决方案1】:

理想情况下,您在这里不需要循环,但您使用模板匹配。假设您有多个 game_id 元素,并且位于它们的父元素上,您可以这样做...

<xsl:apply-templates select="game_id[number(game_rating/@rating) > 5]" />

然后,您将拥有一个匹配 game_id

的模板
<xsl:template match="game_id">
    <h1><xsl:value-of select="game_name"></xsl:value-of></h1>

例如,给定这个样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/*">
        <xsl:apply-templates select="game_id[number(game_rating/@rating) > 5]" />
    </xsl:template>

    <xsl:template match="game_id">
        <h1><xsl:value-of select="game_name" /></h1>
    </xsl:template>
</xsl:stylesheet>

应用于以下 XML 时

<games>
    <game_id id="101">
        <game_name>Minecraft</game_name>
        <game_rating rating="9">9/10</game_rating>
    </game_id>
    <game_id id="102">
        <game_name>Goat Simulator</game_name>
        <game_rating rating="4">4/10</game_rating>
    </game_id>
</games>

那么下面是输出

 <h1>Minecraft</h1>

或者,根据您的 XML 的实际结构,您可以允许 XSLT 的内置模板对节点进行一些选择,并有一个额外的模板来排除低评级的游戏。在这种情况下,以下也会给出相同的输出。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="game_id[number(game_rating/@rating) &lt;= 5]" />

    <xsl:template match="game_id">
        <h1><xsl:value-of select="game_name" /></h1>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 谢谢你,这真的让我很头疼。
  • 还有……你怎么知道我用过山羊模拟器……真是个让人上瘾的游戏:)
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多