2011-08-17 2 views
0

다음 XSLT 코드는 지정된 노드에서 폴더와 해당 파일 항목을 나열합니다.XSLT xsl : apply-templates 조건부 구문

이 모든 것은 정상적으로 작동하지만 페이지를 매개 변수화하고 선택적으로 태그 값으로 출력을 필터링하고 싶습니다.

나는 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

코드 스 니핏 위의 설명에서 코드가 사라지지 않도록이 게시물을 편집하고 작은 따옴표를 역선으로 전환해야합니다. 뒷다리는 틸다와 같은 열쇠에 있습니다. –

+0

좋은 질문입니다, +1. 쉽고 간단하며 간단한 해결책은 내 대답을 참조하십시오. :) –

답변

1

:

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

설명 : 위의 select 속성에있는 XPath 표현식이 비어 있지 않은 노드 집합을 선택하려면 boolean($tag)true()이어야합니다. 따라서 위의 단일 <xsl:apply-templates> 명령은 질문에서 long <xsl:choose>과 동일합니다.

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를 ' 대신 긴 <xsl:choose> 명령, 사용 라일리 XSLT 요리 책