2009-12-21 5 views
0

Je développe un skin pour DotNetNuke 5 en utilisant le composant de menu DNN Done Right qui utilise un XSL-T personnalisé pour convertir le sitemap XML en navigation HTML.DotNetNuke + XPath = Menu de navigation personnalisé

L'utilisation de XSL-T permet de sauver des vies par rapport aux autres façons de créer un menu de navigation. Cependant, j'ai eu des problèmes à faire quelque chose d'un peu plus complexe, étant donné que je suis un nouveau venu dans XML-T et XPath.

Ce que je suis en train de réaliser est la suivante:

  • Ignore niveau 0 nœuds
  • boucle à travers tous les niveaux 1 noeuds dans la hiérarchie sélectionnée
  • Une fois que le nœud de niveau 1 sélectionné est trouvé , commencez à boucler dans la hiérarchie/la structure du fil d'Ariane jusqu'au niveau actif.
  • Une fois au niveau du noeud actif, boucle à travers et afficher toutes les frères et sœurs de ce niveau
  • ensuite terminer une boucle à travers le niveau 1 noeuds

Ci-dessous est un bloc XML exemple d'un plan du site du composant de menu les usages.

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

Voici également mon point de départ (incorrect), juste pour exposer mon manque de connaissances XSL/XPath. (Mon code est erroné, car il répertorie tous les noeuds L1, plutôt que seulement les noeuds L1 dans la hiérarchie sélectionnée)

<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

Conseil: S'il vous plaît ne pas poster des déclarations XML ainsi que des exemples de code XML. Le codage dans la déclaration (ISO-8859-1) et le codage réel (UTF-8, comme le reste de la page Web) diffèrent. – Tomalak

+0

déclarations XML supprimées –

Répondre

0

Merci à la fois pour vos réponses. Malheureusement, votre code n'était pas tout à fait ce dont j'avais besoin (probablement en raison de la nature complexe de ce que je recherche et de mon incapacité à expliquer mes exigences) - mais grâce à votre exemple de code, j'ai une meilleure compréhension de XSL- T et créé les éléments suivants:

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

Cela fait exactement ce que je dois, en dehors de la section CELA nE FONCTIONNE PAS CORRECTEMENT qui, pour une raison quelconque, montre aussi des noeuds qui, à part les frères et sœurs ... Je suis actuellement à la recherche à cela et en espérant que c'est un petit bug dans mon code. Bien que si vous pouvez repérer le problème, s'il vous plaît faites le moi savoir!:)

Voici le rendu HTML à partir du T-XSL:

<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

devait être

1

suit suppose qu'il ne peut être un nœud sélectionné dans l'entrée:

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

sortie pour votre XML exemple:

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

Un menu imbriqué est facile à créer, mais il est vrai que je ne suis pas vraiment sûr de ce que vous voulez. Si vous publiez la sortie désirée, je peux voir.

0

Si vous pouvez poster la sortie réelle que vous attendez à le voir alors aider, mais je pense que vous voudrez peut-être quelque chose comme ceci:

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

Si cela ne vous donne pas ce que vous voulez , n'hésitez pas à poser une question sur les forums DNNDoneRight, c'est pour ça qu'ils sont là!