2012-10-23 65 views
0

我一直在用這個撞牆的方式將我的頭撞到牆上。我有一個像這樣的一系列的XML:使用XSLT首先顯示N個XML元素

<INTELLCONT id="33954082817" dmd:lastModified="2011-04-05T13:38:05" dmd:startDate="2010-12-30" dmd:endDate="2010-12-30"> 
     <CONTYPE>Journal Article</CONTYPE> 
     <CONTYPEOTHER/> 
     <CLASSIFICATION>Learning and Pedagogical Research</CLASSIFICATION> 
     <STATUS>Not Accepted</STATUS> 
     <TITLE>The Use of Alternative Quiz Formats to Enhance Students’ Experiences in the Introductory Accounting Course</TITLE> 

    </INTELLCONT> 
    <INTELLCONT id="11473068032" dmd:lastModified="2012-08-30T14:12:05" dmd:startDate="2009-03-17" dmd:endDate="2010-11-30"> 
     <CONTYPE>Journal Article</CONTYPE> 
     <CONTYPEOTHER/> 
     <CLASSIFICATION>Learning and Pedagogical Research</CLASSIFICATION> 
     <STATUS>Published</STATUS> 
     <TITLE>"Using Debate to Enhance Critical Thinking in the Accounting Classroom: Two Examples of Debates on the Sarbanes-Oxley Act and Tax Policy Issues</TITLE> 

(我已經刪除了一些其它標籤的爲了簡潔)。對於任何xml文件,這些<INTELLCONT>標籤中可能會有10-20個。我需要顯示<INTELLCONT>中某些字段的前五個值,但只有<PUBLISH>標籤設置爲「已發佈」的條目。這裏的XSL至今:

<xsl:choose> 
    <xsl:when test="dm:Data/dm:Record/dm:INTELLCONT/dm:STATUS = 'Published'"> 
     <xsl:for-each select="dm:Data/dm:Record/dm:INTELLCONT[1]"> 
      <xsl:if test="dm:STATUS = 'Published'"> 
       <p><xsl:value-of select="dm:TITLE" />, 
        <xsl:choose> 
         <xsl:when test="dm:JOURNAL/dm:JOURNAL_NAME !=''"> 
          <i><xsl:value-of select="dm:JOURNAL/dm:JOURNAL_NAME"/></i>, 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:text> </xsl:text> 
         </xsl:otherwise> 
        </xsl:choose> 
        <xsl:choose> 
         <xsl:when test="dm:DTM_PUB !=''"> 
          <xsl:value-of select="dm:DTM_PUB"/>, 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:text> </xsl:text> 
         </xsl:otherwise> 
        </xsl:choose> 
        <xsl:value-of select="dm:DTY_PUB"/></p> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:when> 
</xsl:choose> 

這表面上的第一項,但只有當<STATUS>設置爲「已發佈」。這很好,但是和上面的xml一樣,由於<STATUS>不是「已發佈」,因此沒有任何顯示。這也是好的,但如果我把這個代碼,並列舉此行<xsl:for-each select="dm:Data/dm:Record/dm:INTELLCONT[1]"><xsl:for-each select="dm:Data/dm:Record/dm:INTELLCONT[5]">話,我會得到所有地方<STATUS>發表的條目,但如果有少於5個已公佈,然後我贏了」 t得到我需要的5個條目的列表。

我知道必須有更好的方式來做到這一點,但我還沒有想通出來呢。任何幫助將是偉大的!

+0

請列出一個簡單的示例輸入文檔以及該輸入的預期輸出。整個文件請 - 不是碎片。另請指定XSLT的版本。 –

+0

另請確保您的文件清單格式正確。您當前提供的文檔片段格式不正確。 –

回答

4

我不完全理解你的要求的解釋,但你似乎在相當錯誤的方式是想這件事。您需要了解模板規則,這是在XSLT中編寫代碼的自然方式!

如果你想顯示與已發佈狀態的前五個INTELLCONT元素,使用

<xsl:apply-templates select="dm:INTELLICONT[dm:STATUS='Published'][position() &lt;= 5]"/> 

然後寫一個模板規則來顯示他們:

<xsl:template match=:dm:INTELLICONT"> 
<p><xsl:apply-templates/></p> 
</xsl:template> 

然後寫的模板規則個別字段:

<xsl:template match="dm:JOURNAL[dm:JOURNAL_NAME != '']"> 
    <i><xsl:value-of select="dm:JOURNAL_NAME"/></i> 
</xsl:template> 

當您看到由專家編寫的XSLT代碼時,您會發現很少有 - 每個選擇,或如果指示。

+0

謝謝邁克爾,這對我有用。對XSLT仍然持有看法,這對我們有很大的幫助。 – Chris