我有以下XSLT代码,它列出了指定节点中的文件夹及其文件项。
这一切都运行正常,但我想参数化页面,并可选择按标签值过滤其输出。
作为一个XLST numpty我很难理解我应该在<xsl:when test="$tag">
条款下提出的条件语法 - 有人可以帮忙吗?
<xsl:variable name="tag" select="umbraco.library:Request('tag')" />
<xsl:template match="/">
<!-- Root folder in Media that holds the folders to output -->
<xsl:variable name="mediaRootFolderId" select="5948" />
<!-- Pass in true() to get XML for all nodes below -->
<xsl:variable name="mediaRootNode" select="umbraco.library:GetMedia($mediaRootFolderId, true())" />
<xsl:choose>
<xsl:when test="$tag">
</xsl:when>
<xsl:otherwise>
<!-- If we didn't get an error, output Folder elements that contain Image elements -->
<xsl:apply-templates select="$mediaRootNode[not(error)]/Folder[File]" >
<xsl:sort select="@nodeName"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Template for folders -->
<xsl:template match="Folder">
<div class="folder">
<h2>Folder: <xsl:value-of select="@nodeName" /></h2>
<div class="images">
<xsl:apply-templates select="File">
<xsl:sort select="@nodeName"/>
</xsl:apply-templates>
</div>
</div>
</xsl:template>
<!-- Template for files -->
<xsl:template match="File">
File: <a href="{umbracoFile}" alt="{@nodeName}" ><xsl:value-of select="@nodeName" /></a> <br/>
</xsl:template>
答案 0 :(得分:1)
使用:
,而不是长<xsl:choose>
条指令
<xsl:apply-templates select=
"$mediaRootNode[not($tag)][not(error)]
/Folder[File]" >
解释:对于上面select
属性中的XPath表达式,要选择非空的节点集,boolean($tag)
必须为true()
。因此,上述单<xsl:apply-templates>
条指令相当于问题中的长<xsl:choose>
。
答案 1 :(得分:0)
你可以测试$ tag是否设置如下。
<xsl:param name="tag">
<xsl:message terminate="yes">
$tag has not been set
</xsl:message>
</xsl:param>
虽然这不是标准的,但它适用于大多数XSLT处理器。
如果您想要绝对保存,可以将值设置为非法值(例如1 div 0)并在模板正文中对其进行测试:
<xsl:param name="tag" select="1 div 0" />
<xsl:if test="$tag = 1 div 0">
<xsl:message terminate="yes">
$tag has not been set, or has been set to Infinity, which is invalid.
</xsl:message>
</xsl:if>
资料来源:O'Reilly XSLT Cookbook