我在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&wt=xml&indent=true&facet=true&facet.field=id&facet.sort=count&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)有没有更简单的方法来完成所有这些?
感谢您的帮助。
答案 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,我们发现这是非常资源密集的。
答案 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&wt=xml&indent=true&facet=true&facet.field=owningItem&fq=bundleName:ORIGINAL&facet.sort=count&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=*:*&fl=title,handle&wt=xml&omitHeader=true&indent=true&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>