【问题标题】:Override recently added list in home page覆盖主页中最近添加的列表
【发布时间】:2015-08-28 04:40:54
【问题描述】:

我想知道是否可以覆盖主页中的最近添加列表。默认行为是任何新提交的项目都会显示在列表中,无论其发布日期如何。有没有办法覆盖它,只显示例如两年内发布的最新提交的出版物(或有条件的if dc.date.issued => 2014)?

我正在使用 DSpace 5.3 Mirage 2 主题。

更新

使用@terry的答案,这是我尝试过的代码:

<xsl:template match="dri:referenceSet[@rend='recent-submissions']">
    <xsl:for-each select="dri:reference">
        <xsl:variable name="externalMetadataURL">
            <xsl:text>cocoon:/</xsl:text>
            <xsl:value-of select="@url"/>
            <!-- No options selected, render the full METS document -->
        </xsl:variable>
        <xsl:comment> External Metadata URL: <xsl:value-of select="$externalMetadataURL"/> </xsl:comment>
        <xsl:variable name="issue-date"  select="document($externalMetadataURL)//dim:field[@element='date'][@qualifier='issued'][1]/text()"/>
        <xsl:comment> External Metadata URL: <xsl:value-of select="$issue-date"/> </xsl:comment>

        <!--
           Assuming dates conform to YYYY-MM-DD syntax, a simple string compare should work.
           An XSLT extension would be needed to computer the current date.
        -->
        <xsl:if test="$issue-date &lt; 2014">
            <xsl:apply-templates select="."/>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

另外,根据我另一篇帖子中的@schweerelos 中的suggestion,我在 document() 调用之前发表了评论,以查看是否正确检索了来自$externalMetadataURL 的元数据。

通过浏览器查看源代码,元数据被正确检索(虽然它不尊重我的条件)。

查看源代码

<div id="aspect_discovery_SiteRecentSubmissions_div_site-home" class="ds-static-div primary repository">
    <h2 class="ds-div-head page-header">Recently Added</h2>
    <div id="aspect_discovery_SiteRecentSubmissions_div_site-recent-submission" class="ds-static-div secondary recent-submission">
    <!-- External Metadata URL: cocoon://metadata/handle/10862/2260/mets.xml-->
    <!-- External Metadata URL: 2015-->
    <!-- External Metadata URL: cocoon://metadata/handle/10862/2265/mets.xml-->
    <!-- External Metadata URL: 2015-->
    <!-- External Metadata URL: cocoon://metadata/handle/10862/2261/mets.xml-->
    <!-- External Metadata URL: 2015-->
    <!-- External Metadata URL: cocoon://metadata/handle/10862/2262/mets.xml-->
    <!-- External Metadata URL: 2015-->
    <!-- External Metadata URL: cocoon://metadata/handle/10862/2263/mets.xml-->
    <!-- External Metadata URL: 2015-->
<p id="aspect_discovery_SiteRecentSubmissions_p_recent-submission-view-more" class="ds-paragraph recentSubmissionViewMore">
<a href="/recent-submissions">View more</a>

这是生成的 DRI:

<div id="aspect.discovery.SiteRecentSubmissions.div.site-home" rend="primary repository" n="site-home">
    <div id="aspect.discovery.SiteRecentSubmissions.div.site-recent-submission" rend="secondary recent-submission" n="site-recent-submission">
        <head>Recently Added</head>
        <referenceSet id="aspect.discovery.SiteRecentSubmissions.referenceSet.site-last-submitted" rend="recent-submissions" n="site-last-submitted" type="summaryList">   
            <reference repositoryID="10862" type="DSpace Item" url="/metadata/handle/10862/2260/mets.xml"/>
            <reference repositoryID="10862" type="DSpace Item" url="/metadata/handle/10862/2265/mets.xml"/>
            <reference repositoryID="10862" type="DSpace Item" url="/metadata/handle/10862/2261/mets.xml"/>
            <reference repositoryID="10862" type="DSpace Item" url="/metadata/handle/10862/2262/mets.xml"/>
            <reference repositoryID="10862" type="DSpace Item" url="/metadata/handle/10862/2263/mets.xml"/>
        </referenceSet>
        <p id="aspect.discovery.SiteRecentSubmissions.p.recent-submission-view-more" rend="recentSubmissionViewMore" n="recent-submission-view-more">
            <xref target="/recent-submissions">View more</xref>
        </p>
    </div>
</div>

即使我删除了我的条件(例如 &lt;xsl:if test="$issue-date &amp;lt; 2014"&gt;),我仍然有空白,因为 查看源代码 代码如下图所示。

有什么建议吗?

【问题讨论】:

    标签: xslt-1.0 dspace


    【解决方案1】:

    最近项目的 DSpace 配置文件 (discovery.xml) 将允许您设置用于提取最近项目的元数据字段。您可以将该字段从一个集合更改为另一个集合。您可以设置要拉取的最大项目数,但不能设置其他过滤条件。

    您需要使用如下逻辑在 XSLT 中设置该标准。

    <xsl:template match="dri:referenceSet[@rend='recent-submission']">
       <xsl:for-each select="dri:reference">
         <xsl:variable name="issue-date"  select="document(@url)//dim:field[@element='date'][@qualifier='issued'][1]/text()"/>
    
        <!-- 
           Assuming dates conform to YYYY-MM-DD syntax, a simple string compare should work.
           An XSLT extension would be needed to computer the current date.
        -->
        <xsl:if test="$issue-date &gt; 2014">
          <ul class="ds-artifact-list">
            <xsl:apply-templates select="*[not(name()='head')]" mode="summaryList"/>
          </ul>
        </xsl:if>
      <xsl:for-each>
    </xsl:template>
    

    以下 stackoverflow 答案说明了如何将 java 函数合并到 DSpace XSLT 样式表中:请参阅 How to shorten filename displayed in DSpace

    【讨论】:

    • 特里,我没有使用 java 函数,而是使用date:year() 函数来比较发行日期是否等于当年。当然,我首先将$issue-date 子串化为仅返回 4 位数字。我注意到[@rend='recent-submission'] 应该是[@rend='recent-submissions'] 我已经将discovery.xml 中的元数据字段更改为发布日期而不是加入日期。我的测试条件如下所示:&lt;xsl:if test="substring($issue-date,1,4) = date:year()"&gt; 但我的结果为空白。提前致谢。
    • 我更新了我的帖子以包含我使用的实际代码。最近的列表没有显示,请指教我的代码有什么问题。希望您的积极回应并提前致谢。
    • 我不明白“有空格”是什么意思。如果在 块中添加注释会发生什么?尝试与“2014”而不是 2014 进行比较。如果我理解你最初的问题,我相信你会想要一个 >测试。
    • 我用图片更新了我的帖子,说明“有空白”是什么意思。我在 &lt;xsl-if&gt; 块中添加了评论 &lt;xsl:comment&gt; External Metadata DATE: &lt;xsl:value-of select="$issue-date"/&gt; &lt;/xsl:comment&gt;,当我查看源代码时,评论没有出现。我在discovery.xml 中将我的recentSubmissionConfiguration 增加到100,认为这可能是列表未显示的原因。在我最初的问题中,我只是将&amp;gt; 作为任意条件。如果它真的尊重我在&lt;xsl:if&gt; 块中设置的条件,我想对此进行测试。我也试过'2014',但结果相同。
    • 在 Mirage 中,我相信这是用来显示最近项目的模板:github.com/DSpace/DSpace/blob/dspace-5_x/dspace-xmlui/src/main/… 您需要在 xsl:for-each 中复制此逻辑。我怀疑您需要在 xsl:apply-templates 调用中添加一个模式。
    【解决方案2】:

    好的,为了我以后的参考,下面的代码是我使用 Mirage 2 主题覆盖主页中最近提交列表的代码。感谢@terrywb 的回答。

    <xsl:template match="dri:div[@id='aspect.discovery.SiteRecentSubmissions.div.site-recent-submission']/dri:referenceSet[@rend='recent-submissions']">
        <xsl:for-each select="dri:reference">
            <xsl:variable name="externalMetadataURL">
                <xsl:text>cocoon:/</xsl:text>
                <xsl:value-of select="@url"/>
                <!-- No options selected, render the full METS document -->
            </xsl:variable>
            <xsl:variable name="issue-date"  select="document($externalMetadataURL)//dim:field[@element='date'][@qualifier='issued'][1]/text()"/>
            <!--
               Assuming dates conform to YYYY-MM-DD syntax, a simple string compare should work.
               An XSLT extension would be needed to computer the current date.
            -->
            <xsl:if test="substring($issue-date,1,4) = date:year()">
                <xsl:comment> External Metadata URL: <xsl:value-of select="$issue-date"/> </xsl:comment>
                <xsl:comment> Current year is: <xsl:value-of select="date:year()"/> </xsl:comment>
                <ul class="ds-artifact-list list-unstyled">
                    <xsl:apply-templates select="." mode="summaryList"/>
                </ul>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
    

    请注意,我使用过

    <xsl:template match="dri:div[@id='aspect.discovery.SiteRecentSubmissions.div.site-recent-submission']/dri:referenceSet[@rend='recent-submissions']">
    

    这是因为如果我只使用&lt;xsl:template match="dri:referenceSet[@rend='recent-submissions']"&gt;,它也会在您单击View more 链接后覆盖列表。我还使用了date:year() XSLT 扩展来捕获当前年份,这样我就不必每年硬编码或更改年份。

    【讨论】:

      【解决方案3】:

      我更改了“最近添加”以修改 page-strucutre.xsl 中的这些代码块:

      <!-- Otherwise use default handling of body -->
      <xsl:otherwise>
          <xsl:apply-templates />
      </xsl:otherwise>
      

      通过这个:

      <!-- Otherwise use default handling of body -->
      <xsl:otherwise>
          <xsl:apply-templates select="*[not((@n='site-home'))]"/>
      </xsl:otherwise>
      

      此更改将阻止“最近添加”和“社区视图”的呈现。

      为了在页面结构的其他位置显示“最近添加”,我为此创建了一个模板:

      <xsl:template name="buildCustomRecent">
          <ul class="list-group-plain" style="list-style: none;">
              <xsl:variable name="countRecent">
                  <xsl:value-of select="count(/dri:document/dri:body/dri:div/dri:div/dri:referenceSet/*)" />
              </xsl:variable>
              <xsl:for-each select="/dri:document/dri:body/dri:div/dri:div/dri:referenceSet/*">
                  <xsl:variable name="externalMetadataURL">
                      <xsl:text>cocoon:/</xsl:text>
                      <xsl:value-of select="@url"/>
                      <!-- No options selected, render the full METS document -->
                  </xsl:variable>
                  <xsl:variable name="title"
                                select="document($externalMetadataURL)//dim:field[@element='title'][not(@qualifier)]"/>
                  <xsl:variable name="author"
                                select="document($externalMetadataURL)//dim:field[@element='contributor'][@qualifier='author'][1]/text()"/>
                  <xsl:variable name="issue-date"
                                select="document($externalMetadataURL)//dim:field[@element='date'][@qualifier='issued'][1]/text()"/>
                  <xsl:variable name="urlObjId" select="document($externalMetadataURL)//mets:METS/@OBJID"/>
      
                  <li>
                      <a>
                          <xsl:attribute name="href">
                              <xsl:value-of select="$urlObjId"/>
                          </xsl:attribute>
                          <xsl:value-of select="$title"/>
                      </a>
                      <br/>
                      <xsl:value-of select="concat($author,' (',$issue-date,')')"/>
                      <br/>
                  </li>
              </xsl:for-each>
              <xsl:if test="$countRecent=0">
                  <xsl:text>No itens to show.</xsl:text>
              </xsl:if>
          </ul>
      </xsl:template>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 2014-01-01
        • 2014-11-16
        • 1970-01-01
        • 2011-06-29
        • 2015-06-25
        • 2013-09-28
        相关资源
        最近更新 更多