XLST在web.sitemap中查找ASP.NET角色

时间:2012-09-24 05:33:42

标签: asp.net xslt menu sitemap

我正在使用使用VS.net 2010创建的web.sitemap以及一个XSLT来创建一个干净的CSS菜单。
我已经从Cyotec修改了xslt以去除第一个节点但是我到目前为止还无法解决如何在内部搜索以仅显示链接,具体取决于用户的角色。

XSLT如下:

<?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="/">
    <ul id="main-menu">
      <xsl:apply-templates select="*"/>
    </ul>
  </xsl:template>

  <xsl:template match="/*/*">
    <xsl:apply-templates select="*"/>
  </xsl:template>

  <xsl:template match="map:siteMapNode">
    <xsl:if test="/siteMap/SiteMapNode[@roles != 'Admin']">
            <li>
          <a href="{substring(@url, 2)}" title="{@description}">
            <xsl:value-of select="@title"/>
          </a>

          <xsl:if test="map:siteMapNode">
            <xsl:call-template name="mapNode"/>
          </xsl:if>

        </li>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

XML看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/" title=""  description="Anon" roles="*">
    <siteMapNode url="~/anon.aspx" title="Anon"  description="Anon" roles="*" />
    <siteMapNode url="~/admin1.aspx" title="Admin1"  description="Admin Only" roles="Admin"/>
    <siteMapNode url="~/admin2.aspx" title="Admin2"  description="Admin Only" roles="Admin">
      <siteMapNode url="~/admin3.aspx" title="Admin3"  description="Admin Only" roles="Admin"/>
    </siteMapNode>
  </siteMapNode>
</siteMap>

我只想输出urls标题和描述的位置!= Admin 没有搜索,一切正常 是否有人能够对'if'功能有所了解,或提出更好的方法来实现这一目标? 提前致谢

1 个答案:

答案 0 :(得分:2)

当前 xsl:if 条件的问题....

<xsl:if test="/siteMap/SiteMapNode[@roles != 'Admin']"> 

....第一个正斜杠意味着它是一个绝对路径,从根元素开始,所以 xsl:if 所说的是否有任何 SiteMapNode ,紧接在 siteMap 元素下,不是Admin角色。这意味着在你的情况下它总是如此。

您真的只想检查当前元素的作用

<xsl:if test="@roles != 'Admin'"> 

但是,这样做有一个更整洁的方法。删除 xsl:if 条件,只需要一个单独的模板来匹配管理角色元素,然后忽略它们。

<xsl:template match="map:siteMapNode[@roles='Admin']"/>

这是完整的XSLT

<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="/">
      <ul id="main-menu">
         <xsl:apply-templates select="*"/>
      </ul>
   </xsl:template>

   <xsl:template match="/*/*">     
      <xsl:apply-templates select="*"/>     
   </xsl:template>     

   <xsl:template match="map:siteMapNode[@roles='Admin']"/>

   <xsl:template match="map:siteMapNode">
      <li>
         <a href="{substring(@url, 2)}" title="{@description}">
            <xsl:value-of select="@title"/>
         </a>
         <xsl:if test="map:siteMapNode">
            <xsl:call-template name="mapNode"/>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>

当应用于您的示例XML时,输出以下内容

<ul id="main-menu">
   <li>
      <a href="/anon.aspx" title="Anon">Anon</a>
   </li>
</ul>

请注意,与admin角色元素匹配的模板比任何 SiteMapNode 元素匹配的模板更具体,因此XSLT处理器在匹配时将优先考虑。