1

这是我第一次使用 Content Query Web 部件和 xslt。我必须以last 5 posts以下方式显示来自博客的内容(请看下图):

该表包含两列。在左栏中我想显示最后一篇文章,在右栏中我想显示来自特定博客的其余帖子。

编辑 1

来源只是一个 OOTB 博客站点,我在其中添加了一些帖子。我想在包含两列的 html 表中显示这些帖子。在左栏中,我想显示在博客中输入的最后一篇文章,在右栏中,我想循环浏览其他帖子。用户必须指定他/她希望在 CQWP 中看到多少帖子。

编辑 2

这是我到目前为止创建的 xslt。唯一的想法是该表被重复多次,我不希望这样。应该只有一张桌子。如果您查看 xslt 代码,我手动输入了一些文本,例如 Test1、test 2... 在它们的位置,我想显示其余的博客文章。

<xsl:template name="Post" match="Row[@Style='Post']" mode="itemstyle">
    <xsl:variable name="SafeLinkUrl">
        <xsl:call-template name="OuterTemplate.GetSafeLink">
            <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="DisplayTitle">
        <xsl:call-template name="OuterTemplate.GetTitle">
            <xsl:with-param name="Title" select="@Title"/>
            <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <div>        
        <table width="100%" cellpadding="2" cellspacing="2" border="1">
            <tr>
                <td colspan="2" valign="top">
                   <xsl:value-of select="@Author"/></td>
                <td rowspan="2" valign="top" width="30%">
                    <div>
                        <b>Previous blog posts:</b>
                    </div>
                    <div>
                        <ul style="margin-left:-2px;">
                        <li>Test 1</li>
                        <li>Test 2</li>
                        <li>Test 3</li>
                        <li>Test 4</li>
                        </ul>
                    </div>
                    </td>
            </tr>
            <tr>
                <td width="15%" valign="top">
                    image</td>
                <td  valign="top">
                     <div>
                        <xsl:value-of select="@Title"/>
                     </div>  
                     <div class="custom_description"> 
                        <xsl:value-of select="@Body" disable-output-escaping="yes" /> 
                    </div>                  
                    <p>
                    <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
                    <a href="{$SafeLinkUrl}">
                      <xsl:if test="$ItemsHaveStreams = 'True'">
                        <xsl:attribute name="onclick">
                          <xsl:value-of select="@OnClickForWebRendering"/>
                        </xsl:attribute>
                      </xsl:if>
                      <xsl:if test="$ItemsHaveStreams != 'True' and @OpenInNewWindow = 'True'">
                        <xsl:attribute name="onclick">
                          <xsl:value-of disable-output-escaping="yes" select="$OnClickTargetAttribute"/>
                        </xsl:attribute>
                      </xsl:if>
                      <br />
                      <b>Read More &gt;</b>
                    </a>
                    </p>
                </td>
            </tr>
        </table>                   
    </div>
</xsl:template>

编辑 3

<root>
   <Posts>
        <Post ID="1">
         <Title>this post 1</Title>
         <Body>The comment comes here</Body>
    </Post>
<Post ID="2">
         <Title>this post 2</Title>
         <Body>The comment comes here</Body>
    </Post>
<Post ID="3">
         <Title>this post 3</Title>
         <Body>The comment comes here</Body>
    </Post>
<Post ID="4">
         <Title>this post 4</Title>
         <Body>The comment comes here</Body>
    </Post>
<Post ID="5">
         <Title>this post 5</Title>
         <Body>The comment comes here</Body>
    </Post>

   </Posts>

</root>

谢谢

在此处输入图像描述

4

2 回答 2

2

首先让我告诫自己:我对 SharePoint 一无所知,而且我没有安装 SharePoint。有一个专门研究 SharePoint 问题的 StackExchange 网站,该网站可能比 SO 为您提供更好的服务。请参阅https://sharepoint.stackexchange.com/questions/22465/recreating-the-blog-template

您还应该看看http://www.glynblogs.com/2011/04/overriding-the-presentation-of-an-xslt-list-view-web-part.html


更新

这个 XSLT 1.0 样式表,用于 MS XSLT 处理器...

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="xsl msxsl">
<xsl:output method="html" doctype-system="" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*" />

<xsl:variable name="empty-main">
  <empty-main>No content yet.</empty-main>
</xsl:variable>

<xsl:variable name="empty-sub">
  <empty-main>No older content yet.</empty-main>
</xsl:variable>

<xsl:template match="/*">
  <html>
  <head>
    <title>Blog</title>
    <style type="text/css">
      table {
        width: 100%;
        border: 1px solid #000;
      }
      td.main-col,  td.subsiduary-col {
        vertical-align:text-top;
      }
      td.main-col {
        width: 75%
      }
      td.subsiduary-col {
        width: 25%
      }
    </style>
  </head>

  <body>
    <table border="1">
     <tr>
     <xsl:variable name="count-posts" select="count(msxsl:node-set(Posts/Post))" />
       <td class="main-col">
         <xsl:apply-templates select="
       (Posts/Post[last()] | msxsl:node-set($empty-main))[1]" />
       </td>
       <td class="subsiduary-col">
         <xsl:apply-templates select="
       Posts/Post[position() &gt; last() - 5 and position() &lt; last()] |
       msxsl:node-set($empty-sub)[$count-posts &lt; 2]" />
       </td>
     </tr>
    </table>
  </body>
  </html>
</xsl:template>


<xsl:template match="Post">
  <xsl:apply-templates select="Title" />
  <p><xsl:copy-of select="Body/node()" /></p>
</xsl:template>

<xsl:template match="Post[last()]/Title" priority="2">
  <h1><xsl:value-of select="." /></h1>
</xsl:template>

<xsl:template match="Post/Title">
  <h2><xsl:value-of select="." /></h2>
</xsl:template>


<xsl:template match="empty-main|empty-sub" priority="2">
  <p><xsl:value-of select="." /></p>
</xsl:template>

</xsl:stylesheet>

...将转换此输入...

<root>
    <Posts>
        <Post ID="1">
            <Title>this post 1</Title>
            <Body>The comment comes here</Body>
        </Post>
        <Post ID="2">
            <Title>this post 2</Title>
            <Body>The comment comes here</Body>
        </Post>
        <Post ID="3">
            <Title>this post 3</Title>
            <Body>The comment comes here</Body>
        </Post>
        <Post ID="4">
            <Title>this post 4</Title>
            <Body>The comment comes here</Body>
        </Post>
        <Post ID="5">
            <Title>this post 5</Title>
            <Body>The comment comes here</Body>
        </Post>
    </Posts>
</root>

..进入这个输出...

<!DOCTYPE html SYSTEM "">
<html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Blog</title>
    <style type="text/css">
      table {
        width: 100%;
        border: 1px solid #000;
      }
      td.main-col,  td.subsiduary-col {
        vertical-align:text-top;
      }
      td.main-col {
        width: 75%
      }
      td.subsiduary-col {
        width: 25%
      }
    </style>
  </head>
  <body>
    <table border="1">
      <tr>
        <td class="main-col">
          <h1>this post 5</h1>
          <p>The comment comes here</p>
        </td>
        <td class="subsiduary-col">
          <h2>this post 1</h2>
          <p>The comment comes here</p>
          <h2>this post 2</h2>
          <p>The comment comes here</p>
          <h2>this post 3</h2>
          <p>The comment comes here</p>
          <h2>this post 4</h2>
          <p>The comment comes here</p>
        </td>
      </tr>
    </table>
  </body>
</html>

要查看它在浏览器中的呈现方式,请将 html 输出粘贴到http://htmledit.squarefree.com/中。

于 2012-11-10T07:37:27.947 回答
0

根据在 Web 部件的面板工具中选择的排序显示第一个或最后一个项目。

 <xsl:if test="count(preceding-sibling::*)=0"> 

例子

<xsl:template name="DisplayPosts" match="Row[@Style='DisplayPosts']" mode="itemstyle">    

 <table width="100%" border="1">
 <tr>
  <td width="70%">
     <xsl:if test="count(preceding-sibling::*)=0">
        <xsl:value-of select="@Title" />
     </xsl:if>
 </td>
 <td width="30%">
    <xsl:if test="count(preceding-sibling::*)&gt;0">
        <xsl:value-of select="@Title" />
  </xsl:if>             
 </td>  
 </tr>
 </table>

</xsl:template> 
于 2012-11-20T18:42:43.220 回答