将大多数下载的项插入XMLUI(DSpace 6.2)

时间:2018-02-27 11:40:39

标签: xslt dspace mirage

我在DSpace 6.2上使用XMLUI(Mirage)并试图插入"最下载的项目"进入主页。

我已经找到了SOLR查询,即(在page-structure.xsl中):

<xsl:variable name="statsURL">
    <xsl:text>http://localhost/solr/statistics</xsl:text>
</xsl:variable>
<xsl:apply-templates select="document(concat($statsURL,'/select?q=type:0+-isBot:true+statistics_type:view&amp;wt=xml&amp;indent=true&amp;facet=true&amp;facet.field=id&amp;facet.sort=count&amp;facet.limit=10'))" mode="mostdownloaded"/>

此查询返回xml文档:

<response>
    +<result name="response" numFound="8" start="0"></result>
    -<lst name="facet_counts">
        <lst name="facet_queries"/>
        -<lst name="facet_fields">
            -<lst name="id">
                <int name="49b63c98-122c-40d4-9181-2ad4db8853c9">8</int>
                <int name="061c72a0-3edc-4e17-8f33-4e7f6ce4573a">0</int>
                <int name="0e124f85-4636-4eb5-85cb-2e4afd3e3ed0">0</int>
                <int name="19095190-9074-4a4a-bb59-abcb539c8c38">0</int>
                <int name="1e5350e0-83d9-4f26-bd76-e5d660254ee6">0</int>
                <int name="432038ee-a7d7-4c69-80c1-02641e105286">0</int>
                <int name="6b70eeea-be33-4489-8370-189ef041ba93">0</int>
                <int name="9a8cd24e-3d88-43fc-8e92-b4e2c6142fbc">0</int>
                <int name="bba37b59-7edc-453c-87d2-4039e432217b">0</int>
                <int name="cc78e683-9563-49df-b5cf-35d506b4a27d">0</int>
            </lst>
        </lst>
        <lst name="facet_dates"/>
        <lst name="facet_ranges"/>
        <lst name="facet_intervals"/>
    </lst>
</response>

然后我将其与模板匹配,如下所示:

<xsl:template match="/response/lst/lst/lst/int" mode="most-downloaded">
<div class="most_downloaded">
    <xsl:value-of select="./@name"/>
</div>
<div class="downloaded_count">
    <xsl:value-of select="text()"/>
</div>
</xsl:template>

我希望看到8个div类和#34; most_downloaded&#34;,每个包含项目的id,穿插另外8个div类&#34; downloaded_count&#34;包含实际值。 我确实看到了这些div,但在它们之上,我得到了所有XML文本节点的转储。我认为这是由于我对模板匹配的理解不足而发生的。

我的问题是:
i)我的查询是否正确获取大多数下载项目的列表?我试图测试这个,但没有得到积极的结果 ii)匹配模板的正确方法是什么? / response / lst / lst / lst / int听起来不对 iii)如何使用id(我认为是数据库中的项目uuid)通过cocoon获取mets.xml数据?
iv)有没有更简单的方法来完成所有这些?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

i)您的查询获取比特流ID,而不是拥有项目的ID。对于大多数下载的项目,您需要facet.field=owningItem,并且可能还需要排除,因此您不会计算缩略图(例如&fq=bundleName:ORIGINAL - 如果您有非标准的捆绑名称,则需要对其进行调整)

ii)对我来说很好看。您可能希望像<xsl:template match="*" mode="most-downloaded">这样的东西来抑制您所看到的随机XML垃圾。

iii)我认为最好从Discovery Solr核心获取元数据,而不是尝试获取mets.xml文件。你可能能够在一个查询中从一个查询中获取Solr加入到发现核心并获取标题(或者你想要的任何其他元数据),但我不确定它是否适用于分面。您可以在模板中查询每个ID的Discovery核心,以获取您所追求的内容(例如http://localhost:8080/solr/search/select?q=*:*&fq=search.id= [id-goes-here] &amp; rows = 1&amp; ; FL =标题)

iv)取决于你是否认为编写Java代码更容易;)我在两个步骤中在本地解决了很多相同的问题:(a)每天查询一次,查询与你的查询非常相似并写出结果到(JSON)文件; (b)为Cocoon变换器编写Java代码,该变换器从文件中加载项目ID,查找相应项目的标题,然后以有用的格式将其放入页面。不确定你的方法是否更好/更差!虽然我的方法避免了必须实时查询Solr,我们发现这是非常资源密集的。

仅供参考,我对(iv)中提到的JSON文件的查询是 http://localhost:8080/solr/statistics/select?q=*:*&fq=-isBot:true&fq=type:0&fq=statistics_type:view&facet=true&facet.field=owningItem&facet.limit=5&indent=true&rows=0&fq=time:[NOW/DAY-7DAYS+TO+NOW/DAY]&facet.mincount=5&fq=bundleName:ORIGINAL&wt=json&omitHeader=true

  • 获取非机器人命中
  • 点击比特流(类型0)
  • 统计类型是视图(不是工作流程或其他任何内容)
  • 我们希望它们按相应项目的ID分组
  • 我们只想要5
  • 我们希望这是缩进的(这仅适用于光学)
  • 我们想要0行数据(除了方面之外 - 我们只关心方面)
  • 我们想要最近7天的整天
  • 我们只想要文件已下载至少5次的项目
  • 我们只想要ORIGINAL包,而不是缩略图等
  • 我们想要JSON格式
  • 我们想跳过一些我们不关心的Solr结果

答案 1 :(得分:0)

这是最终有效的代码:

<xsl:variable name="searchURL" select="confman:getProperty('discovery','search.server')"/>
<xsl:variable name="statsURL" select="confman:getProperty('solr-statistics.server')"/>   

.....

                    <xsl:if test="string-length($request-uri)=0">
                       <div class="downloaded-wrapper">
                          <xsl:apply-templates select="document(concat($statsURL,'/select?q=type:0+-isBot:true+statistics_type:view&amp;wt=xml&amp;indent=true&amp;facet=true&amp;facet.field=owningItem&amp;fq=bundleName:ORIGINAL&amp;facet.sort=count&amp;facet.limit=10'))" mode="most-downloaded"/>
                       </div>
                    </xsl:if>
                </xsl:otherwise>
            </xsl:choose>
            </div>
            <xsl:apply-templates select="//*[@pagination='masked']/@pagination" mode="external"/>
        </div>
    </xsl:template>

    <xsl:template match="/" mode="most-downloaded">
        <xsl:for-each select="/response/lst/lst/lst[@name='owningItem']/int">
            <div class="most_downloaded">
                <xsl:variable name="itemId">
                    <xsl:value-of select="./@name"/>
                </xsl:variable>
                <xsl:apply-templates select="document(concat($searchURL,'/select?q=*:*&amp;fl=title,handle&amp;wt=xml&amp;omitHeader=true&amp;indent=true&amp;fq=search.resourceid:',$itemId))" mode="itemMeta"/>
            </div>
            <div class="downloaded_count">
                <xsl:value-of select="text()"/>
            </div>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="/" mode="itemMeta">
        <xsl:variable name="mainURL" select="confman:getProperty('dspace.baseUrl')"/>
        <a>  
            <xsl:attribute name="href"><xsl:value-of select="concat($mainURL,'/handle/',/response/result/doc/str[@name='handle']/text())"/></xsl:attribute>
            <xsl:for-each select="/response/result/doc/arr[@name='title']/str">
                <xsl:value-of select="./text()"/>
            </xsl:for-each>
        </a> 
    </xsl:template>