2011-06-02 41 views
2

我想通過使用XSL來編寫麪包屑導航來轉換XML。嘗試使用XML/XSL編寫麪包屑導航

以下是一段我使用的XML文件:

<Menu> 
<ID>22486a60-2bfe-46ba-96ee-7ea92b6ca5bb</ID> 
<PageID>00000000-0000-0000-0000-000000000000</PageID> 
<Link/> 
<Target/> 
<Title>Main Menu</Title> 
<Image/> 
<Items> 
    <Menu> 
     <ID>44595707-a331-49ae-a8ed-4bc1cef22e4f</ID> 
     <PageID>83a1df5f-2909-4c8a-9aa7-a4f2e0111d7c</PageID> 
     <Link>/home.aspx</Link> 
     <Target>_self</Target> 
     <Title>Home</Title> 
     <Image/> 
     <Items/> 
    </Menu> 
    <Menu> 
     <ID>a9fd822b-838f-4129-9628-4ce667005450</ID> 
     <PageID>88e8e3c3-39e3-40a4-9dfd-476f2082f4e0</PageID> 
     <Link>/About-Us.aspx</Link> 
     <Target>_self</Target> 
     <Title>About Us</Title> 
     <Image/> 
     <Items/> 
    </Menu> 
    <Menu> 
     <ID>3aa256eb-9f80-42b3-b637-2e22f7008adb</ID> 
     <PageID>3369b394-1aec-4a9f-bb9f-1bae7bdde858</PageID> 
     <Link>/Products.aspx</Link> 
     <Target>_self</Target> 
     <Title>Products</Title> 
     <Image/> 
     <Items> 

      <Menu> 
       <ID>b2f7efae-19d7-4177-9874-962944af9836</ID> 
       <PageID>88e8e3c3-39e3-40a4-9dfd-476f2082f4e0</PageID> 
       <Link>/Aprons.aspx</Link> 
       <Target>_self</Target> 
       <Title>Aprons</Title> 
       <Image/> 
       <Items/> 
      </Menu> 

我遇到麻煩XSL來顯示當前頁面。它顯示所有祖先,但不顯示當前頁面。這是我到目前爲止:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt"> 
    <xsl:output method="html" omit-xml-declaration="yes"/> 
    <xsl:param name="CurrentPage">a5e2418a-f42e-4c0d-9d63-515ecb6af79e</xsl:param> 

    <xsl:template match="/"> 
     <ul id="breadcrumb"> 
      <xsl:call-template name="innerNode"> 
       <!--<xsl:value-of select="ancestor-or-self::PageID = $CurrentPage"/>--> 
      </xsl:call-template> 
     </ul> 
    </xsl:template> 

    <xsl:template name="innerNode"> 
     <xsl:for-each select="Menu/Items"> 
      <xsl:if test="descendant::*/PageID = $CurrentPage"> 
       <li> 
        <xsl:choose> 
         <xsl:when test="not(PageID = $CurrentPage)"> 
          <a href="/"><xsl:value-of select="../Title"/></a> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:value-of select="Items"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </li> 
      </xsl:if> 
      <xsl:call-template name="innerNode"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

任何幫助,將不勝感激!

感謝, 傑森

+0

請修復輸入,因爲它沒有很好的形成,很難理解它的真實結構。 – 2011-06-02 18:03:44

回答

0

下面的樣式表首先選擇與正確的頁面ID的菜單項,然後顯示其所有的祖先,最後顯示的菜單項目本身。這種方法比反覆計算表達式descendant::*更有效。

請注意,如果菜單結構中不存在頁面ID,則不會輸出ul元素。如果要顯示ul元素(即使它將爲空),請更改樣式表,以便ul包裝xsl:for-each

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" omit-xml-declaration="yes"/> 
    <xsl:param name="CurrentPage">a5e2418a-f42e-4c0d-9d63-515ecb6af79e</xsl:param> 

    <xsl:template match="/"> 
     <xsl:for-each select="//Menu[PageID = $CurrentPage]"> 
      <ul id="breadcrumb"> 
       <xsl:for-each select="ancestor::Menu"> 
        <li><a href="{Link}"><xsl:value-of select="Title"/></a></li> 
       </xsl:for-each> 
       <li><xsl:value-of select="Title"/></li> 
      </ul> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝!有效。 – jasonaburton 2011-06-03 11:45:18