2009-12-21 77 views
0

我使用它使用一个定制的XSL-T的XML网站地图转换成HTML导航DNN Done Right菜单组件开发DotNetNuke的5皮肤。DotNetNuke的+的XPath =自定义导航菜单

使用XSL-T相比是建设一个导航菜单的其他方式生命的救星。然而,我遇到了一些更复杂的问题,因为我是XML-T和XPath的新手。

我想要实现的是:

  • 忽略0级节点
  • 遍历所有级别在选择的层级
  • 一旦选定级别1节点1节点被发现,开始循环层次结构/面包屑结构直到活动级别。
  • 在活动节点级别,循环通过
  • 一旦并表明水平
  • 然后玩完通过电平1节点

下面循环的所有兄弟姐妹是一个网站地图的菜单部件的示例XML块使用。

<Root> 
    <root> 
     <node id="37" text="Home" url="http://www.dnndoneright.com/Home.T37.aspx" enabled="1" selected="0" breadcrumb="0" first="1" last="0" only="0" depth="0" > 
      <description >Upgrade your standard DNN menu - automatically and for free - to an SEO-optimised, accessible, mobile-friendly, cross-browser menu.</description> 
     </node> 

     <node id="56" text="DNN Menu" url="http://www.dnndoneright.com/DNN-Menu.T56.aspx" enabled="1" selected="0" breadcrumb="1" first="0" last="0" only="0" depth="0" > 
      <node id="97" text="Menu features" url="http://www.dnndoneright.com/Menu-features.T97.aspx" enabled="1" selected="0" breadcrumb="0" first="1" last="0" only="0" depth="1" /> 
      <node id="111" text="Pre-built templates" url="http://www.dnndoneright.com/Pre-built-templates.T111.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="1" > 
       <node id="94" text="Standard DNN menu, upgraded" url="http://www.dnndoneright.com/Standard-DNN-menu-upgraded.T94.aspx" enabled="1" selected="0" breadcrumb="0" first="1" last="0" only="0" depth="2" /> 
       <node id="124" text="Superfish template" url="http://www.dnndoneright.com/Superfish-template.T124.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="106" text="Treeview template" url="http://www.dnndoneright.com/Treeview-template.T106.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="107" text="Accordion template" url="http://www.dnndoneright.com/Accordion-template.T107.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="112" text="Dropdown template" url="http://www.dnndoneright.com/Dropdown-template.T112.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="96" text="Mega-menu" url="http://www.dnndoneright.com/Mega-menu.T96.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="1" only="0" depth="2" /> 
      </node> 
      <node id="113" text="Getting started" url="http://www.dnndoneright.com/Getting-started.T113.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="1" > 
       <node id="114" text="Installing the menu" url="http://www.dnndoneright.com/Installing-the-menu.T114.aspx" enabled="1" selected="0" breadcrumb="0" first="1" last="0" only="0" depth="2" /> 
       <node id="115" text="Upgrading a SolPart menu" url="http://www.dnndoneright.com/Upgrading-a-SolPart-menu.T115.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="116" text="Upgrading a DNNMenu" url="http://www.dnndoneright.com/Upgrading-a-DNNMenu.T116.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="117" text="Installing a template" url="http://www.dnndoneright.com/Installing-a-template.T117.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="118" text="Adding to a skin" url="http://www.dnndoneright.com/Adding-to-a-skin.T118.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="1" only="0" depth="2" /> 
      </node> 
      <node id="119" text="Customising templates" url="http://www.dnndoneright.com/Customising-templates.T119.aspx" enabled="0" selected="0" breadcrumb="1" first="0" last="1" only="0" depth="1" > 
       <node id="120" text="Standard options" url="http://www.dnndoneright.com/Standard-options.T120.aspx"   enabled="1" selected="0" breadcrumb="0" first="1" last="0" only="0" depth="2" /> 
       <node id="121" text="Specifying filenames" url="http://www.dnndoneright.com/Specifying-filenames.T121.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="2" /> 
       <node id="122" text="XML format" url="http://www.dnndoneright.com/XML-format.T122.aspx"      enabled="1" selected="1" breadcrumb="1" first="0" last="0" only="0" depth="2" /> 
       <node id="123" text="Creating custom templates" url="http://www.dnndoneright.com/Creating-custom-templates.T123.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="1" only="0" depth="2" /> 
      </node> 
     </node> 

     <node id="87" text="Download" url="http://www.dnndoneright.com/Download.T87.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="0" only="0" depth="0" /> 

     <node id="85" text="Contact" url="http://www.dnndoneright.com/Contact.T85.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="1" only="0" depth="0" > 
      <node id="129" text="Blog" url="http://www.dnndoneright.com/Blog.T129.aspx" enabled="1" selected="0" breadcrumb="0" first="1" last="0" only="0" depth="1" /> 
      <node id="130" text="Forum" url="http://www.dnndoneright.com/Forum.T130.aspx" enabled="1" selected="0" breadcrumb="0" first="0" last="1" only="0" depth="1" /> 
     </node> 
    </root> 
</Root> 

另外这里是我的(不正确)的起点,只是为了暴露我缺乏XSL/XPath的知识。 (我的代码是错误的,因为它会列出所有L1节点,而不是选择的层级只是L1节点)以下假定只能有输入一个选择的节点

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" /> 

    <xsl:template match="/"> 
    <div class="SideMenu"> 
     <!-- Loop through all L1 nodes --> 
     <xsl:for-each select="Root/root/node/node"> 
     <xsl:if test="@enabled='1'" > 
      <!-- Only use L1 in the current hierarchy --> 

      <div> 
      [ <xsl:value-of select="@text"/>: <xsl:value-of select="@depth"/> ] 
      </div> 
     </xsl:if> 
     </xsl:for-each> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 
+1

提示:请不要使用XML代码样本一起发布XML声明。声明(ISO-8859-1)中的编码和实际编码(UTF-8,与网页的其余部分一样)不同。 – Tomalak 2009-12-21 13:04:45

+0

XML声明除去 – 2009-12-21 13:15:43

回答

0

谢谢你的回应。不幸的是,你的代码并不是我所需要的(很可能是由于我所经历的复杂性质以及我无法解释我的需求) - 但是由于您的示例代码,我对XSL- T和创建以下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" /> 

<xsl:template match="/"> 
    <div class="SideMenu"> 
     <!-- Loop through all L1 nodes --> 
     <xsl:for-each select="Root/root/node"> 
     <xsl:if test="@enabled='1'" > 
      <xsl:if test="@breadcrumb='1'" > 
      <!-- Find active root node--> 
      <!-- L0 nodes: Don't ever show (These are the horizontal tabs) --> 

      <!-- Always show all children: L1 nodes --> 
      <xsl:apply-templates select="child::node()[@url]" mode="BaseNode" ></xsl:apply-templates> 

      </xsl:if> 
     </xsl:if> 
     </xsl:for-each> 
    </div> 
</xsl:template> 

    <!-- Template: Base node --> 
    <xsl:template match="node" mode="BaseNode" > 

    <xsl:choose> 
     <xsl:when test="@breadcrumb='0'" > 
     <!-- Non-breadcrumb L1 node --> 
     <xsl:apply-templates select="." mode="NonShadedNode" ></xsl:apply-templates> 

     </xsl:when> 
     <xsl:when test="@breadcrumb='1'" > 
     <!-- Child which is part of hierarchy --> 
     <xsl:apply-templates select="." mode="ShadedNode" ></xsl:apply-templates> 

     <!-- Drill down through hierarchy of active nodes--> 
     <xsl:for-each select="descendant::node()[@url]"> 
      <xsl:if test="@breadcrumb='1'" > 

      <!-- Is this the last node? If so, show children --> 
      <xsl:choose> 
       <xsl:when test="child::node()[@url]"> 
        <!-- Not last node --> 
       <xsl:apply-templates select="." mode="ShadedNode" ></xsl:apply-templates> 

       </xsl:when> 
       <xsl:otherwise> 
       <!-- Last node: loop through all siblings --> 

       <!-- THIS LOOP DOESN'T WORK CORRECTLY --> 
       <xsl:for-each select="preceding-sibling::node()" > 
        <xsl:apply-templates select="." mode="ShadedNode" ></xsl:apply-templates> 
       </xsl:for-each> 

       <xsl:apply-templates select="." mode="SelectedNode" ></xsl:apply-templates> 

       <xsl:for-each select="following-sibling::node()" > 
        <xsl:apply-templates select="." mode="ShadedNode" ></xsl:apply-templates> 
       </xsl:for-each> 

       </xsl:otherwise> 
      </xsl:choose> 

      </xsl:if> 
     </xsl:for-each> 

     </xsl:when> 
    </xsl:choose> 

    </xsl:template> 

    <!-- Template: Non-shaded node --> 
    <xsl:template match="node" mode="NonShadedNode" > 
    <a> 
     <xsl:attribute name="href"> 
     <xsl:value-of select="@url"/> 
     </xsl:attribute> 
     <xsl:attribute name="style"> 
     padding-left:<xsl:value-of select="@depth * 10"/> 
     </xsl:attribute> 
     <xsl:value-of select="@text"/> 
    </a> 
    </xsl:template> 

    <!-- Template: Shaded node --> 
    <xsl:template match="node" mode="ShadedNode" > 
    <a class="SideMenu_Shaded"> 
     <xsl:attribute name="href"> 
     <xsl:value-of select="@url"/> 
     </xsl:attribute> 
     <xsl:attribute name="style"> 
     padding-left:<xsl:value-of select="@depth * 10"/> 
     </xsl:attribute> 
     <xsl:value-of select="@text"/> 
    </a> 
    </xsl:template> 

    <!-- Template: Selected node --> 
    <xsl:template match="node" mode="SelectedNode" > 
    <a class="SideMenu_Selected"> 
     <xsl:attribute name="style"> 
     padding-left:<xsl:value-of select="@depth * 10"/> 
     </xsl:attribute> 
     <xsl:value-of select="@text"/> 
    </a> 
    </xsl:template> 

</xsl:stylesheet> 

这不正是我需要的,除了这并不正常工作部分由于某种原因还显示节点其中除了兄弟姐妹......我目前正在在这个希望它是我的代码中的一个小错误。

但如果你能发现问题,请让我知道!:)

下面是来自XSL-T所提供的HTML:

<div class="SideMenu"><a href="/Home/Tester.aspx" style="&#xA;  padding-left:10">Tester </a><a class="SideMenu_Shaded" href="/Home/ChiefConstablesArea.aspx" style="&#xA;  padding-left:10">Chief Constables Area</a> 
    Chief Constables Area 
    Chief Constables Area 
    <a class="SideMenu_Shaded" href="/Home/ChiefConstablesArea/ChiefsFocusGroups.aspx" style="&#xA;  padding-left:20">Chief's Focus Groups</a> 
    <a class="SideMenu_Shaded" href="/Home/ChiefConstablesArea/AbouttheChief.aspx" style="&#xA;  padding-left:20">About the Chief</a> 
    <a class="SideMenu_Shaded" href="/Home/ChiefConstablesArea/ChiefsOfficerGroup.aspx" style="&#xA;  padding-left:20">Chief's Officer Group</a> 
    <a class="SideMenu_Selected" style="&#xA;  padding-left:20">Chief's Messages</a> 
    <a class="SideMenu_Shaded" href="/Home/ChiefConstablesArea/ForceAwardsScheme.aspx" style="&#xA;  padding-left:20">Force Awards Scheme</a> 
    <a href="/Home/ActiveForumLitetrial.aspx" style="&#xA;  padding-left:10">Active Forum Lite trial</a></div> 
+0

<的xsl:for-每个选择= “前同辈节点::()”>是需要 <的xsl:for-每个选择=“前同辈节点::()[@ url]“> – 2009-12-22 09:40:05

1

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:template match="/"> 
    <div class="SideMenu"> 
     <!-- select all the siblings of the selected node --> 
     <xsl:apply-templates select="//node[@selected=1]/../node" /> 
    </div> 
    </xsl:template> 

    <!-- nodes are turned into a <div> with some descriptive text --> 
    <xsl:template match="node"> 
    <div> 
     <xsl:value-of select="concat('[ ', @text, ': ', ' ]')" /> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 

输出为示例XML:

<div class="SideMenu"> 
    <div>[ Standard options: ]</div> 
    <div>[ Specifying filenames: ]</div> 
    <div>[ XML format: ]</div> 
    <div>[ Creating custom templates: ]</div> 
</div> 

嵌套的菜单很容易创建,但无可否认我真的不知道你想要什么。如果您发布期望的输出,我可以看到它。

0

如果你可以张贴实际的输出,你希望会看到那么它会帮助,但我想你可能想是这样的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="root"> 
    <div class="SideMenu"> 
     <!-- Loop through level 1 nodes --> 
     <xsl:apply-templates select="//node[@depth=1]" mode="general" /> 
    </div> 
    </xsl:template> 

    <xsl:template match="node" mode="general"> 
    <xsl:choose> 
     <!-- If the currently selected node, show all siblings --> 
     <xsl:when test="@selected=1"> 
     <xsl:apply-templates select="../node" mode="only" /> 
     </xsl:when> 
     <!-- Otherwise show just this node --> 
     <xsl:otherwise> 
     <xsl:apply-templates select="." mode="only" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    <!-- Follow the breadcrumb down towards the currently selected node --> 
    <xsl:apply-templates select="node[@breadcrumb=1]" mode="general" /> 
    </xsl:template> 

    <xsl:template match="node" mode="only"> 
    <div> 
     [ <xsl:value-of select="@text"/>: <xsl:value-of select="@depth"/> ] 
    </div> 
    </xsl:template> 
</xsl:stylesheet> 

如果不给你你想要什么,请随时在DNNDoneRight论坛上提出问题,这就是他们的目标!