概述和目标
开箱即用, 苔藓’ 内容查询 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 名称="价值" |
这已是非常有用的. 谢谢!
Aah… 这是因为我以不同的方式命名我的列表样式并没有意识到在 ContentQueryMain.xsl 中它会检查"风格":
<xsl:当 test="@Style='NameOfMyStyle'">
它与重命名的工作. 🙂
它几乎为我工作: 我设法输出 </表> 正确地结束标记, 但起始标记是缺掉的. 看来测试 ="$CurPos = 1" 不会返回 true. 但是,为什么?
伟大的职位. Paul 我做上面的事情. 我有一个查询, 如何实现"总实际开支不可随意的总和" 或两个列的值的总和.
你做任何工作与创建自定义的 ContentQueryMain 和 ItemStyle xsl 文件了? 我问的原因是我不想担心我自定义的样式将被覆盖任何补丁程序或升级. 你有例子吗? 我试过 ContentQueryMain.xsl 完全相同的副本并将该新的自定义副本上载到样式库. 当在.webpart 的 MainXslLink 属性中把这个 xsl 文件的引用, 我得到 401 未授权. 自定义 xsl 文件是已发布的版本,每个人都有对它的读访问权限.
精彩绝伦的帖子谢谢! 有了争夺这现在的最后几天.
你好, 这是一个真正有帮助的帖子. 我把它所有的工作, 和也实行的迈克布朗的变化,所以将一组
里面的桌子旁无论结果我作为 CQWB 的属性中的组的参数选择.
我也做了标题链接, 所以它很好地工作. 我仍然有一个问题, 虽然. 我按站点名称分组结果. 在表格内, 它很好地组合它们, 它看起来不错, 但它仍然是打印出所有的组
名称(在我的例子中的站点名称) 表的上方. 有谁知道如何摆脱这些?
谢谢,
格雷格 ·
好文章. 我设法给我的表的默认 Sharepoint 列表的外观通过分析列表中的源代码. 这里是需要在 ItemStyle 中适合的主要 HTML 块:
<表格宽度 ="100%" 类 ="ms listviewtable" 边境 = 0 空隙 = 0 中 = 1 dir ="None">
<!–标题–>
<TR 类 ="ms viewheadertr" 底边对齐 = 顶部>
<TH nowrap 范围 ="col" 类 ="ms-vh2"><div 样式 ="宽度:100%;位置:相对;左:0;返回页首:0;">
<表样式 ="宽度:100%;" CtxNum ="1" 高度 ="100%" 格 = 1 中 = 0 类 ="ms-unselectedtitle">
<TR>
<TD 宽度 ="100%" 类 ="ms vb" nowrap>
富有杜效价 ici
</TD>
<TD 样式 ="位置:绝对;">
</TD>
</TR>
</表></div>
</TH>
<!–对于所有标头单元格重复–>
</TR>
<!– 表数据 –>
<TR 类 ="">
<!–数据列, 第一次与超链接使用 Paul 的代码 –>
<TD 类 ="ms vb2">数据在这里</TD>
<!–空列–>
<TD 类 ="ms vb2">
<大跨度 dir = 无></大跨度><
/TD>
<!–日期列–>
<TD 类 ="ms vb2">
<NOBR>11/12/2008</NOBR>
</TD>
</TR>
<!–***可选行 – 使用将插入基于模 2 的当前行的交替类的一个新的 XSL 变量–>
<TR 类 ="ms 交替">
…
</TR>
</表>
那就是加洲正是我一直在寻找......你摇滚的人......万岁。爱你的职位。.
<xsl:应用模板选择 ="。" 模式 ="itemstyle">
<xsl:与参数名称 ="CurPos" 选择 ="$CurPosition" />
<xsl:与参数名称 ="最后一" 选择 ="$LastRow" />
<xsl:与参数名称 ="StartNewGroup" select="@__begingroup" />
</xsl:当>
<xsl:当测试 ="$StartNewGroup = True">
<tr>
<运输署 >
<xsl:调用模板 name="OuterTemplate.GetGroupName">
<xsl:与参数名称 ="组名" select="@*[名称()$Group =]"/>
<xsl:与参数名称 ="GroupType" 选择 ="$GroupType"/>
</xsl:调用模板>
</运输署>
</tr>
</xsl:当>
<xsl:否则>
</xsl:否则>
</xsl:选择>
嗨保罗,
当使用 xml/xsl 和内容查询 web 部件, 你找到好的方法来设置您的 xslt 的格式吗? 试图更改和设计的测试证明正确的疼痛的 * * 只使用一个文本编辑器…
所有最好的
(例如:. https://myweb.com/Marketing/images/icn-order.gif, )
我应该使用图像或图片在 CommonViewFields 字段类型? (例如:. InternalColumnName, 图像)
您的帖子正是我要找的东西. 不过, 我不能让它工作.
我有不同的文档中存储的文档. 存储库,但分类使用自定义类列 (选择: 1 或 2. 我想要使用 CQWP 来显示这些文件基于他们班.
我是能够添加 CQWP, 将其导出到 SPD, 配置 itemStyle.xls 在列表视图中显示自定义领域. 然而, 我不能成功地执行你在这里描述.
这些都是我想要在我的 CQWP 中显示的列:
文件类型 (显示图标)
文件标题
上次修改日期
由世卫组织修改
签出给
签入注释
目前在列表格式的结果. 做如何改变为台面的格式.
谢谢.
吉
抱歉,在我的名字不能确定 missspelling 在哪里 ” 来自.