XSLT xsl: apply-templates Условный синтаксис - PullRequest
0 голосов
/ 17 августа 2011

У меня есть следующий XSLT-код, в котором перечислены папки и элементы их файлов с указанного узла.

Это все работает нормально, но я бы хотел параметризовать страницу и дополнительно отфильтровать ее вывод по значению тега.

Будучи пустышкой XLST, я озадачен синтаксисом условного выражения, которое я должен вставить в предложение <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 ]

1 голос
/ 17 августа 2011

Вместо длинной инструкции <xsl:choose> используйте:

 <xsl:apply-templates select=
   "$mediaRootNode[not($tag)][not(error)]
                                /Folder[File]" > 

Объяснение : Для выражения XPath в атрибуте select, указанном выше, выберитенепустое множество узлов необходимо, чтобы boolean($tag) было true().Таким образом, приведенная выше одиночная инструкция <xsl:apply-templates> эквивалентна длинной <xsl:choose> в вопросе.

0 голосов
/ 17 августа 2011

вы можете проверить, установлен ли $ 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

...