4

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

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

我的问题是:
i) 我的查询是否正确,以获取下载最多的项目列表?我试图对此进行测试,但没有收到积极的结果。
ii) 匹配模板的正确方法是什么?/response/lst/lst/lst/int 听起来不对。
iii) 如何使用 id(我相信它是数据库中的项目 uuid)通过 cocoon 获取 mets.xml 数据?
iv) 有没有更简单的方法来做这一切?

谢谢你的帮助。

4

2 回答 2

1

这是最终起作用的代码:

<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>
于 2018-03-01T09:58:30.207 回答
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] &rows=1&fl=title)。

iv) 取决于您是否认为编写 Java 代码更容易;) 我已经通过两步过程在本地解决了很多相同的问题:(a) 每天查询一次 solr,查询与您的查询非常相似,并将结果写入 ( 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 次的项目
  • 我们只想要原始包,而不是缩略图等
  • 我们想要 JSON 格式
  • 我们想跳过一些我们不关心的 Solr 结果内容
于 2018-02-28T04:39:55.533 回答