我一直在用这玩意儿撞墙。我有一系列这样的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文件,可能有10-20个这样的<INTELLCONT>标记。我需要显示<INTELLCONT>中某些字段的前五个字段的值,但只显示<PUBLISH>标记设置为"Published“的条目。下面是到目前为止的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>设置为"Published“。这很好,但就像上面的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个,那么我将不会获得我需要的5个条目的列表。
我知道一定有更好的方法来做这件事,但我还没有弄明白。任何帮助都是最好的!
发布于 2012-10-24 04:37:02
我不完全理解你对需求的解释,但你似乎用了错误的方式。您需要了解模板规则,这是用XSLT编写代码的自然方式!
如果要显示状态为Published的前五个INTELLCONT元素,请使用
<xsl:apply-templates select="dm:INTELLICONT[dm:STATUS='Published'][position() <= 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代码时,您会发现for-each、choose或if指令非常少。
https://stackoverflow.com/questions/13038338
复制相似问题