Принудительно проверять каждую запись при применении шаблона?

У меня есть шаблон, который выбирает изображения, а затем выводит их в один из двух шаблонов.

Я хотел бы отслеживать каждое отдельное изображение и вывод на основе значений каждого из них. В настоящее время, если одно изображение широко, оно выводит их все в соответствии с широким шаблоном. Я бы предпочел использовать оба шаблона.

<xsl:template name="get-images">
    <xsl:param name="image-entry"/>
    <xsl:choose>

        <xsl:when test="($image-entry/image/meta/@width) &gt; ($image-entry/image/meta/@height)">
        <xsl:apply-templates select="$image-entry/image" mode="wide">
            <xsl:with-param name="image-class" select="'full-width'"/>
            <xsl:with-param name="caption-class" select="'full-width-caption'"/>
        </xsl:apply-templates>
        </xsl:when>

        <xsl:otherwise>
            <xsl:apply-templates select="$image-entry/image" mode="tall">
            <xsl:with-param name="image-class" select="'center'"/>
            <xsl:with-param name="caption-class" select="'full-width-caption'"/>
            </xsl:apply-templates>
        </xsl:otherwise>

    </xsl:choose>
</xsl:template>

<xsl:template match="image" mode="wide">
    <xsl:param name="image-class" />
    <xsl:param name="caption-class" />

    <a href="{$root}/image/full{@path}/{filename}">
        <img src="{$root}/image/wide{@path}/{filename}" alt="{../description}" class="{$image-class}"/>
    </a>

    <p class="{$caption-class}">
        Image courtesy of: <a href="{../source}"><xsl:value-of select="../title"/></a>
    </p>
</xsl:template>

<xsl:template match="image" mode="tall">
    <xsl:param name="image-class" />
    <xsl:param name="caption-class" />

    <span class="centered">
        <a href="{$root}/image/full{@path}/{filename}">
            <img src="{$root}/image/tall{@path}/{filename}" alt="{../description}" class="{$image-class}"/>
        </a>
    </span>

    <p class="{$caption-class}">
        Image courtesy of: <a href="{../source}"><xsl:value-of select="../title"/></a>
    </p>
</xsl:template>

Бонусный вопрос: как я могу игнорировать заголовок, если источник значения не существует?

            <article-images field-id="24" subsection-id="5" items="1">
                <item id="109" creation-date="2014-04-24T05:16:52+01:00">
                    <image size="317 KB" path="/uploads" type="image/jpeg">
                        <filename>funny-lolcat.jpg</filename>
                        <meta creation="2014-04-24T05:16:52+01:00" width="1600" height="1200" />
                    </image>
                    <description mode="formatted"><p>Aww!</p>
</description>
                    <title handle="" />
                    <source handle="" />
                </item>
            </article-images>

1 ответ

Решение

Вместо двух режимов используйте один режим и переместите логику "широкая" и "не широкая" в выражения соответствия шаблонов:

<xsl:template match="image[meta/@width &gt; meta/@height]">
  <!-- logic for wide image -->
</xsl:template>

<xsl:template match="image">
  <!-- logic for not-wide image -->
</xsl:template>

И теперь вы можете просто применить шаблоны ко всем изображениям за один раз без choose:

<xsl:apply-templates select="$image-entry/image"/>

Чтобы игнорировать заголовок, если нет источника, я бы переместил логику заголовка в другой шаблон, соответствующий source элемент

<xsl:template match="source" mode="caption">
  <p class="full-width-caption">
      Image courtesy of: <a href="{.}"><xsl:value-of select="../title"/></a>
  </p>
</xsl:template>

Затем в основном шаблоне сделать:

<xsl:apply-templates select="../source" mode="caption"/>

Если есть источник, он создаст заголовок, если нет, то он ничего не даст.

Учитывая пример, который вы только что добавили к вопросу, похоже, что вы хотите исключить заголовок no, когда source элемент "не существует", а скорее, если он не имеет значения. Вы можете сделать это, изменив вышеуказанное apply-templates в

<xsl:apply-templates select="../source[string()]" mode="caption" />

Это добавило бы заголовок для <source handle="">something</source> но не для <source handle="" />,

Что это делает, так это фильтрация, поэтому мы выбираем только ../source элемент, если [string()] Предикат верен. string() Функция возвращает "строковое значение" элемента контекста (source в этом случае) и строка в логическом контексте обрабатывается как false, если она пуста, и true в противном случае. Таким образом, в этом случае эффект заключается в применении шаблонов к source элемент, только если он имеет непустое значение.

Другие вопросы по тегам