カテゴリーアーカイブ: SharePoint 開発

ItemStyle.xsl に重大な変更に注意してください。

私は右の昼食の時間について、コンテンツのクエリ Web パーツの外観をカスタマイズする ItemStyle.xsl で働いていた, Xsl を変更速報を作られました。. それを実現しなかった, これは遠大なサイト コレクション全体で影響していたが、. 私は昼食と帰国を離れてを行った, 場所の束で表示されるこのメッセージに気づいた:

この Web パーツを表示できません。. 問題のトラブルシューティング, Microsoft Office SharePoint Designer などの Windows SharePoint Services と互換性のある HTML エディタでこの Web ページを開く. 問題が解決しない場合, Web サーバーの管理者にお問い合わせください。.

クライアントを非難 (それがこの時点で私のせいだったことを知らず、まだ) 最終的に気づいたその visual studio intellisense 私の警告だった私が不正な形式の XSL を持っていたことが、. それを修正、すべては仕事を始めた.

とびきり ItemStyle.xsl で作業するときに注意します。 (グローバルの XSL ファイルのいずれか) — それらを破壊多くの成果物のサイト コレクションに影響を与える.

<終了/>

コンテンツ クエリ Web パーツの結果をグリッドに表示します。 / テーブル

概要と目標

ボックスのうち, MOSS’ コンテンツのクエリ Web パーツ (CQWP) その結果、一覧形式で表示します。, 検索結果に同じような. また、グリッド形式で結果を表示することが可能です。 (すなわち. HTML テーブルの形式). グリッドのフォーマットはいくつかの状況で優れています。. この記事でその効果を達成するために方法を記述します。.

ビジネス シナリオ

私はモスをエンタープライズ全体に展開のクライアントで働いています。. プロジェクト階層内の最初のクラスの市民は、独自の最上位レベルのサイトを持っている、我々 は彼らの分類を設計しています。. プロジェクト マネージャーは、プロジェクトのサマリー情報の単一リストを維持します。, タイトルなど, 予算, 予想される完了日, 残りの予算と他の集計タイプのフィールド. 「シングルトンで" 私は必ず 1 つだけ項目が含まれ、SharePoint のカスタム リストを意味します。. 簡単に言えば, それはこのように見える:

イメージ

技術的なアプローチは多くの説明と同じ ここで (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP は、XSL 変換を使用してレンダリングするブラウザーの HTML を出力するには.

私は常に XSL は悪夢のようなので、XSL に飛び込む前に結果を思い描く. ここでは私の目的の結果:

イメージ

このような HTML は、その結果を生成します。:

<html>
 <>
 <センター>
 <テーブル 境界線= 1>

<!-- ラベル->
 <tr bgcolor青 =>
 <td><フォント = ホワイト><b>プロジェクト名</b></フォント></td>
 <td 位置合わせ= 右><フォント = ホワイト><b>完全な日付</b></フォント></td>
 <td 位置合わせ= 右><フォント = ホワイト><b>予算</b></フォント></td>
 <td 位置合わせ= 右><フォント = ホワイト><b>実際の経費</b></フォント></td>
 <td><フォント = ホワイト><b>全体的な状態</b></フォント></td>
 </tr>

<tr>
 <td>再コンピューター室.</td>
 <td 位置合わせ= 右>02/01/08</td>
 <td 位置合わせ= 右>22,500.00</td>
 <td 位置合わせ= 右>19,000.00</td>
 <td>進行中</td>
 </tr>

<tr>
 <td>SQL アップグレードのサーバをプロビジョニング</td>
 <td 位置合わせ= 右>04/01/08</td>
 <td 位置合わせ= 右>7,500.00</td>
 <td 位置合わせ= 右>0.00</td>
 <td>計画</td>
 </tr>

</テーブル>
 </センター>
 </>
</html>

アプローチ

グリッドを作成する手順します。:

  1. グリッドの各コンポーネントを識別します。 (行/列).
  2. 定義し、必要なサイト内の列を作成します。.
  3. サブ プロジェクトを単一のリストのサイトを作成します。.
  4. Web ページに、CQWP を追加し、あなたのリストを検索するように構成.
  5. 追加の列を収集するために、CQWP の XML を変更します。.
  6. テーブルを生成する XSL を変更します。.

数は 6 に集中するつもり. 番号 1 から 4 は、まっすぐ進むと CQWP ユーザーが既に行われている何か. 5 番は MSDN からこの徹底的なスクリーン ショット満載記事を含む他の人が十分に文書化されています。 ここで (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) ヘザー ソロモンのブログ ここで (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

ナットとボルト

開始し、ステップ 1 から 5 は、MSDN のドキュメントとヘザー ソロモンの記事に従って.

この時点で, ページに、CQWP を追加したし、するが、 <CommonViewFields> 必要に応じて構成.

通常の手順に従って, これらの中間結果を得る:

1. コンテンツ タイプを作成します。, そのコンテンツ タイプの 2 つのサイト テンプレートのカスタム リスト. ここでは、コンテンツのタイプ:

イメージ

ここでは、サイトの構造:

イメージ

2. 私のプロジェクトのサブサイトとシングルトン プロジェクト サマリー リストを作成した後、CQWP を追加します。:

イメージ

3. 経由するすべての追加情報を追加します <CommonViewFields>:

        <プロパティ 名前="CommonViewFields" タイプ="文字列">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</プロパティ>

1 つの行またはそれのすべてのプロパティ フィールドを維持しなければならなかったことに注意が働かないでしょう (CQWP は、クエリ結果項目をないこと私に言うだろう).

4. この時点で, MSDN の記事「を超えて移動する準備整いましたとヘザー ソロモンの記事を上にフリップ. 彼女の手順をステップ付近から #5 作成をカスタマイズする / ItemStyle.xsl の実体化バージョン. ヘザーを忠告します。, ステップ アップ 11 これらの中間結果を得る:

4.1: 私 XSL テンプレートの名前をとおり:

<xsl:テンプレート名 ="グリッド" 一致"の行を =[@Style =「グリッド」]" モード =「itemstyle」>

私も若干示唆彼女を変更します。 <xsl:それぞれ …> 追加することによって、 <br/> クリーナーのリストを提供するタグ:

    <xsl:それぞれ 選択="@*">
      P:<xsl:値の 選択="名前()" /><br/>
    </xsl:それぞれ>

4.2: Web パーツを変更します。, 外観に移動し、私の"グリッドを選択します" スタイル:

イメージ

変更を適用して、ここでは、結果:

イメージ

我々 のフィールドを上から見ることができます。 (プロジェクト名, 経費, ステータス, など) 我々 は、HTML を出力するときに使用するの. それだけでなく, XSL のこれらの列を参照する必要がありますに使用する名前がわかりますが、. たとえば, "Project_x005F_x0020_Name"としてプロジェクトの進捗状況を参照します。.

この時点で, ヘザーのブログから、これらの巨人の肩から出発します。, 自分自身の小さなビットを追加します。.

ContentQueryMain.xsl

メモ: ItemStyle.xsl だけでなく ContentQueryMain.xsl に変更を加えるとき, 変更の効果を確認する前にそれらのファイルを再度チェックインする必要があります。.

グリッド作る目的のため, モスは、CQWP から見る結果を生成する 2 つの XSL ファイルを使用します。. 出力の前のビットを生成するには, ItemStyle.xsl を修正しました. モスは実際に別の XSL ファイルを使用します。, その HTML を生成する ItemStyle.xsl と共にに ContentQueryMain.xsl. その名の通り, ContentQueryMain.xsl は、"メインです。" XSL 変換の全体的な流れを制御します。. 見つかったすべての項目を反復処理し、ItemStyle.xsl 1 つずつテンプレートに渡します. ItemStyle.xsl オープンを生成するを変更します <テーブル> 最初の行のデータおよび閉鎖の出力前にタグ <テーブル> 最後の行を出力後のタグ. これを達成するために, ContentQueryMain.xsl が変更され、"グリッドに 2 つのパラメーターを渡す" ItemStyle.xsl でテンプレート, "最後の行" 「現在の行」. ItemStyle.xsl はこれらを使用して、条件付きで必要なタグを生成するには.

ヘザー ソロモンのテクニックを使用してください。, 我々 は ContentQueryMain.xsl を探します. ItemStyle.xsl と同じ場所にあります。. このスクリーン ショットを助ける必要があります。:

イメージ

次の変更を加える必要があります。:

  • Xsl テンプレートを変更します。, "CallItemTemplate" 実際に ItemStyle.xsl でグリッド テンプレートを呼び出す. それはカバーの開閉を条件付きで生成する必要があるデータがあるのでグリッド テンプレートに 2 つのパラメーターを渡します <テーブル> タグ.
  • "CallItemTemplate を呼び出す ContentQueryMain.xsl の別のビットを変更します。" それを渡す"LastRow" パラメーターを LastRow 私たちグリッド テンプレートに渡される可能性がありますので.

"OuterTemplate.CallItemTemplate という名前のテンプレートを見つける" 文字列で識別されます。:

  <xsl:テンプレート 名前="OuterTemplate.CallItemTemplate">

次のように全体のテンプレートを置き換える:

  <xsl:テンプレート 名前="OuterTemplate.CallItemTemplate">
    <xsl:param 名前="CurPosition" />

    <!--
      LastRow」を追加します。" パラメーター.
      我々 だけがあるとき使用で項目スタイル パス「グリッド」.
    -->
    <xsl:param 名前="LastRow" />

    <xsl:選択してください。>
      <xsl:とき テスト="@Style = 'NewsRollUpItem'">
        <xsl:テンプレートを適用 選択="." モード="itemstyle">
          <xsl:param と 名前="EditMode" 選択="$cbq_iseditmode" />
        </xsl:テンプレートを適用>
      </xsl:とき>
      <xsl:とき テスト="@Style = 'NewsBigItem'">
        <xsl:テンプレートを適用 選択="." モード="itemstyle">
          <xsl:param と 名前="CurPos" 選択="$CurPosition" />
        </xsl:テンプレートを適用>
      </xsl:とき>
      <xsl:とき テスト="@Style = 'NewsCategoryItem'">
        <xsl:テンプレートを適用 選択="." モード="itemstyle">
          <xsl:param と 名前="CurPos" 選択="$CurPosition" />
        </xsl:テンプレートを適用>
      </xsl:とき>

      <!--
              現在の位置と lastrow グリッド itemstyle.xsl テンプレートに渡す.
              ItemStyle.xsl が使用オープンを放出して終了 <テーブル> タグ.
      -->
      <xsl:とき テスト="@Style = 'グリッド'">
        <xsl:テンプレートを適用 選択="." モード="itemstyle">
          <xsl:param と 名前="CurPos" 選択="$CurPosition" />
          <xsl:param と 名前="最後" 選択="$LastRow" />
        </xsl:テンプレートを適用>
      </xsl:とき>

      <xsl:それ以外の場合>
        <xsl:テンプレートを適用 選択="." モード="itemstyle">
        </xsl:テンプレートを適用>
      </xsl:それ以外の場合>
    </xsl:選択してください。>
  </xsl:テンプレート>

コメント、変更の目的を説明します。.

もちろんです, "OuterTemplate.CallItemTemplate" 自体は別のテンプレートから呼び出される. このテキスト文字列を検索してそのテンプレートを特定します。:

<xsl:テンプレート 名前="OuterTemplate.Body">

OuterTemplate.Body の指示をスクロールし、LastRow パラメーターを次のように挿入 (斜体のコメントとして表示されます。):

<xsl:呼び出しテンプレート 名前="OuterTemplate.CallItemTemplate">
  <xsl:param と 名前="CurPosition" 選択="$CurPosition" />
  <!-- LastRow パラメーターを挿入します。. -->
  <xsl:param と 名前="LastRow" 選択="$LastRow"/>
</xsl:呼び出しテンプレート>

これすべての後, 我々 は最終的に私たち ItemStyle.xsl を出すことができるように正しくセットアップされてものを持っています。 <テーブル> 適切な場所にタグ.

ItemStyle.Xsl

メモ: もう一度, これらの変更の効果を確認するように変更を行った後 ItemStyle.xsl でチェックします。.

ここに 2 つのタスクがあります。:

  • グリッド テンプレート全体を置き換える. コピー/ペーストを下からすることができます。.
  • "Formatcurrency できるようにするテンプレート定義の外部のいくつかのちんぷんかんぷんの追加します。" テンプレートを使用. (XSL に関する微妙なハンドルを持って私はことを伝えることができます。).

最初, ItemStyle.xsl の上部にあります。, この行を追加します:

  <!-- 米国を表示させることができますいくつかマンボ ジャンボ. 通貨. -->
  <xsl:10 進形式 名前="スタッフ" ="D" />

  <xsl:テンプレート 名前="既定" 一致="*" モード="itemstyle">

私は追加直接前に注意してください、 <xsl:テンプレート名 ="デフォルト" …> 定義.

次, グリッド テンプレートに戻る. グリッド テンプレート全体を以下のコードに置き換えます. それは徹底的にコメントします。, 私にメールや質問がありましたら、私のブログにコメントを残すことを躊躇しないが、.

  <xsl:テンプレート 名前="グリッド" 一致="行[@Style = 'グリッド']" モード="itemstyle">

    <!--
      ContentMain.xsl は、CurPos と最後に渡します.
      我々 は条件付きでオープンを出力するこれらを使用しての開閉 <テーブル> タグ.
    -->
    <xsl:param 名前="CurPos" />
    <xsl:param 名前="最後" />

    <!-- 次の変数が標準 ItemStyle.xsl から変更されていません -->
    <xsl:変数 名前="SafeImageUrl">
      <xsl:呼び出しテンプレート 名前="OuterTemplate.GetSafeStaticUrl">
        <xsl:param と 名前="UrlColumnName" 選択="「ImageUrl」"/>
      </xsl:呼び出しテンプレート>
    </xsl:変数>
    <xsl:変数 名前="SafeLinkUrl">
      <xsl:呼び出しテンプレート 名前="OuterTemplate.GetSafeLink">
        <xsl:param と 名前="UrlColumnName" 選択="「LinkUrl」"/>
      </xsl:呼び出しテンプレート>
    </xsl:変数>
    <xsl:変数 名前="DisplayTitle">
      <xsl:呼び出しテンプレート 名前="OuterTemplate.GetTitle">
        <xsl:param と 名前="タイトル" 選択="@Title"/>
        <xsl:param と 名前="UrlColumnName" 選択="「LinkUrl」"/>
      </xsl:呼び出しテンプレート>
    </xsl:変数>
    <xsl:変数 名前="LinkTarget">
      <xsl:場合 テスト="@OpenInNewWindow = 'true'" >_blank</xsl:場合>
    </xsl:変数>

    <!--
      ここで我々 は、変数を定義します。, "tableStart".  これは列ラベルと同様に、テーブルの開口部を定義するために使用する HTML を含む.  その場合 CurPos = 1, CDATA タグで HTML が含まれています.
      それ以外の場合, それは空になります.

      ItemStyle は ContentQueryMain.xsl で呼び出されるたびに、tableStart の値はエミッタ.
    -->
    <xsl:変数 名前="tableStart">
      <xsl:場合 テスト="$CurPos = 1">
        <![CDATA[
        <表の罫線 = 1>
          <tr bgcolor ="blue">
            <td><フォントの色「白」を =><b>プロジェクト名</b></フォント></td>
            <td 整列 =「右」><フォントの色「白」を =><b>完全な日付</b></フォント></td>
            <td 整列 =「右」><フォントの色「白」を =><b>予算</b></フォント></td>
            <td 整列 =「右」><フォントの色「白」を =><b>実際の経費</b></フォント></td>
            <td><フォントの色「白」を =><b>全体的な状態</b></フォント></td>
          </tr>
        ]]>
      </xsl:場合>
    </xsl:変数>

    <!--
      別の変数, tableEnd は単に終了を定義タグを表.

      TableStart と同様に, それは常にエミッタ.  だからこそ、その値が割り当てられているかどうか我々 は ContentQueryMain.xsl で最後の行を渡されてきたに基づいて条件付きで.
    -->
    <xsl:変数 名前="tableEnd">
      <xsl:場合 テスト="$CurPos = $Last">
        <![CDATA[ </テーブル> ]]>
      </xsl:場合>
    </xsl:変数>

    <!--
      常に tableStart の内容を出力します。.  これは ContentQueryMain.xsl によって私達に渡された最初の行ではない場合, 我々 はその値が空白になります知っているし、.

      出力エスケープを無効にするとき tableStart ない空白, ブラウザーでレンダリングしたい実際の HTML が含まれています.  我々 は教えていない場合 XSL パーサーを無効にする出力エスケープ, ようなものが生成されます"&lt;テーブル&gt;" 」の代わりに<テーブル>".
    -->
    <xsl:値の 選択="$tableStart" 無効にする出力エスケープ="はい"/>


    <tr>
      <!--
      P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status
      -->
      <td>
        <xsl:値の 選択="@Project_x005F_x0020_Name"/>
      </td>

      <td 位置合わせ="">
        <xsl:値の 選択="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </td>

      <td 位置合わせ="">
        <xsl:呼び出しテンプレート 名前="formatcurrency">
          <xsl:param と 名前="" 
選択="@Project_x005F_x0020_Budget"></xsl:param と> </xsl:呼び出しテンプレート> </td> <td 位置合わせ=""> <xsl:呼び出しテンプレート 名前="formatcurrency"> <xsl:param と 名前="" 選択="@Project_x005F_x0020_Expenses">
</xsl:param と> </xsl:呼び出しテンプレート> </td> <td> <xsl:値の 選択="@Project_x005F_x0020_Status"/> </td> <!-- 以下のすべて、物事を明確にコメント アウト. ただし, それを戻すとかに、 <td> その効果を確認するには. --> <!-- <div id ="linkitem" クラス =「アイテム」> <xsl:場合テスト ="文字列の長さ($SafeImageUrl) != 0"> <div クラス =「画像エリア左」> <href ="{$SafeLinkUrl}" ターゲット ="{$LinkTarget}"> <img クラス ="画像-固定幅" src ="{$SafeImageUrl}"
alt ="{@ImageUrlAltText}"/> </は> </div> </xsl:場合> <div クラス「リンク項目」を => <xsl:呼び出しテンプレート
name="OuterTemplate.CallPresenceStatusIconTemplate"/> <href ="{$SafeLinkUrl}"
ターゲット ="{$LinkTarget}" タイトル ="{@LinkToolTip}"> <xsl:値の選択"$DisxslyTitle"=/> </は> <div クラス =「説明」> <xsl:値の select="@Description" /> </div> </div> </div>
--> </tr> <!-- 終了を出力テーブルのタグ. 我々 は最後の行をしている場合, これは空白になります. --> <xsl:値の 選択="$tableEnd" 無効にする出力エスケープ="はい"/> </xsl:テンプレート> <xsl:テンプレート 名前="formatcurrency"> <xsl:param 名前="" 選択="0" /> <xsl:値の 選択='番号の書式設定($値, "$DDD,DDD,DDD。HD ®, 「スタッフ」)' /> </xsl:テンプレート>

標準の WSS ・苔データ入力画面はカスケード ドロップダウンをサポートしていません (または他の内-通信から)

更新プログラム (04/2008): この素晴らしいブログのエントリこの問題への良い javascript をベースのアプローチを示しています。: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

アップデート 2: (04/2008): このブログのエントリにも有望します。: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

週に数回, 毎日ではない場合, フォーラムのユーザーは、カスケード ドロップダウンを介して通常満たされるだろう要件を記述します。. たとえば, 私は 2 つのドロップダウン コントロールがあります。:

  • 米国の一覧. 状態
  • 米国の一覧. 都市.

責任の UI プロバイダーとして, このような動作がいい:

  • ポール、米国を選択します. ドロップダウン リストから状態.
  • これにより、都市ドロップダウン選択状態に属する都市のみをフィルター処理するには.
  • ポールはこのフィルターされたリストから都市を選択します。.

この機能のボックスのサポートはありません。. 実際, 直接内部形式の通信のあらゆる種類の OOB サポートされていません. これは、プログラムを使用してフォーム上のフィールドの変化に対応した非表示/有効化/無効化フィールドがあります。.

可能な解決策とこれらについて説明するこの記事の本当の目的は、オプションとしてそれらを知っています。:

  1. カスタム列型を開発します。. 開発者はカスタム列, あなたは"世界中のフルコントロールを持っています。" カスタム列の. できますを実装するカスケード ドロップダウン方法.
  2. ワークフローの使用を検討します。. いくつかのケースで, 自動的に別のフィールドの値に基づいてフィールドに値を代入します。. このケースでは, 計算列を使用するよう通常試みるでしょう, しかし、いくつかの回, それは仕事を得ることはありません。. SharePoint Designer ワークフローはコードと visual studio に落としに比較的管理に優しい代替です。. このルートを行く場合, によって対処する問題の注意してください。 この記事 (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. イベント ハンドラー: ワークフローのような, これは、事実の後のソリューション. イベント ハンドラーは、.NET アセンブリ ((C#), VB.NET) どの SharePoint コントロールを渡します. 開発するオブジェクトがリストのデータへのアクセス (全体のオブジェクト モデル) 必要な計算を行うことができます。.
  4. SharePoint デザイナーを使用して、カスタムの入力フォームを作成. このアプローチに関する直接の経験を持っていません。, しかし、私は彼らがNewForm.aspxこれらの日に良いことをやっている聞きます🙂
  5. ASP.NET データ エントリ関数は、独自のロールします。 (スタンドアロンの web ページと web パーツ) 代わりに使用します.

誰も他のまたはより良いオプションを知っている場合, くださいコメントを投稿して、この記事のボディを更新します.

<終了/>

Technorati のタグ:

SharePoint のバー グラフを作成します。

概要:

(更新プログラム 12/04/07: これに対処する、非常に興味深い web パーツで別のブログへのリンク、最後にもう一つの興味深いリソースを追加)

このブログのエントリは、SharePoint のバー グラフを作成する方法を説明します. それはデータ ビュー web パーツに依存するだけ、これは WSS および MOSS 環境で動作します。.

全体的なアプローチは以下のとおりです。:

  1. グラフにデータが含まれるリストまたはドキュメント ライブラリを作成します。.
  2. 関連付けられているドキュメント ライブラリの場所 / カスタム ページに一覧表示し、データ ビュー web パーツに変換 (DVWP).
  3. グラフとして表示する HTML を生成する dvwp での XSL を変更します。.

ビジネス シナリオ / セットアップ:

標準のタイトル列を持つカスタム リストと 1 つの追加列を作りました, 「ステータス」. これは、モデルは、 (非常に単純化) 「経費の承認" シナリオがタイトルを表すプロジェクトおよびステータス値のリストから:

  • 提案
  • プロセス内
  • ストール

目的は、これらのステータス コードを示すインタラクティブな水平バー グラフを生成するために.

リストを格納した、このように見えます:

イメージ

データ ビュー Web パーツを作成します。:

ページにカスタム リストを追加することによって dvwp で作成します。 (私の場合のサイトのページ) 指示に従います ここで (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Dvwp で単に作成に加えて, すべての利用可能な行を表示するページング プロパティを設定することも. 私, これは次のよう:

イメージ

この時点で, 私は常に SPD とは、ブラウザーを閉じる. 私は、再度、ブラウザーを使用してページを開きます. これは、誤ってページの web パーツのレイアウトをいじくる回避できます。.

XSLT を変更します。:

今こそ、XSLT を変更するには.

私は常にこの visual studio を使用してください。. (参照してください。 ここで たくさん役立つ intellisense に関する注意について).

空のプロジェクトを作成する 4 つの新しいファイルを追加 (単語"オリジナルを置き換える" "New" 適切な):

  • Original.xslt
  • New.xslt
  • オリジナル Params.xml
  • 新しい Params.xml

私の場合, それはこのように見える:

イメージ

Web パーツを変更および params と XSL"オリジナルをコピー" Visual Studio でのバージョン.

ここでの目的は HTML がグラフとして表示するに dvwp でクエリから返される結果を変換する XSL が発生するには.

この目的のため, 最初、HTML がどのように私たちは"XSL"として知られている狂気混乱して取得する前に考慮すること. (明確にするには, 以下は簡単な例です。; don't をそれを入力または visual studio にコピー/ペースト. 書き込みの後半を開始点、完全な打撃を提供します。). 次のサンプル グラフが直後 HTML としてレンダリングされます。:

サンプル棒グラフ

対応する HTML:

<html>
<体>
<センター>
<テーブル幅 = 80%>
<tr><td><センター>水平棒グラフ</td></tr>
<tr>
<td 整列 =「センター」>
<表の罫線 ="1" 幅 = 80%>
<tr>
<td の幅 = 10%>オープン</td>
<td><テーブルの cellpadding ="0" cellspacing ="0" 国境 = 0 幅 = 50%><tr bgcolor = 赤><td>&nbsp;</td></tr></テーブル></td>
</tr>
<tr>
<td の幅 = 10%>閉じる</td>
<td><テーブルの cellpadding ="0" cellspacing ="0" 境界線幅 0 = = 25 %><tr bgcolor = 赤><td>&nbsp;</td></tr></テーブル></td>
</tr>
<tr>
<td の幅 = 10%>ストール</td>
<td><テーブルの cellpadding ="0" cellspacing ="0" 境界線幅 0 = = 25 %><tr bgcolor = 赤><td>&nbsp;</td></tr></テーブル></td>
</tr>
</テーブル>
</td>
</tr>
</テーブル>
</体>
</html>

「赤」に行の背景色を設定することによって私のバーを作成する死んでシンプルなアプローチを使用されます。.

これは持ち帰りはこちら: 最後に, 我々 がやっているすべては行と列で HTML を作成します。.

XSLT テンプレート:

水平バー グラフを生成する XSLT をコピーしました。. それはかなりよく、私はこれらのノートを除いてここに追加されませんように、コメント:

  • 既定の XSL が SharePoint Designer くれた dvwp で初めて作成したときに開始.
  • SPD からこれを削減することができた 657 行 166 ライン.
  • 私は didn't をいじくり回パラメーター XML ファイル (XSL とは別であり dvwp で自体を変更するのに行くとき何を意味知っているよ; 変更することができます 2 つのファイルがあります。). ただし, それを簡素化するために, XSL からほぼすべての人を削除しました。. これを作りたい場合は、これらのパラメーターの使用, 変数定義を XSL に追加するだけ. Visual studio プロジェクトに元の XSL 変数定義があるので、それは簡単にできる.
  • コピーして、visual studio プロジェクトに直接これを貼り付けることができるべき. [, 私の呼び出しを削除して、独自の呼び出し「ゲイビレッジ」を挿入します。.
  • 作成することによって作品をドリルダウンします。 <href> このように: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. この手法は、他のコンテキストで値のかもしれない. 最初に, 複雑な形式に準拠する必要があります私はだと思った: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, 私の環境でその必要はありませんが、. リストの URL は、SharePoint によって私たちに渡されますので、これは一般化するは非常に簡単.

ここでは:

<xsl:スタイル シート バージョン="1.0" 除外結果接頭辞="rs z o s ddwrt dt msxsl 専用" 
xmlns:msxsl 専用="urn:スキーマ-マイクロソフト-com:xslt" xmlns:xsl="http://www.w3.org//1999年/XSL 変換"
xmlns:SharePoint="命令" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:o="urn:スキーマ-マイクロソフト-com:オフィス" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11 d 1 A29F-00AA00C14882" xmlns:rs="urn:スキーマ-マイクロソフト-com:行セット" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urn:frontpage:内部"
> <xsl:出力 メソッド="html" インデント="いいえ" /> <xsl:10 進形式 ナン="" /> <xsl:param 名前="ListUrlDir"></xsl:param> <!-- ドリル ダウンをサポートするために必要. --> <xsl:テンプレート 一致="/" xmlns:SharePoint="命令"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
> <xsl:変数 名前="dvt_StyleName">テーブル</xsl:変数> <xsl:変数 名前="" 選択="/dsQueryResponse/行/行" /> <xsl:変数 名前="dvt_RowCount" 選択="カウント($行)" /> <xsl:変数 名前="IsEmpty" 選択="$dvt_RowCount = 0" /> <xsl:変数 名前="dvt_IsEmpty" 選択="$dvt_RowCount = 0" /> <xsl:選択してください。> <xsl:とき テスト="$dvt_IsEmpty"> グラフにデータがないです。!<br/> </xsl:とき> <xsl:それ以外の場合> <!-- 面白いものはここから始まります. グラフ内の行ごとに変数のペアを定義する必要があります。: 合計項目数と合計のパーセント. --> <xsl:変数 名前="totalProposed" 選択="カウント(/dsQueryResponse/行/行[空白を正規化(@Status) = '提案'])" /> <xsl:変数 名前="percentProposed" 選択="$totalProposed div $dvt_RowCount" /> <xsl:変数 名前="totalInProcess" 選択="カウント(/dsQueryResponse/行/行[空白を正規化(@Status) = 'のプロセス'])" /> <xsl:変数 名前="percentInProcess" 選択="$totalInProcess div $dvt_RowCount" /> <xsl:変数 名前="totalStalled" 選択="カウント(/dsQueryResponse/行/行[空白を正規化(@Status) '停止' =])" /> <xsl:変数 名前="percentStalled" 選択="$totalStalled div $dvt_RowCount" /> <!-- ここで我々 の HTML テーブルを定義します。. 私は一貫性を持つようにいくつかの標準的な SharePoint のスタイルここから借りています. 私はそれは同様のテーマをオーバーライド グローバル css ファイルへの変更を名誉と思う. --> <テーブル ="100%" cellspacing="0" cellpadding="2" スタイル="右枠線: 1 固体 #C0C0C0; 下枠線: 1 固体 #C0C0C0; 罫線左: 固体; ボーダー左幅: 1; 罫線上部: 固体; 国境トップ幅: 1;"> <tr> <td 位置合わせ="センター"> <テーブル 境界線="1" ="100%"> <!-- グラフにしたい各ステータスを, 「ゲイビレッジをと呼んでください。" テンプレート. 我々 はそれを渡す: 1. 行のラベル. これはハイパーリンクに変換します。. 2. パーセント (上から変数). 3. 基になるリストからコードの実際のフィールド名. これは、表示ラベルと一致する必要はありません。. 4. フィールドの値のを一致 #3. 5. このステータス コードのアイテムの合計 (すべてのステータス コードのない総計). それが発する、 <tr></tr> 水平バー グラフ線. このテンプレートに表示したい各ステータス コードを募集します。. --> <xsl:呼び出しテンプレート 名前="ゲイビレッジ"> <xsl:param と 名前="BarDisplayLabel" 選択="' 提案 '"/> <xsl:param と 名前="BarPercent" 選択="$percentProposed"/> <xsl:param と 名前="QueryFilterFieldName" 選択="' 状態 '"/> <xsl:param と 名前="QueryFilterFieldValue" 選択="' 提案 '"/> <xsl:param と 名前="TotalItems" 選択="$totalProposed"></xsl:param と> </xsl:呼び出しテンプレート> <xsl:呼び出しテンプレート 名前="ゲイビレッジ"> <xsl:param と 名前="BarDisplayLabel" 選択="' 停止 '"/> <xsl:param と 名前="BarPercent" 選択="$percentStalled"/> <xsl:param と 名前="QueryFilterFieldName" 選択="' 状態 '"/> <xsl:param と 名前="QueryFilterFieldValue" 選択="' 停止 '"/> <xsl:param と 名前="TotalItems" 選択="$totalStalled"></xsl:param と> </xsl:呼び出しテンプレート> <xsl:呼び出しテンプレート 名前="ゲイビレッジ"> <xsl:param と 名前="BarDisplayLabel" 選択="' のプロセス'"/> <xsl:param と 名前="BarPercent" 選択="$percentInProcess"/> <xsl:param と 名前="QueryFilterFieldName" 選択="' 状態 '"/> <xsl:param と 名前="QueryFilterFieldValue" 選択="' のプロセス'"/> <xsl:param と 名前="TotalItems" 選択="$totalInProcess"></xsl:param と> </xsl:呼び出しテンプレート> </テーブル> </td> </tr> </テーブル> </xsl:それ以外の場合> </xsl:選択してください。> </xsl:テンプレート> <!-- このテンプレートは、バー グラフで個々 の行を表示する作業を行います. あなたはおそらくあなたの微調整をここのほとんどをやる. --> <xsl:テンプレート 名前="ゲイビレッジ"> <xsl:param 名前="BarDisplayLabel" /> <!-- ラベルを表示するには --> <xsl:param 名前="BarPercent"/> <!-- 合計のパーセント. --> <xsl:param 名前="QueryFilterFieldName"/> <!-- クエリにジャンプするために使用 & フィルター --> <xsl:param 名前="QueryFilterFieldValue"/> <!-- クエリにジャンプするために使用 & フィルター --> <xsl:param 名前="TotalItems" /> <!-- この barlabel の合計数 --> <tr> <!-- バー自体のラベルします。. --> <td クラス="ms formbody" ="30%"> <!-- このステートメントの次のセットは基になるデータのフィルター処理されたビューにドリルダウンすることができますクエリ文字列を作成します。. 私たちが作るここでいくつかのものを使用: 1. 列にフィルターを適用するリストに FilterField1 と FilterValue1 を渡すことが我々. 2. SharePoint は私たちに重要なパラメーターを渡すこと, 対象となるこの DVWP「実行している」基になるリストを指す ListUrlDir. XSL の楽しみではないです。? --> <xsl:本文 無効にする出力エスケープ="はい"> <![CDATA[<href ="]]></xsl:本文> <xsl:値の 選択="$ListUrlDir"/> <xsl:本文 無効にする出力エスケープ="はい"><![CDATA[?FilterField1 =]]></xsl:本文> <xsl:値の 選択="$QueryFilterFieldName"/> <xsl:本文 無効にする出力エスケープ="はい"><![CDATA[&FilterValue1 =]]></xsl:本文> <xsl:値の 選択="$QueryFilterFieldValue"/> <xsl:本文 無効にする出力エスケープ="はい"><![CDATA[">]]></xsl:本文> <xsl:値の 選択="$BarDisplayLabel"/> <xsl:本文 無効にする出力エスケープ="はい"><![CDATA[</は>]]></xsl:本文> <!-- 次のビットの形式でいくつかの数字を示しています。: "(合計 / % 合計の)" --> (<xsl:値の 選択="$TotalItems"/> / <!-- これは私たちの素敵なパーセントのラベルを作成します. おかげで, マイクロソフト! --> <xsl:呼び出しテンプレート 名前="percentformat"> <xsl:param と 名前="%" 選択="$BarPercent"/> </xsl:呼び出しテンプレート>) </td> <!-- 最後に, 出力、 <td> バーのタグ自体.--> <td> <テーブル cellpadding="0" cellspacing="0" 境界線="0" ="{ラウンド($BarPercent * 100)+1}%"> <tr bgcolor=""> <xsl:本文 無効にする出力エスケープ="はい"><![CDATA[&nbsp;]]></xsl:本文> </tr> </テーブル> </td> </tr> </xsl:テンプレート> <!-- これはいくつかの XSL テンプレートでは MS を見つけたから直接取得します。. --> <xsl:テンプレート 名前="percentformat"> <xsl:param 名前="%"/> <xsl:選択してください。> <xsl:とき テスト="番号の書式設定($%, '#,##0%;-#,##0%')= 'ナン'">0%</xsl:とき> <xsl:それ以外の場合> <xsl:値の 選択="番号の書式設定($%, '#,##0%;-#,##0%')" /> </xsl:それ以外の場合> </xsl:選択してください。> </xsl:テンプレート> </xsl:スタイル シート>

結果:

上から XSL は、このグラフを生成します。:

イメージ

基になるデータのステータス コードをクリックしてドリルダウンします。:

イメージ

思考の結論:

これは一般化することができます。?

このグラフの概念を愛してください。, 行き、とても手作業でコーディングを行う必要があるという事実を嫌いだが、. これを一般化できるかどうかを少し考えを与えてくれたし、私は楽観的, しかし、私はどこかにすべての仕事を提供しないパスに沿ってれんが造りの壁があることを少し恐れても. 誰もがこの上のいくつかの良いアイデアを持っている場合, コメントで注意してくださいまたは 私にメールします。.

垂直のグラフ:

これは水平バー グラフです。. 確かに垂直のグラフを作成することが可能です。. 我々 は、HTML を変更する必要があります。. 同じ方法を始めるだろう: 垂直のバー グラフの HTML 表現を作成し、XSL 経由で取得する方法を把握し、. 誰もが興味なら, 私はそれを試してみるし、うまくように説得される可能性. 誰かが既にそれを行っている場合, 私が知っていると私はあなたのブログへのリンクを喜んでますしてください🙂

垂直のグラフとの課題は、グラフのラベルは管理が困難だと思う, しかし、不可能ではない確かに.

フィールド名ガッチャ:

少なくとも 2 つの外を見るフィールド名とは.

最初, スペースを含むフィールド名は、XSL でエスケープするには. これはおそらく、ここで問題:

        <xsl:変数 名前="totalProposed" 
選択="カウント(/dsQueryResponse/行/行[空白を正規化(@Status) = '提案'])" />

場合"ステータス" 実際にという名前の列"ステータス コード" "Status_x0020_Code"として参照する必要がありますし、:

   <xsl:変数 名前="totalProposed" 
選択="カウント(/dsQueryResponse/行/行[空白を正規化(@Status_x0020_Code) = '提案'])" />

2 番目, 私はこれについて少しあいまいだと, また、フィールド名の変更の警告にする必要があります。. あなたのフィールド"ステータス コードに名前を付ける場合" その後, 「AFE 状況」を名前を変更する, 「内部名" 変わりません. 内部名が"ステータス コードをできます。" "Status_x0020_Code"として参照する必要があります. 「その他リソース" リンクが診断し、この種の問題の修正に役立つことがあります。.

その色について:

"赤を選んだ" それは現時点では私を喜ばせるため. 大した数の単なる視覚的な記述を提供するために異なる色を表示することはないです。, しかし、有用な KPI をまた提供するために. たとえば, 場合の割合"失速" AFE は > 10% その後、赤を表示します。, そうでなければ黒で表示します。. 使用 <xsl:選択してください。> これを達成するために.

その他のリソース:

幸せな変換!

<終了/>

私のブログを購読します。!

カスタム リストで OM データ (または, まだ別の OM データ Displayor [YACC のような, 異なる])

今日, 「入力した列名は既に使用されてまたは予約メッセージの背後にある根本的な原因を追跡時間のほんの一握りを過ごした. 別の名前を選択します。"

問題の列を作成できませんでした。, 削除して別の環境の再作成, それを知っていたので予約の名前はなかった. ただし, 私は単に見つけることができなかった列をどこでも任意のサイトで標準的な SharePoint ユーザー インターフェイスを介してサイト コレクション.

を掲示 MSDN フォーラムここで 不屈と アンドリュー ・ ウッドワード 基になるオブジェクト モデル データの方向に私を指摘しました。.

消えた codeplex 私は OM の基になるデータにピアし、のトラブルを見つける私を助けるに役立つだろういくつかのツールを検索するには.

いくつかのツールを試して、彼らは非常にクールな面白いが、最終的に, UI が私の目的のために十分ではなかった. 私はない任意の手段によってそれら批判します。, しかし、明らかにツール メーカー問題を持っていなかった私の心で、UI を作成するとき :). ワークステーションを作成に時間と労力のかなりの量を投資するほとんどの人が見える / ツリー ビューを提供するクライアント アプリケーション, 右クリック コンテキスト メニューなど. これらがいいとすべて, しかし、それは多くの作業も非常に柔軟性がトップラインのユーザー エクスペリエンスを作成するには.

私は本当にこの問題に対する答えを必要と. それ私が発生した場合は、カスタム リストにサイト コレクションのサイト内の列のすべてを得ることができます。, フィルターを適用できます。, 並べ替えし、私このおそらく既存の列を見つけるに役立つだろうビューの作成 (それをしました。, ところで). 私は先に行きして 1 時間または 2 つを後でした。, いた私のすべてのサイト内の列でグループ化のユーザー設定リストに読み込まれます, 並べ替えなど. 5 分後に私の答えを見つけた.

私は正常に、世界を引き継ぐとき, 私は私にすべての SharePoint ツール プロバイダーがカスタム リストでそのオブジェクト モデルのデータを提示を考慮する必要が真剣になります令だと思う. その方法, 力を持っています。 いずれかを検索する方法私はしたいです。 (制約, もちろんです, 標準的な sharepoint 機能によって).