Создание выпадающего списка из строки, разделенной запятыми [XML / XSL] - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над старым веб-сайтом электронной коммерции, на котором установлена ​​действительно старая версия ASPDotNetStoreFront с полным отказом от ответственности. Я не очень разбираюсь в XML / XSL. Мне просто нужно погрузиться и попытаться заставить работать код, глядя на другие код.

По существу, некоторые продукты ограничены в том количестве, в котором они могут быть проданы. Страница продукта получает это в виде строки, разделенной запятой. Например,

"5,10,15,20"

Я настроил параметр ниже для сбора этих данных, который работает правильно

 <xsl:param name="restrictedquantities">
      <xsl:value-of select="/root/Products2/Product/RestrictedQuantities" />
 </xsl:param>     

После этого мне нужно вывести количества в виде отдельных опций в теге select, например ниже

<select>
     <option value="5">5</option>
     <option value="10">10</option>
     <option value="15">15</option>
     <option value="20">20</option>
</select>

Мне удалось на 98% работать с приведенным ниже кодом, большую часть кода я нашел в других вопросах о переполнении стека и пытался соединить его вместе,

<xsl:when test="$restrictedquantities != ''">
    <select>
        <xsl:call-template name="split">
            <xsl:with-param name="s" select="$restrictedquantities" />
        </xsl:call-template>
     </select>
</xsl:when>

Затем за пределами моего шаблона ниже я создал еще один шаблон, который разделяет строку через запятые, и по мере вывода я помещаю теги вокруг значений.

<xsl:template name="split" xmlns="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="s" />
    <xsl:param name="withcomma" select="false()" />
    <xsl:choose>
      <xsl:when test="contains($s, ',')">
        <!-- if there is still a comma, call me again
       with everything after the first comma... -->
        <xsl:call-template name="split">
          <xsl:with-param name="s" select="substring-after($s, ',')" />
          <xsl:with-param name="withcomma" select="true()" />
        </xsl:call-template>
        <!-- ...and print afterwards the current part -->
        &lt;option value="<xsl:value-of select="substring-before($s, ',')" />"&gt;<xsl:value-of select="substring-before($s, ',')" />&lt;/option&gt;
      </xsl:when>
      <xsl:otherwise>
        <!-- No comma left in the remaining part: print the rest -->
        &lt;option value="<xsl:value-of select="$s" />"&gt;<xsl:value-of select="$s" />&lt;/option&gt;
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Это приводит к выводу ниже, где он выводит двойные кавычки вокруг вывода моих шаблонов, делая его неработающим.

Вывод на консоль моего тега выбора Я думаю, что мне нужно как-то избежать моего кода, но я не уверен. Я чувствую, что заставляю XSL делать то, чего не предполагалось.

Любая помощь или альтернативы были бы фантастическими Спасибо

1 Ответ

0 голосов
/ 26 июня 2018

Вероятно, это связано с тем, что вы пытаетесь создать теги option

.
 &lt;option value="<xsl:value-of select="substring-before($s, ',')" />"&gt;<xsl:value-of select="substring-before($s, ',')" />&lt;/option&gt;

Вы выводите текст здесь, а не создаете новые элементы. Вы действительно должны делать это ...

<option value="{substring-before($s, ',')}"><xsl:value-of select="substring-before($s, ',')" /></option>

Обратите внимание на использование шаблонов значений атрибутов (фигурные скобки) при создании атрибутов.

Также обратите внимание, что вам также не нужен xmlns="http://www.w3.org/1999/XSL/Transform" в шаблоне split. На самом деле, если вы оставите его сейчас, это вызовет ошибку, так как это будет означать, что процессор будет обрабатывать option как элемент xsl и будет жаловаться, потому что не распознает его.

В любом случае, попробуйте этот шаблон вместо

<xsl:template name="split">
    <xsl:param name="s" />
    <xsl:param name="withcomma" select="false()" />
    <xsl:choose>
      <xsl:when test="contains($s, ',')">
        <xsl:call-template name="split">
          <xsl:with-param name="s" select="substring-after($s, ',')" />
          <xsl:with-param name="withcomma" select="true()" />
        </xsl:call-template>
        <option value="{substring-before($s, ',')}"><xsl:value-of select="substring-before($s, ',')" /></option>
      </xsl:when>
      <xsl:otherwise>
        <option value="{$s}"><xsl:value-of select="$s" /></option>
      </xsl:otherwise>
    </xsl:choose>
</xsl:template>
...