1

VS.net 2010 と XSLT を使用して作成された web.sitemap を使用して、きれいな 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>

roles != Admin すべてが検索なしで正常に機能する URL のタイトルと説明のみを出力したいと考えています。
「if」関数に光を当てたり、これを達成するためのより良い方法を提案したりできる人はいますか?
前もって感謝します

4

1 に答える 1

2

現在のxsl:if条件の問題....

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

....最初のスラッシュは、ルート要素から始まる絶対パスであることを意味するため、すべてのxsl:ifが言っているのは、 siteMap要素のすぐ下に、管理者ロールではないSiteMapNodeがあるかどうかです。 . これは、あなたのケースでは常に真であることを意味します。

あなたは本当に現在の要素の役割を確認したいだけです

<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 role 要素に一致するテンプレートは、任意のSiteMapNode要素に一致するテンプレートよりも具体的であるため、XSLT プロセッサは一致時にこれを優先することに注意してください。

于 2012-09-24T06:33:37.097 に答える