xmlxsltweb.sitemap

Is it possible to view web.sitemap as a table?


Is it possible to use XSLT to display a nested web.sitemap into a single non-nested table?

Looking around on the web, I found some XSLT code that transforms a web.sitemap file into a nested set of unordered lists (UL). Converting that into table markup, what I get is a set of nested tables.

I know I'm "doing it wrong." Does someone know how to present this as a single table -- not nested?

For those who want to know why I am asking this and what I'm trying to do, I'm trying to fill a client request to read the sitemap but present it as a table rather than as an asp.navigation control (which is my default action). If there is a better way to do this, I'm open to ideas. This was my best theory based on what I have been able to find by web search.

Thank you for any ideas.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:map="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" exclude-result
    prefixes="map">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<xsl:template name="mapNode" match="map:siteMap">
    <table>
        <xsl:apply-templates/>
    </table>
</xsl:template>

<xsl:template match="map:siteMapNode">
<tr>
    <td style="border:thin solid red;">
        <a>
            <xsl:attribute name="href">
                <xsl:value-of select="@url"/>
            </xsl:attribute>
            <xsl:value-of select="@title"/>
        </a>

        <xsl:if test="map:siteMapNode">
            <xsl:call-template name="mapNode"/>
        </xsl:if>
    </td>
    <td style="border:thin solid red;">
        <xsl:value-of select="@description"/>
    </td>
</tr>
</xsl:template>
</xsl:stylesheet>

Solution

  • I'm mostly guessing here, but I think you want something like:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:map="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" 
    exclude-result-prefixes="map">
    <xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
    
    <xsl:template match="/map:siteMap">
        <table>
            <xsl:apply-templates select="map:siteMapNode"/>
        </table>
    </xsl:template>
    
    <xsl:template match="map:siteMapNode">
        <tr>
            <td>
                <a href="{@url}"><xsl:value-of select="@title"/></a>
            </td>
            <td>
                <xsl:value-of select="@description"/>
            </td>
        </tr>
        <xsl:apply-templates select="map:siteMapNode"/>
    </xsl:template>
    
    </xsl:stylesheet>
    

    Applied to the following example input:

    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
      <siteMapNode title="Home" description="Home" url="~/default.aspx">
        <siteMapNode title="Products" description="Our products" url="~/Products.aspx">
          <siteMapNode title="Hardware" description="Hardware choices" url="~/Hardware.aspx"/>
          <siteMapNode title="Software" description="Software choices" url="~/Software.aspx"/>
        </siteMapNode>
        <siteMapNode title="Services" description="Services we offer" url="~/Services.aspx">
          <siteMapNode title="Training" description="Training classes" url="~/Training.aspx"/>
          <siteMapNode title="Consulting" description="Consulting services" url="~/Consulting.aspx"/>
          <siteMapNode title="Support" description="Supports plans" url="~/Support.aspx"/>
        </siteMapNode>
      </siteMapNode>
    </siteMap>
    

    produces the result:

    <table>
       <tr>
          <td>
             <a href="~/default.aspx">Home</a>
          </td>
          <td>Home</td>
       </tr>
       <tr>
          <td>
             <a href="~/Products.aspx">Products</a>
          </td>
          <td>Our products</td>
       </tr>
       <tr>
          <td>
             <a href="~/Hardware.aspx">Hardware</a>
          </td>
          <td>Hardware choices</td>
       </tr>
       <tr>
          <td>
             <a href="~/Software.aspx">Software</a>
          </td>
          <td>Software choices</td>
       </tr>
       <tr>
          <td>
             <a href="~/Services.aspx">Services</a>
          </td>
          <td>Services we offer</td>
       </tr>
       <tr>
          <td>
             <a href="~/Training.aspx">Training</a>
          </td>
          <td>Training classes</td>
       </tr>
       <tr>
          <td>
             <a href="~/Consulting.aspx">Consulting</a>
          </td>
          <td>Consulting services</td>
       </tr>
       <tr>
          <td>
             <a href="~/Support.aspx">Support</a>
          </td>
          <td>Supports plans</td>
       </tr>
    </table>
    

    rendered as:

    enter image description here