2017-11-29 26 views
0

私はXSLTの新機能であり、教授が毎年持っていた出版物数のCSVを作成しようとしています。各エントリは dm:INTELLCONTdm:DTY_PUBと表示されています。私が年をハードコーディングしないと、これを正しく行う方法を考え出すのに問題があります。私は何かを出版した毎年毎回ループでこれをやりたいのです。私の現在のXMLファイルには、次のとおりです。変数/未知の値を数えるXSLT

<?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" 
 
\t xmlns="http://www.w3.org/1999/xhtml" xmlns:dm="http://www.digitalmeasures.com/schema/data" 
 
\t xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" 
 
\t xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" 
 
\t xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
 
\t xmlns:array="http://www.w3.org/2005/xpath-functions/array" 
 
\t xmlns:map="http://www.w3.org/2005/xpath-functions/map" 
 
\t xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="array fn map math xhtml xs"> 
 
\t 
 
\t <xsl:output method="text" encoding="utf-8"/> 
 
\t <xsl:variable name="delimiter" select="','"/> 
 
\t <!-- xmlns:dm is the xmlns attribute in Data.--> 
 
\t 
 
\t <!-- define an array containing the fields we are interested in --> 
 
\t <xsl:variable name="fieldArray"> 
 
\t \t <field>Journal Articles</field> 
 
\t \t <field>Books</field> 
 
\t \t <field>Book Chapters</field> 
 
\t \t <field>Conference Proceeedings</field> 
 
\t \t <field>Others</field> 
 
\t </xsl:variable> 
 
\t <xsl:param name="fields" select="document('')/*/xsl:variable[@name='fieldArray']/*" /> 
 
\t 
 
\t <xsl:key name="Year-Published" match="dm:INTELLCONT" use="dm:DTY_PUB"/> 
 
\t <xsl:template match="/dm:Data"> 
 
\t \t <!--key("Year-Published", '2017')--> 
 
\t \t <!--<xsl:text>Journal Articles</xsl:text> 
 
\t \t <xsl:value-of select="$delimiter" /> 
 
\t \t <xsl:text>Books</xsl:text> 
 
\t \t <xsl:value-of select="$delimiter" /> 
 
\t \t <xsl:text>Book Chapters</xsl:text> 
 
\t \t <xsl:value-of select="$delimiter" /> 
 
\t \t <xsl:text>Conference Proceedings</xsl:text> 
 
\t \t <xsl:value-of select="$delimiter" /> 
 
\t \t <xsl:text>Others</xsl:text> 
 
\t \t --> 
 
\t \t 
 
\t \t 
 
\t \t <xsl:text>Year,</xsl:text> 
 
\t \t <!-- tabulating Years as columns --> 
 
\t \t <xsl:for-each select="dm:Record/dm:INTELLCONT[generate-id()=generate-id(key('Year-Published', dm:DTY_PUB)[1])]"> 
 
\t \t \t <xsl:sort select="(dm:DTY_PUB)" order="ascending"/> 
 
\t \t \t <xsl:value-of select="(dm:DTY_PUB)"/> <xsl:text>,</xsl:text> 
 
\t \t </xsl:for-each> 
 
\t \t <xsl:text>&#xa;</xsl:text> 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t <!-- Tabulating Published Papers Per Year--> 
 
\t \t <xsl:for-each select="dm:Record/dm:INTELLCONT[generate-id()=generate-id(key('Year-Published', dm:DTY_PUB)[1])]"> 
 
\t \t \t <xsl:sort select="(dm:DTY_PUB)" order="ascending"/> 
 
\t \t \t <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'])"/> 
 
\t \t \t <xsl:value-of select="$delimiter" /> 
 
\t \t </xsl:for-each> 
 
\t \t <xsl:text>&#xa;</xsl:text> 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t <!-- output newline --> 
 
\t \t <xsl:text>&#xa;</xsl:text> 
 
\t </xsl:template> 
 
\t 
 
</xsl:stylesheet>

年ごとの各出版物にはコメントが掲載されています。毎年のアペール

私は毎年彼らが出版し、その年に何冊の出版物が存在するかを数えたいと思っています。どんな助けもありがとうございます。

答えて

0

あなたはXSLT 1.0 Muenchian Groupingという難しい部分の基本的なアイデアをマスターしたように見えますが、次に簡単な文脈の問題にぶつかりました。ここでは:のため、それぞれの理由の中に意味を作ることができない

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

、コンテキスト項目は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(....))を見ることが期待されます。

これにはXSLT 2.0とxsl:for-each-groupを使用できませんか?それは人生をはるかに簡単にします...

+0

私は具体的に私がバージョン2を使用することを許さなかったと言われました。これをありがとう、私はそれに試してみましょう – mks

+0

これらの決定を下した人々だけが、生産性の低下でコストを知っていたら... –

関連する問題