将大多数下载的项目插入 XMLUI (DSpace 6.2)
Inserting most downloaded items into XMLUI (DSpace 6.2)
我在 DSpace 6.2 上使用 XMLUI (Mirage) 并尝试将 "Most Downloaded Items" 插入主页。
我已经找到了 SOLR 查询,即(在页面-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"/>
此查询 returns 一个 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>
我希望看到 class "most_downloaded" 的 8 个 div,每个包含项目的 id,中间穿插着 class "downloaded_count" 的另外 8 个包含实际内容的 div价值。
我确实看到了这些 div,但在它们之上,我得到了所有 XML 文本节点的转储。我认为这是由于我对模板匹配的理解不足造成的。
我的问题是:
i) 我获取最多下载项目列表的查询是否正确?我已经尝试对此进行测试,但没有收到积极的结果。
ii) 匹配模板的正确方法是什么? /response/lst/lst/lst/int 听起来不对。
iii) 如何使用 id(我认为是数据库中的项目 uuid)通过 cocoon 获取 mets.xml 数据?
iv) 有更简单的方法来完成所有这些吗?
感谢您的帮助。
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=标题).
iv) 取决于您是否认为编写 Java 代码更容易 ;) 我已经在 two-step 过程中在本地解决了很多相同的问题:(a) 每天查询一次 solr与您的查询非常相似,并将结果写入 (JSON) 文件; (b) 为 Cocoon 转换器编写 Java 代码,从文件中加载项目 ID,查找相应项目的标题,然后以有用的格式将其放入页面。不确定你的做法是否better/worse!虽然我的方法避免了必须实时查询 Solr,但我们发现这非常耗费资源。
- 获得non-bot点击率
- 比特流命中率(类型 0)
- 其中统计类型是视图(不是工作流或其他任何类型)
- 我们希望它们按相应项目的 ID 分组
- 我们只要5个
- 我们希望缩进(这只是为了光学)
- 我们想要 0 行数据(这将是对面的补充——我们只关心面)
- 我们想要最后 7 天
- 我们只想要文件至少被下载 5 次的项目
- 我们只想要原始包,而不是缩略图等
- 我们想要JSON格式
- 我们想跳过一些我们不关心的 Solr 结果内容
这是最终有效的代码:
<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>
我在 DSpace 6.2 上使用 XMLUI (Mirage) 并尝试将 "Most Downloaded Items" 插入主页。
我已经找到了 SOLR 查询,即(在页面-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"/>
此查询 returns 一个 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>
我希望看到 class "most_downloaded" 的 8 个 div,每个包含项目的 id,中间穿插着 class "downloaded_count" 的另外 8 个包含实际内容的 div价值。 我确实看到了这些 div,但在它们之上,我得到了所有 XML 文本节点的转储。我认为这是由于我对模板匹配的理解不足造成的。
我的问题是:
i) 我获取最多下载项目列表的查询是否正确?我已经尝试对此进行测试,但没有收到积极的结果。
ii) 匹配模板的正确方法是什么? /response/lst/lst/lst/int 听起来不对。
iii) 如何使用 id(我认为是数据库中的项目 uuid)通过 cocoon 获取 mets.xml 数据?
iv) 有更简单的方法来完成所有这些吗?
感谢您的帮助。
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=标题).
iv) 取决于您是否认为编写 Java 代码更容易 ;) 我已经在 two-step 过程中在本地解决了很多相同的问题:(a) 每天查询一次 solr与您的查询非常相似,并将结果写入 (JSON) 文件; (b) 为 Cocoon 转换器编写 Java 代码,从文件中加载项目 ID,查找相应项目的标题,然后以有用的格式将其放入页面。不确定你的做法是否better/worse!虽然我的方法避免了必须实时查询 Solr,但我们发现这非常耗费资源。
- 获得non-bot点击率
- 比特流命中率(类型 0)
- 其中统计类型是视图(不是工作流或其他任何类型)
- 我们希望它们按相应项目的 ID 分组
- 我们只要5个
- 我们希望缩进(这只是为了光学)
- 我们想要 0 行数据(这将是对面的补充——我们只关心面)
- 我们想要最后 7 天
- 我们只想要文件至少被下载 5 次的项目
- 我们只想要原始包,而不是缩略图等
- 我们想要JSON格式
- 我们想跳过一些我们不关心的 Solr 结果内容
这是最终有效的代码:
<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>