XSLT: Как мне получить значение переменной путем объединения строки и другой переменной?

#xslt-2.0

#xslt-2.0

Вопрос:

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

Цель состоит в том, чтобы создать scrset для изображений размером от 300 пикселей до максимум 4200. Но остановка srcset до того, как он достигнет значения MaxWidth . Итак, если изображение имеет максимальную ширину 2000, то итерация остановится после вывода 1800.

Это код, который у меня есть до сих пор:

 <xsl:variable name="count" select="14"/>
<xsl:variable name="maxWidth" select="2200"/> <!-- this value will be dynamic depending on each image (taken from an attribute on the image) -->

<xsl:variable name="loopIndex1" select="300"/> 
<xsl:variable name="loopIndex2" select="600"/>
<xsl:variable name="loopIndex3" select="900"/>
<xsl:variable name="loopIndex4" select="1200"/>
<xsl:variable name="loopIndex5" select="1500"/>
<xsl:variable name="loopIndex6" select="1800"/>
<xsl:variable name="loopIndex7" select="2100"/>
<xsl:variable name="loopIndex8" select="2400"/>
<xsl:variable name="loopIndex9" select="2700"/>
<xsl:variable name="loopIndex10" select="3000"/>
<xsl:variable name="loopIndex11" select="3300"/>
<xsl:variable name="loopIndex12" select="3600"/>
<xsl:variable name="loopIndex13" select="3900"/>
<xsl:variable name="loopIndex14" select="4200"/>

<xsl:attribute name="srcset"> 
    <xsl:for-each select="1 to $count">
        <xsl:variable name="index" select="position()"/>

        <xsl:variable name="source">
            <xsl:value-of select="concat('loopIndex', $index)"/>
        </xsl:variable>

        <xsl:if test="$source amp;< $maxWidth">
            http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;amp;w=<xsl:value-of select="concat($source, ' ')" /> <xsl:value-of select="$source" />w,
        </xsl:if>

    </xsl:for-each>
</xsl:attribute>
  

Если я удалю тест только для получения некоторого вывода, результат будет:

 srcset="
http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;w=loopIndex1 loopIndex1w,
http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;w=loopIndex2 loopIndex2w,
etc
"
  

Желаемый результат:

 srcset="
http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;w=300 300w,
http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;w=600 600w,
etc
"
  

Мне также нужно, чтобы после последнего элемента не было запятой. Это означает, что если http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;w=600 600w, бы это был последний вывод, то запятой в конце не было бы, например:

 http://imagescalerserver.com/?url=http://test.com/1108932.jpgamp;w=600 600w
  

В идеале я хотел бы не создавать переменные loopIndex, а просто увеличить значение на 300 в общей сложности за 14 итераций, но поскольку переменные нельзя изменить, это лучшее, что мне удалось. Если есть лучший способ, я был бы признателен, если бы узнал об этом.

Ответ №1:

Объявите одну переменную <xsl:variable name="loopIndex" select="300, 600, 900, ..., 4200"/> (вам нужно указать ... ее в вашем коде), а затем вы можете установить

 <xsl:variable name="source" select="$loopIndex[current()]"/>
  

внутри for-each .

Комментарии:

1. Большое вам спасибо. Вы даже не представляете, как долго я боролся с этой проблемой: D И такое простое и элегантное решение тоже. Единственное, что я получаю запятую в конце на последней итерации (она редко доходит до 4200). Но, похоже, это не нарушает синтаксис html, поэтому я могу с этим смириться. Еще раз спасибо 🙂