XSLT xsl:apply-templates条件语法

时间:2011-08-17 05:27:11

标签: xslt umbraco

我有以下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>

2 个答案:

答案 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