【问题标题】:Check if a variable of the for-each is equal with an XML entry检查 for-each 的变量是否与 XML 条目相等
【发布时间】:2010-08-18 20:14:05
【问题描述】:

我正在尝试将“选定”属性添加到<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>

&lt;xsl:if /&gt; 的正确格式是什么?

编辑:

我的 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>

【问题讨论】:

  • 您尝试转换的 XML 是什么样的(请仅提供相关部分)?
  • 帕劳斯:你的测试条件是错误的。在for-each 内容模板中,上下文节点是albums。所以我认为没有albums/page/index/values/album。提供输入样本。
  • 你想要的输出呢?
  • 您的问题的某些部分似乎已经消失。也许文本中有一些尖括号?尝试用反引号转义这些单词。

标签: xslt xhtml xpath


【解决方案1】:

您使用的 XPath 不正确:

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

应该是:

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

你是在不同albums节点的上下文中,所以需要先到父节点values才能获取album的值。

或者,您需要根您的 XPath:

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

【讨论】:

  • 我添加了我正在转换的 XML 文件。 page/index/values/album 与 page/index/values/album 无关。第二个是 &lt;select&gt; 的所选专辑的 id。
【解决方案2】:

测试条件应该是:

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>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 2011-01-26
      • 2022-01-07
      • 2015-01-02
      相关资源
      最近更新 更多