XSL - 检查属性是否等于所选值

时间:2017-01-17 22:45:26

标签: xml xslt

我正在使用 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>

这是添加数据值

的部分
<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>

1 个答案:

答案 0 :(得分: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属性。