我有一个模板,可以获取图像,然后将它们输出到两个模板中的一个。
我希望它能根据每个图像的值来跟踪每个图像和输出。目前,如果一个图像宽,则根据宽模板输出所有图像。我宁愿使用这两个模板。
<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>
答案 0 :(得分: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"/>
如果有一个来源,这会产生一个标题,如果没有,那么它就什么都不产生。
考虑到您刚刚添加到问题中的示例,当source
元素&#34;不存在时,您似乎想要排除字幕号码&#34;但是,如果没有价值。您可以将上述apply-templates
更改为
<xsl:apply-templates select="../source[string()]" mode="caption" />
这会为<source handle="">something</source>
添加标题,但不会为<source handle="" />
添加标题。
这样做是过滤,所以如果../source
谓词为真,我们只选择[string()]
元素。 string()
函数返回&#34;字符串值&#34; context元素(在这种情况下为source
)和布尔上下文中的字符串如果为空则被视为false,否则为true。因此,在这种情况下,效果是仅在模板具有非空值时才将模板应用于source
元素。