我正在使用 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>
答案 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
属性。