概述和目标
开箱即用, 苔藓’ 内容查询 Web 部件 (CQWP) 其结果显示在列表格式中, 类似于搜索结果. 它也是可能以网格格式显示结果 (e 小节. HTML 表的格式). 栅格格式是在某些情况下更好. 描述了如何实现这种效果在这篇文章.
业务方案
有在客户端与企业级苔藓推出. 我们已设计及其分类,例如,项目层次结构中的第一类公民,有他们自己的顶级网站. 项目经理保持单身人士列表项目的摘要信息, 如标题, 预算, 预计的完工日期, 其余的预算和其他摘要类型字段. 由"单身" 我的意思是保证包含只有一个项目的自定义 SharePoint 列表. 简单地, 它看起来像这样:
技术方法是多描述的一样 在这里 (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP 使用 XSL 转换来发出为浏览器的 HTML 呈现.
我总是设想结果前潜入 XSL,因为 XSL 是一场噩梦. 这里是我期望的结果:
像这样的 HTML 生成的结果:
|
<html>
<正文>
<中心>
<表 边框= 1>
<!-- 标签 — —>
<tr 背景色= 蓝>
<运输署><字体 颜色= 白色><b>项目名称</b></字体></运输署>
<运输署 对齐= 正确><字体 颜色= 白色><b>完成日期</b></字体></运输署>
<运输署 对齐= 正确><字体 颜色= 白色><b>预算</b></字体></运输署>
<运输署 对齐= 正确><字体 颜色= 白色><b>实际费用</b></字体></运输署>
<运输署><字体 颜色= 白色><b>整体状态</b></字体></运输署>
</tr>
<tr>
<运输署>重新连接计算机房.</运输署>
<运输署 对齐= 正确>02/01/08</运输署>
<运输署 对齐= 正确>22,500.00</运输署>
<运输署 对齐= 正确>19,000.00</运输署>
<运输署>在进展中</运输署>
</tr>
<tr>
<运输署>提供服务器的 SQL 升级</运输署>
<运输署 对齐= 正确>04/01/08</运输署>
<运输署 对齐= 正确>7,500.00</运输署>
<运输署 对齐= 正确>0.00</运输署>
<运输署>计划</运输署>
</tr>
</表>
</中心>
</正文>
</html>
|
方法
按照这些步骤来创建网格:
- 确定网格的组件 (行/列).
- 定义并创建必要的站点列.
- 创建子网站,为项目和单身人士名单.
- 将 CQWP 添加到 web 页并将其配置为搜索您的列表.
- 修改 CQWP 的 XML,以收集更多列.
- 修改 XSL 生成表.
我要去专注于数字六. 数字从一到四个是直向前和任何 CQWP 用户已经做的东西. 五号已被证实的其他人包括详尽屏幕截图载货的本文从 MSDN 在这里 (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) 和希瑟 · 所罗门的博客 在这里 (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
螺栓和螺母
开始和执行步骤一到五的 MSDN 文档和希瑟 · 所罗门条步骤.
在这一点, 向页面添加了您的 CQWP 和你有你 <CommonViewFields> 根据需要配置.
按照通常的步骤, 拿到这些中间结果:
1. 创建内容类型, 该内容类型和两个站点模板的自定义列表. 这里是内容类型:
这里是网站结构:
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</属性>
请注意,我只好把上一个线或它的所有属性字段将不工作 (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
请注意: 当对 ContentQueryMain.xsl 以及 ItemStyle.xsl 的更改, 您需要检查那些文件回之前您看到您的更改的效果.
为网格制作目的, 苔藓使用两个不同的 XSL 文件来生成的结果我们看到从 CQWP. 生成输出的前一位, 我们修改了 ItemStyle.xsl. 苔藓实际上使用另一个 XSL 文件, ContentQueryMain.xsl 到 ItemStyle.xsl 来生成其 HTML 结合. 正如其名称所暗示, ContentQueryMain.xsl 是"主" 控制整体液流的翻译的 XSL. 它遍历所有找到的项并将它们传递到模板逐一在 ItemStyle.xsl. 我们将修改 ItemStyle.xsl 生成开放 <表> 之前发射的第一行的数据并关闭标记 <表> 标记后发出的最后一行. 要做到这一点, ContentQueryMain.xsl 被修改,以将两个参数传递给我们"网格" ItemStyle.xsl 中的模板, "最后一行" 和"当前行". ItemStyle.xsl 使用这些有条件地发出必要的标记.
使用希瑟 · 所罗门的技术, 我们找到 ContentQueryMain.xsl. 它坐落在 ItemStyle.xsl 一样的地方. 此屏幕快照应该帮助:
我们需要进行以下更改:
- 修改 xsl 模板, "CallItemTemplate" 这实际上调用我们在 ItemStyle.xsl 的网格模板. 我们将到网格模板传递两个参数,以便它会有这些数据,它需要有条件地生成打开和关闭 <表> 标签.
- 另一位叫"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 中进行任何更改,这样,你看到那些更改的效果后检查.
我们这里有两个任务:
- 替换整个网格模板. 你可以复制/粘贴从下面.
- 添加一些胡言外模板定义,使"formatcurrency" 要工作模板. (你可以告诉我关于 XSL 有稀薄的句柄).
第一次, 靠近顶部的 ItemStyle.xsl, 添加下面这行:
<!-- 一些胡言乱语,使我们能够显示美国. 货币. -->
<xsl:十进制格式 名称="工作人员" 数字="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, 它包括 HTML 在 CDATA 标记.
否则, 它将为空.
TableStart 的值是一大,每次通过 ContentQueryMain.xsl 调用 ItemStyle 时.
-->
<xsl:变量 名称="tableStart">
<xsl:如果 测试="$CurPos = 1">
<![CDATA[
<表格边框 = 1>
<tr 背景色 ="蓝色">
<运输署><字体颜色 ="白"><b>项目名称</b></字体></运输署>
<运输署对齐 ="权利"><字体颜色 ="白"><b>完成日期</b></字体></运输署>
<运输署对齐 ="权利"><字体颜色 ="白"><b>预算</b></字体></运输署>
<运输署对齐 ="权利"><字体颜色 ="白"><b>实际费用</b></字体></运输署>
<运输署><字体颜色 ="白"><b>整体状态</b></字体></运输署>
</tr>
]]>
</xsl:如果>
</xsl:变量>
<!--
另一个变量, tableEnd 只是定义关闭表标记.
与 tableStart 一样, 它始终是一大. 这就是为什么它的值分配有条件地根据是否我们被路过的最后一行 ContentQueryMain.xsl.
-->
<xsl:变量 名称="tableEnd">
<xsl:如果 测试="$CurPos = $Last">
<![CDATA[ </表> ]]>
</xsl:如果>
</xsl:变量>
<!--
总是发出 tableStart 的内容. 如果这不是通过 ContentQueryMain.xsl 传递给我们的第一行, 然后我们知道它的值将显示为空白.
禁用输出转义因为当 tableStart 不空白, 它包括我们要由浏览器呈现的实际 HTML. 如果我们不告诉 XSL 解析器来禁用输出转义, 它将生成之类"&这是;表>" 而不是"<表>".
-->
<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
-->
<运输署>
<xsl:值的 请选择="@Project_x005F_x0020_Name"/>
</运输署>
<运输署 对齐="权利">
<xsl:值的 请选择="@Project_x005F_x0020_End_x005F_x0020_Date"/>
</运输署>
<运输署 对齐="权利">
<xsl:调用模板 名称="formatcurrency">
<xsl:与 param 名称="价值" 请选择="@Project_x005F_x0020_Budget"></xsl:与 param>
</xsl:调用模板>
</运输署>
<运输署 对齐="权利">
<xsl:调用模板 名称="formatcurrency">
<xsl:与 param 名称="价值" 请选择="@Project_x005F_x0020_Expenses"> </xsl:与 param>
</xsl:调用模板>
</运输署>
<运输署>
<xsl:值的 请选择="@Project_x005F_x0020_Status"/>
</运输署>
<!--
满足以下所有条件被注释掉,以澄清事情.
不过, 把它带回来,塞进 <运输署> 看看它的效果.
-->
<!--
<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。GDA, "工作人员")' />
</xsl:模板>
|