XSL - 如果值不存在,则为属性添加值

时间:2017-04-03 14:50:19

标签: xml xslt

创建元素时,我需要将值添加到 data-id 属性(这是有效的),但是一旦设置了这个值,我就需要保留它。问题是,如果在创建表单期间更改了任何顺序,则会更改ID,对于 data-id ,我需要一个固定值。任何想法。

我有用于创建输入元素的代码:

<div class="field" align="left">
    <xsl:element name="input">
    <xsl:attribute name="id"><xsl:value-of select="$field_id" /></xsl:attribute>
    <xsl:attribute name="name"><xsl:value-of select="$field_id" /></xsl:attribute>
    <xsl:attribute name="type">text</xsl:attribute>
    <xsl:attribute name="value"><xsl:value-of select="." /></xsl:attribute>
    <xsl:attribute name="maxlength"><xsl:value-of select="@maxlength" /></xsl:attribute>
    <xsl:attribute name="minlength"><xsl:value-of select="@minlength" /></xsl:attribute>
    <xsl:attribute name="class">text</xsl:attribute>
    <xsl:attribute name="data-id">
        <xsl:value-of select="$field_id" />
    </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">
                                            fieldPropertyChange('smalltext', '<xsl:value-of select="$field_id" />');
    </xsl:attribute>
</xsl:element>

1 个答案:

答案 0 :(得分:1)

在HTML中,reqired="required"的反面不是{​​{1}}。阅读spec on boolean attributes

  

布尔属性不允许使用值“true”和“false”。要表示错误值,必须完全省略该属性。

如果字段是可选字段,请忽略“required”属性。

此外,您缺少attribute value templates。一般不需要required="false",而且样本中根本不需要<xsl:attribute><xsl:element>也是如此。

以下是您的代码应该是什么样的。

<div class="field" align="left">
    <input
        id="{$field_id}" name="{$field_id}" type="text" class="text" 
        value="{.}" data-id="{$field_id}"
        onchange="fieldPropertyChange('smalltext', '{$field_id}')"
    >
        <xsl:copy-of select="@maxlength|@minlength|@required[. = 'required']" />
    </input>
</div>

你想要一个带有一堆属性的<input>。并且您希望复制属性@maxlength@minlength(如果它们存在于源中)和@required(但前提是它在源中实际上具有值'required' )。

对于这种情况,

<xsl:copy-of>是正确的选择。

另外请注意,您可能想摆脱onchange。我建议您使用jQuery和单独的脚本文件进行事件处理,并将所有Javascript保留在HTML代码之外。