我对XSLT非常陌生,我正试图创建一个CSV,列出每个教授每年拥有的出版物数量,每个条目都是由dm:INTELLCONT表示的不同的出版物,并且每年都用dm:DTY_PUB来表示--我很难找到如何正确地完成这个任务--如果我一年不编写硬代码的话,我想在他们每年发布一些东西的时候循环这样做。我当前的XML文件是:
<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2017-10-16">
<INTELLCONT id="151370213376" dmd:originalSource="MANAGE_DATA" dmd:lastModified="2017-10-03T11:41:47" dmd:startDate="2016-04-15" dmd:endDate="2016-04-15">
<REFEREED>Yes</REFEREED>
<CONTYPE>Abstract</CONTYPE>
<CONTYPEOTHER/>
<STATUS>Published</STATUS>
<TITLE>Sample Title</TITLE>
<TITLE_SECONDARY/>
<DTM_PUB>April (2nd Quarter/Spring)</DTM_PUB>
<DTD_PUB>15</DTD_PUB>
<DTY_PUB>2016</DTY_PUB>
<PUB_START>2016-04-15</PUB_START>
<PUB_END>2016-04-15</PUB_END>
<USER_REFERENCE_CREATOR>Yes</USER_REFERENCE_CREATOR>
</INTELLCONT>
<INTELLCONT id="151368284160" dmd:originalSource="MANAGE_DATA" dmd:lastModified="2017-10-03T10:44:48" dmd:startDate="2017-01-01" dmd:endDate="2017-12-31">
<REFEREED>Yes</REFEREED>
<CONTYPE>Journal Article</CONTYPE>
<CONTYPEOTHER/>
<STATUS>Published</STATUS>
<TITLE>Sample Title</TITLE>
<TITLE_SECONDARY/>
<INTELLCONT_AUTH id="151368284163">
<FACULTY_NAME/>
<FNAME>FN</FNAME>
<MNAME/>
<LNAME>LN</LNAME>
<INSTITUTION/>
<ROLE>Author</ROLE>
<STUDENT_LEVEL/>
</INTELLCONT_AUTH>
<INTELLCONT_AUTH id="151368284161">
<FACULTY_NAME>1898739</FACULTY_NAME>
<FNAME>FN</FNAME>
<MNAME>MN</MNAME>
<LNAME>LN</LNAME>
<INSTITUTION/>
<ROLE>Author</ROLE>
<STUDENT_LEVEL/>
</INTELLCONT_AUTH>
<PUBLISHER>Public Health</PUBLISHER>
<PUBCTYST/>
<PUBCNTRY/>
<VOLUME>14</VOLUME>
<ISSUE>3</ISSUE>
<PAGENUM>265</PAGENUM>
<DTY_PUB>2017</DTY_PUB>
<PUB_START>2017-01-01</PUB_START>
<PUB_END>2017-12-31</PUB_END>
<USER_REFERENCE_CREATOR>Yes</USER_REFERENCE_CREATOR>
</INTELLCONT>
<INTELLCONT id="151368284160" dmd:originalSource="MANAGE_DATA" dmd:lastModified="2017-10-03T10:44:48" dmd:startDate="2017-01-01" dmd:endDate="2017-12-31">
<REFEREED>Yes</REFEREED>
<CONTYPE>Journal Article</CONTYPE>
<CONTYPEOTHER/>
<STATUS>Published</STATUS>
<TITLE>Sample Title</TITLE>
<TITLE_SECONDARY/>
<INTELLCONT_AUTH id="151368284163">
<FACULTY_NAME/>
<FNAME>FN</FNAME>
<MNAME/>
<LNAME>LN</LNAME>
<INSTITUTION/>
<ROLE>Author</ROLE>
<STUDENT_LEVEL/>
</INTELLCONT_AUTH>
<PUBLISHER>Public Health</PUBLISHER>
<PUBCTYST/>
<PUBCNTRY/>
<VOLUME>14</VOLUME>
<ISSUE>3</ISSUE>
<PAGENUM>265</PAGENUM>
<DTY_PUB>2017</DTY_PUB>
<PUB_START>2017-01-01</PUB_START>
<PUB_END>2017-12-31</PUB_END>
<USER_REFERENCE_CREATOR>Yes</USER_REFERENCE_CREATOR>
</INTELLCONT>
</Data>
我当前的XSL文件是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:csv="csv:csv"
xmlns="http://www.w3.org/1999/xhtml" xmlns:dm="http://www.digitalmeasures.com/schema/data"
xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="array fn map math xhtml xs">
<xsl:output method="text" encoding="utf-8"/>
<xsl:variable name="delimiter" select="','"/>
<!-- xmlns:dm is the xmlns attribute in Data.-->
<!-- define an array containing the fields we are interested in -->
<xsl:variable name="fieldArray">
<field>Journal Articles</field>
<field>Books</field>
<field>Book Chapters</field>
<field>Conference Proceeedings</field>
<field>Others</field>
</xsl:variable>
<xsl:param name="fields" select="document('')/*/xsl:variable[@name='fieldArray']/*" />
<xsl:key name="Year-Published" match="dm:INTELLCONT" use="dm:DTY_PUB"/>
<xsl:template match="/dm:Data">
<!--key("Year-Published", '2017')-->
<!--<xsl:text>Journal Articles</xsl:text>
<xsl:value-of select="$delimiter" />
<xsl:text>Books</xsl:text>
<xsl:value-of select="$delimiter" />
<xsl:text>Book Chapters</xsl:text>
<xsl:value-of select="$delimiter" />
<xsl:text>Conference Proceedings</xsl:text>
<xsl:value-of select="$delimiter" />
<xsl:text>Others</xsl:text>
-->
<xsl:text>Year,</xsl:text>
<!-- tabulating Years as columns -->
<xsl:for-each select="dm:Record/dm:INTELLCONT[generate-id()=generate-id(key('Year-Published', dm:DTY_PUB)[1])]">
<xsl:sort select="(dm:DTY_PUB)" order="ascending"/>
<xsl:value-of select="(dm:DTY_PUB)"/> <xsl:text>,</xsl:text>
</xsl:for-each>
<xsl:text>
</xsl:text>
<!-- Tabulating Published Papers Per Year-->
<xsl:for-each select="dm:Record/dm:INTELLCONT[generate-id()=generate-id(key('Year-Published', dm:DTY_PUB)[1])]">
<xsl:sort select="(dm:DTY_PUB)" order="ascending"/>
<xsl:value-of select="count(dm:Record/dm:INTELLCONT[dm:CONTYPE='Journal Article'][dm:STATUS='Published'][dm:DTY_PUB=key('Year-Published', dm:DTY_PUB)[1])][dm:USER_REFERENCE_CREATOR!='No'])"/>
<xsl:value-of select="$delimiter" />
</xsl:for-each>
<xsl:text>
</xsl:text>
<!-- output newline -->
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
正如您所看到的,在我每年试图统计每一份出版物的部分,有注释,每年汇编发表的论文,
我想循环通过他们每年出版和统计有多少出版物,这一年,任何帮助都将非常感谢,谢谢提前!
发布于 2017-11-30 00:49:30
您似乎已经掌握了XSLT1.0Muenchian分组的基本思想,这是困难的部分,然后您在一个简单的上下文问题上出错了。在此:
<xsl:for-each select="dm:Record/dm:INTELLCONT[...]">
<xsl:sort select="(dm:DTY_PUB)" order="ascending"/>
<xsl:value-of select="count(dm:Record/dm:INTELLCONT[..]/>
</xsl:for-each>这是没有意义的,因为在for-each中,上下文项是INTELLICONT元素,并且您试图向下选择dn:RECORD。
在需要计算组大小的Muenchian分组中,逻辑结构是
<xsl:for-each select="one item with each key value">
<xsl:value-of select="count(all items with the same key value)"/>
</xsl:for-each>所以我希望看到count(key(....))。
您确定不能为此使用XSLT2.0和xsl:for-each-group吗?它让生活变得更容易..。
https://stackoverflow.com/questions/47545310
复制相似问题