2011-08-11 6 views
1

XSLT (XSLT-1)에 관한 질문이 있습니다. 며칠 째 그것을 시도하고 있지만 작동시키지 못했습니다.XSLT 탐색 메뉴

XML 및 XSLT-1을 사용하여 표준 웹 사이트 트리 탐색을 만들고 싶습니다. 현재 항목의 경로에있는 항목 만 표시해야합니다. 현재 항목에 하위 항목이있는 경우 다음 노드를 열어야합니다.

<cat> 
    <item id="0" name="1"> 
     <item id="1" name="1.1"></item> 
     <item id="2" name="1.2"></item> 
     <item id="3" name="1.3"></item> 
     <item id="4" name="1.4"> 
      <item id="5" name="1.4.1"> 
       <item id="6" name="1.4.1.1"></item> 
       <item id="7" name="1.4.1.2"></item> 
       <item id="8" name="1.4.1.3"></item> 
      </item> 
      <item id="9" name="1.4.2"></item> 
      <item id="10" name="1.4.3"></item> 
     </item> 
     <item id="11" name="1.5"></item> 
     <item id="12" name="1.6"></item> 
    </item> 
    <item id="13" name="2"> 
     <item id="14" name="2.1"></item> 
     <item id="15" name="2.2"></item> 
    </item> 
    <item id="16" name="3"></item> 
</cat> 

가 지금은 URL에 의해 $의 페이지 id = 7 보내기로 페이지를 호출 할, 그리고이 같은 일부 출력 표시해야합니다 :

내 XML 소스는 다음과 같이이다

<ul> 
    <li>1 
     <ul> 
      <li>1.1</li> 
      <li>1.2</li> 
      <li>1.3</li> 
      <li>1.4 
       <ul> 
        <li>1.4.1 
         <ul> 
          <li>1.4.1.1</li> 
          <li class="activeitem">1.4.1.2</li> 
          <li>1.4.1.3</li> 
         </ul> 
        </li> 
        <li>1.4.2</li> 
        <li>1.4.3</li> 
       </ul> 
      </li> 
      <li>1.5</li> 
      <li>1.6</li> 
     </ul> 
    </li> 
    <li>2</li> 
    <li>3</li> 
</ul> 

나는 URL로 발송합니다 $의 페이지 id = 4 페이지를 호출하고,이 같은 일부 출력 표시해야합니다 경우 :

<ul> 
    <li>1 
     <ul> 
      <li>1.1</li> 
      <li>1.2</li> 
      <li>1.3</li> 
      <li class="activeitem">1.4 
       <ul> 
        <li>1.4.1</li> 
        <li>1.4.2</li> 
        <li>1.4.3</li> 
       </ul> 
      </li> 
      <li>1.5</li> 
      <li>1.6</li> 
     </ul> 
    </li> 
    <li>2</li> 
    <li>3</li> 
</ul> 

희망을 내 예제는 모두에게 이해할 수 있습니다.

이미 사이트 맵과 탐색 경로 탐색 기능이 작동하지만이 경로는 매우 까다 롭고 경험이 많습니다.

예제를 Tree navigation with XML and XSLT에서 수정하려고했지만 제대로 작동하지 않았습니다. 항목에 대한 경로 만 표시하고 나머지는 표시하지 않습니다.

XSLT-1에 익숙한 사람이 나를 도와 줄 수 있습니까?

아니면 누군가 이미 이미 여기에 게시 할 수있는 해결책이 있습니까?

매우 친절합니다. 관심을 가져 주셔서 감사합니다.

답변

2

여기에있는 도전 과제는 새로운 목록 내에서 탐색하기위한 올바른 테스트를 찾는 것입니다. 주어진 목록 항목에 대해서는 다음과 같은 종류의 테스트 (실제로는 분명하지 않음)를 찾고 있다고 생각합니다.

이 변환기를 확인하십시오. $위한

[XSLT 1.0]

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes"/> 
    <xsl:param name="pageid" select="4"/> 

    <xsl:template match="/"> 
     <xsl:call-template name="Navigate"/> 
    </xsl:template> 

    <xsl:template name="Navigate"> 
     <ul> 
      <xsl:apply-templates select="/cat/item" mode="Navigate"/> 
     </ul> 
    </xsl:template> 

    <xsl:template match="item" mode="Navigate"> 
     <li> 
      <xsl:apply-templates select="@id[.=$pageid]" mode="Navigate"/> 
      <xsl:value-of select="@name"/> 
      <xsl:if test="item and .//@id=$pageid"> 
       <ul> 
        <xsl:apply-templates select="item" mode="Navigate"/> 
       </ul> 
      </xsl:if> 
     </li> 
    </xsl:template> 

    <xsl:template match="@id" mode="Navigate"> 
     <xsl:attribute name="class"> 
      <xsl:value-of select="'activeitem'"/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

결과 페이지 id = 4 : $위한

<ul> 
    <li>1<ul> 
     <li>1.1</li> 
     <li>1.2</li> 
     <li>1.3</li> 
     <li class="activeitem">1.4<ul> 
       <li>1.4.1</li> 
       <li>1.4.2</li> 
       <li>1.4.3</li> 
      </ul> 
     </li> 
     <li>1.5</li> 
     <li>1.6</li> 
     </ul> 
    </li> 
    <li>2</li> 
    <li>3</li> 
</ul> 

결과 페이지 id = 7 : $의 페이지 id위한

<ul> 
    <li>1<ul> 
     <li>1.1</li> 
     <li>1.2</li> 
     <li>1.3</li> 
     <li>1.4<ul> 
       <li>1.4.1<ul> 
        <li>1.4.1.1</li> 
        <li class="activeitem">1.4.1.2</li> 
        <li>1.4.1.3</li> 
        </ul> 
       </li> 
       <li>1.4.2</li> 
       <li>1.4.3</li> 
      </ul> 
     </li> 
     <li>1.5</li> 
     <li>1.6</li> 
     </ul> 
    </li> 
    <li>2</li> 
    <li>3</li> 
</ul> 

결과 = 13 :

<ul> 
    <li>1</li> 
    <li class="activeitem">2<ul> 
     <li>2.1</li> 
     <li>2.2</li> 
     </ul> 
    </li> 
    <li>3</li> 
</ul> 
+0

@Eddy 피드백을 보내 주셔서 감사합니다. 이제 오름차순/내림차순이 지원되고'xsl : call-template'에 적용됩니다. 참고 재귀를 단순화하기 위해 템플릿 모드를 사용했습니다. –

+1

@empo에게 많은 감사를드립니다! 이 중 하나가 잘 작동하고 있으며 나는 "모드"와 관련이 없습니다. 나는 알고 있어야 할 중요한 것을 배웠다. –

1

나는 항목이 하위 페이지로 선택된 페이지가 있거나 선택된 페이지 인 경우 해당 항목의 모든 하위 항목을보고 싶다는 논리가 있다고 생각합니다. 질문과 같이

4 여기를

내 시도는 ...

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="pageNum" select="13" /> 

    <xsl:template match="/cat"> 
     <ul> 
     <xsl:apply-templates /> 
     </ul> 
    </xsl:template> 

    <xsl:template match="item"> 
     <li> 
     <xsl:if test="@id=$pageNum"> 
      <xsl:attribute name="class">activeitem</xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="@name" /> 
     <xsl:choose> 
      <xsl:when test="descendant-or-self::item[@id=$pageNum] and count(node()) > 0"> 
       <ul> 
        <xsl:apply-templates /> 
       </ul> 
      </xsl:when> 
     </xsl:choose> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

7 예상 출력됩니다.13의 경우 출력은 다음과 같습니다.

<ul> 
    <li>1</li> 
    <li class="activeitem">2 
     <ul> 
      <li>2.1</li> 
      <li>2.2</li> 
     </ul> 
    </li> 
    <li>3</li> 
</ul> 
+0

나는 당신이 원하는 논리에 충실하다고 생각합니다. 나는 아마 요구 사항을 오해했습니다. +1 –

+1

그에 따라 테스트 조건이 수정되었습니다. 하나의 테스트 만 할 때'xsl : choose'를 사용하는 이유는 무엇입니까? –

+0

@empo 네, 맞습니다! 필자가 글을 쓰기 시작했을 때, 나는 자손들과 아이템 자체를 매칭하기 위해 별도의 조건이 필요하다고 생각했다. 결국 나는 테스트를 하나로 합쳤지만 xsl로 만들지 않았다. : –