Принудительно проверять каждую запись при применении шаблона?
У меня есть шаблон, который выбирает изображения, а затем выводит их в один из двух шаблонов.
Я хотел бы отслеживать каждое отдельное изображение и вывод на основе значений каждого из них. В настоящее время, если одно изображение широко, оно выводит их все в соответствии с широким шаблоном. Я бы предпочел использовать оба шаблона.
<xsl:template name="get-images">
<xsl:param name="image-entry"/>
<xsl:choose>
<xsl:when test="($image-entry/image/meta/@width) > ($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 > 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
элемент, только если он имеет непустое значение.