2017-01-17 3 views
0

Я работаю с xsl файл, который используется для создания полей формы. Мне нужно проверить, совпадает ли значение параметра с выбранным значением и добавить выбранный атрибут в это поле. Это код для создания вариантов (все работает здесь, и параметры создаются динамически):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> 

Любые идеи?

EDIT

Пример кода 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

Просто чтобы подтвердить ...Вы говорите, что теги '

+0

Да, все параметры создаются без каких-либо проблем, а выбор - правильно получать данные (на основе выбранной опции). – Sasha

ответ

1

Проблема заключается в порядок ваших заявлений. Атрибуты должны создаваться перед любыми другими дочерними узлами элемента. Как per the W3C spec ...

Ниже перечислены все ошибки:

  • Добавление атрибута к элементу после детей, которые были добавлены к нему; реализации могут либо сигнализировать об ошибке, либо игнорировать атрибут .

xsl:value-of является createng дочернего текстового узла, в вашем случае.

Кроме того, у вас был атрибут @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.

+0

Спасибо за подробный ответ :). Это по-прежнему отказывается работать (я пробовал оба примера), но теперь у меня есть начальная точка, где нужно смотреть :). – Sasha

+0

Я только что внесла некоторые изменения в свой ответ, если вы хотите взглянуть еще раз. –

+0

Я добавил пример созданного XML-кода. Как ни странно, параметры не имеют атрибута value, но HTML имеет. Это должно быть так? – Sasha

Смежные вопросы