【问题标题】:XSL - check if attribute is equal to the selected valueXSL - 检查属性是否等于所选值
【发布时间】:2017-01-17 22:45:25
【问题描述】:

我正在使用 xsl 文件,该文件用于创建表单字段。我需要检查选项值是否与选定值相同,并将选定属性添加到该选项字段。这是创建选项的代码(这里一切正常,选项是动态创建的):

<xsl:when test="@type='select'">
                                <xsl:attribute name="title">Select List</xsl:attribute>
                                <xsl:apply-templates select=".">
                                    <xsl:with-param name="field_id" select="$field_id" />
                                    <xsl:with-param name="field_type" select="@type" />
                                    <xsl:with-param name="isEditing" select="$isEditing" />
                                </xsl:apply-templates>
                                <xsl:element name="div">
                                    <xsl:attribute name="id"><xsl:value-of select="$field_id" /></xsl:attribute>
                                    <xsl:attribute name="type">select</xsl:attribute>
                                    <xsl:attribute name="class">field  ui-select</xsl:attribute>
                                    <xsl:element name="select">
                                        <xsl:attribute name="name"><xsl:value-of select="$field_id" /></xsl:attribute>
                                        <xsl:attribute name="id"><xsl:value-of select="$field_id" /></xsl:attribute>
                                        <xsl:attribute name="data-native-menu">false</xsl:attribute>
                                        <xsl:attribute name="size">1</xsl:attribute>

                                        <xsl:attribute name="required">
                                            <xsl:choose>
                                                <xsl:when test="@required='required'">required</xsl:when>
                                                <xsl:otherwise>false</xsl:otherwise>
                                            </xsl:choose>
                                        </xsl:attribute>

                                        <xsl:attribute name="onchange">CustomJS.manageDropdownSelect(this)</xsl:attribute>

                                        <xsl:attribute name="data-value">
                                            <xsl:choose>
                                                <xsl:when test="@data-value!=''">
                                                    <xsl:value-of select="@data-value" /></xsl:when>
                                            </xsl:choose>
                                        </xsl:attribute>

                                        <xsl:for-each select="./options/option">
                                            <xsl:element name="option">

                                                <xsl:attribute name="value">
                                                    <xsl:value-of select="." />
                                                </xsl:attribute>

                                                <xsl:value-of select="." />

                                                <xsl:if test="@data-value='@value'">
                                                    <xsl:attribute name="selected">selected</xsl:attribute>
                                                </xsl:if>

                                            </xsl:element>
                                        </xsl:for-each>
                                    </xsl:element>
                                </xsl:element>

                                <!-- field data -->
                                <xsl:element name="input">
                                    <xsl:attribute name="id">field_id</xsl:attribute>
                                    <xsl:attribute name="type">hidden</xsl:attribute>
                                    <xsl:attribute name="class">fielddata</xsl:attribute>
                                    <xsl:attribute name="value"><xsl:value-of select="concat($field_id,':',@type)" /></xsl:attribute>
                                </xsl:element>
                            </xsl:when>

这是添加data-value的部分:

<xsl:attribute name="data-value">
                                            <xsl:choose>
                                                <xsl:when test="@data-value!=''">
                                                    <xsl:value-of select="@data-value" /></xsl:when>
                                            </xsl:choose>
                                        </xsl:attribute>

这是负责选项的部分:

<xsl:for-each select="./options/option">
    <xsl:element name="option">

                                        <xsl:attribute name="value">
                                            <xsl:value-of select="." />
                                        </xsl:attribute>

                                        <xsl:value-of select="." />

                                        <xsl:if test="@data-value='@value'">
                                            <xsl:attribute name="selected">selected</xsl:attribute>
                                        </xsl:if>

                                    </xsl:element>
                                </xsl:for-each>

我需要弄清楚如何将此部分与所选值联系起来:

 <xsl:if test="@data-value='@value'">
       <xsl:attribute name="selected">selected</xsl:attribute>
 </xsl:if>

有什么想法吗?

编辑

我得到的 XML 代码示例:

<field type="select" name="" id="select_0" data-value="List 14" required="false">
    <options>
        <option>List 1</option>
        <option>List 12</option>
        <option>List 13</option>
        <option>List 14</option>
        <option>List 12</option>
        <option>List 125</option>
    </options>
</field>

【问题讨论】:

  • 只是为了确认...您是说&lt;option&gt; 标签创建正确,但selected 属性实际上并没有出现在其中的任何标签上?谢谢!
  • 是的,所有选项都创建没有任何问题,并且 select 正在正确获取数据值(基于所选选项)。

标签: xml xslt


【解决方案1】:

问题在于您的陈述顺序。必须在元素的任何其他子节点之前创建属性。作为per the W3C spec...

以下都是错误:

  • 在向元素添加子元素后为其添加属性;实现可能会发出错误信号或忽略 属性。

xsl:value-of 在您的情况下正在创建一个子文本节点。

此外,您在测试中的撇号中有属性@value,它将寻找“@value”的文字字符串值。但在您的情况下,您想检查节点的实际值,这是一个文本节点。所以就用text()

此外,data-value 是祖先 field 元素的属性,而不是当前的 option 元素。你应该做../../@data-value=text() 而不是@data-value='@value'

所以,你的代码应该是这样的:

<xsl:element name="option">
     <xsl:attribute name="value">
          <xsl:value-of select="." />
     </xsl:attribute>
    <xsl:if test="../../@data-value=text()">
        <xsl:attribute name="selected">selected</xsl:attribute>
    </xsl:if>
    <xsl:value-of select="." />
</xsl:element>

注意,这里不用xsl:element创建元素,直接写出元素即可。您可以简化为以下内容:

<option value="{.}">
    <xsl:if test="../../@data-value=text()">
        <xsl:attribute name="selected">selected</xsl:attribute>
    </xsl:if>
    <xsl:value-of select="." />
</option>

注意使用Attribute Value Templates 来创建value 属性。

【讨论】:

  • 感谢您的详细回答:)。这仍然无法正常工作(我尝试了两个示例),但我现在有了一个起点:)。
  • 我刚刚对我的回答做了一些修改,如果你想再看一下。
  • 我添加了创建的 XML 代码示例。奇怪的是,选项没有 value 属性,但 HTML 有。应该是这样的吧?
  • 我刚刚在data-value 附近发现了另一个问题,我已将其添加到我的答案中。
  • 嗯,这仍然拒绝工作:/,我想我今天碰壁了。非常感谢您对我的帮助,不想再打扰您了:)。
猜你喜欢
  • 2018-04-01
  • 2012-01-14
  • 1970-01-01
  • 2019-03-19
  • 2015-02-16
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多