2009-10-13 6 views
0

여기가 내 문제입니다. 나는이 같은 조직 된 "메뉴"가 있습니다XSLT 조건부 노드 선택

<menutree> 
    <menuitem name="Foo"> 
    <menuitem name="Sub-Foo"> 
     <menuitem name="Sub-sub-foo1"/> 
     <menuitem name="Sub-sub-foo2"/> 
     <menuitem name="Sub-sub-foo3"/> 
    </menuitem> 
    <menuitem name="Other-Sub-Foo"> 
     <menuitem name="Other-Sub-sub-foo1"/> 
     <menuitem name="Other-Sub-sub-foo2"/> 
     <menuitem name="Other-Sub-sub-foo3"/> 
    </menuitem> 
    </menuitem> 
    <menuitem name="Bar"> 
    <menuitem name="Sub-Bar"> 
     <menuitem name="Sub-sub-Bar1"/> 
     <menuitem name="Sub-sub-Bar2"/> 
     <menuitem name="Sub-sub-Bar3"/> 
    </menuitem> 
    </menuitem> 
</menutree> 

을 그리고 난 당신이 하위 하위 foo1은 페이지에있어 가정, 다음과 같은 결과를 찾고 있어요. 이것은 현재 브랜치에 대한 하위 페이지를 보여주고 싶기 때문에 Sub-Foo 페이지에있는 경우 필자가 찾고자하는 결과이기도합니다. 기타 하위 하위에는 기타 하위 하위 하위 페이지가 표시됩니다.

    • 서브 푸
      • 하위 서브 foo1은
      • 하위 서브에서는 foo2
      • 하위 서브 foo3
    • 다른 서브 - 푸

아이디어는 메뉴가 현재 컨텍스트에 따라 빌드된다는 것입니다. 각 페이지는 트리에서 "메뉴"속성으로 참조되며, XML에 포함 된 모든 "페이지"에서 메뉴 트리를 구문 분석하여 현재 컨텍스트를 기반으로 올바른 메뉴를 작성합니다.

답변

1

당신은 이런 식으로 뭔가를 찾고 계십니까 :

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="currentPage">Sub-sub-foo1</xsl:param> 
    <xsl:template match="/"> 
    Current page: <xsl:value-of select="$currentPage" /><br /> 
    <ul> 
     <xsl:choose> 
     <xsl:when test="//menuitem[@name=$currentPage]"> 
      <xsl:apply-templates select="//menuitem[@name=$currentPage]/.." /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:apply-templates /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </ul> 
    </xsl:template> 

    <xsl:template match="menuitem"> 
    <li> 
     <xsl:choose> 
     <xsl:when test="@name=$currentPage"> 
      <b><xsl:value-of select="@name" /></b> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@name" /> 
     </xsl:otherwise> 
     </xsl:choose> 

     <xsl:if test="menuitem"> 
     <ul> 
      <xsl:apply-templates /> 
     </ul> 
     </xsl:if> 
    </li> 
    </xsl:template> 

</xsl:stylesheet> 
+0

내부 UL은 리튬 안에 있어야한다; closing li는 닫는 xsl : if 태그 다음에 놓여 야합니다. –

+0

@jeff : ty, 고정 –

+0

오. 변수를 menuitem 템플릿으로 옮기는 데 문제가 있습니다. –