检查for-each的变量是否与XML条目相等

时间:2010-08-18 20:14:05

标签: xslt xhtml xpath

我正在尝试将“已选择”属性添加到<option>。我尝试了各种各样的方法,但我无法让它发挥作用。这就是我正在尝试的方式:

<xsl:for-each select="page/index/values/albums">
    <option>
        <xsl:attribute name="value"><xsl:value-of select="id" /></xsl:attribute>
        <xsl:if test="page/index/values/album = id">
             <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="name" />
    </option>
</xsl:for-each>

<xsl:if />的正确形式是什么?

修改

我的XML文件:

<page>
    <index>
        <values>
            <album>2</album>

            <albums>
                <id>1</id>
                <name>Album #1</name>
            </albums>

            <albums>
                <id>2</id>
                <name>Album #2</name>
            </albums>
        </values>
    </index>
</page>

输出:

<option value="1">Album #1</option>
<option value="2" selected="selected">Album #2</option>

3 个答案:

答案 0 :(得分:2)

您使用的XPath不正确:

<xsl:if test="page/index/values/album = id">

应该是:

<xsl:if test="../album = id">

您处于不同albums个节点的上下文中,因此您需要在获取values的值之前转到父节点album

或者,你需要root你的XPath:

<xsl:if test="/page/index/values/album = id">

答案 1 :(得分:1)

测试条件应为:

id = ../album

修改:现在使用所需的输出,请使用此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="values">
        <select>
            <xsl:apply-templates select="albums"/>
        </select>
    </xsl:template>
    <xsl:template match="albums">
        <option value="{id}">
            <xsl:apply-templates/>
        </option>
    </xsl:template>
    <xsl:template match="id"/>
    <xsl:template match="id[.=../../album]">
        <xsl:attribute name="selected">selected</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

输出:

<select>
    <option value="1">Album #1</option>
    <option value="2" selected="selected">Album #2</option>
</select>

答案 2 :(得分:0)

您添加属性的表单是正确的,但正如@Alejandro指出的那样,您的if测试条件可能是错误的。特别是“=”的左侧。这些XPath表达式与上下文节点相关,即page/index/values/albums