Xslt 将下载最多的项目插入XMLUI(DSpace 6.2)

Xslt 将下载最多的项目插入XMLUI(DSpace 6.2),xslt,dspace,mirage,Xslt,Dspace,Mirage,我在DSpace 6.2上使用XMLUI(Mirage),并试图将“下载最多的项目”插入主页 我已经找到了这方面的SOLR查询,即(在page structure.xsl中): http://localhost/solr/statistics 此查询返回一个xml文档: <response> +<result name="response" numFound="8" start="0"></result> -<lst name="fa

我在DSpace 6.2上使用XMLUI(Mirage),并试图将“下载最多的项目”插入主页

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


http://localhost/solr/statistics
此查询返回一个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>

+
-
-
-
8.
0
0
0
0
0
0
0
0
0
然后将其与模板匹配,如中所示:

<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,每个div包含项目的id,另外8个div的“downloaded_count”类包含实际值。 我确实看到了这些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
——如果您有非标准的捆绑包名称,您需要调整它)

我觉得很好。您可能需要像
这样的东西来抑制您看到的随机XML垃圾

iii)我认为最好从Discovery Solr core获取元数据,而不是尝试获取mets.xml文件。您可能能够在一个查询中执行到discovery core的Solr连接,并从中获取标题(或任何其他您想要的元数据),但我不确定这是否适用于faceting。您可以在模板中查询Discovery core中的每个ID,以获取所需的内容(例如[ID在这里]&rows=1&fl=title)

iv)取决于您是否认为编写Java代码更容易;)我已经通过两个步骤在本地解决了几乎相同的问题:(a)每天使用一个类似于您的查询查询solr一次,并将结果写入(JSON)文件;(b) 为Cocoon transformer编写Java代码,从文件中加载项目ID,查找相应项目的标题,然后以有用的格式将其放入页面。不确定您的方法是否更好/更差!虽然我的方法避免了实时查询Solr,但我们发现这是一种资源密集型方法

仅供参考,我对(iv)中提到的JSON文件的查询是

  • 获得非机器人攻击
  • 比特流的命中率(类型0)
  • 其中统计类型为视图(不是工作流或其他任何类型)
  • 我们希望它们按相应项目的ID分组
  • 我们只想要5个
  • 我们希望这是缩进(这只是光学)
  • 我们需要0行数据(这将是对facet的补充-我们只关心facet)
  • 我们想要最后的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&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>

.....

variable declaration'$statsURL'在哪里?我已经使用:
http://localhost/solr/statistics                     
谢谢@schweerelos
i)你100%正确
ii)再一次,100%
iii)我使用了你的第二个想法,几乎成功了。我将在完成后粘贴代码。iv)我更喜欢你的方法。solr的开销要小得多。我也会试试看。编写Java不是问题,但我假设您的意思是我需要为主题创建一个新的方面。我对DSpace文档很费劲,因为它似乎只是告诉一个人该做什么,而不是如何做。您是否有任何指向可以帮助您的资源的指针
非常感谢。很高兴您能在@ShaunDonovan工作!你可以编写你自己的方面,我也做过几次,例如(surfacecontent一个接近你的用例,但从搜索核心中提取数据,而不是stats一个)我发现在重新启动时,额外的方面似乎会减慢tomcat的速度,所以最近我转向向现有方面添加转换器。您只需在sitemap.xmap中将它们拉入即可。我没有比官方的DSpace文档和旧的但仍然相关的cocoon文档更好的文档了,对不起!嗨@shaun donovan,你介意在要点中分享你的完整代码吗?谢谢
<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>