覆盖主页中最近添加的列表

Override recently added list in home page

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

此外,根据我的另一个 post 的 of @schweerelos,我在 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>

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

有什么建议吗?

最近项目的 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>

以下 Whosebug 答案说明了如何将 java 函数合并到 DSpace XSLT 样式表中:参见

好的,为了我以后的参考,下面的代码是我使用 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']">

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

我更改了 'Recently Added' 修改页面中的这些代码块-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>

此更改将阻止渲染 'Recently Added' 和 'Community View'。

为了在页面结构的其他地方显示 'Recently Added',我为此创建了一个模板:

<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>